在消耗了大量的时间后终于找到一个比较简单的方式,调用几个函数,虽然这几个函数底层还是bdc,但是不用自己找屏幕之类的,比较简单

参考:ABAP BAPI_ACC_DOCUMENT_POST创建会计凭证_sap bapi生成会计凭证-CSDN博客

FORM frm_import_bapi .
  DATA:
    ls_header  TYPE bapiache09,
    lt_gl      TYPE TABLE OF bapiacgl09,
    lt_curr    TYPE TABLE OF bapiaccr09,
    lt_account TYPE TABLE OF bapiacar09,
    lt_return  TYPE TABLE OF bapiret2.
  DATA:
    lv_type TYPE bapiache09-obj_type,
    lv_key  TYPE bapiache09-obj_key,
    lv_sys  TYPE bapiache09-obj_sys.

  DATA: lv_message TYPE string.

  DATA: lt_extension2 TYPE TABLE OF bapiparex,
        ls_extension2 TYPE bapiparex,
        ls_accit      TYPE zsfico_e_001.

  DATA: ls_ftpost TYPE ftpost,
        lt_ftpost TYPE TABLE OF ftpost,
        lt_fttax  TYPE TABLE OF fttax,
        lt_blntab TYPE TABLE OF blntab,
        lv_subrc  TYPE sy-subrc,
        lv_msg    TYPE bapiret2.

  DEFINE macro.
    ls_ftpost-fnam = &1.
    ls_ftpost-fval = &2.
    CONDENSE ls_ftpost-fval NO-GAPS.
    APPEND ls_ftpost TO lt_ftpost.
  END-OF-DEFINITION.

  LOOP AT gt_excel INTO gs_excel GROUP BY ( number = gs_excel-number bukrs = gs_excel-bukrs blart = gs_excel-blart bldat = gs_excel-bldat budat = gs_excel-budat month = gs_excel-month bktxt = gs_excel-bktxt waers = gs_excel-waers size = GROUP SIZE )
ASSIGNING
FIELD-SYMBOL(<group>).

    IF <group>-size > 999.
      LOOP AT GROUP <group> ASSIGNING FIELD-SYMBOL(<line>).
        <line>-tip = icon_red_light.
        <line>-message = '该凭证行项目不能超过999条'.
      ENDLOOP.
      CONTINUE.
    ENDIF.

    LOOP AT GROUP <group> ASSIGNING <line> WHERE umskz EQ 'W'.
      EXIT.
    ENDLOOP.

    " 如果凭证中包含特殊总账类型是W的,不能通过调用bapi的方式生成凭证
    IF sy-subrc EQ 0.
      " 有特殊总账类型是 W 的
      CALL FUNCTION 'POSTING_INTERFACE_START'
        EXPORTING
*         I_CLIENT           = SY-MANDT
          i_function         = 'C'
          i_group            = 'ZBDCINCLUDEW'
*         I_HOLDDATE         = ' '
          i_keep             = 'X'
*         I_MODE             = 'N'
*         I_UPDATE           = 'S'
          i_user             = sy-uname
*         I_XBDCC            = ' '
        EXCEPTIONS
          client_incorrect   = 1
          function_invalid   = 2
          group_name_missing = 3
          mode_invalid       = 4
          update_invalid     = 5
          user_invalid       = 6
          OTHERS             = 7.
      IF sy-subrc <> 0.
