abap使用BAPI_ACC_DOCUMENT_POST创建会计凭证

1.首先需要做个增强,像记账码那些,才能传入,参考

https://www.cnblogs.com/zfswff/p/5702405.html,

2.如果是汇票类型的凭证,想使用该BAPI,需要另外做增强,参考

https://www.cnblogs.com/liangliang245916893/p/12888762.html

3.按照记账码区分总账/客户/供应商等,参考

https://blog.csdn.net/wangjolly/article/details/105610551

4.可以调用过账bapi前,可以使用BAPI_ACC_DOCUMENT_CHECK检查是否能成功

回到报表,填写参考事务码F-02的填写就好了,

注意,有些像销项税之类的科目,需在税项目额外增加一行,同时总账项目里的这行的金额需要计算。

CALL FUNCTION 'CALCULATE_TAX_FROM_GROSSAMOUNT'
          EXPORTING
            i_bukrs = gs_output-bukrs
            i_mwskz = gs_output-mwsk1
            i_waers = gs_output-waers "''
            i_wrbtr = gs_output-dmbtr
          TABLES
            t_mwdat = t_tax_info.

5.如果是一次性供应商,则写在传入位置。

*一次性供应商
      IF gs_output-name1 NE '' OR gs_output-ort01 NE ''.
        ls_customer-name = gs_output-name1.
        ls_customer-city = gs_output-ort01.
        ls_customer-country 'CN'.
      ENDIF.

6.如果需要预制凭证,而不是直接生成凭证,需要在给记账码做增强的位置(第1点)加上

READ TABLE c_extension2 INTO wa_extension WITH KEY structure 'BAPI-PARK'.
    IF sy-subrc 0.
      MOVE '2' TO c_acchd-status_new.
      DELETE c_extension2 INDEX sy-tabix.
    ENDIF.

然后在代码加上

  ls_exten-structure 'BAPI-PARK'.
    APPEND ls_exten TO lt_exten.
    CLEAR ls_exten.

LT_exten在BAPI的位置

    CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
      EXPORTING
        documentheader    = ls_head
        customercpd       = ls_customer "一次性供应商
      IMPORTING
        obj_key           = lv_key
      TABLES
        accountgl         = lt_glitem "总账
        accountreceivable = lt_cust "客户
        accountpayable    = lt_vendor "供应商
        accounttax        = lt_tax "税
        currencyamount    = lt_curren
        extension1        = lt_extension
        criteria          = lt_crite
        return            = lt_return
        extension2        = lt_exten.

 传入表结构:

 

参考代码

FUNCTION zbpm_rfc017.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(P_SYSTEM) TYPE  CHAR4 DEFAULT 'BPM'
*"     VALUE(P_UNAME) TYPE  UNAME DEFAULT SY-UNAME
*"     VALUE(P_NAME1) TYPE  CHAR12 OPTIONAL
*"  TABLES
*"      IT_ZS007 STRUCTURE  ZFICOS007 OPTIONAL
*"      IT_ZS0072 STRUCTURE  ZFICOS007 OPTIONAL
*"----------------------------------------------------------------------

  DATA: ls_head      LIKE bapiache09, "抬头
        lt_glitem    LIKE TABLE OF bapiacgl09, "总账
        ls_glitem    LIKE bapiacgl09,
        lt_cust      LIKE TABLE OF bapiacar09, "客户
        ls_cust      LIKE bapiacar09,
        lt_vendor    LIKE TABLE OF bapiacap09, "供应商
        ls_vendor    LIKE bapiacap09,
        lt_tax       LIKE TABLE OF bapiactx09, "
        ls_tax       LIKE bapiactx09,
        lt_curren    LIKE TABLE OF bapiaccr09, "货币金额
        ls_curren    LIKE bapiaccr09,
        lt_return    LIKE TABLE OF bapiret2,
        ls_return    LIKE bapiret2,
        lt_exten     LIKE TABLE OF bapiparex,
        ls_exten     LIKE bapiparex,
        lt_extension LIKE TABLE OF bapiacextc,
        ls_extension LIKE bapiacextc,
        lv_key       LIKE bapiache09-obj_key,
        ls_customer  LIKE bapiacpa09,
        lt_crite     LIKE TABLE OF bapiackec9,
        ls_crite     LIKE bapiackec9.
  DATA: gs_output  LIKE zficos007,
