您的位置:首页 > 其它

根据MRP建议对采购订单需求日期的建议修改采购订单需求日期

2015-12-08 11:50 190 查看
MRP跑完之后会产生计划单,然后发放成请购单,再由请购单发放成采购订单。

对于现有的采购订单,MRP会建议取消或延交。

但是MRP没找到标准的发放对采购订单需求日期进行更改,故客制修改采购订单的需求日期。

第一次没有休眠直接跑API,发现系统好慢,然后系统貌似有宕机的迹象。故诚惶诚恐。

后经测试发现,每当对一个采购订单所有的行更改完需求日期之后重新送审,会产生一个PO通信输出请求,

然后因为出现几百上千个请求,导致系统会宕机,后想了一个办法,每次跑之前检查系统是否还有PO通知输出请求在运行,

有就等待,直到运行完毕,没有就继续运行,虽然这么做会造成时间的延长,但是系统会安全,鱼与熊掌不可兼得。

另1:修改完需求日期会重新根据默认的审批层级结构送审,因为这部分不需要上级审批,所以设置系统的更改单容忍度(PO模块下更改单功能下),

在一定天数的需求日期更改可以自行重新审批,不走审批层级结构

另2:直接修改底表的需求日期,我也想过,但是经测试发现改完之后MRP不参考底表修改后的数据,所以此不可行。

未解决问题:如果需求日期更改不导致版本增加,不要求重新审批岂不美哉?

共享code如下:

CREATE OR REPLACE Package Body JWPOP002 Is

