SAP ABAP BAPI参照销售订单创建交货单,拣配,过账(BAPI_OUTB_DELIVERY_CREATE_SLS)

参照销售订单创建交货单BAPI:BAPI_OUTB_DELIVERY_CREATE_SLS

拣配:WS_DELIVERY_UPDATE

过账:BAPI_OUTB_DELIVERY_CONFIRM_DEC

交货单: VL01N,VL02N.VL03N 

FUNCTION ZSNSDFM_WMS001.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(INPUT) TYPE  ZSNSDSWMS001
*"  EXPORTING
*"     REFERENCE(OUTPUT) TYPE  ZSNSDSWMOUT
*"----------------------------------------------------------------------

  DATA: LS_VBKOK    TYPE VBKOK,
        LV_DELIVERY TYPE LIKP-VBELN,
        LV_VBELN    TYPE LIKP-VBELN,
        LV_ZPOSNR   TYPE LIPS-POSNR,
        LV_MENGE    TYPE EKPO-MENGE,
        LS_VBPOK    TYPE VBPOK,
        LT_VBPOK    TYPE TABLE OF VBPOK,
        LS_PROT     TYPE PROTT,
        LT_PROT     TYPE TABLE OF PROTT.

  DATA LT_RETURN TYPE BAPIRET2 .
  DATA INPUT_T TYPE ZSNSDTWMS001 .

  DATA LV_MATNR TYPE N LENGTH 18 .
  APPEND INPUT TO INPUT_T .
  LOOP AT INPUT_T INTO DATA(LS_ITEMS).
    SELECT SINGLE * FROM LIKP INTO @DATA(LS_LIKP) WHERE VBELN = @LS_ITEMS-ZDELIVERY-VBELN .

    CLEAR OUTPUT .
    OUTPUT-VBELN = LS_ITEMS-ZDELIVERY-VBELN .
    "检查发货单是否已过账
    IF LS_LIKP-WBSTK = 'C'.
      OUTPUT-ZTYPE  = 'E'.
      OUTPUT-ZMESSAGE = '交货单已过账,请检查!'.
    ENDIF.

    CHECK LS_LIKP-WBSTK NE 'C' .

    "交货单拣配
    CLEAR:LV_MENGE,LV_ZPOSNR,LV_VBELN .

    LV_VBELN  = LS_ITEMS-ZDELIVERY-VBELN .
    LV_DELIVERY = LV_VBELN.


    LOOP AT LS_ITEMS-ZITEM INTO DATA(LS_ITEM).

      LS_VBKOK = VALUE #( VBELN_VL  = LV_VBELN
                          WADAT_IST = LS_ITEMS-ZDELIVERY-WADAT_IST+0(8)
                          KZWAD     = 'X'
                          KOMUE    = 'X'
                          KZKODAT  = 'X').

      LV_DELIVERY = LV_VBELN.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          INPUT  = LS_ITEM-MATNR
        IMPORTING
          OUTPUT = LV_MATNR.

      LS_VBPOK = VALUE #( VBELN_VL = LV_VBELN
                          POSNR_VL = LS_ITEM-POSNR
                          VBELN    = LV_VBELN
                          POSNN    = LS_ITEM-POSNR
                          CHARG    = LS_ITEM-CHARG
                          LGORT    = LS_ITEM-LGORT
                          MATNR    = LV_MATNR
                          TAQUI    = 'X'
                          LIANP    = 'X'
*                          LFIMG    = LS_ITEM-LFIMG
*                          LGMNG    = LS_ITEM-LFIMG
                          PIKMG    = LS_ITEM-LFIMG )
.
      APPEND LS_VBPOK TO LT_VBPOK.
    ENDLOOP.
    TRY .
      "拣配
        CALL FUNCTION 'WS_DELIVERY_UPDATE'
          EXPORTING
            VBKOK_WA       = LS_VBKOK
            DELIVERY       = LV_DELIVERY
            UPDATE_PICKING = 'X'
