【ABAP】BAPI委外订单入库

21 篇文章 2 订阅

BAPI委外订单入库相比普通入库要多加三个字段,line_id、parent_id 、line_depth。
委外订单的上层只需要line_id,下层需要line_id、parent_id 、line_depth。
line_id唯一不重复,下层的parent_id 要等于上层的line_id,line_depth = ‘01’。
字段定义

DATA: BEGIN OF wa_bapi_header.
          INCLUDE STRUCTURE bapi2017_gm_head_01.
  DATA: END OF wa_bapi_header.

  DATA: BEGIN OF wa_goodsmvt_code.
          INCLUDE STRUCTURE bapi2017_gm_code.
  DATA: END OF wa_goodsmvt_code.

  DATA: BEGIN OF it_bapi_item OCCURS 0.
          INCLUDE STRUCTURE bapi2017_gm_item_create.
  DATA: END OF it_bapi_item.

  DATA: BEGIN OF it_cmtmsg OCCURS 0.
          INCLUDE STRUCTURE bapiret2.
  DATA: END OF it_cmtmsg.

  DATA:wa_ekpo    LIKE ekpo.
  DATA:g_mblnr    LIKE mseg-mblnr,
       g_mjahr    LIKE mseg-mjahr,
       g_bamng    LIKE ekbe-bamng,
       g_msg(100) TYPE c.

  DATA:l_line_id    TYPE mseg-line_id    VALUE '000000',
       l_parent_id  TYPE mseg-parent_id  VALUE '000000',
       l_line_depth TYPE mseg-line_depth VALUE '00'.

内表赋值,调用BAPI

 "抬头信息
*  wa_bapi_header-pstng_date = sy-datum. "凭证中的凭证日期
  wa_bapi_header-doc_date = p_budat.
  IF wa_bapi_header-doc_date IS INITIAL.
    wa_bapi_header-doc_date   = sy-datum. "凭证记帐日期
  ENDIF.
  wa_bapi_header-pstng_date = p_budat.
  IF wa_bapi_header-pstng_date IS INITIAL.
    wa_bapi_header-pstng_date   = sy-datum. "凭证记帐日期
  ENDIF.
  wa_bapi_header-header_txt = p_bktxt. "凭证抬头文本
  wa_goodsmvt_code-gm_code  = '01'. "GM CODE

  "明细信息
  LOOP AT it_out2 INTO wa_out WHERE check = 'X'." AND wtmng > 0 AND rsnum = ''.
    SELECT SINGLE *
      INTO wa_ekpo
      FROM ekpo
     WHERE ebeln = wa_out-ebeln
       AND ebelp = wa_out-ebelp.

    IF wa_out-rspos = ''.
      it_bapi_item-move_type   = '101'.
    ELSE.
      it_bapi_item-move_type   = '543'.
    ENDIF.
    it_bapi_item-plant       = wa_ekpo-werks.
    it_bapi_item-stge_loc    = wa_out-lgort.
    it_bapi_item-po_number   = wa_out-ebeln.
    it_bapi_item-po_item     = wa_out-ebelp.
    it_bapi_item-entry_qnt   = wa_out-wtmng.
    it_bapi_item-entry_uom   = wa_out-meins.
    it_bapi_item-mvt_ind     = 'B'.
    IF wa_out-rsnum NE ''.
      IF wa_out-rspos = ''.
        l_line_id            = l_line_id + 1.
        l_parent_id          = l_line_id.
        it_bapi_item-line_id = l_line_id.
      ELSE.
        it_bapi_item-parent_id  = l_parent_id.
        l_line_id               = l_line_id + 1.
        it_bapi_item-line_id    = l_line_id.
        it_bapi_item-line_depth = '01'.
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            input  = wa_out-vbeln
          IMPORTING
            output = it_bapi_item-val_sales_ord.
        it_bapi_item-val_s_ord_item = wa_out-vbelp.
      ENDIF.
    ENDIF.
    IF wa_out-wtmng <= 0.
      MESSAGE '此次收货数量必须大于0' TYPE 'S'.
      EXIT.
    ENDIF.

    "补前导零
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = wa_out-matnr
      IMPORTING
        output = wa_out-matnr.

    it_bapi_item-material    = wa_out-matnr.
    APPEND it_bapi_item.
    CLEAR:it_bapi_item,wa_ekpo.
  ENDLOOP.

  IF it_bapi_item[] IS NOT INITIAL.
    CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
      EXPORTING
        goodsmvt_header  = wa_bapi_header
        goodsmvt_code    = wa_goodsmvt_code
      IMPORTING
        materialdocument = g_mblnr
        matdocumentyear  = g_mjahr
      TABLES
        goodsmvt_item    = it_bapi_item
        return           = it_cmtmsg.

    IF g_mblnr IS NOT INITIAL.
      "提交
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
      "删除已经过账的数据
      DELETE it_out WHERE check = 'X' AND wtmng > 0 .
      CONCATENATE '物料凭证:' g_mblnr '已经创建.' INTO g_msg.
      MESSAGE g_msg TYPE 'S'.
    ELSE.
      "回滚
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      READ TABLE it_cmtmsg WITH KEY type = 'E'.
      CONCATENATE '入库过账失败!' it_cmtmsg-message INTO g_msg.
      MESSAGE  g_msg TYPE 'E'.
      EXIT.
    ENDIF.
  ENDIF.
  CLEAR:wa_bapi_header,it_bapi_item,p_bktxt.
  FREE:it_bapi_item.
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值