自動處理【庫存物料交易MMT接口表】程序

這個程序,根據輸入的參數可以自動處理MTL_TRANSACTIONS_INTERFACE表或者MTL_MATERIAL_TRANSACTIONS_TEMP表。

處理有2中方式:

1 自動提交請求Inventory transaction worker處理。處理對應的TRANSACTION_HEADER_ID的數據。只是負責提請求處理接口表數據,後期是否成功不是它可以知道的。

2 立刻過賬。如果有1筆過賬不了,則返回錯誤。

可以根據實際需要選擇不同的處理接口的方式。

提交請求的好處是,處理大批量的數據的時候,處理速度快。但是不可以保證處理的完整性。因爲數據隨時可能卡接口。所以建議增加庫存或者庫存轉移的交易可以選擇這種處理。

而立刻過賬的好處是,可以保證整個流程可以完整完成,因爲它可以完全保證丟到接口表的數據一定可以產生交易。缺點是處理速度慢。當過賬的數據超過500行,聯機處理起來速度極慢。致命的缺點。扣減庫存的最好選擇這種處理。(曾經試過過賬1500行雜發數據,立刻過賬邏輯處理,它處理了3個多小時,還沒完成。後來改爲直接丟接口,不用幾分鐘就跑完了。。。)

這個東西還是蠻實用的。

具體請看輸入參數

-----------------------------
--處理接口表,可選處理方式

