ABAP 拆批拣货交货bapi以及实例

使用函数

BAPI_OUTB_DELIVERY_CHANGE:拆批bapi
WS_DELIVERY_UPDATE:拣货函数
BAPI_OUTB_DELIVERY_CONFIRM_DEC:过账函数

样例

先做一个测试交货单

事务码:va01 创建销售订单
事务码:vl01n 生成交货单
交货单如下

盘盈两个批次

用于拆分上一个交货单的10个物料,这里简单分一下,
用migo盘盈 两个批次,分别为4个物料和6个物料

代码样例

这里的代码根据我造的数据写死的,只能作为样例参考
而且我将几个函数分开来写了,要用到线上,赋值基本都在一起,最后再连续调用三个函数
下面的代码可以直接用于测试

"批次拆分相关变量
DATA:
  lit_header_partner   LIKE TABLE OF bapidlvpartnerchg           , "交货:合作伙伴更改
  lit_header_deadlines LIKE TABLE OF bapidlvdeadln               , "交货截止日期
  lit_item_data        LIKE TABLE OF bapiobdlvitemchg            , "更改外向交货拣配数据项目等级
  lit_item_control     LIKE TABLE OF bapiobdlvitemctrlchg        , "外向交货项目级别控制数据
  lit_ret              LIKE TABLE OF bapiret2   WITH HEADER LINE , "返回参数
  lit_item_data_spl    LIKE TABLE OF /spe/bapiobdlvitemchg       , "更改向外交货拣配数据项目等级(SPE)
  is_header_data       LIKE          bapiobdlvhdrchg             , "更改外向交货拣配数据表头等级
  is_header_control    LIKE          bapiobdlvhdrctrlchg         , "外向交货标题级别控制数据
  iv_delivery          LIKE          bapiobdlvhdrchg-deliv_numb  . "交货

DATA:
  lwa_header_partner   LIKE          bapidlvpartnerchg           , "交货:合作伙伴更改
  lwa_header_deadlines LIKE          bapidlvdeadln               , "交货截止日期
  lwa_item_data        LIKE          bapiobdlvitemchg            , "更改外向交货拣配数据项目等级
  lwa_item_control     LIKE          bapiobdlvitemctrlchg        , "外向交货项目级别控制数据
  lwa_item_data_spl    LIKE          /spe/bapiobdlvitemchg,
  lwa_cwm_item_data    LIKE          /cwm/bapiobdlvitem,
  lwa_return           LIKE          bapiret2                    . "返回参数

DATA: l_msg TYPE string.

PARAMETERS p_vbeln TYPE vbeln_vl DEFAULT '80000284'.

iv_delivery = p_vbeln. "交货单号

SELECT * FROM lips INTO TABLE @DATA(lt_lips) WHERE vbeln = @p_vbeln.

READ TABLE lt_lips INTO DATA(ls_lips) INDEX 1.

"头信息
is_header_data-deliv_numb     = p_vbeln. "交货单号
is_header_control-deliv_numb  = p_vbeln.

"修改原10行项目数量
CLEAR lwa_item_data.
lwa_item_data-deliv_numb     = p_vbeln.
lwa_item_data-deliv_item     = '10'.      "原行项目
lwa_item_data-dlv_qty        = '0'.
lwa_item_data-dlv_qty_imunit = '1'.
lwa_item_data-fact_unit_nom   = ls_lips-umvkz.       "销售数量转换成SKU的分子(因子)
lwa_item_data-fact_unit_denom = ls_lips-umvkn.       "销售数量转换为 SKU 的值(除数)
lwa_item_data-base_uom        = ls_lips-meins.    "基本单位
lwa_item_data-sales_unit      = ls_lips-vrkme.    "销售单位
APPEND lwa_item_data TO lit_item_data .

CLEAR lwa_item_control.
lwa_item_control-deliv_numb = p_vbeln.
lwa_item_control-deliv_item = '10'.       "原行项目
lwa_item_control-chg_delqty = 'X'.      "数量修改标志
APPEND lwa_item_control TO lit_item_control.


