经过测试该API可以取消订单发运行和订单行,取消订单未测试
只测试了取消标准采购订单,BPA未测试
例子说明:
标准PO采购订单有多行采购订单,有一行数量为3000,它有三行发运行都是1000的数量。
第一次取消一行发运行:前台检查发现,发运行变成两行,数量各1000,订单行变成2000
第二次取消一行发运行:前台检查发现,发运行变成一行,数量为1000,订单行变成1000
第三次去爱下一行发运:前台检查发现,发运行消失需要用户填写发运行,订单行数量变成0,需要用户填写需求时间等必要信息。
经过该测试,说明API会取消发运行,并同时扣减对应订单号数量等相关信息,因此如果所有发运行都取消,则建议使用api将订单行也进行取消,具体代码如下:
注意:需要初始化ou、职责等环境信息。
代码建立了临时表存储需要取消的发运行信息及执行状态
-- Create table
create table PO_LINE_LOC_CANCEL_T
(
line_id NUMBER,
line_loc_id NUMBER,
status VARCHAR2(10),
message VARCHAR2(2000)
);
DECLARE
x_Return_Status VARCHAR2(10);
v_Header_Id NUMBER;
v_Line_Id NUMBER;
v_Line_Loc_Id NUMBER;
Ln_Line_Loc_Id NUMBER := 13689870;
Lv_No_Flag VARCHAR2(1) := 'N';
Lv_Message VARCHAR2(2000);
Lv_Status VARCHAR2(20);
CURSOR Cur_Loop IS
SELECT *
FROM It_Erp_r.Po_Line_Loc_Cancel_t t
ORDER BY t.Line_Id;
BEGIN
--Mo_Global.Init('PO');
Mo_Global.Init('SQLAP');
Mo_Global.Set_Policy_Context('S', 8762);
Fnd_Global.Apps_Initialize(User_Id => 16786, Resp_Id => 58560, Resp_Appl_Id => 20003);
v_Line_Loc_Id := NULL;
FOR i IN Cur_Loop LOOP
Lv_No_Flag := 'N';
Lv_Status := Fnd_Api.g_Ret_Sts_Success;
Lv_Message := NULL;
BEGIN
SELECT Plla.Po_Header_Id
,Plla.Po_Line_Id
,Decode(Sign(Plla.Quantity - Pla.Quantity), 0, NULL, Plla.Line_Location_Id)
INTO v_Header_Id
,v_Line_Id
,v_Line_Loc_Id
FROM Po_Line_Locations_All Plla
,Po_Lines_All Pla
WHERE 1 = 1
AND Plla.Po_Line_Id = Pla.Po_Line_Id
AND Plla.Line_Location_Id = i.Line_Loc_Id;
Dbms_Output.Put_Line(v_Line_Loc_Id);
EXCEPTION
WHEN OTHERS THEN
Lv_No_Flag := 'Y';
Lv_Status := Fnd_Api.g_Ret_Sts_Error;
Lv_Message := '查询数据异常:' || SQLERRM;
Dbms_Output.Put_Line(Lv_Message);
END;
IF Lv_No_Flag = 'N' THEN
Po_Document_Control_Pub.Control_Document(p_Api_Version => 1.0
, --版本信息,目前为1.0
p_Init_Msg_List => 'T'
,p_Commit => 'T'
,x_Return_Status => x_Return_Status
, -- 返回接口运行结果,S为成功,E为错误,U为未知错误
p_Doc_Type => 'PO'
,p_Doc_Subtype => 'STANDARD'
, -- 取消标准PO
p_Doc_Id => v_Header_Id
,p_Doc_Num => NULL
, -- Po_header_id和单据编码任选一个参数即可
p_Release_Id => NULL
,p_Release_Num => NULL
,p_Doc_Line_Id => v_Line_Id
,p_Doc_Line_Num => NULL
,p_Doc_Line_Loc_Id => v_Line_Loc_Id
,p_Doc_Shipment_Num => NULL
,p_Action => 'CANCEL'
, --固定值
p_Action_Date => SYSDATE
,p_Cancel_Reason => NULL
, --Cancel原因
p_Cancel_Reqs_Flag => NULL
,p_Print_Flag => NULL
,p_Note_To_Vendor => NULL
,p_Use_Gldate => 'N');
COMMIT;
IF x_Return_Status != 'S' THEN
Lv_Status := Fnd_Api.g_Ret_Sts_Error;
FOR i IN 1 .. Fnd_Msg_Pub.Count_Msg LOOP
Lv_Message := Substr(Lv_Message || Fnd_Msg_Pub.Get(p_Msg_Index => i, p_Encoded => 'F')
,1
,2000);
Dbms_Output.Put_Line(Fnd_Msg_Pub.Get(p_Msg_Index => i, p_Encoded => 'F'));
END LOOP;
END IF;
END IF;
UPDATE It_Erp_r.Po_Line_Loc_Cancel_t t
SET t.Status = Lv_Status
,t.Message = Lv_Message
WHERE t.Line_Id = i.Line_Id;
END LOOP;
END;
/