经过测试该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;
 /