"新拆分的批次
CLEAR lwa_item_data.
lwa_item_data-deliv_numb = p_vbeln.
lwa_item_data-deliv_item = '900001'.       "拆分后的新行项目
lwa_item_data-hieraritem = '10'.             "上级行项目
lwa_item_data-batch      = '2300000001'.   "新批次
lwa_item_data-dlv_qty    = '4'.              "自己重新计算拆分后的数量,
lwa_item_data-dlv_qty_imunit = '4'.
lwa_item_data-fact_unit_nom   = ls_lips-umvkz.       "销售数量转换成SKU的分子(因子)
lwa_item_data-fact_unit_denom = ls_lips-umvkn.       "销售数量转换为 SKU 的值(除数)
lwa_item_data-base_uom        = ls_lips-meins.    "基本单位
lwa_item_data-sales_unit      = ls_lips-vrkme.    "销售单位
lwa_item_data-usehieritm      = '1'.
APPEND lwa_item_data TO lit_item_data.

CLEAR lwa_item_data.
lwa_item_data-deliv_numb = p_vbeln.
lwa_item_data-deliv_item = '900002'.    "拆分后的新行项目
lwa_item_data-hieraritem = '10'.          "上级行项目
lwa_item_data-batch      = '2300000002'."新批次
lwa_item_data-dlv_qty    = '6'.
lwa_item_data-dlv_qty_imunit = '6'.
lwa_item_data-fact_unit_nom   = ls_lips-umvkz.       "销售数量转换成SKU的分子(因子)
lwa_item_data-fact_unit_denom = ls_lips-umvkn.       "销售数量转换为 SKU 的值(除数)
lwa_item_data-base_uom        = ls_lips-meins.    "基本单位
lwa_item_data-sales_unit      = ls_lips-vrkme.    "销售单位
lwa_item_data-usehieritm      = '1'.
APPEND lwa_item_data TO lit_item_data.

CLEAR lwa_item_control.
lwa_item_control-deliv_numb = p_vbeln.
lwa_item_control-deliv_item = '900001'. "拆分后的新行项目
lwa_item_control-chg_delqty = 'X'.      "数量修改标志
APPEND lwa_item_control TO lit_item_control  .

CLEAR lwa_item_control.
lwa_item_control-deliv_numb = p_vbeln.
lwa_item_control-deliv_item = '900002'."拆分后的新行项目
lwa_item_control-chg_delqty = 'X'.     "数量修改标志
APPEND lwa_item_control TO lit_item_control  .

CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
  EXPORTING
    header_data      = is_header_data
    header_control   = is_header_control
    delivery         = iv_delivery
  TABLES
    header_partner   = lit_header_partner
    header_deadlines = lit_header_deadlines
    item_data        = lit_item_data
    item_control     = lit_item_control
    item_data_spl    = lit_item_data_spl
    return           = lit_ret.

IF lit_ret[] IS INITIAL.
  COMMIT WORK AND WAIT.
ENDIF.

LOOP AT lit_ret WHERE type = 'E'.
  CLEAR l_msg.
  MESSAGE ID  lit_ret-id
      TYPE   'E'
      NUMBER lit_ret-number
      WITH   lit_ret-message_v1
             lit_ret-message_v2
             lit_ret-message_v3
             lit_ret-message_v4
      INTO   l_msg.

  WRITE:/ l_msg.

ENDLOOP.


"拣货相关变量
DATA: ls_vbkok        TYPE vbkok.
DATA: lt_vbkok        TYPE STANDARD TABLE OF vbkok.
DATA: lt_prott        TYPE STANDARD TABLE OF prott.
DATA: ls_prott        TYPE prott.
DATA: lt_vbpok        TYPE STANDARD TABLE OF vbpok.
DATA: ls_vbpok        TYPE vbpok.
DATA: lv_flag         TYPE char01.
DATA: lv_message      TYPE string.
DATA: lv_all_message  TYPE string.

