Oracle EBS:ASCP 截获工作台发放的PR

工作台发放的计划单可以自动转成请购单,实际上系统的功作就是将发放的计划单通过系统自动启动PO模块中的"导入申请"这个请求,将计划单插入至po_requisitions_interface_all这个接口表中,转成已批准的PR。
http://www.dezai.cn/Blog/article.asp?id=325
因为之前作过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:将导入申请设成一个计划,定时跑此请求




Oracle EBS:ASCP 截获工作台发放的PR

 

 

方法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 ;



一点学习积累,与大家分享,欢迎指证。

你可能感兴趣的:(oracle)