自动处理【库存物料交易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
- 自动处理【库存物料交易MMT接口表】程序
- 自动处理【库存物料交易MMT接口表】程序
- 详解EBS接口开发之库存事务处理-物料批次导入
- 详解EBS接口开发之库存事务处理-物料批次导入
- 详解EBS接口开发之库存事务处理-物料批次导入
- 自动处理【任务单工序移动接口表】程序
- API实现自动处理物料搬运单
- API实现自动处理物料搬运单
- API实现自动处理物料搬运单
- SAP物料类型与物料库存信息在哪个表中
- SAP 物料预留 库存变化
- 库存表自动操作编程
- 通过接口表导入物料成本
- MM中物料的库存仓位和库存地点
- 关于SAP物料的历史库存
- 关于SAP物料的历史库存
- ABAP 仓库库存-物料拆分的算法
- 获取物料的103待检库存
- 25匹马,找出最快的3匹,但是只有5个赛道,每次比赛只能得到5匹马的速度排序,那么最少需要多少次比赛
- Tornado 与文件上传
- cocos2d-x 3.0 mac下第一步之helloworld
- 为什么cp很多小文件非常慢——对cp和rm命令的一些思考
- 编译器开发(一)
- 自动处理【库存物料交易MMT接口表】程序
- oracle中的数值函数整理
- vc++之oncreate
- Redis使用总结之与Memcached异同
- Python快速教程
- mysql数据库配置之线程参数设置
- Web自动化测试(1): Python+Behave+ Selenium Web Driver 在windows系统的安装
- 句柄和指针的区别(php资源类型)
- 程序员技术练级攻略