EBS 取消PO订单、订单行、订单发运行

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值