二维码

[BAPI] 外向交货单创建、拣配和发货过账

Twilight发表于 2018-09-30 15:56Twilight 最后回复于 2018-09-30 15:56 [复制链接] 4533 0

程序代码:
  1. FUNCTION zsdfm012.
  2. *"----------------------------------------------------------------------
  3. *"*"本地接口
  4. *"  IMPORTING
  5. *"     VALUE(I_INPUT) TYPE  ZSDS116 OPTIONAL
  6. *"  EXPORTING
  7. *"     VALUE(E_MESSAGE) TYPE  ZOTS001
  8. *"     VALUE(E_VBELN_VL) TYPE  VBELN_VL
  9. *"  TABLES
  10. *"      T_VBAP STRUCTURE  ZSDS111 OPTIONAL
  11. *"----------------------------------------------------------------------
  12.   FIELD-SYMBOLS:<fs_vbap> TYPE zsds111.
  13.   DATA:lv_delivery     TYPE vbeln_vl.
  14.   DATA:lv_dlv_qty      TYPE lfimg.
  15.   DATA:lt_return       TYPE TABLE OF bapiret2 WITH HEADER LINE.
  16.   DATA:lt_items TYPE TABLE OF bapidlvreftosalesorder WITH HEADER LINE.
  17.   DATA:lt_created_items TYPE TABLE OF bapidlvitemcreated WITH HEADER LINE.
  18.   DATA:BEGIN OF lt_matnr OCCURS 0,
  19.         matnr TYPE mara-matnr,
  20.       END OF lt_matnr.

  21.   IF i_input-bolnr IS INITIAL.
  22.     e_message-type = 'E'.
  23.     e_message-message = '提单号必填'.
  24.     EXIT.
  25.   ENDIF.

  26.   CHECK t_vbap[] IS NOT INITIAL.
  27.   LOOP AT t_vbap ASSIGNING <fs_vbap>.
  28.     PERFORM frm_inputsap_vbeln CHANGING <fs_vbap>-vbeln.
  29.     PERFORM frm_inputsap_vbeln CHANGING <fs_vbap>-vbeln_vl.
  30.     PERFORM frm_inputsap_vrkme CHANGING <fs_vbap>-vrkme.
  31.     lt_items-ref_doc    = <fs_vbap>-vbeln.
  32.     lt_items-ref_item   = <fs_vbap>-posnr.
  33.     lt_items-dlv_qty    = <fs_vbap>-lfimg.
  34.     lt_items-sales_unit = <fs_vbap>-vrkme.
  35.     APPEND lt_items.
  36.   ENDLOOP.

  37. *-->检查物理是否被锁定,否则生成交货单交货数量=0
  38.   SELECT matnr
  39.   INTO TABLE lt_matnr
  40.   FROM vbap
  41.   FOR ALL ENTRIES IN t_vbap
  42.   WHERE vbeln = t_vbap-vbeln
  43.     AND posnr = t_vbap-posnr.
  44.   IF lt_matnr[] IS NOT INITIAL.
  45.     SORT lt_matnr BY matnr.
  46.     DELETE ADJACENT DUPLICATES FROM lt_matnr COMPARING matnr.
  47.     LOOP AT lt_matnr.
  48.       CALL FUNCTION 'ENQUEUE_EMMARAE'
  49.         EXPORTING
  50.           mode_mara      = 'E'
  51.           mandt          = sy-mandt
  52.           matnr          = lt_matnr-matnr
  53.         EXCEPTIONS
  54.           foreign_lock   = 1
  55.           system_failure = 2
  56.           OTHERS         = 3.
  57.       IF sy-subrc <> 0.
  58.         e_message-type = 'E'.
  59.         e_message-message = '物料' && lt_matnr-matnr && '被锁定'.
  60.         EXIT.
  61.       ENDIF.
  62.     ENDLOOP.
  63.   ENDIF.

  64.   CHECK e_message-type NE 'E'.
  65.   READ TABLE t_vbap ASSIGNING <fs_vbap> INDEX 1.
  66.   IF sy-subrc = 0 AND <fs_vbap>-vbeln_vl IS INITIAL.
  67.     WAIT UP TO 1 SECONDS.
  68. *--> 创建外向交货单 MV50AFZ1
  69.     DATA:lv_zsdfm012 TYPE zsds116.

  70.     lv_zsdfm012 = i_input.
  71.     EXPORT lv_zsdfm012 TO MEMORY ID 'ABAP_ZSDFM012'.  "10/20/30/40/50

  72.     CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_SLS'
  73.       IMPORTING
  74.         delivery          = lv_delivery
  75.       TABLES
  76.         sales_order_items = lt_items
  77.         created_items     = lt_created_items
  78.         return            = lt_return.

  79.     LOOP AT lt_return WHERE type CA 'AEX'.
  80.       IF e_message-message IS INITIAL.
  81.         e_message-message = lt_return-message.
  82.       ELSE.
  83.         e_message-message = e_message-message && '/' && lt_return-message.
  84.       ENDIF.
  85.     ENDLOOP.
  86.     IF sy-subrc = 0.
  87.       e_message-type = 'E'.
  88.       CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  89. *      EXIT.
  90.     ELSE.
  91. *-->判断 交货单创建后交货数量是否 = 需要交货的数量
  92.       LOOP AT t_vbap ASSIGNING <fs_vbap>.
  93.         CLEAR:lv_dlv_qty.
  94.         LOOP AT lt_created_items WHERE ref_doc = <fs_vbap>-vbeln AND ref_item = <fs_vbap>-posnr.
  95.           lv_dlv_qty = lv_dlv_qty + lt_created_items-dlv_qty.
  96.         ENDLOOP.
  97.         IF sy-subrc = 0 AND <fs_vbap>-lfimg NE lv_dlv_qty.
  98.           e_message-type = 'E'.
  99.           e_message-message = '行项目' && lt_created_items-ref_item && '物料' && lt_created_items-material        && '库存不足!'.
  100.           EXIT.
  101.         ENDIF.
  102.       ENDLOOP.
  103.       IF e_message-type = 'E'.
  104.         CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  105.       ELSE.
  106.         CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
  107.           EXPORTING
  108.             wait = 'X'.

  109.         "提单号没有 会导致发货过账失败
  110.         PERFORM frm_delivery_update USING lv_delivery
  111.                                     CHANGING e_message
  112.                                              e_vbeln_vl.
  113.       ENDIF.
  114.     ENDIF.
  115.   ELSE.
  116.     lv_delivery = <fs_vbap>-vbeln_vl.

  117.     PERFORM frm_delivery_update USING lv_delivery
  118.                                 CHANGING e_message
  119.                                          e_vbeln_vl.

  120.   ENDIF.

  121. *解锁
  122.   LOOP AT lt_matnr.
  123.     CALL FUNCTION 'DEQUEUE_EMMARAE'
  124.       EXPORTING
  125.         mode_mara = 'E'
  126.         mandt     = sy-mandt
  127.         matnr     = lt_matnr-matnr.
  128.   ENDLOOP.

  129. ENDFUNCTION.

  130. FORM frm_inputsap_vbeln CHANGING pc_vbeln TYPE char10.
  131.   CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
  132.     EXPORTING
  133.       input  = pc_vbeln
  134.     IMPORTING
  135.       output = pc_vbeln.
  136. ENDFORM.
  137. FORM frm_inputsap_vrkme CHANGING pc_vrkme TYPE char3.
  138.   CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
  139.     EXPORTING
  140.       input          = pc_vrkme
  141.     IMPORTING
  142.       output         = pc_vrkme
  143.     EXCEPTIONS
  144.       unit_not_found = 1
  145.       OTHERS         = 2.
  146. ENDFORM.
  147. FORM frm_delivery_update USING pi_delivery TYPE vbeln_vl
  148.                           CHANGING pc_message STRUCTURE zots001
  149.                                    pc_vbeln_vl TYPE vbeln_vl.
  150.   FIELD-SYMBOLS:<fs_vbap> TYPE zsds111.

  151.   DATA:BEGIN OF lt_lips OCCURS 0,
  152.         vbeln TYPE lips-vbeln,
  153.         posnr TYPE lips-posnr,
  154.         matnr TYPE lips-matnr,
  155.         charg TYPE lips-charg,
  156.         lfimg TYPE lips-lfimg,
  157.         lgmng TYPE lips-lgmng,
  158.         lgort TYPE lips-lgort,
  159.         vrkme TYPE lips-vrkme,
  160.         meins TYPE lips-meins,
  161.         umvkz TYPE lips-umvkz,
  162.         umvkn TYPE lips-umvkn,
  163.         vgbel TYPE lips-vgbel,
  164.         vgpos TYPE lips-vgpos,
  165.         uecha TYPE lips-uecha,
  166.       END OF lt_lips.

  167.   DATA:lt_vbpok    TYPE TABLE OF vbpok WITH HEADER LINE,
  168.        lt_prot     TYPE TABLE OF prott WITH HEADER LINE,
  169.        lt_verko    TYPE TABLE OF verko WITH HEADER LINE,
  170.        lt_verpo    TYPE TABLE OF verpo WITH HEADER LINE,
  171.        lt_vbsupcon TYPE TABLE OF vbsupcon WITH HEADER LINE.

  172.   DATA:ls_vbkok TYPE vbkok.
  173.   DATA:lv_err_anyerr TYPE c,
  174.        lv_err_itmdel TYPE c,
  175.        lv_err_podupd TYPE c,
  176.        lv_err_interf TYPE c,
  177.        lv_err_goodsi TYPE c,
  178.        lv_err_finalc TYPE c.

  179. *---交货抬头数据
  180.   ls_vbkok-vbeln_vl        = pi_delivery.
  181.   ls_vbkok-vbtyp_vl        = 'J'.  " Delivery Type
  182.   ls_vbkok-wabuc           = 'X'.  " Post good issue automatically
  183.   ls_vbkok-komue           = 'X'.  " update delivery qty with picking qty
  184.   ls_vbkok-wadat_ist       = sy-datum.

  185.   SELECT vbeln
  186.          posnr
  187.          matnr
  188.          charg
  189.          lfimg
  190.          lgmng
  191.          lgort
  192.          vrkme
  193.          meins
  194.          umvkz
  195.          umvkn
  196.          vgbel
  197.          vgpos
  198.          uecha
  199. INTO TABLE lt_lips
  200. FROM lips
  201. WHERE vbeln = pi_delivery.

  202.   LOOP AT lt_lips.
  203.     lt_vbpok-vbeln_vl = lt_lips-vbeln.
  204.     lt_vbpok-posnr_vl = lt_lips-posnr.
  205.     lt_vbpok-vbeln = lt_lips-vgbel.
  206.     lt_vbpok-posnn = lt_lips-vgpos.
  207.     lt_vbpok-matnr = lt_lips-matnr.
  208.     lt_vbpok-charg = lt_lips-charg.
  209.     lt_vbpok-lgort = lt_lips-lgort.
  210.     lt_vbpok-pikmg = lt_lips-lfimg.
  211.     lt_vbpok-lgmng = lt_lips-lgmng.
  212.     lt_vbpok-vrkme = lt_lips-vrkme.
  213.     lt_vbpok-meins = lt_lips-meins.
  214.     lt_vbpok-umvkz = lt_lips-umvkz.
  215.     lt_vbpok-umvkn = lt_lips-umvkn.
  216.     APPEND lt_vbpok.
  217.   ENDLOOP.


  218. *--->更改拣配数量 & 发货过账
  219.   CALL FUNCTION 'WS_DELIVERY_UPDATE'
  220.     EXPORTING
  221.       vbkok_wa                    = ls_vbkok
  222. *     synchron                    = 'X'
  223. *     NO_MESSAGES_UPDATE          = ' '
  224.       commit                      = 'X'
  225.       delivery                    = pi_delivery
  226.       update_picking              = 'X'
  227. *     if_database_update          = '1'
  228. *     IF_NO_INIT                  = ' '
  229. *     IF_NO_READ                  = ' '
  230. *     if_error_messages_send_0    = 'X'
  231.     IMPORTING
  232.       ef_error_any_0              = lv_err_anyerr
  233.       ef_error_in_item_deletion_0 = lv_err_itmdel
  234.       ef_error_in_pod_update_0    = lv_err_podupd
  235.       ef_error_in_interface_0     = lv_err_interf
  236.       ef_error_in_goods_issue_0   = lv_err_goodsi
  237.       ef_error_in_final_check_0   = lv_err_finalc
  238. *     EF_ERROR_PARTNER_UPDATE     =
  239. *     EF_ERROR_SERNR_UPDATE       =
  240.     TABLES
  241.       vbpok_tab                   = lt_vbpok
  242.       prot                        = lt_prot
  243. *     verko_tab                   = lt_verko
  244. *     verpo_tab                   = lt_verpo
  245. *     vbsupcon_tab                = lt_vbsupcon
  246.     .

  247.   IF lv_err_anyerr IS INITIAL.
  248.     pc_message-type = 'S'.
  249.     pc_message-message = '拣配过账成功'.
  250.     pc_vbeln_vl = pi_delivery.
  251.   ELSE.
  252.     pc_message-type = 'E'.
  253.     pc_message-message = '拣配过账失败'.
  254.     pc_vbeln_vl = pi_delivery.
  255.   ENDIF.

  256. ENDFORM.
复制代码

注意交货单字段BOLNR更新,可使用WS_DELIVERY_UPDATE_2,不需要使用ABAP内存方式相关阅读:BAPI_OUTB_DELIVERY_CHANGE拆分批次报错
回复

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表