PROCEDURE PROCESS_TRANSACTION_INTERFACE(
      P_PROCESS_TABLE           VARCHAR2  ---處理表格,是 INTERFACE 表 還是 TEMP 表
     ,P_PROCESS_TYPE           VARCHAR2  ---處理方式,是 提交請求 SUBMIT_REQUEST 還是 立刻過賬 PROCESS_ONLINE
     ,P_TRANSACTION_HEADER_ID  NUMBER    ---處理的頭ID
     ,x_REQUEST_ID           OUT NUMBER --輸出的請求ID
     ,x_retcode              OUT NUMBER  ---0:成功  非0:失敗( 或者:0:成功  1:警告   2:錯誤  ----注意:確定警告的時候要做什麼動作)
     ,x_errbuf               OUT VARCHAR2  ---具體的錯誤信息
   )

      IS
       L_PROCESS_PHASE     NUMBER;                             --標識程序的進度
       ---
       L_REQUEST_TABLE     VARCHAR2(1);
       L_REQUEST_ID        NUMBER;
       ---
       ---INTERFACE Online Deal
       L_OUTCOME               BOOLEAN;
       L_TIMEOUT               NUMBER := 100;
       L_ERROR_CODE            VARCHAR2(4000);
       L_ERROR_EXPLANATION     VARCHAR2(4000);
       ---
       ---TEMP Online Deal
       L_RETURN_COUNT                NUMBER;
       X_TRANS_COUNT                 NUMBER;
       X_RETURN_STATUS               VARCHAR2 (1);
       X_MSG_COUNT                   NUMBER;
       X_MSG_DATA                    VARCHAR2 (2000);
   BEGIN
      x_retcode := 0;
      x_errbuf := Null;

      L_PROCESS_PHASE := 0;

      ---首先的第一步是:檢查不可以爲空的參數
      IF P_PROCESS_TABLE IS NULL OR P_PROCESS_TYPE IS NULL OR P_TRANSACTION_HEADER_ID IS NULL
      THEN
         x_errbuf := '調用PROCESS_TRANSACTION_INTERFACE的時候,必要的參數不存在,請檢查參數!';
         x_retcode := 2;
         RETURN;
      END IF;

      L_PROCESS_PHASE := 1;

     ------------Start------------
      IF P_PROCESS_TYPE = 'SUBMIT_REQUEST' THEN
        ---自動提交過賬的請求
        --Process transaction interface
        /*L_REQUEST_ID :=
         FND_REQUEST.SUBMIT_REQUEST('INV'
                                   ,'INCTCM'
                                   ,''
                                   ,TO_CHAR(SYSDATE, 'YYYY/MM/DD HH24:MI:SS')
                                   ,FALSE
                                   ,CHR(0)
                                   );*/
        ---Inventory transaction worker
        IF P_PROCESS_TABLE = 'INTERFACE' THEN
          L_REQUEST_TABLE := '1';
        ELSIF P_PROCESS_TABLE = 'TEMP' THEN
          L_REQUEST_TABLE := '2';
        ELSE
         x_errbuf := '參數P_PROCESS_TABLE('||P_PROCESS_TABLE||')無效,請檢查參數!';
         x_retcode := 2;
         RETURN;
        END IF;
        L_REQUEST_ID :=
        FND_REQUEST.SUBMIT_REQUEST( 'INV', -- application 
                                    'INCTCW', -- program 
                                    NULL, --'Inventory Transaction Worker', description optional)
                                    NULL, -- start_time (optional) 
                                    FALSE, -- sub_request 
                                    to_char(P_TRANSACTION_HEADER_ID), -- header id to process
                                    L_REQUEST_TABLE, -- 1 is the interface table 2 is temp table
                                    '', -- group to process required 
                                    '', -- source to process 
                                    chr(0)
                                    );
        L_PROCESS_PHASE := 2;
        dbms_output.PUT_LINE('自動產生的請求ID:'||L_REQUEST_ID);
        IF L_REQUEST_ID = 0 THEN
          x_errbuf := '自動提交請求失敗!';
          x_retcode := 2;
          RETURN;
        ELSE
          x_errbuf := x_errbuf||'自動提交請求成功!請求ID:'||L_REQUEST_ID;
        END IF;
        x_REQUEST_ID := L_REQUEST_ID;
        L_PROCESS_PHASE := 3;
      ELSIF P_PROCESS_TYPE = 'PROCESS_ONLINE' THEN
         IF P_PROCESS_TABLE = 'INTERFACE' THEN
             L_TIMEOUT := 100;
             -- Auto commit whenever success or failure!!but by sam.t modify:no auto commit;
             L_OUTCOME :=
                XYG_MTL_ONLINE_TRANSACTION_PUB.PROCESS_ONLINE(
                   P_TRANSACTION_HEADER_ID   => P_TRANSACTION_HEADER_ID
                  ,P_TIMEOUT                 => L_TIMEOUT
                  ,P_ERROR_CODE              => L_ERROR_CODE
                  ,P_ERROR_EXPLANATION       => L_ERROR_EXPLANATION
                );
            L_PROCESS_PHASE := 4;

             IF (L_OUTCOME = FALSE)
             THEN
                DBMS_OUTPUT.PUT_LINE('Failed to process the transaction');
                DBMS_OUTPUT.PUT_LINE('Error code: ' || L_ERROR_CODE);
                DBMS_OUTPUT.PUT_LINE('Error message: ' || L_ERROR_EXPLANATION);

                --刪除批次接口表數據
                DELETE MTL_TRANSACTION_LOTS_INTERFACE
                 WHERE TRANSACTION_INTERFACE_ID IN
                             (SELECT TRANSACTION_INTERFACE_ID
                                FROM MTL_TRANSACTIONS_INTERFACE
                               WHERE TRANSACTION_HEADER_ID =
                                        P_TRANSACTION_HEADER_ID);
                --刪除物料事務處理接口表數據
                DELETE INV.MTL_TRANSACTIONS_INTERFACE
                 WHERE TRANSACTION_HEADER_ID = P_TRANSACTION_HEADER_ID;

                x_retcode := 2;
                x_errbuf :=
                      '過賬捆綁編碼('|| P_TRANSACTION_HEADER_ID||')在INTERFACE接口表處理錯誤!錯誤信息:'
                   || CHR(10)
                   || L_ERROR_CODE
                   || '-'
                   || L_ERROR_EXPLANATION;
                ---必須做回滾!因爲可能部分數據已經丟到接口表!
                ROLLBACK;
                ----
                RETURN;
             ELSE
                NULL;
                DBMS_OUTPUT.PUT_LINE(   'INTERFACE Transaction with header id '
                                     || TO_CHAR(P_TRANSACTION_HEADER_ID)
                                     || ' has been processed successfully');
             END IF;
         ELSIF P_PROCESS_TABLE = 'TEMP' THEN
            FND_MSG_PUB.INITIALIZE;
            X_RETURN_STATUS            := FND_API.G_RET_STS_SUCCESS;
            --0 to indicate successful processing and value -1 to indicate failure processing
            L_RETURN_COUNT             :=
              INV_TXN_MANAGER_PUB.PROCESS_TRANSACTIONS
                                    (P_API_VERSION           => 1.0
                                    ,P_INIT_MSG_LIST         => FND_API.G_FALSE
                                    ,P_COMMIT                => FND_API.G_FALSE
                                    ,P_VALIDATION_LEVEL      => FND_API.G_VALID_LEVEL_FULL
                                    ,X_RETURN_STATUS         => X_RETURN_STATUS
                                    ,X_MSG_COUNT             => X_MSG_COUNT
                                    ,X_MSG_DATA              => X_MSG_DATA
                                    ,X_TRANS_COUNT           => X_TRANS_COUNT
                                    ,P_TABLE                 => 2   --1==MTI,2==MMTT
                                    ,P_HEADER_ID             => P_TRANSACTION_HEADER_ID
                                    );

            IF L_RETURN_COUNT = -1 OR X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS
            THEN
              FOR A_REC IN (SELECT MMTT.TRANSACTION_TEMP_ID
                                  ,MMTT.ERROR_CODE
                                  ,MMTT.ERROR_EXPLANATION
                              FROM MTL_MATERIAL_TRANSACTIONS_TEMP MMTT
                             WHERE MMTT.TRANSACTION_HEADER_ID = P_TRANSACTION_HEADER_ID
                               AND ROWNUM=1) --只取1個錯誤顯示出來
              LOOP
                 DBMS_OUTPUT.PUT_LINE (   'transaction_temp_id: '
                                       || A_REC.TRANSACTION_TEMP_ID
                                      );
                 DBMS_OUTPUT.PUT_LINE ('error_code: ' || A_REC.ERROR_CODE);
                 DBMS_OUTPUT.PUT_LINE ('error_explanation: '
                                       || A_REC.ERROR_EXPLANATION
                                      );
                x_errbuf :=
                      '過賬捆綁編碼('|| P_TRANSACTION_HEADER_ID||')在TEMP接口表時處理錯誤!錯誤信息:'
                   || CHR(10)
                   || A_REC.ERROR_CODE
                   || '-'
                   || A_REC.ERROR_EXPLANATION;
              END LOOP;
              x_retcode := 2;
              ---必須做回滾!因爲可能部分數據已經丟到接口表!
              ROLLBACK;
                ----
              RETURN;
            ELSE
               NULL;
                DBMS_OUTPUT.PUT_LINE(   'TEMP Transaction with header id '
                                     || TO_CHAR(P_TRANSACTION_HEADER_ID)
                                     || ' has been processed successfully');
            END IF;
         ELSE
             x_errbuf := '參數P_PROCESS_TABLE('||P_PROCESS_TABLE||')無效,請檢查參數!';
             x_retcode := 2;
             RETURN;
         END IF;
        L_PROCESS_PHASE := 5;
      ELSE
         x_errbuf := '參數P_PROCESS_TYPE('||P_PROCESS_TYPE||')無效,請檢查參數!';
         x_retcode := 2;
         RETURN;
      END IF;
      ------------End--------------

      L_PROCESS_PHASE := 6;

   EXCEPTION
      WHEN OTHERS
      THEN
         x_retcode := 2;
         x_errbuf :=
               'P_PROCESS_TYPE:'
            || P_PROCESS_TYPE
            || ' P_TRANSACTION_HEADER_ID:'
            || P_TRANSACTION_HEADER_ID
            || ' 產生交易的時候有異常錯誤!'
            || CHR(10)
            || '錯誤信息:'
            || TO_CHAR(SQLCODE)
            || '-'
            || SQLERRM
            || CHR(10)
            || '程序進度:'
            || L_PROCESS_PHASE;
   END;


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章