zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    《算法竞赛入门经典》 例题35 生成元 (Digit Generator, ACM ICPC Seoul 2005,UVa)
    《算法竞赛入门经典》 例题35 生成元 (Digit Generator, ACM ICPC Seoul 2005,UVa)
    《算法竞赛入门经典》 例题35 生成元 (Digit Generator, ACM ICPC Seoul 2005,UVa)
    SVN分支
    SVN分支
    SVN 版本回退
    SVN 版本回退
    如何在excel中取消合并单元格后内容自动填充?
    如何在excel中取消合并单元格后内容自动填充?
    如何让自己像打王者荣耀一样发了疯、拼了命的学习?
  • 原文地址:https://www.cnblogs.com/chaguoguo/p/14006892.html
Copyright © 2011-2022 走看看