ABAP交货单实例

该代码段主要涉及SAP系统的交货单处理,包括创建、修改和取消操作。通过调用BAPI函数`BAPI_OUTB_DELIVERY_CHANGE`和`BAPI_OUTB_DELIVERY_CREATE_SLS`,实现交货单的更改和创建,并进行错误检查。同时,将处理结果存储到自建表中,并与外部系统进行通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

METHOD zsd_ii_si_delivery_order_in~si_delivery_order_in.
DATA:
input_hd TYPE zmmi005_dt_mesg_hd,
input_body TYPE zsd_dt_delivery_order_msgb_tab,
input_body_item TYPE zsd_dt_delivery_order_msgbd,

  gt_hxm          TYPE zsd_dt_delivery_order_item_tab,
  wa_hxm          TYPE zsd_dt_delivery_order_items.

"bapi
DATA:delivery       TYPE vbeln,
     num_deliveries TYPE bapidlvcreateheader-num_deliveries,

     lt_order_items TYPE TABLE OF bapidlvreftosalesorder,
     ls_order_items TYPE  bapidlvreftosalesorder,
     lt_return      TYPE TABLE OF bapiret2,
     ls_return      TYPE bapiret2
     .


"反馈
DATA: output_hd   TYPE zmmi005_dt_mesg_hd,
      output_body TYPE zsd_dt_hxm_res_msgbd_tab,
      output_line TYPE zsd_dt_hxm_res_msgbd.

*接口变量
DATA: go_obj TYPE REF TO zco_si_unhxm_out."接口类
DATA: out TYPE zsd_mt_hxm_res.

DATA: l_ship_point TYPE vstel,  "交货单
      vbeln        TYPE vbeln,   "销单
      ret_msg      TYPE string.  "记录反馈信息


"交货单修改
DATA:str_header_data    TYPE bapiobdlvhdrchg,
     str_header_control TYPE bapiobdlvhdrctrlchg.

DATA :item_data         TYPE bapiobdlvitemchg,
      item_body         TYPE STANDARD TABLE OF bapiobdlvitemchg,

      item_control      TYPE bapiobdlvitemctrlchg,
      item_control_body TYPE STANDARD TABLE OF bapiobdlvitemctrlchg.

DATA:
      techn_control   TYPE bapidlvcontrol.              "TECHN_CONTROL

"删除的发送产销
DATA: lo_output TYPE REF TO zsd_co_si_sap_del_ord_out,
      gt_deiv   TYPE zsd_mt_sap_del_ord.

DATA: lt_004 TYPE STANDARD TABLE OF ztsd004,
      ls_004 TYPE ztsd004.


" header和body
input_hd       = input-mt_delivery_order-msghd.
input_body     = input-mt_delivery_order-msgbd.


"反馈头信息
out-mt_hxm_res-msghd-msgid     = input_hd-msgid.
out-mt_hxm_res-msghd-tlgid     = input_hd-tlgid.
out-mt_hxm_res-msghd-tlgname   = input_hd-tlgname.
out-mt_hxm_res-msghd-dtsend    = sy-datum && sy-uzeit.
out-mt_hxm_res-msghd-sender    = 'ERP'.
out-mt_hxm_res-msghd-receiver  = input_hd-sender.

"交货单一个电文只传一条211215
LOOP AT   input_body INTO input_body_item.
  EXPORT deli = input_body_item-items TO MEMORY ID 'DELV'.

  CASE  input_body_item-cancle_flg.
    WHEN 'U'.
      delivery                      =  input_body_item-vbeln.
      delivery                      = |{ delivery ALPHA = IN }|.   "防止不带前0
      str_header_data-deliv_numb    =  delivery.
      str_header_control-deliv_numb =  delivery.


      LOOP AT input_body_item-items INTO  wa_hxm.

        item_data-deliv_numb       = delivery.
        item_data-deliv_item       = wa_hxm-posnr.
        item_data-dlv_qty          = wa_hxm-lfimg.

        item_data-fact_unit_nom    = 1.
        item_data-fact_unit_denom  = 1.


        item_control-deliv_numb = delivery.
        item_control-deliv_item = wa_hxm-posnr.

        IF wa_hxm-cancle_flg = 'U'.
          item_control-chg_delqty = 'X'.


        ELSE.
          item_control-del_item = 'X'.
          CLEAR:item_data-dlv_qty.
        ENDIF.
        APPEND item_control  TO item_control_body.
        APPEND  item_data TO item_body.


        "20220527手工执行存自建表
        ls_004-vbeln = delivery.
        ls_004-posnr = wa_hxm-posnr.
        ls_004-lgort = wa_hxm-lgort.
        ls_004-stat  = input_body_item-cancle_flg.
        APPEND ls_004 TO lt_004.
        CLEAR : item_data, item_control,ls_004.
      ENDLOOP.

      CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
        EXPORTING
          header_data    = str_header_data
          header_control = str_header_control
          delivery       = delivery
  •         techn_control  = techn_control
    
  •         TECHN_CONTROL  =
    
  •         HEADER_DATA_SPL =
    
  •         HEADER_CONTROL_SPL            =
    
  •         SENDER_SYSTEM  =
          TABLES
    
  •         HEADER_PARTNER =
    
  •         HEADER_PARTNER_ADDR           =
    
  •         HEADER_DEADLINES              =
            item_data      = item_body
            item_control   = item_control_body
    
  •         ITEM_SERIAL_NO =
    
  •         SUPPLIER_CONS_DATA            =
    
  •         EXTENSION1     =
    
  •         EXTENSION2     =
            return         = lt_return
    
  •         TOKENREFERENCE =
    
  •         ITEM_DATA_SPL  =
    
  •         COLLECTIVE_CHANGE_ITEMS       =
    
  •         NEW_ITEM_DATA  =
    
  •         NEW_ITEM_DATA_SPL             =
    
  •         NEW_ITEM_ORG   =
    
  •         ITEM_DATA_DOCU_BATCH          =
          .
    
        LOOP AT lt_return INTO ls_return WHERE type = 'E'.
          CLEAR ret_msg.
          MESSAGE ID  ls_return-id
              TYPE   'E'
              NUMBER ls_return-number
              WITH   ls_return-message_v1
                     ls_return-message_v2
                     ls_return-message_v3
                     ls_return-message_v4
              INTO   ret_msg.
    
  •          WRITE:/ ret_msg.
        ENDLOOP.
    
  •      "检查bapi
    
  •      LOOP AT  lt_return INTO ls_return  WHERE type = 'E' OR type = 'A'.
    
  •        CONCATENATE ret_msg  ls_return-message INTO ret_msg SEPARATED BY '/'.
    
  •      ENDLOOP.
    
        IF ret_msg IS INITIAL.
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            EXPORTING
              wait = 'X'.
          output_line-orderunm1  = input_body_item-bl_no.
          output_line-orderunm2  = |{ delivery ALPHA = OUT }|.
          output_line-msgcode    = 'S'.
    
          "传给产销一份
    
          SUBMIT zsd_r003  WITH  delivery = delivery
                           WITH  cancel   = input_body_item-cancle_flg    AND RETURN .
    
    
          "处理成功存自建表
          MODIFY ztsd004 FROM TABLE lt_004.
          COMMIT WORK.
    
        ELSE.
          output_line-orderunm1  = input_body_item-bl_no.
          output_line-orderunm2  = |{ delivery ALPHA = OUT }|.
          output_line-msgcode    = 'E'.
          output_line-msg        = ret_msg.
        ENDIF.
    
        APPEND output_line TO output_body .
    
    
      WHEN 'I'.
        l_ship_point = input_body_item-vstel.
        vbeln        = input_body_item-zvbeln.
        vbeln        = |{ vbeln ALPHA = IN }|.
        LOOP AT input_body_item-items INTO  wa_hxm.
    
  •    wa_hxm-zposnr = |{ wa_hxm-zposnr ALPHA = IN }|.
          ls_order_items-ref_doc  = vbeln.
          ls_order_items-ref_item = wa_hxm-zposnr.
          ls_order_items-dlv_qty  = wa_hxm-lfimg.
    
          SELECT SINGLE meins INTO ls_order_items-sales_unit FROM vbap WHERE vbeln = vbeln AND posnr = ls_order_items-ref_item.
    
          APPEND ls_order_items TO lt_order_items.
    
    
          "20220527手工执行存自建表
          ls_004-posnr = wa_hxm-posnr.
          ls_004-lgort = wa_hxm-lgort.
          ls_004-stat  = input_body_item-cancle_flg.
          APPEND ls_004 TO lt_004.
    
    
          CLEAR:  ls_order_items,ls_004.
    
        ENDLOOP.
    
        CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_SLS'
          EXPORTING
            ship_point        = l_ship_point
    
  •         DUE_DATE          = DUE_DATE
    
  •         DEBUG_FLG         =
    
  •         NO_DEQUEUE        = ' '
          IMPORTING
            delivery          = delivery
            num_deliveries    = num_deliveries
          TABLES
            sales_order_items = lt_order_items
    
  •         SERIAL_NUMBERS    =
    
  •         EXTENSION_IN      =
    
  •         DELIVERIES        =
    
  •         CREATED_ITEMS     =
    
  •         EXTENSION_OUT     =
            return            = lt_return.
    
        "检查bapi
        LOOP AT  lt_return INTO ls_return  WHERE type = 'E' OR type = 'A'.
          CONCATENATE ret_msg  ls_return-message INTO ret_msg SEPARATED BY '/'.
        ENDLOOP.
    
        IF ret_msg IS INITIAL.
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            EXPORTING
              wait = 'X'.
          output_line-orderunm1  = input_body_item-bl_no.
    
          "处理成功存自建表
          LOOP AT lt_004 ASSIGNING FIELD-SYMBOL(<fs>).
            <fs>-vbeln = delivery.
          ENDLOOP.
    
          CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
            EXPORTING
              input  = delivery
            IMPORTING
              output = delivery.
          output_line-orderunm2  = |{ delivery ALPHA = OUT }|.
          output_line-msgcode    = 'S'.
    
          "传给产销一份
    
          SUBMIT zsd_r003  WITH  delivery = delivery
                           WITH  cancel   = input_body_item-cancle_flg    AND RETURN .
    
          MODIFY ztsd004 FROM TABLE lt_004.
          COMMIT WORK.
        ELSE.
          output_line-orderunm1  = input_body_item-bl_no.
          output_line-orderunm2  = |{ delivery ALPHA = OUT }|.
          output_line-msgcode    = 'E'.
          output_line-msg        = ret_msg.
        ENDIF.
    
        APPEND output_line TO output_body .
    
      WHEN 'D'.
        delivery                      =  input_body_item-vbeln.
        delivery                      = |{ delivery ALPHA = IN }|.   "防止不带前0
        str_header_data-deliv_numb    =  delivery.
        str_header_control-deliv_numb =  delivery.
        str_header_control-dlv_del    = 'X'.
    
    
        "查新  交货单数据
        "传给产销一份
    
        SUBMIT zsd_r003  WITH  delivery = delivery
                         WITH  cancel   = input_body_item-cancle_flg  AND RETURN .
    
    
        CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
          EXPORTING
            header_data    = str_header_data
            header_control = str_header_control
            delivery       = delivery
    
  •         techn_control  = techn_control
    
  •         TECHN_CONTROL  =
    
  •         HEADER_DATA_SPL =
    
  •         HEADER_CONTROL_SPL            =
    
  •         SENDER_SYSTEM  =
          TABLES
    
  •         HEADER_PARTNER =
    
  •         HEADER_PARTNER_ADDR           =
    
  •         HEADER_DEADLINES              =
    
  •         item_data      = item_body
    
  •         item_control   = item_control_body
    
  •         ITEM_SERIAL_NO =
    
  •         SUPPLIER_CONS_DATA            =
    
  •         EXTENSION1     =
    
  •         EXTENSION2     =
            return         = lt_return
    
  •         TOKENREFERENCE =
    
  •         ITEM_DATA_SPL  =
    
  •         COLLECTIVE_CHANGE_ITEMS       =
    
  •         NEW_ITEM_DATA  =
    
  •         NEW_ITEM_DATA_SPL             =
    
  •         NEW_ITEM_ORG   =
    
  •         ITEM_DATA_DOCU_BATCH          =
          .
    
        LOOP AT lt_return INTO ls_return WHERE type = 'E'.
          CLEAR ret_msg.
          MESSAGE ID  ls_return-id
              TYPE   'E'
              NUMBER ls_return-number
              WITH   ls_return-message_v1
                     ls_return-message_v2
                     ls_return-message_v3
                     ls_return-message_v4
              INTO   ret_msg.
        ENDLOOP.
    
  •      "检查bapi
    
  •      LOOP AT  lt_return INTO ls_return  WHERE type = 'E' OR type = 'A'.
    
  •        CONCATENATE ret_msg  ls_return-message INTO ret_msg SEPARATED BY '/'.
    
  •      ENDLOOP.
    
        IF ret_msg IS INITIAL.
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            EXPORTING
              wait = 'X'.
          output_line-orderunm1  = input_body_item-bl_no.
          output_line-orderunm2  = |{ delivery ALPHA = OUT }|.
          output_line-msgcode    = 'S'.
    
          "成功后调用用发送接口
    
          IMPORT deljhd = gt_deiv FROM MEMORY ID 'DEL'.
    
          TRY .
              CREATE OBJECT lo_output.
              CALL METHOD lo_output->si_sap_del_ord_out
                EXPORTING
                  output = gt_deiv.
              COMMIT WORK AND WAIT.
            CATCH cx_ai_system_fault.
          ENDTRY.
    
        ELSE.
          output_line-orderunm1  = input_body_item-bl_no.
          output_line-orderunm2  = |{ delivery ALPHA = OUT }|.
          output_line-msgcode    = 'E'.
          output_line-msg        = ret_msg.
        ENDIF.
    
        APPEND output_line TO output_body .
    
      WHEN OTHERS.
    ENDCASE.
    
    CLEAR:input_body_item,l_ship_point,delivery,num_deliveries,lt_order_items,output_line,vbeln,gt_deiv.
    
    FREE  MEMORY ID 'DELV'.
    FREE  MEMORY ID 'DEL'.
    

    ENDLOOP.

    out-mt_hxm_res-msgbd = output_body.

    TRY .
    CREATE OBJECT go_obj.
    CALL METHOD go_obj->si_unhxm_out
    EXPORTING
    output = out.
    COMMIT WORK AND WAIT.
    CALL FUNCTION ‘ZFUN_PO_LOG’
    EXPORTING

  •       OUTPUT1 =
          output2 = out.
    CATCH cx_ai_system_fault.
    

    ENDTRY.

    ENDMETHOD.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值