/*created by jam huang 20151201 根据MRP自动更新采购订单的需求日期*/

 procedure auto_update_need_date(Errbuf        Out Varchar2,

                                 Errcode       Out Varchar2) is

   

   CURSOR C_HEADER IS

    SELECT DISTINCT  p.organization_id,p.po_number,p.userid

      FROM jw_update_po_date_temp P;

      

   cursor c_line(v_po_number varchar2) is

    select t.rowid row_id,

           t.organization_id,

           t.po_number,

           t.revision_num,

           t.line_num,

           t.postprocessing_lead_time,

           t.new_need_date

      from jw_update_po_date_temp t

     where t.po_number = v_po_number;

    

   excep exception;

   v_num_1 number := 0 ;

   v_num_2 number := 0 ;

   i_1 number;

   j number;

   v_APPROVALS varchar2(1);

   v_rev_num number;

   v_resp_id number;

   v_error_num number := 0;

   

   v_conc_num number;

   v_conc_num_1 number;

   

   RESULT       NUMBER ;

   v_api_errors po_api_errors_rec_type;

 begin

   -------防呆--------------

   select count(*)   ---只能在周二和周五运行

     into v_num_1

     from dual

    where to_char(sysdate, 'd') not in ('3', '6');

   if v_num_1 > 0 then

     raise excep;

   end if;

   

   select count(*)

     into v_num_2  ----一天只能跑一次

     from jw_run_update_po_date_flag j

    where j.run_date = trunc(sysdate)

      and j.flag = 'Y';

   if v_num_2 > 0 then

     raise excep;

   end if;

   

   insert into jw_update_po_date_temp_his   ------备份

   select  p.*,sysdate from jw_update_po_date_temp p;

   commit;

   delete from jw_update_po_date_temp;  ------清除

   commit;

   

    INSERT INTO jw_update_po_date_temp

         (organization_id,

          po_number,

          revision_num,

          line_num,

          postprocessing_lead_time,

          new_need_date,

          creation_date,

          userid)

    select mr.organization_id,

         mipo.po_number,

         pha.revision_num,

         pla.line_num,

         msib.postprocessing_lead_time,

         min(mr.new_schedule_date) new_need_date,

         SYSDATE,

         (select fu.user_id from fnd_user fu where fu.employee_id = pha.agent_id and rownum = 1) userid

    from MRP_ITEM_PURCHASE_ORDERS mipo,

         MRP_RECOMMENDATIONS      mr,

         po_lines_all             pla,

         po_headers_all           pha,

         mtl_system_items_b       msib

    where mipo.transaction_id = mr.disposition_id

     and mr.disposition_status_type = 1

     and trunc(mr.new_schedule_date) <> trunc(mr.old_schedule_date)

     and mr.organization_id = msib.organization_id

     and mr.inventory_item_id = msib.inventory_item_id

     and mipo.line_id = pla.po_line_id

     and pla.po_header_id = pha.po_header_id

     and mipo.po_number = pha.segment1

     AND MR.ORGANIZATION_ID = 86

     --and mipo.po_number = '20151008014'

     and pha.authorization_status in ('REQUIRES REAPPROVAL','APPROVED')

    group by mr.organization_id,

            mipo.po_number,

            pha.revision_num,

            pla.line_num,

            msib.postprocessing_lead_time,

            pha.agent_id;

    COMMIT;

   

    for v_header in C_HEADER loop

    BEGIN

       select decode(v_header.organization_id,85,50643,86,50647,50643) into v_resp_id from dual;

       fnd_global.apps_initialize(user_id      => v_header.userid,

                             resp_id      => v_resp_id,

                             resp_appl_id => 201);

       MO_GLOBAL.init('SQLAP');

       i_1 := 1;                      

       select count(*) into i_1 from jw_update_po_date_temp t where t.po_number = v_header.po_number;

       j := 0 ;    

       v_APPROVALS := 'N';

       v_conc_num_1 := 0;

       LOOP

           v_conc_num_1 := v_conc_num_1 + 1;

         select count(*)

           into v_conc_num

           from FND_CONCURRENT_REQUESTS F

          WHERE F.CONCURRENT_PROGRAM_ID = 45109

            AND F.PHASE_CODE <> 'C';

          exit when (v_conc_num = 0) or (v_conc_num_1 = 20);

          dbms_lock.sleep(3);

       END LOOP;

       if v_conc_num_1 >= 20 then

         raise excep;

       end if;

       for v_line in c_line(v_header.po_number) loop

          j := j + 1;

          if j = i_1 then

            v_APPROVALS := 'Y';

          ELSE

            v_APPROVALS := 'N';

          end if;

          SELECT PHA.REVISION_NUM INTO v_rev_num FROM PO_HEADERS_ALL PHA WHERE PHA.SEGMENT1 = v_header.po_number;  

          RESULT := 0;

          RESULT := PO_CHANGE_API1_S.UPDATE_PO(X_PO_NUMBER           => v_header.po_number,

                                       X_RELEASE_NUMBER      => NULL,

                                       X_REVISION_NUMBER     => v_rev_num,

                                       X_LINE_NUMBER         => v_line.line_num,

                                       X_SHIPMENT_NUMBER     => 1,

                                       NEW_QUANTITY          => NULL,

                                       NEW_PRICE             => NULL,

                                       NEW_PROMISED_DATE     => NULL,

                                       NEW_NEED_BY_DATE      => v_line.new_need_date - v_line.postprocessing_lead_time,

                                       LAUNCH_APPROVALS_FLAG => v_APPROVALS,

                                       UPDATE_SOURCE         => NULL,

                                       VERSION               => '1.0',

                                       X_OVERRIDE_DATE       =>  NULL,

                                       X_API_ERRORS          => v_api_errors,

                                       p_BUYER_NAME          => NULL, /* Bug:2986718 */

                                       -- <INVCONV R12 START>

                                       p_secondary_quantity => NULL,

                                       p_preferred_grade    => NULL/*,

                                       -- <INVCONV R12 END>

                                       p_org_id => 81*/);

         IF (RESULT = 1) THEN

           update jw_update_po_date_temp d

              set d.flag = 'Y'

             where d.rowid = v_line.row_id;

           commit;

         else

            ROLLBACK;

           update jw_update_po_date_temp d

              set d.flag = 'E'

             where d.rowid = v_line.row_id;

           commit;

         end if;

         IF v_APPROVALS = 'Y' THEN

            dbms_lock.sleep(7);--休息7s让PO通信输出跑完

         END IF;

       end loop;

    EXCEPTION

      WHEN OTHERS THEN

        v_error_num := v_error_num + 1;

    END;

    end loop;

    if v_error_num > 0 then

       INSERT INTO jw_run_update_po_date_flag(run_date,flag,userid)

       VALUES(TRUNC(SYSDATE),'E',FND_PROFILE.VALUE('USER_ID'));

       COMMIT;

    else

       INSERT INTO jw_run_update_po_date_flag(run_date,flag,userid)

       VALUES(TRUNC(SYSDATE),'Y',FND_PROFILE.VALUE('USER_ID'));

       COMMIT;

    end if;

 exception

   when excep THEN

      ROLLBACK;

      INSERT INTO jw_run_update_po_date_flag(run_date,flag,userid)

      VALUES(TRUNC(SYSDATE),'E',FND_PROFILE.VALUE('USER_ID'));

      COMMIT;

      --RAISE_APPLICATION_ERROR(-20001,'运行失败!');

      Errcode := Sqlcode;

      Errbuf  := 'Error->' ||  Sqlerrm(Errcode);

   when others then

      rollback;

      INSERT INTO jw_run_update_po_date_flag(run_date,flag,userid)

      VALUES(TRUNC(SYSDATE),'E',FND_PROFILE.VALUE('USER_ID'));

      COMMIT;

      Errcode := Sqlcode;

      Errbuf  := 'Error->' ||  Sqlerrm(Errcode);

 end;

End JWPOP002;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息