*           commit         = 'X'
*        IMPORTING
*           EF_ERROR_ANY_0 = LV_XFELD
          TABLES
            VBPOK_TAB      = LT_VBPOK[]
            PROT           = LT_PROT.
      CATCH CX_ROOT INTO DATA(LO_ROOT).
    ENDTRY.

    DELETE LT_PROT WHERE MSGTY <> 'E'
                     AND MSGTY <> 'A'.
    IF LT_PROT[] IS INITIAL.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT = 'X'.
      "交货单过账
      PERFORM VL02N_POST TABLES INPUT_T
                         USING LV_VBELN
                         CHANGING OUTPUT .
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

      LOOP AT LT_PROT INTO LS_PROT.
        MESSAGE ID SY-MSGID TYPE 'S' NUMBER SY-MSGNO
              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4
              INTO DATA(LV_MSGTX).

        OUTPUT-ZMESSAGE = OUTPUT-ZMESSAGE && LV_MSGTX.
      ENDLOOP.
      OUTPUT-ZTYPE = 'E'.
    ENDIF.

  ENDLOOP.
ENDFUNCTION.
FORM VL02N_POST TABLES LT_ITEMS TYPE ZSNSDTWMS001
                USING PV_VBELN
             CHANGING OUTPUT TYPE ZSNSDSWMOUT .
  DATA: LS_HEADER_DATA    TYPE BAPIOBDLVHDRCON,
        LS_HEADER_CONTROL TYPE BAPIOBDLVHDRCTRLCON,
        LV_DELIVERY       TYPE BAPIOBDLVHDRCON-DELIV_NUMB,
        LS_RETURN         TYPE BAPIRET2,
        LT_RETURN         TYPE TABLE OF BAPIRET2,
        LS_EXTENSION2     TYPE BAPIEXT,
        LT_EXTENSION2     TYPE TABLE OF BAPIEXT.
  DATA: LT_IPK LIKE TABLE OF /SPE/BAPIOBDLVITEMCONF WITH HEADER LINE,
        LT_ITEM_DATA LIKE TABLE OF BAPIOBDLVITEMCON WITH HEADER LINE,
        LT_ITEM_CONTROL LIKE TABLE OF BAPIOBDLVITEMCTRLCON WITH HEADER LINE,
        LT_HDL LIKE TABLE OF BAPIDLVDEADLN WITH HEADER LINE.
  DATA LV_MATNR TYPE MATNR .
  DATA LT_BAPIDLVHDUNSERNO TYPE STANDARD TABLE OF /SPE/BAPIOBDLVITEM_SKU WITH HEADER LINE.
  LS_HEADER_DATA-DELIV_NUMB = PV_VBELN.

  LS_HEADER_CONTROL-DELIV_NUMB     = PV_VBELN.
  LS_HEADER_CONTROL-POST_GI_FLG    = 'X'.
  LS_HEADER_CONTROL-DELIV_DATE_FLG = 'X'.
  LS_HEADER_CONTROL-GDSI_DATE_FLG = 'X'.
  LS_HEADER_CONTROL-VOLUME_FLG    = 'X'.

  LV_DELIVERY = PV_VBELN.

  "指定库存地点
  LOOP AT LT_ITEMS-ZITEM INTO DATA(LS_ITEM).

    CLEAR LT_IPK .
    LT_IPK-DELIV_NUMB = PV_VBELN.
    LT_IPK-DELIV_ITEM = LS_ITEM-POSNR.
    LT_IPK-STGE_LOC   = LS_ITEM-LGORT.
    APPEND LT_IPK.

    LT_ITEM_DATA-fact_unit_nom = 1.
    LT_ITEM_DATA-fact_unit_denom = 1.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        INPUT  = LS_ITEM-MATNR
      IMPORTING
        OUTPUT = LT_ITEM_DATA-MATERIAL.

    LT_ITEM_DATA-DELIV_NUMB = PV_VBELN .
    LT_ITEM_DATA-DELIV_ITEM = LS_ITEM-POSNR .
    LT_ITEM_DATA-DLV_QTY    = LS_ITEM-LFIMG .
