调用bapi创建特别总账类型是W的会计凭证报错
在消耗了大量的时间后终于找到一个比较简单的方式,调用几个函数,虽然这几个函数底层还是bdc,但是不用自己找屏幕之类的,比较简单。使用起来也很简单,只需要将屏幕上对应的字段填上去就行。
·
在消耗了大量的时间后终于找到一个比较简单的方式,调用几个函数,虽然这几个函数底层还是bdc,但是不用自己找屏幕之类的,比较简单
参考:ABAP BAPI_ACC_DOCUMENT_POST创建会计凭证_sap bapi生成会计凭证-CSDN博客
FORM frm_import_bapi .
DATA:
ls_header TYPE bapiache09,
lt_gl TYPE TABLE OF bapiacgl09,
lt_curr TYPE TABLE OF bapiaccr09,
lt_account TYPE TABLE OF bapiacar09,
lt_return TYPE TABLE OF bapiret2.
DATA:
lv_type TYPE bapiache09-obj_type,
lv_key TYPE bapiache09-obj_key,
lv_sys TYPE bapiache09-obj_sys.
DATA: lv_message TYPE string.
DATA: lt_extension2 TYPE TABLE OF bapiparex,
ls_extension2 TYPE bapiparex,
ls_accit TYPE zsfico_e_001.
DATA: ls_ftpost TYPE ftpost,
lt_ftpost TYPE TABLE OF ftpost,
lt_fttax TYPE TABLE OF fttax,
lt_blntab TYPE TABLE OF blntab,
lv_subrc TYPE sy-subrc,
lv_msg TYPE bapiret2.
DEFINE macro.
ls_ftpost-fnam = &1.
ls_ftpost-fval = &2.
CONDENSE ls_ftpost-fval NO-GAPS.
APPEND ls_ftpost TO lt_ftpost.
END-OF-DEFINITION.
LOOP AT gt_excel INTO gs_excel GROUP BY ( number = gs_excel-number bukrs = gs_excel-bukrs blart = gs_excel-blart bldat = gs_excel-bldat budat = gs_excel-budat month = gs_excel-month bktxt = gs_excel-bktxt waers = gs_excel-waers size = GROUP SIZE )
ASSIGNING
FIELD-SYMBOL(<group>).
IF <group>-size > 999.
LOOP AT GROUP <group> ASSIGNING FIELD-SYMBOL(<line>).
<line>-tip = icon_red_light.
<line>-message = '该凭证行项目不能超过999条'.
ENDLOOP.
CONTINUE.
ENDIF.
LOOP AT GROUP <group> ASSIGNING <line> WHERE umskz EQ 'W'.
EXIT.
ENDLOOP.
" 如果凭证中包含特殊总账类型是W的,不能通过调用bapi的方式生成凭证
IF sy-subrc EQ 0.
" 有特殊总账类型是 W 的
CALL FUNCTION 'POSTING_INTERFACE_START'
EXPORTING
* I_CLIENT = SY-MANDT
i_function = 'C'
i_group = 'ZBDCINCLUDEW'
* I_HOLDDATE = ' '
i_keep = 'X'
* I_MODE = 'N'
* I_UPDATE = 'S'
i_user = sy-uname
* I_XBDCC = ' '
EXCEPTIONS
client_incorrect = 1
function_invalid = 2
group_name_missing = 3
mode_invalid = 4
update_invalid = 5
user_invalid = 6
OTHERS = 7.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
" header
ls_ftpost-stype = 'K'. "Header indicator
ls_ftpost-count = '001'. "First item
macro:
'BKPF-BLDAT' <group>-bldat,
'BKPF-BLART' <group>-blart,
'BKPF-BUKRS' <group>-bukrs,
'BKPF-BUDAT' <group>-budat,
'BKPF-BKTXT' <group>-bktxt,
'BKPF-MONAT' <group>-month,
'BKPF-WAERS' <group>-waers.
LOOP AT GROUP <group> ASSIGNING <line>.
ls_ftpost-stype = 'P'.
ls_ftpost-count = <line>-posnr.
" 行项目
macro:
'RF05A-NEWBS' <line>-bschl.
IF <line>-hkont IS NOT INITIAL.
macro:
'RF05A-NEWKO' <line>-hkont.
ELSEIF <line>-kunnr IS NOT INITIAL.
macro:
'RF05A-NEWKO' <line>-kunnr,
'RF05A-NEWUM' <line>-umskz.
ENDIF.
macro:
'BSEG-WRBTR' <line>-dmbtr,
'BSEG-SGTXT' <line>-sgtxt.
IF <line>-umskz EQ 'W'.
macro: 'BSEG-ZFBDT' <line>-budat.
ENDIF.
IF <line>-aufnr IS NOT INITIAL.
macro: 'COBL-AUFNR' <line>-aufnr.
ENDIF.
IF <line>-matnr IS NOT INITIAL.
macro: 'COBL-MATNR' <line>-matnr.
ENDIF.
macro: 'BSEG-RSTGR' <line>-rstgr.
ENDLOOP.
CALL FUNCTION 'POSTING_INTERFACE_DOCUMENT'
EXPORTING
i_tcode = 'FB01' "Name of t-code for Posting
i_sgfunct = 'C' "Batch input session
IMPORTING
e_subrc = lv_subrc
e_msgid = lv_msg-id "Error handling
e_msgty = lv_msg-type "Error handling
e_msgno = lv_msg-number "Error handling
e_msgv1 = lv_msg-message_v1 "Error handling
e_msgv2 = lv_msg-message_v2 "Error handling
e_msgv3 = lv_msg-message_v3 "Error handling
e_msgv4 = lv_msg-message_v4 "Error handling
TABLES
t_ftpost = lt_ftpost "Internal table populated in Step 2
t_fttax = lt_fttax "Relevant for Tax calculation manually
t_blntab = lt_blntab "Relevant only for Call Trans…
EXCEPTIONS
OTHERS = 1.
CALL FUNCTION 'POSTING_INTERFACE_END'.
IF NOT lv_msg-type CA 'AEX' and lt_blntab is NOT INITIAL.
LOOP AT GROUP <group> ASSIGNING <line>.
<line>-belnr = lt_blntab[ 1 ]-belnr.
<line>-tip = icon_green_light.
<line>-message = '成功!'.
ENDLOOP.
ELSE.
MESSAGE ID lv_msg-id TYPE lv_msg-type NUMBER lv_msg-number INTO lv_message WITH lv_msg-message_v1 lv_msg-message_v2 lv_msg-message_v3 lv_msg-message_v4.
LOOP AT GROUP <group> ASSIGNING <line>.
<line>-tip = icon_red_light.
<line>-message = lv_message.
ENDLOOP.
ENDIF.
CLEAR: lt_ftpost, ls_ftpost, lt_blntab, lt_fttax.
ELSE. " 正常通过bapi的方式创建凭证
" 抬头
ls_header = VALUE #(
comp_code = <group>-bukrs
doc_type = <group>-blart
doc_date = <group>-bldat
pstng_date = <group>-budat
fis_period = <group>-month
header_txt = <group>-bktxt
username = sy-uname
fisc_year = <group>-budat(4)
).
" 行
LOOP AT GROUP <group> ASSIGNING <line>.
IF <line>-hkont IS NOT INITIAL.
lt_gl = VALUE #( BASE lt_gl (
itemno_acc = <line>-posnr
gl_account = <line>-hkont
* customer = |{ <line>-kunnr ALPHA = IN }|
item_text = <line>-sgtxt
orderid = |{ <line>-aufnr ALPHA = IN }|
material = <line>-matnr
) ).
ENDIF.
IF <line>-kunnr IS NOT INITIAL.
lt_account = VALUE #( BASE lt_account (
itemno_acc = <line>-posnr
customer = |{ <line>-kunnr ALPHA = IN }|
* sp_gl_ind = <line>-umskz
) ).
ENDIF.
ls_accit = VALUE #(
posnr = <line>-posnr
bschl = |{ <line>-bschl ALPHA = IN }|
rstgr = <line>-rstgr
umskz = <line>-umskz
).
ls_extension2-structure = 'ZSFICO_E_001'.
ls_extension2+30(960) = ls_accit.
lt_extension2 = VALUE #( BASE lt_extension2 ( ls_extension2 ) ).
lt_curr = VALUE #( BASE lt_curr (
itemno_acc = <line>-posnr
amt_doccur = COND #( WHEN <line>-bschl EQ '50' OR <line>-bschl EQ '19' THEN -1 * <line>-dmbtr ELSE <line>-dmbtr )
currency = <line>-waers
) ).
CLEAR: ls_accit, ls_extension2.
ENDLOOP.
" 4. 调用BAPI
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
EXPORTING
documentheader = ls_header
IMPORTING
obj_type = lv_type
obj_key = lv_key
obj_sys = lv_sys
TABLES
accountgl = lt_gl
currencyamount = lt_curr
accountreceivable = lt_account
extension2 = lt_extension2 "增强字段
return = lt_return.
" 5. 错误处理
IF line_exists( lt_return[ type = 'E' ] ) OR line_exists( lt_return[ type = 'A' ] ) OR line_exists( lt_return[ type = 'X' ] ).
LOOP AT lt_return INTO DATA(ls_return) WHERE type CA 'EAX'.
lv_message &&= ls_return-message.
ENDLOOP.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
LOOP AT GROUP <group> ASSIGNING <line>.
<line>-tip = icon_red_light.
<line>-message = lv_message.
ENDLOOP.
ELSE.
LOOP AT GROUP <group> ASSIGNING <line>.
<line>-tip = icon_green_light.
<line>-message = '成功!'.
<line>-belnr = lv_key(10).
ENDLOOP.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
CLEAR: lv_message.
ENDIF.
ENDLOOP.
ENDFORM.
使用起来也很简单,只需要将屏幕上对应的字段填上去就行。搞定^-^
更多推荐


所有评论(0)