根据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;
对于现有的采购订单,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;
相关文章推荐
- 本人对Oracle Purchase模块的一些了解
- EBS中的采购单据状态及其控制
- 采购订单中的错误
- 采购订单最终关闭之后重新打开solution
- 当我在后台底表直接修改了采购订单需求日期之后
- 使用API取消采购订单,行,发运
- EBS --PO采购订单
- CardView的使用
- 获取本地计算机的主机名
- pulltorefresh微调
- Bypass McAfee Application Control——Code Execution
- easyui 滚动条
- Git常用命令速查
- 【Codeforces Round 271 (Div 2)E】【离散化线段树】Pillars 最长连续序列使得序列相邻的数差值至少为k
- Java 学习笔记
- ngx_http_ssl_module
- namespace详解
- perl switch 和case语句
- online_judge_1031
- Cordova 操作 webView页面中的js