*        it_zs0072  LIKE TABLE OF zficos007,
        gs_output2 LIKE zficos007.
  DATA: wa_zexten      LIKE zficos039.
  DATA: lv_tabix  LIKE sy-tabix,
        lv_item   LIKE sy-tabix,
        p_taxrate LIKE vbak-netwr,
        lv_tabix2 TYPE sy-tabix,
        lv_meins  LIKE t006-msehi.
  DATA: t_tax_info LIKE TABLE OF rtax1u15.

*保存 传输数据
  CREATE OBJECT json_ser
    EXPORTING
      data = it_zs007[].
  CALL METHOD json_ser->serialize.
  CALL METHOD json_ser->get_data
    RECEIVING
      rval = jsonstr.

  ls_zrfc_logs-funcname   = 'ZBPM_RFC017'.
  ls_zrfc_logs-zsystem    = p_system.
  ls_zrfc_logs-uname      = p_uname.
  ls_zrfc_logs-zname1     = p_name1.
  ls_zrfc_logs-erdat      = sy-datum.
  ls_zrfc_logs-uzeit      = sy-uzeit.
*  ls_zrfc_logs-ep_type    = ep_type.
*  ls_zrfc_logs-ep_message = ep_message.
  ls_zrfc_logs-jsonstr1   = jsonstr.

  MODIFY zrfc_logs FROM ls_zrfc_logs.


  SELECT *
    INTO TABLE @DATA(lt_zppt011b)
    FROM zppt011b.
  SORT lt_zppt011b[] BY zbh.


  LOOP AT it_zs007 ASSIGNING FIELD-SYMBOL(<ls_output>).
    ADD 1 TO lv_tabix2 .
    <ls_output>-zpaixu = lv_tabix2.
    IF <ls_output>-budat CA '.-' OR <ls_output>-bldat CA '.-'.
      <ls_output>-message = '日期格式请使用YYYYMMDD'.
      <ls_output>-ztype = 'E'.
    ENDIF.

*<ls_output>-hkont =
    READ TABLE lt_zppt011b INTO DATA(ls_zppt011b) WITH KEY zbh = <ls_output>-hkont BINARY SEARCH.
    IF sy-subrc EQ 0.
      <ls_output>-hkont = ls_zppt011b-hkont.
    ENDIF.

    <ls_output>-hkont = |{ <ls_output>-hkont ALPHA = IN }|.
    <ls_output>-ebeln = |{ <ls_output>-ebeln ALPHA = IN }|.
    <ls_output>-ebelp = |{ <ls_output>-ebelp ALPHA = IN }|.

    APPEND <ls_output> TO it_zs0072[].
  ENDLOOP.
  SORT it_zs0072[] BY zxuhao zpaixu.
  DELETE ADJACENT DUPLICATES FROM it_zs0072[] COMPARING zxuhao.

  LOOP AT it_zs0072 INTO gs_output2 WHERE ztype EQ ''.
    "抬头
    ls_head-username   = sy-uname.
    ls_head-header_txt = gs_output2-bktxt.  "抬头文本
    ls_head-comp_code  = gs_output2-bukrs.  "公司代码
    ls_head-doc_date   = sy-datum."gs_output2-bldat.  "凭证日期
    ls_head-pstng_date = gs_output2-budat.  "过账日期
    ls_head-doc_type   = gs_output2-blart.        "凭证类型
    ls_head-bus_act    = 'RFBU'.      "业务事务
    ls_head-fis_period = gs_output2-budat+4(2).        "会计期间
    ls_head-ref_doc_no = ''.          "参考凭证编号
    CLEAR: lv_item.
    LOOP AT it_zs007 INTO gs_output WHERE zxuhao EQ gs_output2-zxuhao.
      ADD 10 TO lv_item.
*总账
      CASE gs_output-bschl.
        WHEN '40' OR '50' OR '80' OR '90' OR '81' OR '91'
           OR '83' OR '93' OR '84' OR '94' OR '85' OR '95'
           OR '86' OR '96'.
*          IF gs_output-mwsk1 IS INITIAL." gs_output-hkont NE '0066010001'.
          ls_glitem-itemno_acc     = lv_item.            "行项目编号
          ls_glitem-gl_account     = gs_output-hkont.    "科目号
          ls_glitem-costcenter     = gs_output-kostl.    "成本中心
          IF gs_output-kostl IS NOT INITIAL.
