内向交货单创建接口,支持数据指定

FUNCTION zfm_mm_idn_create.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(IS_HEAD) TYPE  ZSMM0024
*"     VALUE(I_NO_COMMIT) TYPE  XFELD OPTIONAL
*"  EXPORTING
*"     VALUE(E_CODE) TYPE  CHAR1
*"     VALUE(E_MSG) TYPE  STRING
*"     VALUE(E_VBELN) TYPE  VBELN_VL
*"  TABLES
*"      IT_ITEM STRUCTURE  ZSMM0025 OPTIONAL
*"----------------------------------------------------------------------

  DATA:it_inb_delivery_detail TYPE TABLE OF bbp_inbd_d WITH HEADER LINE,
       return                 TYPE TABLE OF bapireturn,
       is_inb_delivery_header TYPE bbp_inbd_l.

  is_inb_delivery_header-deliv_date = is_head-eeind.

*** Local Variables
  DATA lt_vbsk LIKE vbsk OCCURS 0 WITH HEADER LINE.
  DATA lt_komdlgn LIKE komdlgn OCCURS 0 WITH HEADER LINE.
  DATA lt_vbfs LIKE vbfs OCCURS 0 WITH HEADER LINE.
  DATA lt_vbls LIKE vbls OCCURS 0 WITH HEADER LINE.
*  DATA lf_h-ind LIKE sy-tabix.         "Hilfsfeld Index
  DATA lf_v_vbeln LIKE likp-vbeln.     "From delivery Number
  DATA lf_b_vbeln LIKE likp-vbeln.     "To delivery Number
  DATA lt_prop LIKE wuebs OCCURS 100 WITH HEADER LINE.

****head
  lt_komdlgn-lfdat = is_head-eeind."交货日期

****item
  LOOP AT it_item. "into et_po_detail.

    lt_komdlgn-spe_posnr = it_item-posnr.

    CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
      EXPORTING
        input        = it_item-matnr
      IMPORTING
        output       = lt_komdlgn-matnr "物料编码
      EXCEPTIONS
        length_error = 1
        OTHERS       = 2.
    IF sy-subrc <> 0.
* Implement suitable error handling here
    ENDIF.

    lt_komdlgn-lfimg = it_item-bdmng."数量

    CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
      EXPORTING
        input          = it_item-meins
*       LANGUAGE       = SY-LANGU
      IMPORTING
        output         = lt_komdlgn-meins "基本计量单位
      EXCEPTIONS
        unit_not_found = 1
        OTHERS         = 2.
    IF sy-subrc <> 0.
* Implement suitable error handling here
    ENDIF.
    lt_komdlgn-vrkme = lt_komdlgn-meins. " 销售单位

    lt_komdlgn-vgbel = it_item-ebeln.    "采购订单号
    lt_komdlgn-vgpos = it_item-ebelp.    "采购订单行号
    lt_komdlgn-lgort = it_item-lgort.    "库存地点

    APPEND lt_komdlgn.
    CLEAR:it_item.
  ENDLOOP.

*** Code from IDOC_INPUT_DESADV1
*** Not Available in 3.1
  CALL FUNCTION 'ME_CONFIRMATION_VIA_EDI'
    TABLES
      t_kom  = lt_komdlgn
      errors = lt_prop
    EXCEPTIONS
      OTHERS = 1.

  IF sy-subrc NE 0.
    e_code = 'E'.
    e_msg = 'Error Coccured in ME_CONFIRMATION_VIA_EDI'.
    RETURN.
  ENDIF.

  LOOP AT lt_komdlgn.
* set default parameter
    lt_komdlgn-vgtyp = 'V'.
    lt_komdlgn-kzazu = 'X'.
    IF lt_komdlgn-lfart IS INITIAL.
      lt_komdlgn-lfart = 'EL'.
    ENDIF.
    MODIFY lt_komdlgn.
  ENDLOOP.

***** Create
  DATA: nrnr LIKE inri-nrrangenr.
  TABLES: tvsa.

* Sammelgangsnummer vergeben
  lt_vbsk-mandt = sy-mandt.
  lt_vbsk-ernam = sy-uname.
  lt_vbsk-erdat = sy-datum.
  lt_vbsk-uzeit = sy-uzeit.
  lt_vbsk-smart = 'L'.

  SELECT SINGLE * FROM tvsa WHERE smart = lt_vbsk-smart.
  IF sy-subrc <> 0.
*** Error Handling To be Done
*   Meldung ins Protokoll
  ENDIF.

  nrnr = tvsa-numki.
  CALL FUNCTION 'NUMBER_GET_NEXT'
    EXPORTING
      nr_range_nr = nrnr
      object      = 'RV_SAMMG'
    IMPORTING
      number      = lt_vbsk-sammg
    EXCEPTIONS
      OTHERS      = 1.
  IF sy-subrc <> 0.
*** Error Hadling TBD
*   Meldung ins Protokoll
  ENDIF.

**** Call Core Function GN_DELIVERY_CREATE.
  CALL FUNCTION 'GN_DELIVERY_CREATE'
    EXPORTING
      vbsk_i    = lt_vbsk
      no_commit = i_no_commit
    IMPORTING
      vbsk_e    = lt_vbsk
    TABLES
      xkomdlgn  = lt_komdlgn
      xvbfs     = lt_vbfs
      xvbls     = lt_vbls
    EXCEPTIONS
      OTHERS    = 1.

*** Error Handling
  IF sy-subrc NE 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
       INTO e_msg
       WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ROLLBACK WORK.
    e_code = 'E'.
    e_msg  = '内向交货单生成失败!' && e_msg.
    RETURN.

  ELSE.

*返回内容为空的确实有错
    IF lt_vbls[] IS INITIAL.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
         INTO e_msg
         WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ROLLBACK WORK.
      e_code = 'E'.
      e_msg  = '内向交货单生成失败!' && e_msg.
      RETURN.
    ENDIF.

*不为空的,判断行数,多余一行的也是有问题
    DATA(lt_vbls_l) = lt_vbls[].
    SORT lt_vbls_l BY vbeln_lif.
    DELETE ADJACENT DUPLICATES FROM lt_vbls_l COMPARING vbeln_lif.

    IF lines( lt_vbls_l ) NE 1.
      ROLLBACK WORK.
      e_code = 'E'.
      e_msg  = '当前数据会导致同时生成多张内向交货单,此情况不允许!'.
      RETURN.
    ELSE.

*其他情况,基本就是通过了
      IF i_no_commit IS NOT INITIAL."必须NO_COMMIT配合使用,不是的话默认COMMIT,NO_COMMIT需要做回滚。
        ROLLBACK WORK.
        e_code = 'S'.
        e_msg  = '测试通过!'.
        RETURN.
      ELSE.

*总算成功
        e_code = 'S'.
        e_msg  = lt_vbls_l[ 1 ]-vbeln_lif &&'创建成功!' && e_msg.
        e_vbeln = lt_vbls_l[ 1 ]-vbeln_lif.

*去掉前导0
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
          EXPORTING
            input  = e_vbeln
          IMPORTING
            output = e_vbeln.

      ENDIF.
    ENDIF.
  ENDIF.

ENDFUNCTION.


关键词: ABAP MM

网友评论

发表评论