You are on page 1of 10

PROCEDURE XX_BOM_EXTRACT (p_error_flag OUT VARCHAR2, p_organization_id IN NUMBER, p_item_id IN NUMBER, p_int_bom_date IN VARCHAR2, p_extract_file_dir IN VARCHAR2) AS --Cursor to Fetch

assembly in an Organization CURSOR model_cur IS SELECT msib.segment1 ,msib.inventory_item_id ,msib.organization_id FROM mtl_system_items_b msib WHERE msib.item_type ='Assembly' AND msib.organization_id =p_organization_id AND msib.segment1 LIKE '%Sub' AND msib.inventory_item_id =nvl(p_item_id,msib.inventory_item_id); --Cursor to Fetch required interfaced data CURSOR component_cur (v_inventory_item_id IN NUMBER,v_organization_id IN NUMBER,v_sysdate VARCHAR2) IS SELECT distinct bet.plan_level, bet.component_item_id , msib.segment1 Component_Item, bcb.attribute14 op_seq, bet.component_quantity Component_Quantity, msib2.segment1 parent_item, mirb.revision_label revision, mcbk.SEGMENT1 Product_category, bcb.change_notice DR_NUMBER, to_char(bcb.effectivity_date,'DD-MON-YYYY HH24:MI:SS')effective_date, FROM BOM_EXPLOSION_TEMP bet, mtl_system_items_b msib, bom_structures_b bsb, bom_components_b bcb, mtl_system_items_b msib2, mtl_item_revisions_b mirb, mtl_item_categories mic , mtl_category_sets_tl mcst, mtl_categories_b_kfv mcbk

WHERE bet.organization_id =v_organization_id AND bet.top_item_id =v_inventory_item_id AND msib.organization_id = bet.organization_id and msib.inventory_item_id=bet.component_item_id AND bsb.organization_id = bet.organization_id AND bsb.bill_sequence_id = bet.bill_sequence_id AND bcb.component_item_id = bet.component_item_id AND bet.bill_sequence_id = bcb.bill_sequence_id AND bcb.effectivity_date <= to_date(v_sysdate,'DD-MON-YYYY HH24:MI:SS') AND (to_date(v_sysdate,'DD-MON-YYYY HH24:MI:SS') BETWEEN bcb.effectivity_date AND nvl(bcb.disable_date,to_date(v_sysdate,'DD-MON-YYYY HH24:MI:SS')))

AND

bcb.effectivity_date = (select max(bcb1.effectivity_date) from bom_components_b bcb1 where (to_date(v_sysdate,'DD-MON-YYYY HH24:MI:SS') BETWEEN bcb1.effectivity_date AND nvl(bcb1.disable_date,to_date(v_sysdate,'DD-MON-YYYY HH24:MI:SS'))) and bcb1.effectivity_date <= to_date(v_sysdate,'DD-MON-YYYY HH24:MI:SS') and bcb1.bill_sequence_id = bet.bill_sequence_id and bcb1.component_item_id = bet.component_item_id) AND msib.organization_id = bet.organization_id AND msib.inventory_item_id = bcb.component_item_id AND msib2.organization_id = bet.organization_id AND msib2.inventory_item_id = bsb.assembly_item_id AND mirb.organization_id = bsb.organization_id AND mirb.inventory_item_id = bcb.component_item_id order by plan_level ; v_orga_name MTL_PARAMETERS.ORGANIZATION_CODE%TYPE; v_org_code MTL_PARAMETERS.ORGANIZATION_ID%TYPE; v_item MTL_SYSTEM_ITEMS_B.SEGMENT1%TYPE; v_item_id MTL_SYSTEM_ITEMS_B.INVENTORY_ITEM_ID%TYPE:=NULL; v_int_bom_date VARCHAR2(100); v_item_rev MTL_ITEM_REVISIONS_B.REVISION%TYPE; v_user_id FND_USER.USER_ID%TYPE := FND_GLOBAL.USER_ID; v_login_id FND_USER.LAST_UPDATE_LOGIN%TYPE := FND_GLOBAL.LOGIN_ID; v_bompexpl_err EXCEPTION; V_FILEHANDLE UTL_FILE.FILE_TYPE; v_product_cat varchar2(100); v_dir VARCHAR2(1000); v_filename varchar2(1000); v_sysdate VARCHAR2(100); v_sta_num NUMBER; v_count number :=0; -- variables for BOM Explosion procedure bompexpl.exploder_userexit -v_err_msg VARCHAR2(1000) v_err_code NUMBER := 0; v_verify_flag NUMBER := 0; v_order_by NUMBER := 1; v_alternate VARCHAR2(240) := NULL; v_grp_id NUMBER := 0; v_new_grp_id NUMBER := 0; v_session_id NUMBER := 0; v_levels_to_explode NUMBER := 1; v_bom_or_eng NUMBER := 1; v_impl_flag NUMBER := 2; v_plan_factor_flag NUMBER := 2; v_explode_option NUMBER := 2; v_module NUMBER := 2; v_cst_type_id NUMBER := 0; v_std_comp_flag NUMBER := 0; v_expl_qty NUMBER := 1;

