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.