ls_vbkok-vbeln_vl = p_vbeln.
ls_vbkok-komue    = 'X'.      "交货数量 = 捡配数量
ls_vbkok-kzkodat  = 'X'.      "Picking date
ls_vbkok-kodat    = sy-datum. "Picking date

CLEAR ls_vbpok.
ls_vbpok-vbeln_vl  = p_vbeln.
ls_vbpok-posnr_vl  = '900001'.
ls_vbpok-vbeln     = '1000000111'.  " 交货单对应的销售单
ls_vbpok-posnn     = '10'.          " 销售单的行项目
ls_vbpok-pikmg     = '4'.           " 拣货数量
ls_vbpok-vrkme     = ls_lips-meins.
APPEND ls_vbpok TO lt_vbpok.

CLEAR ls_vbpok.
ls_vbpok-vbeln_vl  = p_vbeln.
ls_vbpok-posnr_vl  = '900002'.
ls_vbpok-vbeln     = '1000000111'. " 交货单对应的销售单
ls_vbpok-posnn     = '10'.         " 销售单的行项目
ls_vbpok-pikmg     = '6'.          " 拣货数量
ls_vbpok-vrkme     = ls_lips-meins.
APPEND ls_vbpok TO lt_vbpok.


"拣货
CALL FUNCTION 'WS_DELIVERY_UPDATE'
  EXPORTING
    vbkok_wa       = ls_vbkok
    delivery       = p_vbeln
    update_picking = 'X'
    synchron       = 'X'
    nicht_sperren  = 'X'         "L.S Inserted
  TABLES
    vbpok_tab      = lt_vbpok
    prot           = lt_prott
  EXCEPTIONS
    error_message  = 1
    OTHERS         = 2.

IF sy-subrc   = 0 .
  LOOP AT lt_prott INTO ls_prott WHERE msgty CA 'EAX'.
    CALL FUNCTION 'MESSAGE_TEXT_BUILD'
      EXPORTING
        msgid               = ls_prott-msgid
        msgnr               = ls_prott-msgno
        msgv1               = ls_prott-msgv1
        msgv2               = ls_prott-msgv2
        msgv3               = ls_prott-msgv3
        msgv4               = ls_prott-msgv4
      IMPORTING
        message_text_output = lv_message.
    CONCATENATE  lv_all_message lv_message  INTO  lv_all_message .
    lv_message = lv_all_message.
    lv_flag = 'X' .
    CLEAR ls_prott.
  ENDLOOP.
ELSE.
  CLEAR lv_message.
  CALL FUNCTION 'MESSAGE_TEXT_BUILD'
    EXPORTING
      msgid               = sy-msgid
      msgnr               = sy-msgno
      msgv1               = sy-msgv1
      msgv2               = sy-msgv2
      msgv3               = sy-msgv3
      msgv4               = sy-msgv4
    IMPORTING
      message_text_output = lv_all_message.
  lv_message = lv_all_message.
  lv_flag = 'X' .
ENDIF .
IF lv_flag IS  INITIAL .
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    EXPORTING
      wait = 'X'.
ELSE.
  CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

ENDIF.


"过账发货相关函数
DATA:
  lv_vbeln          TYPE bapiobdlvhdrcon-deliv_numb,
  ls_header_data    LIKE bapiobdlvhdrcon,
  ls_header_control LIKE bapiobdlvhdrctrlcon,
  lt_return         LIKE TABLE OF bapiret2 WITH HEADER LINE.

DATA:
  es_emkpf TYPE emkpf,
  t_mesg   LIKE TABLE OF mesg WITH HEADER LINE.

DATA:
  lt_header_deadlines   LIKE TABLE OF bapidlvdeadln WITH HEADER LINE,              "交货截止日期
  lt_item_data          LIKE TABLE OF bapiobdlvitemcon WITH HEADER LINE,           "交货单项目
  lt_item_control       LIKE TABLE OF bapiobdlvitemctrlcon WITH HEADER LINE,       "交货单项目控制数据
  lt_item_data_spl      LIKE TABLE OF /spe/bapiobdlvitemconf WITH HEADER LINE,     "库存地点
  lt_handle_unit_header LIKE TABLE OF bapidlvhdunhdr WITH HEADER LINE.             "工厂