-- DEFAULT 0 -- DEFAULT 1 -- DEFAULT NULL

----------

DEFAULT DEFAULT DEFAULT DEFAULT DEFAULT DEFAULT DEFAULT DEFAULT DEFAULT

1 1 2 2 2 2 0 0 1

v_comp_code v_rev_date

VARCHAR2(240) := NULL; VARCHAR2(240);

-- DEFAULT NULL

--- Variable intialize for OUTPUT File -----------v_serial_no v_bom_level v_com_item v_op_seq v_com_qty v_parent_item v_com_rev v_pro_cat v_change v_eff_date v_model v_make VARCHAR2(240); VARCHAR2(240); VARCHAR2(240); VARCHAR2(240); VARCHAR2(240); VARCHAR2(240); VARCHAR2(240); VARCHAR2(240); VARCHAR2(240); VARCHAR2(240); VARCHAR2(240); VARCHAR2(240);

--- Variable intialize for OUTPUT File -----------BEGIN v_org_code :=p_organization_id ; --Capture parameter value into a Variable v_item_id :=p_item_id ; --Capture parameter value into a Variable v_int_bom_date :=to_char(to_date(p_int_bom_date,'YYYY/MM/DD HH24:MI:SS') ,'DD-MON-YYYY HH24:MI:SS'); --Capture parameter value into a Variable v_dir :=p_extract_file_dir ; SELECT INTO FROM WHERE AND organization_code v_orga_name org_organization_definitions organization_id =p_organization_id disable_date is null;

SELECT to_char(sysdate,'DD-MON-YYYY HH24:MI:SS') INTO v_sysdate FROM DUAL; DELETE FROM XX_BOM_EXTRACT; COMMIT; DBMS_OUTPUT.PUT_LINE('********Extract Runs for Below Parameter**********'); DBMS_OUTPUT.PUT_LINE('Extract run for the Organization Code : ' || v_orga_name); DBMS_OUTPUT.PUT_LINE('Extract run for the Organization ID : ' || v_org_code); DBMS_OUTPUT.PUT_LINE('Extract run for the Model : ' || v_item_id); DBMS_OUTPUT.PUT_LINE('Intended BOM Date for Which BOM Exploded :' || v_int_bom_date);

DBMS_OUTPUT.PUT_LINE('******************************************** *******'); v_sta_num:=0; V_FILEHANDLE:=UTL_FILE.FOPEN(v_dir,v_orga_name||'-'||'BOMS.csv','W'); UTL_FILE.PUTF(V_FILEHANDLE,'Serial No' ||','||'Bom Level'||','||'Part Number'||','||'Op Seq'||',' ||'Quantity'||','||'Parent'||','|| 'Revision'||','||'Product Catg'||','|| 'Drawing Number'||','||'Effective Date'||','||'Feature'||','|| 'Issue type'); UTL_FILE.NEW_LINE(V_FILEHANDLE); FOR model_cur_rec IN model_cur LOOP BEGIN -- Capture Item ID Explosion routine -v_sta_num:=1; SELECT SEGMENT1 INTO v_item FROM MTL_SYSTEM_ITEMS_B WHERE INVENTORY_ITEM_ID =model_cur_rec.inventory_item_id AND ORGANIZATION_ID =v_org_code; EXCEPTION WHEN NO_DATA_FOUND then DBMS_OUTPUT.put_line('No MCID to Explode BOM : ' ||v_sta_num); END; BEGIN v_sta_num:=2; -- Capture Original Item Revision -SELECT r.REVISION INTO v_item_rev FROM MTL_ITEM_REVISIONS_B r WHERE r.INVENTORY_ITEM_ID =model_cur_rec.inventory_item_id AND r.ORGANIZATION_ID = v_org_code AND r.EFFECTIVITY_DATE = (SELECT MAX(v.EFFECTIVITY_DATE) FROM MTL_ITEM_REVISIONS_B v WHERE v.INVENTORY_ITEM_ID =model_cur_rec.inventory_item_id AND v.ORGANIZATION_ID = v_org_code AND v.EFFECTIVITY_DATE <= SYSDATE); DBMS_OUTPUT.put_line('Original Item Revision : ' || v_item_rev); EXCEPTION WHEN NO_DATA_FOUND then DBMS_OUTPUT.put_line('No Item Revision : ' ||v_sta_num); END; BEGIN v_sta_num:=3;

