BAPI调用的代码如下,下面分别介绍几个主要参数
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
EXPORTING
documentheader = lw_documentheader
customercpd = lw_customercpd
contractheader = lw_contractheader
IMPORTING
obj_type = lv_obj_type
obj_key = lv_obj_key
obj_sys = lv_obj_sys
TABLES
accountgl = lt_accountgl
accountreceivable = lt_accountreceivable
accountpayable = lt_accountpayable
accounttax = lt_accounttax
currencyamount = lt_currencyamount
criteria = lt_criteria
valuefield = lt_valuefield
extension1 = lt_extension1
return = lt_return
paymentcard = lt_paymentcard
contractitem = lt_contractitem
extension2 = lt_extension2
realestate = lt_realestate
accountwt = lt_accountwt.
IF lv_obj_key = '$'.
lv_obj_key = ''.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
LOOP AT lt_return INTO lw_return.
ENDLOOP.
供参考的定义的代码,zexten是增强扩展结构,不可缺少,具体往文章后面看
DATA: lw_documentheader LIKE bapiache09,
lw_customercpd LIKE bapiacpa09,
lw_contractheader LIKE bapiaccahd.
DATA: lv_obj_type LIKE bapiache09-obj_type,
lv_obj_key LIKE bapiache09-obj_key,
lv_obj_sys LIKE bapiache09-obj_sys.
DATA: lw_accountgl LIKE bapiacgl09,
lw_accountreceivable LIKE bapiacar09,
lw_accountpayable LIKE bapiacap09,
lw_accounttax LIKE bapiactx09,
lw_currencyamount LIKE bapiaccr09,
lw_criteria LIKE bapiackec9,
lw_valuefield LIKE bapiackev9,
lw_extension1 LIKE bapiacextc,
lw_return LIKE bapiret2,
lw_paymentcard LIKE bapiacpc09,
lw_contractitem LIKE bapiaccait,
lw_extension2 LIKE bapiparex,
lw_realestate LIKE bapiacre09,
lw_accountwt LIKE bapiacwt09.
DATA: lt_accountgl LIKE STANDARD TABLE OF bapiacgl09,
lt_accountreceivable LIKE STANDARD TABLE OF bapiacar09,
lt_accountpayable LIKE STANDARD TABLE OF bapiacap09,
lt_accounttax LIKE STANDARD TABLE OF bapiactx09,
lt_currencyamount LIKE STANDARD TABLE OF bapiaccr09,
lt_criteria LIKE STANDARD TABLE OF bapiackec9,
lt_valuefield LIKE STANDARD TABLE OF bapiackev9,
lt_extension1 LIKE STANDARD TABLE OF bapiacextc,
lt_return LIKE STANDARD TABLE OF bapiret2,
lt_paymentcard LIKE STANDARD TABLE OF bapiacpc09,
lt_contractitem LIKE STANDARD TABLE OF bapiaccait,
lt_extension2 LIKE STANDARD TABLE OF bapiparex,
lt_realestate LIKE STANDARD TABLE OF bapiacre09,
lt_accountwt LIKE STANDARD TABLE OF bapiacwt09.
DATA: wa_zexten LIKE zexten.
1.documentheader :传入会计凭证BKPF表的抬头字段,常用字段如公司代码,过帐日期,凭证类型,凭证抬头文本等
CLEAR lw_documentheader.
lw_documentheader-username = sy-uname.
lw_documentheader-fisc_year = iw_formatdata-budat+0(4).
lw_documentheader-doc_date = iw_formatdata-bldat."Document Date
lw_documentheader-pstng_date = iw_formatdata-budat."Posting Date
lw_documentheader-fis_period = iw_formatdata-budat+4(2).
lw_documentheader-doc_type = iw_formatdata-blart."Document Type
lw_documentheader-comp_code = iw_formatdata-bukrs."Company code
lw_documentheader-ref_doc_no = iw_formatdata-xblnr."Reference
lw_documentheader-header_txt = iw_formatdata-bktxt."
2.行项目字段数据分成四部分,分别对应记账中的应收(客户D),应付(供应商K),总帐,资产,不同的类型写入不同的数据表,也可以根据记账码来分别
应收accountreceivable:要写入客户的行,对应的记账码是借方(01-09),贷方(11-19)
CLEAR:lw_accountreceivable.
lw_accountreceivable-itemno_acc = 20.
lw_accountreceivable-customer = '' .
lw_accountreceivable-item_text = ''.
lw_accountreceivable-gl_account = ''.
lw_accountreceivable-REF_KEY_1 = ''. "
lw_accountreceivable-REF_KEY_3 = ''.
APPEND lw_accountreceivable TO lt_accountreceivable.
应付accountpayable:要写入供应商的行,对应的记账码是借方(21-29),贷方(31-39)
CLEAR:lw_accountpayable.
lw_accountpayable-itemno_acc = 30.
lw_accountpayable-VENDOR_NO = ''.
lw_accountpayable-item_text = ''.
lw_accountpayable-gl_account = ''.
lw_accountpayable-REF_KEY_1 = ''. "参考码1和3共同存储APP订单号
lw_accountpayable-REF_KEY_3 = ''.
APPEND lw_accountpayable TO lt_accountpayable.
总账和资产accountgl:记账码是总账借方(40)贷方(50)资产借方(70)贷方(75)
CLEAR: lw_accountgl.
lw_accountgl-itemno_acc = 10.
lw_accountgl-gl_account = ''.
lw_accountgl-item_text = ''.
lw_accountgl-REF_KEY_1 = ''. "参考码1和3共同存储APP订单号
lw_accountgl-REF_KEY_3 = ''.
APPEND lw_accountgl TO lt_accountgl.
3.金额部分currencyamount,每行分录添加进去一条,按照行项目号itemno_acc区分是哪行的金额
CLEAR: lw_currencyamount.
lw_currencyamount-itemno_acc = 10.
lw_currencyamount-currency = 'CNY'. "货币
lw_currencyamount-amt_doccur = ls_tab-pswbt * -1. "金额
lw_currencyamount-exch_rate = ls_tab-kursf. "汇率
APPEND lw_currencyamount TO lt_currencyamount.
4.COPA获利能力段数据criteria,输入行号,字段名称,以及该字段对应数据,每行数据都能输入多个获利能力段数据,这个用的很少,可以不管
IF iw_formatdata-kunnr1 IS NOT INITIAL .
DATA:lv_kunnr TYPE kunnr .
CLEAR gs_copa .
gs_copa-itemno_acc = iv_index .
gs_copa-fieldname = 'KNDNR'.
lv_kunnr = iw_formatdata-kunnr1 .
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = lv_kunnr
IMPORTING
output = lv_kunnr.
gs_copa-character = lv_kunnr .
APPEND gs_copa TO gt_copa .
ENDIF.
IF iw_formatdata-matnr IS NOT INITIAL .
CLEAR gs_copa .
gs_copa-itemno_acc = iv_index .
gs_copa-fieldname = 'ARTNR'.
gs_copa-character = iw_formatdata-matnr .
APPEND gs_copa TO gt_copa .
ENDIF.
IF iw_formatdata-vbeln IS NOT INITIAL ..
CLEAR gs_copa .
gs_copa-itemno_acc = iv_index .
gs_copa-fieldname = 'KAUFN'.
gs_copa-character = iw_formatdata-vbeln .
APPEND gs_copa TO gt_copa .
ENDIF.
IF iw_formatdata-vbelp IS NOT INITIAL .
CLEAR gs_copa .
gs_copa-itemno_acc = iv_index .
gs_copa-fieldname = 'KDPOS'.
gs_copa-character = iw_formatdata-vbelp .
APPEND gs_copa TO gt_copa .
ENDIF.
IF iw_formatdata-vkorg IS NOT INITIAL .
CLEAR gs_copa .
gs_copa-itemno_acc = iv_index .
gs_copa-fieldname = 'VKORG'.
gs_copa-character = iw_formatdata-vkorg .
APPEND gs_copa TO gt_copa .
ENDIF.
IF iw_formatdata-vtweg IS NOT INITIAL .
CLEAR gs_copa .
gs_copa-itemno_acc = iv_index .
gs_copa-fieldname = 'VTWEG'.
gs_copa-character = iw_formatdata-vtweg .
APPEND gs_copa TO gt_copa .
ENDIF.
IF iw_formatdata-spart IS NOT INITIAL ..
CLEAR gs_copa .
gs_copa-itemno_acc = iv_index .
gs_copa-fieldname = 'SPART'.
gs_copa-character = iw_formatdata-spart .
APPEND gs_copa TO gt_copa .
ENDIF.
5.增强扩展数据extension1,需要SE11创建个需要增强扩展的结构,然后在字段extension1-structure输入这个结构名称,数据传入需要定义这个结构的工作区,然后对对应字段赋值,然后整个将这个工作区赋值到extension2-valuepart1,最后添加进表,传入bapi即可
CLEAR: wa_zexten.
wa_zexten-posnr = 10. "行号
wa_zexten-bschl = '50'. "记帐码
wa_zexten-rstgr = 'A01'.
lw_extension2-structure = 'ZEXTEN'.
lw_extension2-valuepart1 = wa_zexten.
APPEND lw_extension2 TO lt_extension2.
增强结构参考定义
想要增强结构传入的数据生效还需要对bapi做增强才能真正写入会计凭证
SE18可以查看该增强点BADI_ACC_DOCUMENT
如果有了就不用新增了,没有的话需要SE19实施增强
在实施方法IF_EX_ACC_DOCUMENT~CHANGE中写入代码后激活即可成功写入增强字段
METHOD if_ex_acc_document~change.
DATA: lv_extension TYPE bapiparex,
lv_ext_value(960) TYPE c,
lv_accit TYPE accit,
lv_ref TYPE REF TO data.
FIELD-SYMBOLS:<l_struc> TYPE any,
<l_field> TYPE any.
SORT c_extension2 BY structure.
"预制凭证标记
DATA:ls_exte TYPE bapiparex.
READ TABLE c_extension2 INTO ls_exte WITH KEY structure = 'PARK'.
IF sy-subrc = 0.
MOVE '2' TO c_acchd-status_new.
DELETE c_extension2 INDEX sy-tabix.
ENDIF.
READ TABLE c_extension2 INTO ls_exte WITH KEY structure = 'ZSFI_EXTEN'.
IF sy-subrc = 0.
MOVE '2' TO c_acchd-status_new.
* DELETE c_extension2 INDEX sy-tabix.
ENDIF.
LOOP AT c_extension2 INTO lv_extension.
AT NEW structure.
if lv_extension-structure ne 'PARK'.
CREATE DATA lv_ref TYPE (lv_extension-structure).
ASSIGN lv_ref->* TO <l_struc>.
endif.
ENDAT.
if lv_extension-structure ne 'PARK'.
CONCATENATE lv_extension-valuepart1 lv_extension-valuepart2
lv_extension-valuepart3 lv_extension-valuepart4
INTO lv_ext_value.
MOVE lv_ext_value TO <l_struc>.
ASSIGN COMPONENT 'POSNR' OF STRUCTURE <l_struc> TO <l_field>.
READ TABLE c_accit WITH KEY posnr = <l_field>
INTO lv_accit.
IF sy-subrc IS INITIAL.
MOVE-CORRESPONDING <l_struc> TO lv_accit.
MODIFY c_accit FROM lv_accit INDEX sy-tabix.
ENDIF.
ENDIF.
ENDLOOP.
ENDMETHOD.
程序报错收集
1,FB 297 公司没有建立 写入合作伙伴的时候明明有这个合作伙伴但是就是报错,原因是合作合伙伴是6位数,需要加两位前导零
2. F5 846 借/贷标记不一致 记账码对应的金额正负不一致借方记账码应该对应正数金额,贷方记账码对应金额是负数