ABAP 采购订单 交货已完成BAPI处理

REPORT ztest005.

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 : return   TYPE   TABLE   OF  bapireturn  WITH   HEADER   LINE .

DATA : lv_frgke LIKE  ekko-frgke,
       lv_frgsx LIKE  ekko-frgsx.

CLEAR  t_poitem.
REFRESH  t_poitem.
CLEAR  t_poitemx.
REFRESH  t_poitemx.

CLEAR  lv_frgke.
SELECT SINGLE
  frgke
  frgsx
 INTO  (lv_frgke,lv_frgsx)
 FROM  ekko
 WHERE  ebeln =  '4500219546'.

IF  lv_frgke =  'R' . "    如果采购订单被批准了,则先取消批准,才能修改

  CALL FUNCTION 'BAPI_PO_RESET_RELEASE'
    EXPORTING
      purchaseorder  = '4500219546'
      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 .
  ENDIF .
ENDIF .

t_poitem-po_item =  '00010'.
t_poitem-no_more_gr =  'X' .
APPEND  t_poitem.
CLEAR  t_poitem.

t_poitemx-po_item =  '00010'.
t_poitemx-po_itemx =  'X' .
t_poitemx-no_more_gr =  'X' .
APPEND  t_poitemx.
CLEAR  t_poitemx.

CALL FUNCTION 'BAPI_PO_CHANGE'
  EXPORTING
    purchaseorder = '4500219546'
  TABLES
    return        = t_return
    poitem        = t_poitem
    poitemx       = t_poitemx.

READ TABLE t_return WITH KEY type  =  'E' .
IF  sy-subrc  EQ   0 .
  ROLLBACK   WORK .
ELSE .
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    EXPORTING
      wait = 'X'.
ENDIF .

*     如果采购订单被批准了,则先取消批准,修改交货已完成后,在重新设置上批准状态
IF  lv_frgke =  'R'  .
  CALL FUNCTION 'BAPI_PO_RELEASE'
    EXPORTING
      purchaseorder  = '4500219546'
      po_rel_code    = lv_frgsx
      use_exceptions = 'X'
    TABLES
      return         = return.
ENDIF .

在SAP中,可以使用BAPI `BAPI_PRODORD_COMPLETE_GOODS_MOVEMENT` 来将生产订单置为交货已完成(DLV)状态。以下是一个使用该BAPIABAP代码示例: ```abap REPORT zset_prod_order_dlv. DATA: lv_order_number TYPE afpo-aufnr, lt_return TYPE STANDARD TABLE OF bapiret2, ls_goods_movement TYPE bapi_prodord_gm_header, ls_return TYPE bapiret2. * 输入生产订单号 lv_order_number = '000000001234'. " 替换为实际的生产订单号 * 填充货物移动头数据 ls_goods_movement-order_number = lv_order_number. ls_goods_movement-pgi_ind = 'X'. " 标记为发货过账 * 调用BAPI CALL FUNCTION 'BAPI_PRODORD_COMPLETE_GOODS_MOVEMENT' EXPORTING goods_movement_header = ls_goods_movement TABLES return = lt_return. * 检查返回消息 READ TABLE lt_return INTO ls_return WITH KEY type = 'E'. IF sy-subrc = 0. WRITE:/ '处理失败,错误消息:', ls_return-message. ELSE. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'. WRITE:/ '生产订单已成功置为交货已完成(DLV)状态'. ENDIF. ``` ### 代码解释 1. **数据声明**:声明了必要的变量,包括生产订单号、返回消息表、货物移动头数据和单条返回消息结构。 2. **填充货物移动头数据**:设置生产订单号和发货过账标记。 3. **调用BAPI**:调用 `BAPI_PRODORD_COMPLETE_GOODS_MOVEMENT` 函数,传入货物移动头数据,并获取返回消息。 4. **检查返回消息**:检查返回消息中是否有错误消息,如果有则输出错误信息;如果没有,则提交事务并输出成功信息。 ### 注意事项 - 确保输入的生产订单号是有效的,并且该订单处于可以进行交货过账的状态。 - 调用BAPI后,需要调用 `BAPI_TRANSACTION_COMMIT` 来提交事务,否则更改不会保存到数据库中。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值