-- Capture Maximum BOM Level for use in Explosion routine -SELECT MAX(MAXIMUM_BOM_LEVEL) INTO v_levels_to_explode FROM BOM_PARAMETERS WHERE ORGANIZATION_ID= v_org_code; DBMS_OUTPUT.put_line('Maximum BOM Level : ' || v_levels_to_explode); EXCEPTION WHEN NO_DATA_FOUND then DBMS_OUTPUT.put_line('Found No BOM Level' ||v_sta_num); END; v_rev_date :=to_char(SYSDATE,'YYYY-MM-DD HH24:MI:SS'); DBMS_OUTPUT.put_line('v_rev_date:- ' || v_rev_date); BEGIN v_sta_num:=4; -- Session ID is a unique value to identify current session -SELECT BOM_EXPLOSION_TEMP_SESSION_S.NEXTVAL INTO v_session_id FROM DUAL; DBMS_OUTPUT.put_line('Session id : ' || v_session_id); EXCEPTION WHEN NO_DATA_FOUND then DBMS_OUTPUT.put_line('No Session ' || v_sta_num); END; BEGIN v_sta_num:=5; -- Group_ID is a unique value to identify current (Original Item) explosion -SELECT BOM_EXPLOSION_TEMP_S.NEXTVAL INTO v_grp_id FROM DUAL; DBMS_OUTPUT.put_line('group id for orginal item bom explosion

is : '

|| v_grp_id); EXCEPTION WHEN NO_DATA_FOUND then DBMS_OUTPUT.put_line('No Groupid for item' || v_sta_num); END; v_sta_num:=6; -- Call BOM Exploder routine to Explode -DBMS_OUTPUT.put_line('BOM Exploded begins : ' || model_cur_rec.Segment1); v_sta_num:=7; APPS.BOMPEXPL.EXPLODER_USEREXIT ( v_verify_flag, v_org_code, v_order_by, v_grp_id, v_session_id, v_levels_to_explode, v_bom_or_eng, v_impl_flag, v_plan_factor_flag, v_explode_option,

v_module, v_cst_type_id, v_std_comp_flag, v_expl_qty, model_cur_rec.inventory_item_id , v_alternate, v_comp_code, v_int_bom_date , v_err_msg, v_err_code); -- insert into BOM_EXPLOSION_TEMP2 select * from BOM_EXPLOSION_TEMP ; ---for testing COMMIT; IF (v_err_code <> 0) THEN RAISE v_bompexpl_err; END IF; DBMS_OUTPUT.ENABLE(1000000); FOR component_cur_rec IN component_cur (model_cur_rec.inventory_item_id,model_cur_rec.organization_id,v_ sysdate) LOOP v_sta_num:=9; v_count:=v_count+1; INSERT INTO XX_BOM_EXTRACT( Serial_no, Bom_Level, Component_Item, Operating_sequence, Component_Quantity, Parent_Item, Component_Revision, Product_Category, Change_Notice, Effective_Date, Model, Make_Buy_Flag, organization_id, model_item_id) SELECT v_count, component_cur_rec.plan_level, component_cur_rec.Component_Item, component_cur_rec.op_seq, component_cur_rec.Component_Quantity, component_cur_rec.parent_item, component_cur_rec.revision, component_cur_rec.Product_category, component_cur_rec.DR_NUMBER, component_cur_rec.effective_date, model_cur_rec.segment1, component_cur_rec.Make_Buy, v_org_code,