*            IF gs_output-fkber IS INITIAL.
            SELECT SINGLE func_area INTO ls_glitem-func_area FROM csks WHERE kostl EQ gs_output-kostl.
*            ENDIF.
*            ls_glitem-func_area = gs_output-fkber.
          ENDIF.
          ls_glitem-tax_code       = gs_output-mwsk1.    "税码
          ls_glitem-alloc_nmbr     = gs_output-zuonr.    "分配编号
          ls_glitem-item_text      = gs_output-sgtxt.    "项目文本
          ls_glitem-orderid        = gs_output-aufnr.    "销售订单号
          ls_glitem-tax_code       = gs_output-mwsk1. "税码
          ls_glitem-material       = gs_output-matnr.
          ls_glitem-ref_key_1      = gs_output-xref1.
          ls_glitem-ref_key_2      = gs_output-xref2.
          ls_glitem-plant          = gs_output-werks. "工厂
          ls_glitem-quantity       = gs_output-menge. "数量
          ls_glitem-orderid        = gs_output-aufnr. "订单号
          ls_glitem-value_date     = gs_output-valut. "起息日
          ls_glitem-po_number      = gs_output-ebeln. "采购订单
          ls_glitem-po_item        = gs_output-ebelp. "采购订单行项目

          IF NOT gs_output-meins IS INITIAL.
            CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
              EXPORTING
                input          = gs_output-meins
*               LANGUAGE       = SY-LANGU
              IMPORTING
                output         = lv_meins
              EXCEPTIONS
                unit_not_found = 1
                OTHERS         = 2.
            ls_glitem-base_uom       = lv_meins. "基本计量单位
          ENDIF.

*          ls_glitem-wbs_element    = ''.              "WBS元素
          APPEND ls_glitem TO lt_glitem.
          CLEAR ls_glitem.
*          ENDIF.
        WHEN OTHERS.
      ENDCASE.

*客户
      IF gs_output-bschl+0(1) EQ '0' OR gs_output-bschl+0(1) EQ '1'.
        ls_cust-itemno_acc = lv_item.
*        ls_cust-customer   = gs_output-kunnr."客户
*        ls_cust-gl_account = gs_output-hkont."科目
        ls_cust-customer   = gs_output-hkont.
        ls_cust-ref_key_1  = gs_output-xref1.
        ls_cust-ref_key_2  = gs_output-xref2.
        ls_cust-sp_gl_ind  = gs_output-umskz. "特殊总账标识
        ls_cust-pmnttrms   = gs_output-zterm.
        ls_cust-alloc_nmbr = gs_output-zuonr.
        IF gs_output-zfbdt IS NOT INITIAL.
          ls_cust-bline_date = gs_output-zfbdt.   "付款基准日期
        ELSE.
          ls_cust-bline_date = gs_output-budat.   "付款基准日期
        ENDIF.
*        ls_cust-bline_date = gs_output-budat.
        ls_cust-item_text  = gs_output-sgtxt."项目文本
        APPEND ls_cust TO lt_cust.
        CLEAR ls_cust.
      ENDIF.

* 供应商
      IF gs_output-bschl+0(1) EQ '2' OR gs_output-bschl+0(1) EQ '3'.
        ls_vendor-itemno_acc = lv_item.           "行项目编号
        ls_vendor-vendor_no  = gs_output-hkont.   "科目
        ls_vendor-sp_gl_ind  = gs_output-umskz.   "特殊总账
        ls_vendor-pmnttrms   = gs_output-zterm.   "付款条件
        IF gs_output-zfbdt IS NOT INITIAL.
          ls_vendor-bline_date = gs_output-zfbdt.   "付款基准日期
        ELSE.
          ls_vendor-bline_date = gs_output-budat.   "付款基准日期
        ENDIF.
        ls_vendor-ref_key_1  = gs_output-xref1.
        ls_vendor-ref_key_2  = gs_output-xref2.
        ls_vendor-alloc_nmbr = gs_output-zuonr.   "分配编号
        ls_vendor-item_text  = gs_output-sgtxt.   "项目文本
        APPEND ls_vendor TO lt_vendor.
        CLEAR ls_vendor.
      ENDIF.