"交货单过账抬头数据
lv_vbeln = p_vbeln.
ls_header_data-deliv_numb = p_vbeln.
ls_header_control-deliv_numb = p_vbeln.
ls_header_control-post_gi_flg = 'X'.                  "自动过账货物移动

lt_header_deadlines-deliv_numb = p_vbeln.
lt_header_deadlines-timezone = sy-zonlo.              "当前用户所在时区
CONVERT DATE sy-datum                        "过账日期
   INTO TIME STAMP lt_header_deadlines-timestamp_utc TIME ZONE lt_header_deadlines-timezone.
APPEND lt_header_deadlines.

CLEAR lt_item_data.
lt_item_data-deliv_numb = p_vbeln.          "交货单号
lt_item_data-deliv_item = '900001'.          "交货单项目号
lt_item_data-dlv_qty = '4'.             "实际交货数量
*    数量转换,类似500毫升可乐转换为1瓶可乐
lt_item_data-fact_unit_nom   = 1.
lt_item_data-fact_unit_denom = 1.
APPEND lt_item_data.

CLEAR lt_item_control.
lt_item_control-deliv_numb = p_vbeln.
lt_item_control-deliv_item = '900001'.
lt_item_control-chg_delqty = 'X'.                  "允许修改交货数量
lt_item_control-volume_flg = 'X'.                  "量的确认
APPEND lt_item_control.

CLEAR lt_item_data_spl.
lt_item_data_spl-deliv_numb = p_vbeln.
lt_item_data_spl-deliv_item = '900001'.
lt_item_data_spl-stge_loc = '3001'.         "库存地点
APPEND lt_item_data_spl.

CLEAR lt_item_data.
lt_item_data-deliv_numb = p_vbeln.          "交货单号
lt_item_data-deliv_item = '900002'.          "交货单项目号
lt_item_data-dlv_qty = '6'.             "实际交货数量
*    数量转换,类似500毫升可乐转换为1瓶可乐
lt_item_data-fact_unit_nom   = 1.
lt_item_data-fact_unit_denom = 1.
APPEND lt_item_data.

CLEAR lt_item_control.
lt_item_control-deliv_numb = p_vbeln.
lt_item_control-deliv_item = '900002'.
lt_item_control-chg_delqty = 'X'.                  "允许修改交货数量
lt_item_control-volume_flg = 'X'.                  "量的确认
APPEND lt_item_control.

CLEAR lt_item_data_spl.
lt_item_data_spl-deliv_numb = p_vbeln.
lt_item_data_spl-deliv_item = '900002'.
lt_item_data_spl-stge_loc = '3001'.         "库存地点
APPEND lt_item_data_spl.

CALL FUNCTION 'BAPI_OUTB_DELIVERY_CONFIRM_DEC'        "交货单过账
  EXPORTING
    header_data      = ls_header_data
    header_control   = ls_header_control
    delivery         = lv_vbeln
  TABLES
    header_deadlines = lt_header_deadlines
    item_data        = lt_item_data
    item_control     = lt_item_control
    item_data_spl    = lt_item_data_spl
    return           = lt_return.


LOOP AT lt_return WHERE type CA 'AEX'.
  MESSAGE ID lt_return-id TYPE lt_return-type NUMBER lt_return-number INTO DATA(msg)
        WITH  lt_return-message_v1 lt_return-message_v2 lt_return-message_v3 lt_return-message_v4.
  l_msg = msg && '!' && l_msg.
ENDLOOP.
IF l_msg = ''.
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    EXPORTING
      wait = 'X'.
ELSE.
  CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

ENDIF.

代码执行结果

如图可以看到,该交货单已经拆批完成,从两个批次进行交货,并且完成相应拣货以及过账发货

posted @ 2023-01-30 10:30  otowa  阅读(2654)  评论(0)    收藏  举报