Oracle EBS:ASCP 截获工作台发放的PR
作者:admin 日期:2010-03-20
工作台发放的计划单可以自动转成请购单,实际上系统的功作就是将发放的计划单通过系统自动启动PO模块中的"导入申请"这个请求,将计划单插入至po_requisitions_interface_all这个接口表中,转成已批准的PR。
因为之前作过lotus与ERP的接口集成(由OA下需求抛至ERP转成PR),所以思路也由大至了解了。
为什么要截取ASCP的PR呢?
如果配合PO的来源补充规则来使用ASCP的话,因为系统所采用的预测逻辑可能与我们想要的不一样。ASCP+SourcingRule+ASL跑出来PR单,是基于PO模块中的SourcingRule在很长一段时间区段内是稳定的.ASCP运算的时候是考虑整个物料的前后需求.而实际在制造业务的过程中,来源补充规则(供货比例)一般是按季度按月度来看的,不可能长时间保持不变,当然也不太可能时时在变.所以跑出来的PR单的采购需求也就会跟我们预想中的不一制.那就要自己动手,尽量把PR搞得跟我们一样的了。
这里特别要注意的时:物料最小包装量的问题.如果在物料主档中设定了最小包装量的话,ASCP在跑需求的时候就会考虑进去,如果你要对其发放的PR单再作手脚的话,这里又会考虑到最小包装量的问题.会造成需求量的倍增.所以,这里要避免考虑计算了二次最小包装量的问题了。
我这里只把截取ASCP的PR的这个trigger分享出来,因为供货比例是个敏感问题,所以不便分享.
Create or REPLACE TRIGGER DezaiCN_PR_SPLIT
BEFORE
Insert
ON po_requisitions_interface_all
FOR EACH ROW
begin
If :NEW.interface_source_code = 'MSC' THEN
--处理ASCP释放的PR
IF :NEW.org_id = 106 THEN
:NEW.interface_source_code := 'SPLIT';
END IF;
ELSIF :NEW.interface_source_code = 'SPLITED' THEN
:NEW.interface_source_code := 'MSC';
:NEW.LINE_ATTRIBUTE10 := '1';
END IF;
EXCEPTION
WHEN OTHERS THEN
NULL;
end;
至于如何从接口表po_requisitions_interface_all 中转化为已批准的PR,这里有两种方法
方法1:将导入申请设成一个计划,定时跑此请求
方法2:编写一个Procedure,将导入申请这段的代码加入
/*Insert Data to Interface*/
fnd_global.apps_initialize(50117, 1093, 201);
v_retval_req := FND_REQUEST.SUBMIT_REQUEST('PO',
'REQIMPORT',
'',
NULL,
False,
'',
'',
'ALL',
'',
'N',
'Y');
EXCEPTION
WHEN Others THEN
v_error_code := '1';
v_error_message := '提交处理事务处理接口请求失败!' || SUBSTR(SQLERRM, 1, 100);
FND_FILE.PUT_LINE(FND_FILE.LOG, v_error_message);
ROLLBACK;
RETURN;
COMMIT;
说明一下:
1.关于在oracle客户端正确取道PROFILE值的解决办法:fnd_global.APPS_INITIALIZE的说明
USER_ID : The USER_ID number
RESP_ID : The ID number of the responsibility
RESP_APPL_ID : The ID number of the application to which the responsibility belongs
首先找到三个参数的值:
user_id ,resp_id ,resp_appl_id
select user_id from fnd_user where user_name ='yourusername'
select RESPONSIBILITY_ID,APPLICATION_ID from fnd_responsibility where RESPONSIBILITY_KEY=yourrespkey ;
然后:执行
BEGIN
fnd_global.APPS_INITIALIZE(user_id => youruesr_id ,esp_id => yourresp_id,resp_appl_id =>yourresp_appl_id);
END;
这样就可以得到值正确的值了:
select fnd_profile.value('GL_SET_OF_BKS_ID') FROM DUAL;
2.关于fnd_request.submit_request的用法 网上搜索一下就可以了,我这里就不再说明了
方法一跟方法二的实质都是一样的.
3.插入po_requisitions_interface_all 表中的数据,并不是所有字段都要,只能将其中的必须字段的值插入就可以了,当然这也要看哪些字段是否会影响下一业务的发生.所以哪些字段的择取还是要看不同的业务环境及业务流程的。
查看po_requisitions_interface_all 字段
desc po_requisitions_interface_all ;
一点学习积累,与大家分享,欢迎指证。
因为之前作过lotus与ERP的接口集成(由OA下需求抛至ERP转成PR),所以思路也由大至了解了。
为什么要截取ASCP的PR呢?
如果配合PO的来源补充规则来使用ASCP的话,因为系统所采用的预测逻辑可能与我们想要的不一样。ASCP+SourcingRule+ASL跑出来PR单,是基于PO模块中的SourcingRule在很长一段时间区段内是稳定的.ASCP运算的时候是考虑整个物料的前后需求.而实际在制造业务的过程中,来源补充规则(供货比例)一般是按季度按月度来看的,不可能长时间保持不变,当然也不太可能时时在变.所以跑出来的PR单的采购需求也就会跟我们预想中的不一制.那就要自己动手,尽量把PR搞得跟我们一样的了。
这里特别要注意的时:物料最小包装量的问题.如果在物料主档中设定了最小包装量的话,ASCP在跑需求的时候就会考虑进去,如果你要对其发放的PR单再作手脚的话,这里又会考虑到最小包装量的问题.会造成需求量的倍增.所以,这里要避免考虑计算了二次最小包装量的问题了。
我这里只把截取ASCP的PR的这个trigger分享出来,因为供货比例是个敏感问题,所以不便分享.
复制内容到剪贴板 程序代码
Create or REPLACE TRIGGER DezaiCN_PR_SPLIT
BEFORE
Insert
ON po_requisitions_interface_all
FOR EACH ROW
begin
If :NEW.interface_source_code = 'MSC' THEN
--处理ASCP释放的PR
IF :NEW.org_id = 106 THEN
:NEW.interface_source_code := 'SPLIT';
END IF;
ELSIF :NEW.interface_source_code = 'SPLITED' THEN
:NEW.interface_source_code := 'MSC';
:NEW.LINE_ATTRIBUTE10 := '1';
END IF;
EXCEPTION
WHEN OTHERS THEN
NULL;
end;
至于如何从接口表po_requisitions_interface_all 中转化为已批准的PR,这里有两种方法
方法1:将导入申请设成一个计划,定时跑此请求
方法2:编写一个Procedure,将导入申请这段的代码加入
复制内容到剪贴板 程序代码
/*Insert Data to Interface*/
fnd_global.apps_initialize(50117, 1093, 201);
v_retval_req := FND_REQUEST.SUBMIT_REQUEST('PO',
'REQIMPORT',
'',
NULL,
False,
'',
'',
'ALL',
'',
'N',
'Y');
EXCEPTION
WHEN Others THEN
v_error_code := '1';
v_error_message := '提交处理事务处理接口请求失败!' || SUBSTR(SQLERRM, 1, 100);
FND_FILE.PUT_LINE(FND_FILE.LOG, v_error_message);
ROLLBACK;
RETURN;
COMMIT;
说明一下:
1.关于在oracle客户端正确取道PROFILE值的解决办法:fnd_global.APPS_INITIALIZE的说明
USER_ID : The USER_ID number
RESP_ID : The ID number of the responsibility
RESP_APPL_ID : The ID number of the application to which the responsibility belongs
首先找到三个参数的值:
user_id ,resp_id ,resp_appl_id
select user_id from fnd_user where user_name ='yourusername'
select RESPONSIBILITY_ID,APPLICATION_ID from fnd_responsibility where RESPONSIBILITY_KEY=yourrespkey ;
然后:执行
BEGIN
fnd_global.APPS_INITIALIZE(user_id => youruesr_id ,esp_id => yourresp_id,resp_appl_id =>yourresp_appl_id);
END;
这样就可以得到值正确的值了:
select fnd_profile.value('GL_SET_OF_BKS_ID') FROM DUAL;
2.关于fnd_request.submit_request的用法 网上搜索一下就可以了,我这里就不再说明了
方法一跟方法二的实质都是一样的.
3.插入po_requisitions_interface_all 表中的数据,并不是所有字段都要,只能将其中的必须字段的值插入就可以了,当然这也要看哪些字段是否会影响下一业务的发生.所以哪些字段的择取还是要看不同的业务环境及业务流程的。
查看po_requisitions_interface_all 字段
复制内容到剪贴板 程序代码
desc po_requisitions_interface_all ;
一点学习积累,与大家分享,欢迎指证。
评论: 0 | 引用: 0 | 查看次数: 7137
发表评论