*货币
      ls_curren-itemno_acc = lv_item.

      IF gs_output-bschl+0(1) EQ '0' OR gs_output-bschl+0(1) EQ '2'
      OR gs_output-bschl+0(1) EQ '4' OR gs_output-bschl+0(1) EQ '8'
      OR gs_output-bschl EQ '70'. "借方
        ls_curren-amt_doccur = gs_output-dmbtr.
      ELSE.
        ls_curren-amt_doccur = 0 - gs_output-dmbtr.
      ENDIF.
      IF gs_output-mwsk1 IS NOT INITIAL ."AND gs_output-hkont NE '0066010001'
        CLEAR t_tax_info[].

        CALL FUNCTION 'CALCULATE_TAX_FROM_GROSSAMOUNT'
          EXPORTING
            i_bukrs = gs_output-bukrs
            i_mwskz = gs_output-mwsk1
            i_waers = gs_output-waers "''
            i_wrbtr = gs_output-dmbtr
          TABLES
            t_mwdat = t_tax_info.
        LOOP AT t_tax_info INTO DATA(ls_t_tax).
          IF gs_output-bschl+0(1) EQ '0' OR gs_output-bschl+0(1) EQ '2'
          OR gs_output-bschl+0(1) EQ '4' OR gs_output-bschl+0(1) EQ '8'
          OR gs_output-bschl EQ '70'. "借方
            ls_curren-amt_doccur = ls_t_tax-kawrt.
          ELSE.
            ls_curren-amt_doccur = 0 - ls_t_tax-kawrt.
          ENDIF.
        ENDLOOP.
      ENDIF.
*      IF gs_output-mwsk1 IS NOT INITIAL AND p_taxrate IS NOT INITIAL.
*        ls_curren-amt_base = ls_curren-amt_doccur / p_taxrate.
*      ENDIF.
      IF gs_output-waers IS INITIAL.
        ls_curren-currency = 'CNY'.
      ELSE.
        ls_curren-currency = gs_output-waers.
      ENDIF.
      IF gs_output-kursr IS NOT INITIAL.
        ls_curren-exch_rate = gs_output-kursr.
      ENDIF.

      APPEND ls_curren TO lt_curren.
      CLEAR ls_curren.

**原因代码 附加字段
*      IF gs_output-rstgr IS NOT INITIAL.
*        ls_extension-field1 = gs_output-rstgr.
*        APPEND ls_extension TO lt_extension.
*        CLEAR ls_extension.
*      ENDIF.

*扩展字段
      wa_zexten-posnr = lv_item.
      wa_zexten-bschl = gs_output-bschl. "记账码
      wa_zexten-matnr = gs_output-matnr. "物料
      wa_zexten-rstgr = gs_output-rstgr. "付款原因代码
      wa_zexten-werks = gs_output-werks. "工厂
      wa_zexten-kostl = gs_output-kostl. "成本中心
      ls_exten-structure = 'ZFICOS039'.
      ls_exten-valuepart1 = wa_zexten.
      APPEND ls_exten TO lt_exten.

*一次性供应商
      IF gs_output-name1 NE '' OR gs_output-ort01 NE ''.
        ls_customer-name = gs_output-name1.
        ls_customer-city = gs_output-ort01.
        ls_customer-country = 'CN'.
      ENDIF.

*获利段字段 "参考结构 CE0HL00
      IF gs_output-vkorg IS NOT INITIAL. "销售组织
        ls_crite-itemno_acc = lv_item.
        ls_crite-fieldname = 'VKORG'.
        ls_crite-character = gs_output-vkorg.
        APPEND ls_crite TO lt_crite.
      ENDIF.
      IF gs_output-vtweg IS NOT INITIAL. "分销渠道
        ls_crite-itemno_acc = lv_item.
        ls_crite-fieldname = 'VTWEG'.
        ls_crite-character = gs_output-vtweg.
        APPEND ls_crite TO lt_crite.
      ENDIF.
      IF gs_output-kndnr IS NOT INITIAL. "客户
        ls_crite-itemno_acc = lv_item.
        ls_crite-fieldname = 'KNDNR'.
        ls_crite-character = gs_output-kndnr.
        APPEND ls_crite TO lt_crite.
      ENDIF.
      IF gs_output-fkber IS NOT INITIAL. "功能范围
        ls_crite-itemno_acc = lv_item.
        ls_crite-fieldname = 'FKBER'.
        ls_crite-character = gs_output-fkber.
        APPEND ls_crite TO lt_crite.
      ENDIF.
      IF gs_output-skost IS NOT INITIAL. "发送方成本中心
        ls_crite-itemno_acc = lv_item.
        ls_crite-fieldname = 'SKOST'.
        ls_crite-character = gs_output-skost.
        APPEND ls_crite TO lt_crite.
      ENDIF.

