在 Oracle ERP 中,
如何透過 "Material Transaction Interface" 進行雜項領料的資料拋轉,
範例如下 ;
程式碼
DECLARE
-- 以下必須輸入
V_TRANSACTION_INTERFACE_ID NUMBER;
V_SOURCE_CODE VARCHAR2(30) := 'TOMKUO'; -- 自訂一個Source_Code, 目的跟其他作業作區隔
V_SOURCE_HEADER_ID NUMBER := -1; -- 紀錄來源單據 ID
V_SOURCE_LINE_ID NUMBER := -1; -- 紀錄來源單據明細 ID
V_PROCESS_FLAG NUMBER := 1; -- 很重要, 一定要直接帶入 1 (待處理中)
V_VALIDATION_REQUIRED NUMBER := 1; -- 很重要, 一定要直接帶入 1
V_TRANSACTION_MODE NUMBER := 3; -- 很重要, 一定要直接帶入 3
V_LOCK_FLAG NUMBER := 2; -- 很重要, 一定要直接帶入 2
V_LAST_UPDATE_DATE DATE := SYSDATE;
V_LAST_UPDATED_BY NUMBER := 1285;
V_CREATION_DATE DATE := SYSDATE;
V_CREATED_BY NUMBER := 1285;
V_ORGANIZATION_ID NUMBER := 254; -- 廠別
V_INVENTORY_ITEM_ID NUMBER := 376315; -- 料號 ID
V_TRANSACTION_TYPE_ID NUMBER := 32; -- 交易型態 ID
V_TRANSACTION_QUANTITY NUMBER := -10; -- 交易數量 (庫存增加 > 0, 庫存減少 < 0)
V_TRANSACTION_UOM VARCHAR2(3) := 'PCS'; -- 交易單位
V_TRANSACTION_DATE DATE := SYSDATE; -- 交易日期
V_SUBINVENTORY_CODE VARCHAR2(10) := '800'; -- 交易倉庫
V_LOCATOR_ID NUMBER := 513; -- 交易儲位 (視設定, 是否需要儲位)
-- 以下可有可無
V_TRANSACTION_REFERENCE VARCHAR2(240) := '測試'; -- 備註
V_TRANSACTION_SOURCE_ID NUMBER := NULL; -- 紀錄 SOURCE_HEADER_ID 用來處理哪一張單據
V_DISTRIBUTION_ACCOUNT_ID NUMBER := 5959; -- 會計科目 (雜項必須輸入, 且輸入雜項科目, 而不是存貨科目)
/* ======================================================
用於 批次
====================================================== */
V_LOT_NUMBER NUMBER := NULL; -- 批號
/* ======================================================
用於 序號
====================================================== */
V_FM_SERIAL_NUMBER NUMBER := NULL; -- 開始序號
V_TO_SERIAL_NUMBER NUMBER := NULL; -- 結束序號
BEGIN
SELECT MTL_MATERIAL_TRANSACTIONS_S.NEXTVAL
INTO V_TRANSACTION_INTERFACE_ID
FROM DUAL;
-- MMT Interface
INSERT INTO MTL_TRANSACTIONS_INTERFACE (
TRANSACTION_INTERFACE_ID
, SOURCE_CODE
, SOURCE_HEADER_ID
, SOURCE_LINE_ID
, PROCESS_FLAG
, VALIDATION_REQUIRED
, TRANSACTION_MODE
, LOCK_FLAG
, TRANSACTION_TYPE_ID
, LAST_UPDATE_DATE
, LAST_UPDATED_BY
, CREATION_DATE
, CREATED_BY
, ORGANIZATION_ID
, INVENTORY_ITEM_ID
, TRANSACTION_QUANTITY
, TRANSACTION_UOM
, TRANSACTION_DATE
, SUBINVENTORY_CODE
, LOCATOR_ID
, TRANSACTION_REFERENCE
, TRANSACTION_SOURCE_ID
, DISTRIBUTION_ACCOUNT_ID
)
VALUES (
V_TRANSACTION_INTERFACE_ID
, V_SOURCE_CODE
, V_SOURCE_HEADER_ID
, V_SOURCE_LINE_ID
, V_PROCESS_FLAG
, V_VALIDATION_REQUIRED
, V_TRANSACTION_MODE
, V_LOCK_FLAG
, V_TRANSACTION_TYPE_ID
, V_LAST_UPDATE_DATE
, V_LAST_UPDATED_BY
, V_CREATION_DATE
, V_CREATED_BY
, V_ORGANIZATION_ID
, V_INVENTORY_ITEM_ID
, V_TRANSACTION_QUANTITY
, V_TRANSACTION_UOM
, V_TRANSACTION_DATE
, V_SUBINVENTORY_CODE
, V_LOCATOR_ID
, V_TRANSACTION_REFERENCE
, V_TRANSACTION_SOURCE_ID
, V_DISTRIBUTION_ACCOUNT_ID
);
COMMIT;
/*
===== Submit Request =====
*/
declare
v_request_id number;
v_phase varchar2(200);
v_status varchar2(200);
v_dev_phase varchar2(200);
v_dev_status varchar2(200);
v_message varchar2(200);
begin
-- FND_GLOBAL.APPS_INITIALIZE(FND_GLOBAL.USER_ID, FND_GLOBAL.RESP_ID, FND_GLOBAL.RESP_APPL_ID);
FND_GLOBAL.APPS_INITIALIZE(FND_GLOBAL.USER_ID, 51538, 20083);
v_request_id := fnd_request.submit_request( 'INV', 'INCTCM', '', '', false,
CHR(0), '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '' );
COMMIT;
if v_request_id > 0 then
dbms_output.put_line('Submit Request ' || to_char(v_request_id) || ' Success !!' );
else
dbms_output.put_line('Submit Request Failure !!');
end if;
/*
偵測 Request 執行情形 : 每 5 秒偵測一次, 程序最長執行時間設定為 1800 秒
*/
if fnd_concurrent.wait_for_request ( v_request_id, 5, 1800, v_phase, v_status, v_dev_phase, v_dev_status, v_message ) then
if v_dev_phase != 'COMPLETE' or v_dev_status != 'NORMAL' then
dbms_output.put_line( 'Request failed with message ' || v_message );
else
dbms_output.put_line( 'Request finished with status ' || v_status );
end if;
end if;
end;
END;