* Implement suitable error handling here
      ENDIF.

      " header
      ls_ftpost-stype = 'K'.        "Header indicator
      ls_ftpost-count = '001'.      "First item
      macro:
       'BKPF-BLDAT' <group>-bldat,
       'BKPF-BLART' <group>-blart,
       'BKPF-BUKRS' <group>-bukrs,
       'BKPF-BUDAT' <group>-budat,
       'BKPF-BKTXT' <group>-bktxt,
       'BKPF-MONAT' <group>-month,
       'BKPF-WAERS' <group>-waers.

      LOOP AT GROUP <group> ASSIGNING <line>.
        ls_ftpost-stype = 'P'.
        ls_ftpost-count = <line>-posnr.

        " 行项目
        macro:
                 'RF05A-NEWBS' <line>-bschl.
        IF <line>-hkont IS NOT INITIAL.
          macro:
                 'RF05A-NEWKO' <line>-hkont.
        ELSEIF <line>-kunnr IS NOT INITIAL.
          macro:
               'RF05A-NEWKO' <line>-kunnr,
               'RF05A-NEWUM' <line>-umskz.
        ENDIF.
        macro:
                 'BSEG-WRBTR'  <line>-dmbtr,
                 'BSEG-SGTXT'  <line>-sgtxt.

        IF <line>-umskz EQ 'W'.
          macro: 'BSEG-ZFBDT'  <line>-budat.
        ENDIF.
        IF <line>-aufnr IS NOT INITIAL.
          macro: 'COBL-AUFNR'  <line>-aufnr.
        ENDIF.
        IF <line>-matnr IS NOT INITIAL.
          macro: 'COBL-MATNR'  <line>-matnr.
        ENDIF.
        macro: 'BSEG-RSTGR'  <line>-rstgr.
      ENDLOOP.

      CALL FUNCTION 'POSTING_INTERFACE_DOCUMENT'
        EXPORTING
          i_tcode   = 'FB01'          "Name of t-code for Posting
          i_sgfunct = 'C'            "Batch input session
        IMPORTING
          e_subrc   = lv_subrc
          e_msgid   = lv_msg-id        "Error handling
          e_msgty   = lv_msg-type      "Error handling
          e_msgno   = lv_msg-number    "Error handling
          e_msgv1   = lv_msg-message_v1 "Error handling
          e_msgv2   = lv_msg-message_v2 "Error handling
          e_msgv3   = lv_msg-message_v3 "Error handling
          e_msgv4   = lv_msg-message_v4 "Error handling
        TABLES
          t_ftpost  = lt_ftpost        "Internal table populated in Step 2
          t_fttax   = lt_fttax        "Relevant for Tax calculation manually
          t_blntab  = lt_blntab       "Relevant only for Call Trans…
        EXCEPTIONS
          OTHERS    = 1.

      CALL FUNCTION 'POSTING_INTERFACE_END'.

      IF NOT lv_msg-type CA 'AEX' and lt_blntab is NOT INITIAL.
        LOOP AT GROUP <group> ASSIGNING <line>.
          <line>-belnr = lt_blntab[ 1 ]-belnr.
          <line>-tip = icon_green_light.
          <line>-message = '成功!'.
        ENDLOOP.
      ELSE.
        MESSAGE ID lv_msg-id TYPE lv_msg-type NUMBER lv_msg-number INTO lv_message WITH lv_msg-message_v1  lv_msg-message_v2 lv_msg-message_v3 lv_msg-message_v4.
        LOOP AT GROUP <group> ASSIGNING <line>.
          <line>-tip = icon_red_light.
          <line>-message = lv_message.
        ENDLOOP.
      ENDIF.

      CLEAR: lt_ftpost, ls_ftpost, lt_blntab, lt_fttax.

    ELSE.     " 正常通过bapi的方式创建凭证

      " 抬头
      ls_header = VALUE #(
                            comp_code  = <group>-bukrs
                            doc_type   = <group>-blart
                            doc_date   = <group>-bldat
                            pstng_date = <group>-budat
                            fis_period = <group>-month
                            header_txt = <group>-bktxt
                            username   = sy-uname
                            fisc_year  = <group>-budat(4)
      ).

      " 行
      LOOP AT GROUP <group> ASSIGNING <line>.
        IF <line>-hkont IS NOT INITIAL.
          lt_gl = VALUE #( BASE lt_gl (
                                                itemno_acc = <line>-posnr
                                                gl_account = <line>-hkont
*                                      customer   = |{ <line>-kunnr ALPHA = IN }|
                                                item_text  = <line>-sgtxt
                                                orderid    = |{ <line>-aufnr ALPHA = IN }|
                                                material   = <line>-matnr
                ) ).
        ENDIF.

        IF <line>-kunnr IS NOT INITIAL.
          lt_account = VALUE #( BASE lt_account (
                                                   itemno_acc = <line>-posnr
                                                   customer   = |{ <line>-kunnr ALPHA = IN }|
*                                                 sp_gl_ind  = <line>-umskz
          ) ).
        ENDIF.

        ls_accit = VALUE #(
                posnr = <line>-posnr
                bschl = |{ <line>-bschl ALPHA = IN }|
                rstgr = <line>-rstgr
                umskz = <line>-umskz
              ).

        ls_extension2-structure = 'ZSFICO_E_001'.
        ls_extension2+30(960) = ls_accit.
        lt_extension2 = VALUE #( BASE lt_extension2 ( ls_extension2 ) ).

        lt_curr = VALUE #( BASE lt_curr (
                                           itemno_acc = <line>-posnr
                                           amt_doccur = COND #( WHEN <line>-bschl EQ '50' OR <line>-bschl EQ '19' THEN -1 * <line>-dmbtr ELSE <line>-dmbtr )
                                           currency   = <line>-waers
        ) ).

        CLEAR: ls_accit, ls_extension2.
      ENDLOOP.

      " 4. 调用BAPI
      CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
        EXPORTING
          documentheader    = ls_header
        IMPORTING
          obj_type          = lv_type
          obj_key           = lv_key
          obj_sys           = lv_sys
        TABLES
          accountgl         = lt_gl
          currencyamount    = lt_curr
          accountreceivable = lt_account
          extension2        = lt_extension2     "增强字段
          return            = lt_return.

      " 5. 错误处理
      IF line_exists( lt_return[ type = 'E' ] ) OR line_exists( lt_return[ type = 'A' ] ) OR line_exists( lt_return[ type = 'X' ] ).
        LOOP AT lt_return INTO DATA(ls_return) WHERE type CA 'EAX'.
          lv_message &&= ls_return-message.
        ENDLOOP.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        LOOP AT GROUP <group> ASSIGNING <line>.
          <line>-tip = icon_red_light.
          <line>-message = lv_message.
        ENDLOOP.
      ELSE.
        LOOP AT GROUP <group> ASSIGNING <line>.
          <line>-tip = icon_green_light.
          <line>-message = '成功!'.
          <line>-belnr = lv_key(10).
        ENDLOOP.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = 'X'.
      ENDIF.

      CLEAR: lv_message.

    ENDIF.


  ENDLOOP.



ENDFORM.

使用起来也很简单,只需要将屏幕上对应的字段填上去就行。搞定^-^

Logo

加入社区!打开量化的大门,首批课程上线啦!

更多推荐