abap对采购订单强制置为”交货已完成“状态(BAPI_PO_CHANGE、BAPI_PO_RELEASE、BAPI_PO_RESET_RELEASE)

本文介绍了一种在SAP系统中对已批准的采购订单进行强制“交货已完成”状态修改的方法。通过先解除批准状态,然后修改状态,最后重新设置批准状态的过程,详细展示了如何使用BAPI函数实现这一操作。

项目中,需要对一些采购订单做强制“交货已完成”,如果采购订单已批准,是不能用BAPI_PO_CHANGE更改状态的,只有先除去“批准”状态 ,再“交货已完成”,然后再置为批准状态,下面是函数代码,希望对用到的兄弟有帮助。

DATA:PO_NUMBER LIKE EKKO-EBELN.

DATA:T_POITEM LIKE BAPIMEPOITEM OCCURS 0 WITH HEADER LINE.
DATA:T_POITEMX LIKE BAPIMEPOITEMX OCCURS 0 WITH HEADER LINE.
DATA:T_RETURN LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE.
DATA: LV_FRGKE LIKE EKKO-FRGKE,
LV_FRGSX LIKE EKKO-FRGSX.

DATA:RETURN TYPE TABLE OF BAPIRETURN WITH HEADER LINE.

REFRESH OUTPUT.
CLEAR OUTPUT.

SORT INPUT BY EBELN.
LOOP AT INPUT.
CLEAR T_POITEM.
REFRESH T_POITEM.
CLEAR T_POITEMX.
REFRESH T_POITEMX.

 MOVE-CORRESPONDING INPUT TO OUTPUT.

 CLEAR LV_FRGKE.
 SELECT SINGLE
        FRGKE
        FRGSX
        INTO (LV_FRGKE,LV_FRGSX)
        FROM EKKO
        WHERE EBELN = INPUT-EBELN.
  • 如果采购订单被批准了,则先取消批准,才能修改
    IF LV_FRGKE = 'R'.
    
       CALL FUNCTION 'BAPI_PO_RESET_RELEASE'
            EXPORTING
              PURCHASEORDER = INPUT-EBELN
              PO_REL_CODE   = LV_FRGSX
              USE_EXCEPTIONS = 'X'
            TABLES
              RETURN = RETURN.
       CLEAR RETURN.
       READ TABLE RETURN WITH KEY TYPE = 'E'.
       IF SY-SUBRC EQ 0.
          OUTPUT-FLAG = 'E'.
          OUTPUT-MESSAGE = RETURN-MESSAGE.
       ENDIF.
    ENDIF.
    
    IF OUTPUT-FLAG <> 'E'.
       PO_NUMBER = INPUT-EBELN.
    
       T_POITEM-PO_ITEM = INPUT-EBELP.
       T_POITEM-NO_MORE_GR = 'X'.
       APPEND T_POITEM.
       CLEAR T_POITEM.
    
       T_POITEMX-PO_ITEM = INPUT-EBELP.
       T_POITEMX-PO_ITEMX = 'X'.
       T_POITEMX-NO_MORE_GR = 'X'.
       APPEND T_POITEMX.
       CLEAR T_POITEMX.
    
    
       CALL FUNCTION 'BAPI_PO_CHANGE'
          EXPORTING
            PURCHASEORDER = PO_NUMBER
          TABLES
            RETURN        = T_RETURN
            POITEM        = T_POITEM
            POITEMX       = T_POITEMX.
         READ TABLE T_RETURN WITH KEY TYPE = 'E'.
         IF SY-SUBRC EQ 0.
           OUTPUT-FLAG = 'E'.
           OUTPUT-MESSAGE = T_RETURN-MESSAGE.
           ROLLBACK WORK.
         ELSE.
           OUTPUT-FLAG = 'S'.
           OUTPUT-MESSAGE = '交货已完成更改成功!'.
           CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
             EXPORTING
               WAIT = 'X'.
         ENDIF.
    ENDIF.
    
  • 如果采购订单被批准了,则先取消批准,修改交货已完成后,在重新设置上批准状态
    IF LV_FRGKE = 'R' AND OUTPUT-FLAG <> 'E'.
       CALL FUNCTION 'BAPI_PO_RELEASE'
            EXPORTING
              PURCHASEORDER = INPUT-EBELN
              PO_REL_CODE   = LV_FRGSX
              USE_EXCEPTIONS = 'X'
            TABLES
              RETURN = RETURN.
    ENDIF.
    
    APPEND OUTPUT.
    CLEAR OUTPUT.
    

ENDLOOP.

ABAP里按顺序执行BAPI_PO_CHANGEBAPI_REQUISITION_RESET_RELEASE,可借助以下步骤达成: ### 调用BAPI_PO_CHANGE 此函数用于更改采购订单状态。在调用之前,要对输入参数进行初始化,调用之后需检查返回的消息,从而判断操作是否成功。 ### 调用BAPI_REQUISITION_RESET_RELEASE 这个函数用于重采购申请的审批状态。同样,在调用之前要初始化输入参数,调用之后检查返回消息以判断操作是否成功。 以下是示例代码: ```abap REPORT z_call_bapis. DATA: lv_po_number TYPE bapimmpara-po_number, lv_release_code TYPE bapimmpara-po_rel_cod, lv_requisition_number TYPE bapiprhd-requisitionnumber, lv_requisition_item TYPE bapiprit-itemnumber, lt_return TYPE bapiret2 OCCURS 0 WITH HEADER LINE. * 初始化采购订单号和释放代码 lv_po_number = '123456'. lv_release_code = 'ABC'. * 调用BAPI_PO_CHANGE CALL FUNCTION 'BAPI_PO_CHANGE' EXPORTING purchaseorder = lv_po_number po_release_code = lv_release_code TABLES return = lt_return. LOOP AT lt_return WHERE type CA 'AEX'. WRITE:/ 'BAPI_PO_CHANGE 执行失败: ', lt_return-message. EXIT. ENDLOOP. * 如果BAPI_PO_CHANGE执行成功,继续调用BAPI_REQUISITION_RESET_RELEASE IF sy-subrc = 0. * 初始化采购申请号和项目号 lv_requisition_number = '789012'. lv_requisition_item = '00010'. CALL FUNCTION 'BAPI_REQUISITION_RESET_RELEASE' EXPORTING requisition_number = lv_requisition_number item_number = lv_requisition_item TABLES return = lt_return. LOOP AT lt_return WHERE type CA 'AEX'. WRITE:/ 'BAPI_REQUISITION_RESET_RELEASE 执行失败: ', lt_return-message. EXIT. ENDLOOP. ENDIF. * 提交更改 CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'. ``` 上述代码先调用BAPI_PO_CHANGE,若执行成功就接着调用BAPI_REQUISITION_RESET_RELEASE。每次调用之后都会检查返回消息,若有错误就输出错误信息。最后提交更改。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值