本文只是整理备用大部分整理自:https://www.cnblogs.com/chaguoguo/p/14006892.html
一、BAPI介绍
BAPI_ACC_GL_POSTING_POST:
主要用于处理总账凭证的过账。
它允许外部系统或程序直接向SAP的总账模块发送过账请求,而无需通过传统的用户界面(GUI)。
BAPI_ACC_DOCUMENT_POST:
提供更广泛的会计凭证处理能力,可能包括不仅限于总账凭证的其他类型凭证。
它允许更复杂的会计凭证过账操作,具体取决于SAP系统的配置和版本。
二、如何使用这些BAPI
使用这些BAPI通常涉及以下步骤:
准备数据:
确定需要过账的会计凭证的所有相关数据,如凭证日期、过账日期、凭证类型、公司代码、货币、科目、金额等。
这些数据需要按照BAPI要求的格式和参数进行准备。
调用BAPI:
使用ABAP的CALL FUNCTION语句调用相应的BAPI。
将准备好的数据作为BAPI的输入参数传递。
调用BAPI时,还需要处理可能的异常和错误返回。
处理返回信息:
BAPI执行后,会返回一个或多个包含结果信息的表(如BAPIRET2)。
需要检查这些返回信息以确定BAPI是否成功执行,以及是否有任何错误或警告消息。
提交事务:
如果BAPI成功执行且没有错误,通常需要提交事务以保存更改。
这可以通过调用BAPI_TRANSACTION_COMMIT函数模块来实现。
错误处理:
如果在调用BAPI或处理返回信息时遇到错误,需要采取适当的错误处理措施。
这可能包括回滚事务、记录错误日志或通知用户。
先定义一个结构:
代码如下:
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_serEXPORTINGdata = it_zs007[].CALL METHOD json_ser->serialize.CALL METHOD json_ser->get_dataRECEIVINGrval = 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'EXPORTINGinput = gs_output-meins
* LANGUAGE = SY-LANGUIMPORTINGoutput = lv_meinsEXCEPTIONSunit_not_found = 1OTHERS = 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'EXPORTINGi_bukrs = gs_output-bukrsi_mwskz = gs_output-mwsk1i_waers = gs_output-waers "''i_wrbtr = gs_output-dmbtrTABLESt_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.*获利段字段 "参考结构 CE0HL00IF 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'EXPORTINGdocumentheader = ls_headcustomercpd = ls_customerIMPORTINGobj_key = lv_keyTABLESaccountgl = lt_glitem "总账accountreceivable = lt_cust "客户accountpayable = lt_vendor "供应商accounttax = lt_tax "税currencyamount = lt_currenextension1 = lt_extensioncriteria = lt_critereturn = lt_returnextension2 = 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.
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的填写就好了,
注意,有些像销项税之类的科目,需在税项目额外增加一行,同时总账项目里的这行的金额需要计算。