model_cur_rec.inventory_item_id from DUAL WHERE NOT EXISTS(SELECT 'XX' from INFX.XX_BOM_EXTRACT WHERE Component_Item =component_cur_rec.Component_Item and Parent_Item=component_cur_rec.parent_item and Component_Revision=component_cur_rec.revision); END LOOP;-- End Loop of Component Insertion in Temp Table COMMIT; DBMS_OUTPUT.put_line('BOM Exploded Successfully Completed for Model: ||model_cur_rec.segment1); END LOOP; -- End Loop for Model v_sta_num:=10; FOR FOUT in (SELECT DISTINCT SERIAL_NO, Bom_Level, Component_Item, Operating_sequence, Component_Quantity, Parent_Item, Component_Revision, Product_Category, Change_Notice, effective_date, Model, Make_Buy_Flag FROM XX_BOM_EXTRACT order by model,serial_no) LOOP v_serial_no:=FOUT.serial_no; v_bom_level:=FOUT.Bom_Level; v_com_item:=FOUT.Component_Item; v_op_seq :=FOUT.Operating_sequence; v_com_qty:=FOUT.Component_Quantity; v_parent_item:=FOUT.Parent_Item; v_com_rev:=FOUT.Component_Revision; v_pro_cat:=NVL(FOUT.Product_Category,'N/A'); v_change:=FOUT.Change_Notice; v_eff_date:=FOUT.Effective_Date; v_model:=FOUT.Model; v_make:=FOUT.Make_Buy_Flag; BEGIN v_sta_num:=11; UTL_FILE.PUTF(V_FILEHANDLE, v_serial_no ||','|| v_bom_level ||','|| v_com_item ||','|| v_op_seq ||','|| v_com_qty ||','|| v_parent_item ||','|| v_com_rev ||','|| v_pro_cat ||','|| '

v_change v_eff_date v_model v_make);

||','|| ||','|| ||','||

