FICO 所有的创建会计凭证的bapi都是: BAPI_ACC_DOCUMENT_POST
F-37/F-47创建的预收/预付款,只有一行
一般来说都是借贷项平衡。所以直接去函数里面填数据,会报错
查阅资料后得知,如果创建的凭证只有一行的,那么需要打上特定的标识,
函数的入参中 sp_gl_ind 和 bus_act 我分别填写的是F 和 'RFST'
并且增强:BADI_ACC_DOCUMENT
代码如下,供大家参考
DATA:
ls_documentheader LIKE bapiache09,
lt_accountgl LIKE TABLE OF bapiacgl09,
ls_accountgl LIKE bapiacgl09,
lt_currencyamount LIKE TABLE OF bapiaccr09,
ls_currencyamount LIKE bapiaccr09,
lt_return LIKE TABLE OF bapiret2,
ls_return TYPE bapiret2,
lt_accountpayable LIKE TABLE OF bapiacap09,
ls_accountpayable LIKE bapiacap09,
lt_accountreceivable LIKE TABLE OF bapiacar09,
ls_accountreceivable LIKE bapiacar09,
lt_extension LIKE TABLE OF bapiparex,
ls_extension LIKE bapiparex.
DATA: lv_num TYPE posnr_acc.
DATA: ls_exten TYPE zsfi_acc_document_ex1.
DATA: ls_celtab TYPE lvc_s_styl.
LOOP AT gt_data INTO gs_data WHERE box IS NOT INITIAL.
CLEAR:lt_return,gs_data-message.
"凭证抬头
CLEAR ls_documentheader.
ls_documentheader-username = sy-uname. "用户名
ls_documentheader-bus_act = 'RFST'. "必填,且必定为此值,不填报错
ls_documentheader-comp_code = gs_data-bukrs. "公司代码
ls_documentheader-doc_date = sy-datum. "凭证日期 收款日期
ls_documentheader-pstng_date = sy-datum. "过账日期 收款日期
ls_documentheader-doc_type = 'DZ'. "凭证类型
ls_documentheader-header_txt = gs_data-bktxt. "抬头文本
CLEAR: ls_accountreceivable,lt_accountreceivable.
lv_num = lv_num + 1.
ls_accountreceivable-itemno_acc = lv_num. "会计凭证行项目编号
ls_accountreceivable-customer = gs_data-kunnr. "临时客户
ls_accountreceivable-item_text = gs_data-bktxt. "行项目文本
ls_accountreceivable-sales_ord = gs_data-vbeln.
ls_accountreceivable-s_ord_item = gs_data-posnr.
ls_accountreceivable-comp_code = gs_data-bukrs.
ls_accountreceivable-bline_date = gs_data-zdate.
ls_accountreceivable-sp_gl_ind = 'F'.
ls_accountreceivable-tax_code = 'X0'.
ls_accountreceivable-gl_account = '2205010000'.
APPEND ls_accountreceivable TO lt_accountreceivable.
"金额
CLEAR: ls_currencyamount,lt_currencyamount.
ls_currencyamount-itemno_acc = lv_num.
ls_currencyamount-currency = gs_data-waers.
ls_currencyamount-amt_doccur = gs_data-zwrbtr.
APPEND ls_currencyamount TO lt_currencyamount.
CLEAR: ls_exten,ls_extension,lt_extension.
ls_exten-posnr = lv_num. "凭证行项目
ls_exten-bschl = '09'. "凭证行项目过账码
ls_exten-zumsk = 'A'. "
ls_exten-umskz = 'F'. "
ls_extension-structure = 'ZSFI_ACC_DOCUMENT_EX1'.
ls_extension-valuepart1 = ls_exten.
APPEND ls_extension TO lt_extension.
"应收
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
EXPORTING
documentheader = ls_documentheader
TABLES
accountgl = lt_accountgl
accountreceivable = lt_accountreceivable
currencyamount = lt_currencyamount
return = lt_return
extension2 = lt_extension.
LOOP AT lt_return INTO ls_return WHERE type = 'E'.
CONCATENATE gs_data-message ls_return-message INTO gs_data-message.
ENDLOOP.
增强中的代码如下:
DATA: wa_extension TYPE bapiparex,
ext_value(960) TYPE c,
wa_accit TYPE accit,
l_ref TYPE REF TO data.
FIELD-SYMBOLS: <l_struc> TYPE any,
<l_field> TYPE any.
SORT c_extension2 BY structure.
LOOP AT c_extension2 INTO wa_extension.
AT NEW structure.
CREATE DATA l_ref TYPE (wa_extension-structure).
ASSIGN l_ref->* TO <l_struc>.
ENDAT.
CONCATENATE wa_extension-valuepart1 wa_extension-valuepart2
wa_extension-valuepart3 wa_extension-valuepart4
INTO ext_value.
MOVE 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 wa_accit.
IF sy-subrc IS INITIAL.
MOVE-CORRESPONDING <l_struc> TO wa_accit.
*此处为创建单行项目的会计凭证的特殊逻辑。为了不影响标准的会计凭证创建,
*需要根据传入的增强结构判断,并将BSTAT设置为'S',这样就不会校验借贷平衡了
IF wa_extension-structure = 'ZSFI_ACC_DOCUMENT_EX1'.
wa_accit-bstat = 'S'.
ENDIF.
MODIFY c_accit FROM wa_accit INDEX sy-tabix.
ENDIF.
ENDLOOP.