自动处理【库存物料交易MMT接口表】程序

来源:互联网 发布:大叔与女孩的网络电影 编辑:程序博客网 时间:2024/06/09 15:49

这个程序,根据输入的参数可以自动处理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;


 

0 0