*    LT_ITEM_DATA-MATERIAL   = LV_MATNR.
    LT_ITEM_DATA-BATCH      = LS_ITEM-CHARG."批次
    APPEND LT_ITEM_DATA .


*行项目控制
    LT_ITEM_CONTROL-DELIV_NUMB = PV_VBELN..
    LT_ITEM_CONTROL-DELIV_ITEM = LS_ITEM-POSNR.
    LT_ITEM_CONTROL-CHG_DELQTY = 'X'.
    LT_ITEM_CONTROL-VOLUME_FLG = 'X'.
    APPEND LT_ITEM_CONTROL TO LT_ITEM_CONTROL.
    CLEAR LT_ITEM_CONTROL.

  ENDLOOP.
 READ TABLE LT_ITEMS INDEX 1 .

"查 HEADER_DEADLINES 说明得到下面提示
*- WSHDRLFDAT  Delivery date
*- WSHDRWADAT  Goods issue date (planned)
*- WSHDRWADTI  Goods issue date (actual)
*- WSHDRLDDAT  Loading date
*- WSHDRTDDAT  Transportation planning date
*- WSHDRKODAT  Picking date

  CLEAR LT_HDL .
  LT_HDL-DELIV_NUMB =  PV_VBELN.
  LT_HDL-TIMETYPE = 'WSHDRWADTI'. "实际过账日期
  LT_HDL-TIMESTAMP_UTC = LT_ITEMS-ZDELIVERY-WADAT_IST .
  APPEND LT_HDL.

  CLEAR LT_HDL .
  LT_HDL-DELIV_NUMB =  PV_VBELN.
  LT_HDL-TIMETYPE = 'WSHDRWADAT'. "计划日期
  LT_HDL-TIMESTAMP_UTC = LT_ITEMS-ZDELIVERY-WADAT_IST .
  APPEND LT_HDL.

  CLEAR LT_HDL .
  LT_HDL-DELIV_NUMB =  PV_VBELN.
  LT_HDL-TIMETYPE = 'WSHDRLDDAT'. "
  LT_HDL-TIMESTAMP_UTC = LT_ITEMS-ZDELIVERY-WADAT_IST .
  APPEND LT_HDL.

  CLEAR LT_HDL .
  LT_HDL-DELIV_NUMB =  PV_VBELN.
  LT_HDL-TIMETYPE = 'WSHDRTDDAT'. "
  LT_HDL-TIMESTAMP_UTC = LT_ITEMS-ZDELIVERY-WADAT_IST .
  APPEND LT_HDL.


  CLEAR: LS_EXTENSION2.
  LS_EXTENSION2-FIELD  = 'BUDAT'.
  LS_EXTENSION2-VALUE  = LT_ITEMS-ZDELIVERY-WADAT_IST.
  LS_EXTENSION2-TYPE   = 'DATS'.
  LS_EXTENSION2-LENGTH = 8.
  APPEND LS_EXTENSION2 TO LT_EXTENSION2.


  CALL FUNCTION 'BAPI_OUTB_DELIVERY_CONFIRM_DEC'
    EXPORTING
      HEADER_DATA      = LS_HEADER_DATA
      HEADER_CONTROL   = LS_HEADER_CONTROL
      DELIVERY         = LV_DELIVERY
    TABLES
      ITEM_DATA_SPL    = LT_IPK[]
      ITEM_DATA        = LT_ITEM_DATA
      ITEM_CONTROL     = LT_ITEM_CONTROL
      HEADER_DEADLINES = LT_HDL
      EXTENSION2       = LT_EXTENSION2
      RETURN           = LT_RETURN.
  DELETE LT_RETURN WHERE TYPE <> 'E'
                     AND TYPE <> 'A'.
  IF LT_RETURN IS INITIAL.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        WAIT = 'X'.

    WAIT UP TO 1 SECONDS.
    UPDATE LIKP SET VLSTK = ''
                    ANZPK = '0'
              WHERE VBELN = PV_VBELN.

    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        WAIT = 'X'.

    OUTPUT-VBELN = PV_VBELN .
    OUTPUT-ZTYPE  = 'S'.
    OUTPUT-ZMESSAGE = '交货单过账成功'.

  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    OUTPUT-VBELN = PV_VBELN .
    SORT LT_RETURN .
    DELETE ADJACENT DUPLICATES FROM LT_RETURN COMPARING ALL FIELDS .
    LOOP AT LT_RETURN INTO LS_RETURN.
      CONDENSE LS_RETURN-MESSAGE NO-GAPS .
      IF OUTPUT-ZMESSAGE IS INITIAL .
        OUTPUT-ZMESSAGE = LS_RETURN-MESSAGE .
      ELSE.
       CONCATENATE OUTPUT-ZMESSAGE LS_RETURN-MESSAGE INTO OUTPUT-ZMESSAGE SEPARATED BY ';'.
      ENDIF.
    ENDLOOP.
    OUTPUT-ZTYPE = 'E'.
  ENDIF.
