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

     

  • 相关阅读:
    freeCAD定制界面
    freeCAD预选项编辑器
    freeCAD文档结构
    FreeCAD鼠标操作指南
    freeCAD下载与安装
    freeCAD特性列表
    关于freeCAD
    html 试题试卷(包含latex)下载成word
    latex转word公式 java (latextoword,latex_word,latex2word,latex_omml)
    oracle 行列转换
  • 原文地址:https://www.cnblogs.com/chaguoguo/p/14006892.html
Copyright © 2011-2022 走看看