0% found this document useful (0 votes)
252 views10 pages

Bom Explode

This procedure extracts bill of materials (BOM) data for a given organization, item, and date. It uses several cursors and variables to fetch assembly data, explode the BOM using recursion, and insert exploded BOM components into a temporary table. The exploded BOM data is then written to a CSV file for output.

Uploaded by

Netrapal Sisodia
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as RTF, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
252 views10 pages

Bom Explode

This procedure extracts bill of materials (BOM) data for a given organization, item, and date. It uses several cursors and variables to fetch assembly data, explode the BOM using recursion, and insert exploded BOM components into a temporary table. The exploded BOM data is then written to a CSV file for output.

Uploaded by

Netrapal Sisodia
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as RTF, PDF, TXT or read online on Scribd
You are on page 1/ 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

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy