ABAP销售交货单包装程序实现

        第一次接到这种开发需求,花费了大量时间查找可行的解决方案。最终让我找到了可行的办法,本文希望能给同样走了很多弯路的你一点帮助。

       大体上只需要BAPI_HU_CREATE创建HU和WS_DELIVERY_UPDATE将HU更新到交货单。

以下是亲测可行的示例代码:

FORM dr_create  TABLES lt_item STRUCTURE zssdi001_item_in
                USING ls_head TYPE zssdi001_head_in
                l_deli TYPE bapishpdelivnumb-deliv_numb
               CHANGING o_resp TYPE zsrest_out.

  CONSTANTS: cv_vbtyp_notification LIKE likp-vbtyp VALUE '7',
             cv_in_delivery        LIKE verko-object VALUE '03', " inbound
             cv_out_delivery       LIKE verko-object VALUE '01', " outbound
             cv_velin              LIKE vepo-velin VALUE '1',
             cv_pksta_packed       TYPE pksta VALUE 'C'.

  DATA:  lt_lips TYPE STANDARD TABLE OF lips.
  IF l_deli IS NOT INITIAL.
    SELECT * " posnr werks lgort meins lfimg matnr charg ...
      FROM lips
      INTO CORRESPONDING FIELDS OF TABLE lt_lips
      WHERE vbeln = l_deli.
  ENDIF.

  IF lt_lips IS INITIAL.
    o_resp-msgty = 'E'.
    o_resp-msgtx = o_resp-msgtx && ';交货单未找到,包装失败'.
    EXIT.
  ENDIF.

  DATA: lt_hu    LIKE STANDARD TABLE OF hum_rehang_hu,
        ls_hu    LIKE LINE OF lt_hu,
        lv_pksta TYPE vbup-pksta.

  DATA: lt_vekp  TYPE STANDARD TABLE OF vekp,
        lt_vepo  TYPE STANDARD TABLE OF vepo,
        lv_exidv TYPE exidv.

  DATA: ls_vbkok LIKE vbkok,
        lt_hus   LIKE STANDARD TABLE OF vekpvb,
        ls_hus   LIKE LINE OF lt_hus.

  " Handling-Unit Confirmation: Header Data
  DATA: lt_verko LIKE STANDARD TABLE OF verko,
        ls_verko TYPE verko,
        " Handling Unit Confirmation: Content Data
        lt_verpo LIKE STANDARD TABLE OF verpo,
        ls_verpo TYPE verpo,
        lt_prot  LIKE STANDARD TABLE OF prott,
        ls_prot  TYPE prott.

  FIELD-SYMBOLS: <fs_vekp> LIKE vekp,
                 <fs_vepo> LIKE vepo,
                 <fs_lips> LIKE lips.
  FIELD-SYMBOLS:<fs1> TYPE matnr,
                <fs2> TYPE vemng,
                <fs3> TYPE vemng.
  DATA:lv_str1 TYPE string,
       lv_str2 TYPE string,
       lv_str3 TYPE string.

  LOOP AT lt_lips ASSIGNING <fs_lips>.
    DO 4 TIMES.   "模板中的四个包装材料
      CLEAR:lv_str1 , lv_str2,lv_str3.
      lv_str1 = 'VHILM' && sy-index.   "包装材料
      lv_str2 = 'MENGE' && sy-index.   "包装总数
      lv_str3 = 'VEMNG' && sy-index.   "包装数量
      ASSIGN COMPONENT lv_str1 OF STRUCTURE ls_head TO <fs1>.
      ASSIGN COMPONENT lv_str2 OF STRUCTURE ls_head TO <fs2>.
      ASSIGN COMPONENT lv_str3 OF STRUCTURE ls_head TO <fs3>.

      IF <fs1> IS INITIAL.
        CONTINUE.
      ENDIF.

      IF ( <fs_lips>-lfimg IS NOT INITIAL ) AND ( <fs_lips>-lfimg > 0 ).
        " Filter already packed items
        CLEAR lv_pksta.
        SELECT SINGLE pksta
          FROM vbup
          INTO lv_pksta
          WHERE vbeln = <fs_lips>-vbeln
            AND posnr = <fs_lips>-posnr.
        IF lv_pksta EQ cv_pksta_packed  .
          CONTINUE.
        ENDIF.

        " Create HU and assign it to the delivery (no items are yet created)
        "一个材料包几次就创建几个HU
        DO ( <fs2> / <fs3> ) TIMES. 
          CLEAR ls_hu.
          "建空的HU,并赋给交货单
          PERFORM get_assigned_hu  USING  <fs_lips>
                                          <fs1>
                                          <fs3>
                                   CHANGING  ls_hu.


          IF ls_hu IS NOT INITIAL.
            APPEND ls_hu TO lt_hu.

            "创建的HU在vekp中记录
            SELECT * FROM vekp
              INTO TABLE lt_vekp
              WHERE venum = ls_hu-venum.

            LOOP AT lt_vekp ASSIGNING <fs_vekp>.
              CLEAR ls_verko.
              MOVE-CORRESPONDING <fs_vekp> TO ls_verko.
              ls_verko-ernam = sy-uname.
              ls_verko-object = cv_out_delivery.   " Outbound Delivery
              ls_verko-objkey = l_deli.     " Object to Which the HU is Assigned
              ls_verko-exidv = <fs_vekp>-exidv.
              APPEND ls_verko TO lt_verko.
            ENDLOOP.

            " 包装行
            ls_verpo-exidv_ob = ls_hu-top_hu_external.
            ls_verpo-venum    =  ls_hu-venum.
            " other lips fields
            MOVE-CORRESPONDING <fs_lips> TO ls_verpo.
            ls_verpo-tmeng =  <fs3>. "包装数量
            ls_verpo-vrkme =  <fs_lips>-meins.
            APPEND ls_verpo TO lt_verpo.

          ENDIF.
        ENDDO.
      ENDIF.
    ENDDO.

    IF ( lt_verko IS NOT INITIAL ) AND ( lt_verpo IS NOT INITIAL ).

      ls_vbkok-vbeln    = <fs_lips>-vbeln.
      ls_vbkok-vbeln_vl = <fs_lips>-vbeln.
      ls_vbkok-vbtyp_vl = 'J'.

      " Save Handling unit data, pack, update delivery
      CALL FUNCTION 'WS_DELIVERY_UPDATE'
        EXPORTING
          vbkok_wa      = ls_vbkok
          synchron      = abap_true
          commit        = abap_true
          delivery      = <fs_lips>-vbeln
          nicht_sperren = space
        TABLES
          verko_tab     = lt_verko
          verpo_tab     = lt_verpo
          prot          = lt_prot.

      IF NOT lt_prot[] IS INITIAL.
        CLEAR: ls_prot.
        READ TABLE lt_prot INDEX 1 INTO ls_prot.
        MESSAGE ID ls_prot-msgid
               TYPE ls_prot-msgty
               NUMBER ls_prot-msgno
               WITH ls_prot-msgv1 ls_prot-msgv2
                    ls_prot-msgv3 ls_prot-msgv4.
      ENDIF.
    ENDIF.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  GET_ASSIGNED_HU
*&---------------------------------------------------------------------*
*       Create empty HU and assign it to the delivery
*----------------------------------------------------------------------*
*      -->PV_VBELN     text
*      -->PV_PACK_MAT  text
*      -->PV_VBTYP     text
*----------------------------------------------------------------------*
FORM get_assigned_hu
    USING    ps_lips     TYPE lips       " delivery position data
             pv_pack_mat TYPE mara-matnr
             pv_menge    TYPE vemng
    CHANGING ps_hu       TYPE hum_rehang_hu.

  DATA: lt_return         LIKE STANDARD TABLE OF bapiret2,
        ls_return         LIKE LINE OF lt_return,
        lv_hukey          TYPE  bapihukey-hu_exid,
        ls_huheader       TYPE  bapihuheader,
        ls_headerproposal TYPE  bapihuhdrproposal,
        lt_itemproposal   TYPE STANDARD TABLE OF bapihuitmproposal,
        ls_itemproposal   LIKE LINE OF lt_itemproposal.

  DATA: cv_out_delivery1    LIKE verko-object VALUE '01'.

  " HU header proposal
  CLEAR:ls_headerproposal,ls_huheader.
  ls_headerproposal-plant    = ps_lips-werks.
  MOVE ps_lips-lgort TO ls_headerproposal-stge_loc.
  ls_headerproposal-pack_mat = pv_pack_mat.

  " creates record in VEKP (with item proposal given also in VEPO)
  CALL FUNCTION 'BAPI_HU_CREATE'
    EXPORTING
      headerproposal = ls_headerproposal
    IMPORTING
      huheader       = ls_huheader
      hukey          = lv_hukey
    TABLES
      itemsproposal  = lt_itemproposal
      return         = lt_return.

  IF lt_return[] IS INITIAL.
    CLEAR ls_return.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait   = 'X'
      IMPORTING
        return = ls_return.
  ELSE.
    PERFORM get_bapi_error TABLES lt_return.
  ENDIF.

  " Wait to avoid lock in production environment
  WAIT UP TO 1 SECONDS.

  " Set connection to the outbound delivery type (pack_mat_object)
  MOVE cv_out_delivery1 TO ls_huheader-pack_mat_object.
  MOVE ps_lips-vbeln   TO ls_huheader-pack_mat_obj_key.

  REFRESH lt_return.
  CALL FUNCTION 'BAPI_HU_CHANGE_HEADER'
    EXPORTING
      hukey     = ls_huheader-hu_exid
      huchanged = ls_huheader
    IMPORTING
      huheader  = ls_huheader
    TABLES
      return    = lt_return.
  IF lt_return[] IS INITIAL.
    CLEAR ls_return.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait   = 'X'
      IMPORTING
        return = ls_return.
  ELSE.
    PERFORM get_bapi_error TABLES lt_return.
  ENDIF.

  CLEAR ps_hu.
  " note: hu_exid + hu_id are stored in VEKP - Handling Unit - Header Table
  ps_hu-top_hu_external = ls_huheader-hu_exid.
  ps_hu-top_hu_internal = ls_huheader-hu_id.
  ps_hu-venum = ls_huheader-hu_id.
  ps_hu-rfbel = ps_lips-vbeln.
  ps_hu-rfpos = ps_lips-posnr.

ENDFORM.                    " GET_ASSIGNED_HU

*&---------------------------------------------------------------------*
*&      Form  GET_BAPI_ERROR
*&---------------------------------------------------------------------*
*       Checks errors in result table
*----------------------------------------------------------------------*
*      -->P_LT_RETURN  text
*----------------------------------------------------------------------*
FORM get_bapi_error
  TABLES pt_return STRUCTURE bapiret2.

  FIELD-SYMBOLS: <fs_return> LIKE bapiret2.

  LOOP AT pt_return ASSIGNING <fs_return>.
    IF <fs_return>-type = 'E' OR <fs_return>-type = 'A'.
      MESSAGE ID <fs_return>-id
              TYPE <fs_return>-type
              NUMBER <fs_return>-number
              WITH <fs_return>-message_v1 <fs_return>-message_v2
                   <fs_return>-message_v3 <fs_return>-message_v4.
      LEAVE SCREEN.
    ENDIF.
  ENDLOOP.

ENDFORM.                    " GET_BAPI_ERROR

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值