--SET serveroutput ON SIZE 1000000; DECLARE ------------------------------------------------------------------------------- -- PURPOSE: -- Updates GMIR Bom_Header salesorder fields from decoded so_status in MLS -- -- THEORY OF OPERATION: -- This script contains an anomymous PL/SQL block built around a major and minor loop. -- The major loop contains qualified BOM_HEADERS and the minor loop finds their salesorder -- update vaules from SALES_ORDERS.so_status. The minor loop issues update statements -- against BOM_HEADERS. -- -- REVISIONS: -- Code maintainers should be familiar with MLS-GMIR-SO_Updates.doc -- before attempting any maintenance activities. -- -- 02-FEB-05 JJM * store existing BOM_HEADER.salesorder in BOM_HEADER_HISTORY. -- * better comparisons with NULL. -- -- 26-JAN-05 JJM * EXECUTE IMMEDIATE now uses bound varibles for UPDATE targets. -- * Commit every l_commit_rate (10) updates. -- * Dont' update BOM_HEADERS.salesorders if the update will not -- change the existing value. -- -- 17-JAN-05 JJM Incorporate edits from walk thru. See MLS-GMIR-SO-Updates.doc -- -- 14-JAN-05 JJM Started from concepts by K. Newbern, et al. ------------------------------------------------------------------------------- update_value VARCHAR2(256); update_stmt VARCHAR2(1024); l_historyid NUMBER; l_record_count NUMBER DEFAULT 0; l_commit_rate NUMBER DEFAULT 100; BEGIN -- find qualified BOM_HEADERS since yesterday FOR BOM_HEADERS IN (SELECT bh.salesorder, bh.sitecode, bh.expansionid, bh.erid, bh.componentttype, bh.current_config1900, bh.target_config1900, bh.current_config850, bh.target_config850, bh.status, bh.application, bh.fileid, bh.lastupdt, bh.lastupdtuser FROM ct2user.BOM_HEADER bh, SALES_ORDERS@x018 so WHERE bh.sitecode || bh.expansionid = so.customer_reference||trim(substr(so.customer_order_id,-2,2)) AND to_date(so.modified_date) >= to_date(sysdate) - 1) LOOP BEGIN -- get ALL the Sales Orders for each BOM_HEADER FOR SALESORDERS IN (select so.pk_case_id as SALESORDER, so.sellers_reference, decode(upper(so.so_status), 'CANCELLED', 'CNCL', 'CLOSED', 'CLSD', 'DELIVERED', 'DLVD', 'DRAFT', 'DRFT', 'INVOICED', 'INVC', 'OPEN', 'OPEN', 'PARTIALLY DELIVERED', 'PDLV', 'SOURCING CONFIRMED', 'SCON', 'SOURCING DONE', 'SDON', so.so_status) STATUS from SALES_ORDERS@x018 so where so.customer_reference || trim(substr(so.customer_order_id, -2, 2)) = BOM_HEADERS.sitecode || BOM_HEADERS.expansionid) LOOP -- prefix update_value if 'NOT FOR INVOICING' within BOM_HEADER.salesorder IF (instr(BOM_HEADERS.salesorder, 'NOT FOR INVOICING') > 0) THEN IF (instr(update_value,'NOT FOR INVOICING') = 0) THEN -- only prefix it once. update_value := update_value || 'NOT FOR INVOICING, '; END IF; END IF; -- prefix update_value if RTN within ANY sales_order IF (instr(SALESORDERS.sellers_reference, 'RTN', -3) > 0) THEN IF (substr(NVL(update_value,' '),1,3) <> 'RTN') THEN -- only prefix it once. update_value := 'RTN, '; END IF; END IF; -- annotate salesorders with status if needed IF NVL(instr(update_value, SALESORDERS.SALESORDER || SALESORDERS.STATUS), 0) = 0 THEN update_value := update_value || SALESORDERS.SALESORDER || SALESORDERS.STATUS || ', '; END IF; END LOOP; -- clip off any trailing comma IF (INSTR(trim(update_value),',',-1) > 0) THEN update_value := substr(trim(update_value),1,length(update_value)-2); END IF; -- update BOM_HEADER salesorder if needed IF (update_value <> nvl(BOM_HEADERS.salesorder,' ')) THEN -- save BOM_HEADER.salesorder before update in BOM_HEADER_HISTORY SELECT bom_header_history_s.nextval INTO l_historyid FROM DUAL; update_stmt := 'INSERT INTO ct2user.BOM_HEADER_HISTORY VALUES (' || l_historyid || ', ''' || BOM_HEADERS.erid || ''', ''' || BOM_HEADERS.sitecode || ''', ' || BOM_HEADERS.expansionid || ', ''' || BOM_HEADERS.componentttype || ''', ''' || BOM_HEADERS.current_config1900 || ''', ''' || BOM_HEADERS.target_config1900 || ''', ''' || BOM_HEADERS.current_config850 || ''', ''' || BOM_HEADERS.target_config850 || ''', ''' || BOM_HEADERS.status || ''', ''' || BOM_HEADERS.salesorder || ''', '; --build an insert string that contains --NULL keyword. allow fileid 0 to pass. IF (nvl(BOM_HEADERS.fileid,-99) = -99) THEN update_stmt := update_stmt || 'NULL'; ELSE update_stmt := update_stmt || BOM_HEADERS.fileid; END IF; update_stmt := update_stmt || ', ''' || BOM_HEADERS.application || ''', ''' || BOM_HEADERS.lastupdt || ''', ''' || BOM_HEADERS.lastupdtuser || ''', ''' || sysdate || ''')'; EXECUTE IMMEDIATE update_stmt; l_record_count := l_record_count + 1; update_stmt := ' UPDATE ct2user.bom_header SET salesorder = ''' || update_value || ''' ' || ' WHERE sitecode = ''' || BOM_HEADERS.sitecode || '''' || ' AND expansionid = ' || BOM_HEADERS.expansionid; EXECUTE IMMEDIATE update_stmt; l_record_count := l_record_count + 1; IF (MOD(l_record_count, l_commit_rate) = 0) THEN COMMIT; DBMS_OUTPUT.NEW_LINE; DBMS_OUTPUT.PUT_LINE('Committed ' || l_record_count || ' updates'); DBMS_OUTPUT.NEW_LINE; END IF; END IF; -- reset inner loop values update_value := ''; update_stmt := ''; EXCEPTION WHEN OTHERS THEN dbms_output.put_line (update_stmt); dbms_output.put_line('Exception while processing SITE/EXPANSION: ' || BOM_HEADERS.sitecode || BOM_HEADERS.expansionid || ' NEW SALESORDER: ' || update_value || ' SQLCODE: ' || SQLCODE || ': ' || SQLERRM); -- reset inner loop values update_value := ''; update_stmt := ''; END; END LOOP; COMMIT; END;