SAP FI 会计凭证过账 : BAPI_ACC_DOCUMENT_POST
该过账BAPI需要和模拟过账的BAPI “BAPI_ACC_DOCUMENT_CHECK” 搭配使用,这样先执行模拟过账,成功了再执行真正的过账,这样就不会因为执行失败产生废弃的凭证,还有再进行冲销。造成底表数据冗余无用。
模拟过账
call function 'BAPI_ACC_DOCUMENT_CHECK'
exporting
documentheader = i_doc_head
tables
accountgl = it_gl[]
accountreceivable = it_receive[]
accountpayable = it_pay[]
currencyamount = it_curramount[]
extension1 = it_extension[]
return = it_return[].
loop at it_return.
if it_return-type eq 'E'.
g_simu_error = 'X'.
write: / it_return-type, it_return-message(100).
set pf-status '1000'.
leave to list-processing.
endif.
endloop.
if g_simu_error eq 'X'.
write: / 'I 凭证生成错误,实际未生成任何会计凭证'.
clear: p_zsfkdh-d_belnr, p_zsfkdh-d_gjahr,p_zsfkdh-zkf_belnr.
leave screen.
endif.
* 当模拟过账成功,就可以执行真正的BAPI过账 BAPI_ACC_DOCUMENT_POST
DATA: i_doc_head TYPE bapiache09.
DATA: it_gl LIKE TABLE OF bapiacgl09 WITH HEADER LINE.
DATA: it_receive LIKE TABLE OF bapiacar09 WITH HEADER LINE.
DATA: it_pay LIKE TABLE OF bapiacap09 WITH HEADER LINE.
DATA: it_curramount LIKE TABLE OF bapiaccr09 WITH HEADER LINE.
DATA: it_extension LIKE TABLE OF bapiacextc WITH HEADER LINE.
data: f_obj_type like bapiache09-obj_type,
f_obj_key like bapiache09-obj_key,
f_obj_sys like bapiache09-obj_sys.
call function 'BAPI_ACC_DOCUMENT_POST'
exporting
documentheader = i_doc_head
* CUSTOMERCPD =
* CONTRACTHEADER =
importing
obj_type = f_obj_type “传出得
obj_key = f_obj_key
obj_sys = f_obj_sys
tables
accountgl = it_gl[]
accountreceivable = it_receive[]
accountpayable = it_pay[]
currencyamount = it_curramount[]
extension1 = it_extension[]
return = it_return[].
loop at it_return.
if it_return-type = 'E'.
g_post_error = 'X'.
endif.
write: / it_return-type, it_return-message(100).
set pf-status '1000'.
leave to list-processing.
endloop.
if g_post_error eq 'X'.
clear: p_zsfkdh-d_belnr, p_zsfkdh-d_gjahr,p_zsfkdh-zkf_belnr.
leave screen.
endif.
if f_obj_key is not initial.
if p_flag eq 'X'.
clear: p_zsfkdh-d_gjahr, p_zsfkdh-d_belnr.
move f_obj_key(10) to p_zsfkdh-d_belnr.
move f_obj_key+14(4) to p_zsfkdh-d_gjahr.
else.
clear: p_zsfkdh-d_gjahr, p_zsfkdh-zkf_belnr.
move f_obj_key(10) to p_zsfkdh-zkf_belnr.
move f_obj_key+14(4) to p_zsfkdh-d_gjahr.
endif.
endif.
这里面,只有RETURN表是返回表,其他都是输入的参数和输入表
我这次得项目,其实和这篇文章还挺像
https://www.cnblogs.com/liangliang245916893/p/12888762.html
首先是需要 当付款方式 “B选择银行承兑汇款” 得方式,我就要修改特别总账标识,调整科目
在这里插入图片描述
其实做的过程里发现需求理解错误,,应该判断票据类型为B,修改科目
下面是我改的代码:当票据类型为B,perform判断是新的票据还是老的票据,新的就给F,老的就是N
`&---------------------------------------------------------------------
*& Form FRM_GET_SK_UMSKZ
&---------------------------------------------------------------------
----------------------------------------------------------------------
----------------------------------------------------------------------
form frm_get_sk_umskz using ps_zsfkdb like line of it_zsfkdb_p
p_gl_ind type umskz.
data ls_ztyspj type ztyspj. "应收票据表
data ls_ztskdh type ztskdh. "收款单抬头表
check not ps_zsfkdb is initial.
* 根据票据台帐号->获取收款单号
select single *
into ls_ztyspj
from ztyspj
where bukrs = ps_zsfkdb-bukrs
and zpjid = ps_zsfkdb-zpjid.
check not ls_ztyspj is initial.
* 根据收款单号->获取会计凭证编号
select single *
into ls_ztskdh
from ztskdh
where bukrs = ls_ztyspj-gl_bukrs
and gjahr = ls_ztyspj-gl_gjahr
and zskdh = ls_ztyspj-zskdh.
check not ls_ztskdh is initial.
* 根据会计凭证编号->获取特殊G/L标识
select count(*)
from bseg
where bukrs = ls_ztskdh-bukrs
and belnr = ls_ztskdh-d_belnr
and gjahr = ls_ztskdh-d_gjahr
and umskz = ‘N’.
if sy-subrc = 0.
p_gl_ind = ‘N’.
endif.
endform. " FRM_GET_SK_UMSKZ`
这里的it_receive[]是BAPI的传入表,参考结构BAPIACAR09,里面有个字段SP_GL_IND = 特殊总分类帐标志,
tips: 这里教你如何查看BAPI return表的返回报错信息,主要看FIFLD指的哪个字段,PARAMETER指的哪个表,这里看出是it_curramount[]表里的CURRENCY这个字段没有传,那可以DEBUG修改表it_curramount[]给传入个CNY什么的。