ENDFORM .

### 使用 `BAPI_OUTB_DELIVERY_CREATE_STO` 创建出库交货 #### 函数模块描述 函数模块 `BAPI_OUTB_DELIVERY_CREATE_STO` 用于基于存储订单创建外向交货。此功能允许通过编程方式处理物流流程中的这一重要环节,从而实现自动化和集成化管理。 #### 参数列表 该函数模块接受多个输入参数来定义新创建的交货文档的具体属性: - **I_STORAGE_ORDER** (结构体): 存储订单数据集合,包含要转换成交货的关键信息。 - **I_PARTNER** (): 定义参与方角色及其对应的客户编号或供应商编号等信息。 - **I_SCHEDULE_LINES** (): 订单计划行项目详情,指定数量和其他调度细节。 - **I_PICKING_CONTROL** (结构体): 控制选过程的行为设置。 - **IMPORTING** 和 **EXPORTING**: 这些部分通常用来传递额外的信息给调用者或者接收返回的结果集。 #### 示例代码 下面是一个简单的ABAP程序片段展示如何调用这个BAPI并传入必要的参数: ```abap DATA: lv_return TYPE bapi2018, lt_storage_order LIKE TABLE OF likp, ls_partner LIKE bapisdelpa, lt_schedule_lines LIKE TABLE OF resb. " 填充 I_STORAGE_ORDER 表格... APPEND INITIAL LINE TO lt_storage_order ASSIGNING FIELD-SYMBOL(<fs_storage>). <fs_storage>-vbeln = 'STORAGE_ORDER_NUMBER'. " 替换为实际存储订单号 " 设置合作伙伴信息... ls_partner-partnertype = 'SP'. ls_partner-partnernumbe = 'PARTNER_ID'. " 添加到伙伴表格中... APPEND ls_partner TO it_partner. " 置时间安排线路... CREATE DATA gt_resb. FIELD-SYMBOLS <fs_resb> TYPE RESB. ASSIGN gt_resb->* TO <fs_resb>. <fs_resb>-resbk = 'RESBK_VALUE'. " 资源预订键值 APPEND <fs_resb>. CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_STO' EXPORTING i_picking_control = wa_picking_control IMPORTING et_return = lt_return TABLES t_storage_order = lt_storage_order t_partner = it_partner t_schedule_lines = lt_schedule_lines. IF NOT lt_return IS INITIAL. LOOP AT lt_return INTO DATA(ls_return). WRITE:/ ls_return-message, ls_return-type. ENDLOOP. ENDIF. ``` 上述代码展示了基本框架以及一些关键点的操作方法[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gong JX

多谢鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值