使用 BAPI_ACC_DOCUMENT_POST
的時候,如果有些字段在 Tables 參數(shù)中沒有袁串,比如恰矩,現(xiàn)在大家都用 Reason code 來作為現(xiàn)金流量表的實現(xiàn)方案。但 BAPI_ACC_DOCUMENT_POST
的 accountgl
參數(shù)是沒有原因代碼這個字段的体啰。這種情況下,如何能在導(dǎo)入憑證的時候嗽仪,包括這個字段呢荒勇?
簡介
定義一個結(jié)構(gòu),包括
POSNR
(類型為POSNR_ACC
) 和RSTGR
(原因代碼) 兩個字段钦幔。POSNR
這個字段必須有,因為BAPI_ACC_DOCUMENT_POST
包含多個 tables 參數(shù)常柄,需要行項目號來關(guān)聯(lián)鲤氢。比如第一行 #1 的總賬科目、金額西潘、extension2 等卷玉。SE19 實現(xiàn) BADI 增強
ACC_DOCUMENT
,這個增強是用來將BAPI_ACC_DOCUMENT_POST
參數(shù)表EXTENSION2
傳入系統(tǒng)表 ACCIT喷市。只需要實現(xiàn)change
方法在
BAPI_ACC_DOCUMENT_POST
中相种,啟用extension2
參數(shù),將擴展字段傳入
定義結(jié)構(gòu)
事務(wù)碼 SE11 定義一個結(jié)構(gòu) zext2
品姓,包括 POSNR
(類型為 POSNR_ACC
) 和 RSTGR
(原因代碼) 兩個字段寝并。
通過 BADI 將擴展字段傳入系統(tǒng)表
SE19箫措,使用 Classical BADI,BADI name 為 ACC_DOCUMENT衬潦,點擊 Create 按鈕斤蔓。
系統(tǒng)彈出如下對話框,輸入 implementation name:
點擊確認后镀岛,進入如下界面弦牡。下面有一個 Filter values,添加一行漂羊,選擇 BKPFF驾锰,表示這個 BADI 實現(xiàn)只適用于會計憑證直接輸入。
點擊激活按鈕走越,系統(tǒng)提示 migrate 到 New Badi椭豫。并彈出如下對話框
我們不選擇已有的 Enhancement Implementation,自己新建一個买喧。Composite Enhancement Implementation 留空捻悯。
確認后,系統(tǒng)提示 Activate 成功淤毛。點擊界面上的 Interface 按鈕今缚,可以看到,這個 BADI 的實現(xiàn)有兩個方法低淡,其中 CHANGE
方法就是我們需要實現(xiàn)的方法姓言。
這個方法可以從 Example implementation class 拷貝,完全不用改動蔗蹋。
method if_ex_acc_document~change.
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.
modify c_accit from wa_accit index sy-tabix.
endif.
endloop.
endmethod.
過賬函數(shù)包含擴展字段
BAPI_ACC_DOCUMENT_POST 使用 extension2
參數(shù)接收傳入的自定義結(jié)構(gòu)
data: l_extname type string value 'ZEXT2'.
data: extension2 type standard table of bapiparex with header line,
gs_zext2 like zext2.
form populate_extension2.
" first line
clear gs_zext2.
gs_zext2-posnr = '1'.
gs_zext2-rstgr = 'A01'.
clear extension2.
extension2-structure = l_extname.
extension2-valuepart1 = gs_zext2.
append extension2.
" second line
clear gs_zext2.
gs_zext2-posnr = '2'.
gs_zext2-rstgr = 'A01'.
clear extension2.
extension2-structure = l_extname.
extension2-valuepart1 = gs_zext2.
append extension2.
endform.
在 BAPI 中使用 extension2 參數(shù):
call function 'BAPI_ACC_DOCUMENT_POST'
exporting
documentheader = docheader
tables
accountgl = accountgl
currencyamount = currencyamount
extension2 = extension2
return = return.
完整代碼
最后給出完整代碼
report zbapi_acc_doc_post_test.
data:
docheader like bapiache09, " structure of document header
accountgl like bapiacgl09 occurs 0 with header line, " internal table for glaccounts
currencyamount like bapiaccr09 occurs 0 with header line, " internal table for currency
return like bapiret2 occurs 0 with header line. " internal table for return
" Extension2
data: extension2 type standard table of bapiparex with header line,
gs_zext2 like zext2.
" Populate required values
data: l_cocd type bukrs value 'Z900',
l_curr type bapiaccr09-currency value 'CNY',
l_doctype type bapiache09-doc_type value 'SA',
l_extname type string value 'ZEXT2'.
start-of-selection.
perform populate_doc_header.
perform populate_gl_accounts.
perform populate_currency_amt.
perform populate_extension2.
perform generate_fi_document.
form populate_doc_header.
clear docheader.
docheader-username = sy-uname.
docheader-header_txt = 'Test FI doc using BAPI'.
docheader-comp_code = l_cocd. " company code
docheader-doc_date = sy-datum.
docheader-pstng_date = sy-datum.
docheader-doc_type = l_doctype.
endform.
form populate_gl_accounts.
clear accountgl.
accountgl-itemno_acc = '1'.
accountgl-gl_account = '0010010100'.
accountgl-comp_code = l_cocd.
accountgl-pstng_date = sy-datum.
accountgl-doc_type = l_doctype.
accountgl-item_text = '銀行取現(xiàn)'.
append accountgl.
clear accountgl.
accountgl-itemno_acc = '2'.
accountgl-gl_account = '0010020100'.
accountgl-comp_code = l_cocd.
accountgl-pstng_date = sy-datum.
accountgl-value_date = sy-datum.
accountgl-doc_type = l_doctype.
accountgl-item_text = '銀行取現(xiàn)'.
append accountgl.
endform.
form populate_currency_amt.
clear currencyamount.
currencyamount-itemno_acc = '1'.
currencyamount-currency = l_curr.
currencyamount-amt_doccur = '100.00'.
append currencyamount.
clear currencyamount.
currencyamount-itemno_acc = '2'.
currencyamount-currency = l_curr.
currencyamount-amt_doccur = '-100.00'.
append currencyamount.
endform.
form populate_extension2.
clear gs_zext2.
gs_zext2-posnr = '1'.
gs_zext2-rstgr = 'A01'.
clear extension2.
extension2-structure = l_extname.
extension2-valuepart1 = gs_zext2.
append extension2.
clear gs_zext2.
gs_zext2-posnr = '2'.
gs_zext2-rstgr = 'A01'.
clear extension2.
extension2-structure = l_extname.
extension2-valuepart1 = gs_zext2.
append extension2.
endform.
form generate_fi_document.
data: has_error type c,
message_line type string.
has_error = space.
call function 'BAPI_ACC_DOCUMENT_CHECK'
exporting
documentheader = docheader
tables
accountgl = accountgl
currencyamount = currencyamount
extension2 = extension2
return = return.
loop at return.
if return-type = 'E'.
has_error = 'X'.
exit.
endif.
endloop.
if has_error = 'X'.
loop at return.
concatenate return-id return-number ': ' return-message into message_line.
write: / message_line.
clear return.
endloop.
endif.
check has_error = space.
clear return[].
call function 'BAPI_ACC_DOCUMENT_POST'
exporting
documentheader = docheader
tables
accountgl = accountgl
currencyamount = currencyamount
extension2 = extension2
return = return.
if sy-subrc is initial.
call function 'BAPI_TRANSACTION_COMMIT'
exporting
wait = 'X'.
" write messages
loop at return.
concatenate return-id return-number ': ' return-message into message_line.
write: / message_line.
clear return.
endloop.
endif.
if sy-subrc is initial.
write: / 'Successful'.
endif.
endform.