*税项目
      IF gs_output-mwsk1 IS NOT INITIAL ."AND gs_output-hkont NE '0066010001'
*        CLEAR t_tax_info[].
*
*        CALL FUNCTION 'CALCULATE_TAX_FROM_GROSSAMOUNT'
*          EXPORTING
*            i_bukrs = gs_output-bukrs
*            i_mwskz = gs_output-mwsk1
*            i_waers = gs_output-waers "''
*            i_wrbtr = gs_output-dmbtr
*          TABLES
*            t_mwdat = t_tax_info.


        LOOP AT t_tax_info INTO DATA(ls_tax_info2).
          CLEAR ls_tax.
          ADD 10 TO lv_item.
          ls_tax-itemno_acc = lv_item.
          ls_tax-tax_code   = gs_output-mwsk1.
          ls_tax-acct_key   = ls_tax_info2-ktosl.
          ls_tax-cond_key   = ls_tax_info2-kschl.
          ls_tax-taxjurcode = ls_tax_info2-txjcd.
          ls_tax-taxjurcode_deep  = ls_tax_info2-txjcd_deep.
          ls_tax-taxjurcode_level = ls_tax_info2-txjlv.
          APPEND ls_tax TO lt_tax.
          CLEAR ls_tax.

          CLEAR ls_curren.
          ls_curren-itemno_acc = lv_item.
*          ls_curren-currency   = 'CNY'.
          IF gs_output-waers IS INITIAL.
            ls_curren-currency = 'CNY'.
          ELSE.
            ls_curren-currency = gs_output-waers.
          ENDIF.
          ls_curren-amt_doccur = ls_tax_info2-wmwst.
          ls_curren-amt_base = ls_tax_info2-kawrt.
          APPEND ls_curren TO lt_curren.
          CLEAR ls_curren.

        ENDLOOP.

      ENDIF.

      CLEAR: gs_output.
    ENDLOOP.
    IF sy-uname EQ 'IT0003'.
      BREAK-POINT.
    ENDIF.
    IF gs_output2-zsfyz EQ 'X'.
      ls_exten-structure = 'BAPI-PARK'.
      APPEND ls_exten TO lt_exten.
      CLEAR ls_exten.
    ENDIF.
    CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
      EXPORTING
        documentheader    = ls_head
        customercpd       = ls_customer
      IMPORTING
        obj_key           = lv_key
      TABLES
        accountgl         = lt_glitem "总账
        accountreceivable = lt_cust "客户
        accountpayable    = lt_vendor "供应商
        accounttax        = lt_tax "
        currencyamount    = lt_curren
        extension1        = lt_extension
        criteria          = lt_crite
        return            = lt_return
        extension2        = lt_exten.
    READ TABLE lt_return INTO ls_return WITH KEY type = 'E'.
    IF sy-subrc EQ 0.
      ROLLBACK WORK.
      LOOP AT lt_return INTO ls_return WHERE type EQ 'E'.
        CONCATENATE gs_output2-message '_' ls_return-message INTO gs_output2-message.
      ENDLOOP.
      gs_output2-ztype = 'E'.
    ELSE.
      COMMIT WORK AND WAIT.
      gs_output2-belnr = lv_key+0(10).
      gs_output2-message = '更新成功'.
      gs_output2-ztype = 'S'.
    ENDIF.
    MODIFY it_zs0072 FROM gs_output2.
    CLEAR: lt_glitem,lt_cust,lt_vendor,lt_tax,lt_curren,lt_exten,lv_key,ls_customer.
  ENDLOOP.



ENDFUNCTION.
View Code

 

原文地址:https://www.cnblogs.com/chaguoguo/p/14006892.html