UTL_FILE.NEW_LINE(V_FILEHANDLE); COMMIT WORK; EXCEPTION WHEN UTL_FILE.INVALID_PATH THEN v_err_code := SQLCODE; v_err_msg := SUBSTR(SQLERRM,1,100); DBMS_OUTPUT.PUT_LINE( 'ERROR: File location is invalid ' ); DBMS_OUTPUT.PUT_LINE ('At stmt '||v_sta_num||' SQLCODE = ' || v_err_code || ', SQLERRM = ' || v_err_msg); RAISE; WHEN UTL_FILE.INVALID_MODE THEN v_err_code := SQLCODE; v_err_msg:= SUBSTR(SQLERRM,1,100); DBMS_OUTPUT.PUT_LINE( 'ERROR: The open_mode parameter in FOPEN is invalid' ); DBMS_OUTPUT.PUT_LINE ( 'At stmt '||v_sta_num||' SQLCODE = ' || v_err_code || ', SQLERRM = ' || v_err_msg); RAISE; WHEN UTL_FILE.INVALID_FILEHANDLE THEN v_err_code := SQLCODE; v_err_msg:= SUBSTR(SQLERRM,1,100); DBMS_OUTPUT.PUT_LINE( 'ERROR: File handle is invalid' ); DBMS_OUTPUT.PUT_LINE ( 'At stmt '||v_sta_num||' SQLCODE = ' || v_err_code || ', SQLERRM = ' || v_err_msg); RAISE; WHEN UTL_FILE.INVALID_OPERATION THEN v_err_code := SQLCODE; v_err_msg := SUBSTR(SQLERRM,1,100); DBMS_OUTPUT.PUT_LINE( 'ERROR: File could not be opened or operated on as requested' ); DBMS_OUTPUT.PUT_LINE ( 'At stmt '||v_sta_num||' SQLCODE = ' || v_err_code || ', SQLERRM = ' || v_err_msg); RAISE; WHEN UTL_FILE.WRITE_ERROR THEN v_err_code := SQLCODE; v_err_msg := SUBSTR(SQLERRM,1,100); DBMS_OUTPUT.PUT_LINE( 'ERROR: Operating system error occurred during the write operation' ); DBMS_OUTPUT.PUT_LINE ( 'At stmt '||v_sta_num||' SQLCODE = ' || v_err_code || ', SQLERRM = ' || v_err_msg); RAISE; WHEN UTL_FILE.INTERNAL_ERROR THEN v_err_code := SQLCODE; v_err_msg := SUBSTR(SQLERRM,1,100); DBMS_OUTPUT.PUT_LINE( 'ERROR: Unspecified PL/SQL error' ); DBMS_OUTPUT.PUT_LINE ('At stmt '||v_sta_num||' SQLCODE = ' || v_err_code ||

', SQLERRM = ' || v_err_msg); RAISE; WHEN UTL_FILE.CHARSETMISMATCH THEN v_err_code := SQLCODE; v_err_msg:= SUBSTR(SQLERRM,1,100); DBMS_OUTPUT.PUT_LINE( 'ERROR:A file is opened using FOPEN_NCHAR, but later I/O operations use nonchar functions such as PUTF or GET_LINE' ); DBMS_OUTPUT.PUT_LINE ('At stmt '||v_sta_num||' SQLCODE = ' || v_err_code || ', SQLERRM = ' || v_err_msg); RAISE; WHEN UTL_FILE.FILE_OPEN THEN v_err_code := SQLCODE; v_err_msg:= SUBSTR(SQLERRM,1,100); DBMS_OUTPUT.PUT_LINE( 'ERROR:The requested operation failed because the file is open.' ); DBMS_OUTPUT.PUT_LINE ( 'At stmt '||v_sta_num||' SQLCODE = ' || v_err_code || ', SQLERRM = ' || v_err_msg); RAISE; WHEN UTL_FILE.INVALID_MAXLINESIZE THEN v_err_code := SQLCODE; v_err_msg:= SUBSTR(SQLERRM,1,100); DBMS_OUTPUT.PUT_LINE( 'ERROR:The MAX_LINESIZE value for FOPEN() is invalid; it should be within the range 1 to 32767.' ); DBMS_OUTPUT.PUT_LINE ( 'At stmt '||v_sta_num||' SQLCODE = ' || v_err_code || ', SQLERRM = ' || v_err_msg); RAISE; WHEN UTL_FILE.INVALID_FILENAME THEN v_err_code := SQLCODE; v_err_msg:= SUBSTR(SQLERRM,1,100); DBMS_OUTPUT.PUT_LINE( 'ERROR:The filename parameter is invalid.' ); DBMS_OUTPUT.PUT_LINE ( 'At stmt '||v_sta_num||' SQLCODE = ' || v_err_code || ', SQLERRM = ' || v_err_msg); RAISE; WHEN UTL_FILE.ACCESS_DENIED THEN v_err_code:= SQLCODE; v_err_msg:= SUBSTR(SQLERRM,1,100); DBMS_OUTPUT.PUT_LINE( 'ERROR:Permission to access to the file location is denied.'); DBMS_OUTPUT.PUT_LINE ( 'At stmt '||v_sta_num||' SQLCODE = ' || v_err_code || ', SQLERRM = ' || v_err_msg); RAISE; WHEN UTL_FILE.INVALID_OFFSET THEN v_err_code := SQLCODE; v_err_msg:= SUBSTR(SQLERRM,1,100); DBMS_OUTPUT.PUT_LINE( 'ERROR: Causes of the INVALID_OFFSET exception-Either offset caused a seek past the end of the file' ); DBMS_OUTPUT.PUT_LINE ( 'At stmt '||v_sta_num||' SQLCODE = ' ||

v_err_code ||

', SQLERRM = ' || v_err_msg); RAISE; WHEN VALUE_ERROR THEN v_err_code:= SQLCODE; v_err_msg:= SUBSTR(SQLERRM,1,100); DBMS_OUTPUT.PUT_LINE( 'ERROR: An arithmetic, conversion, truncation, or size-constraint error occurs may occure ' ); DBMS_OUTPUT.PUT_LINE ('At stmt '||v_sta_num||' SQLCODE = ' || v_err_code || ', SQLERRM = ' || v_err_msg); RAISE; WHEN NO_DATA_FOUND THEN v_err_code:= SQLCODE; v_err_msg := SUBSTR(SQLERRM,1,100); DBMS_OUTPUT.PUT_LINE( 'ERROR: No data found ' ); DBMS_OUTPUT.PUT_LINE ('At stmt '||v_sta_num||' SQLCODE = ' || v_err_code || ', SQLERRM = ' || v_err_msg); RAISE; WHEN OTHERS THEN v_err_code:= SQLCODE; v_err_msg := SUBSTR(SQLERRM,1,100); ROLLBACK; DBMS_OUTPUT.PUT_LINE( 'ERROR: MIDAS EXTRACT INTERFACE PROGRAM' ); DBMS_OUTPUT.PUT_LINE ( 'At stmt '||v_sta_num||' SQLCODE = ' || v_err_code || ', SQLERRM = ' || v_err_msg); RAISE; END; END LOOP; -- End Loop for Printing from Temp Table UTL_FILE.FCLOSE(V_FILEHANDLE); -- Close file DBMS_OUTPUT.PUT_LINE( ' Output file created Successfully '); execute immediate 'truncate table bom.bom_explosion_temp'; WHEN OTHERS THEN v_err_code:= SQLCODE; v_err_msg := SUBSTR(SQLERRM,1,100); ROLLBACK; DBMS_OUTPUT.PUT_LINE( 'ERROR: MIDAS EXTRACT INTERFACE PROGRAM' ); DBMS_OUTPUT.PUT_LINE ( 'At stmt '||v_sta_num||' SQLCODE = ' || v_err_code || ', SQLERRM = ' || v_err_msg); RAISE; END XX_BOM_EXTRACT; END; / EXIT; EXCEPTION

You might also like