内容分为前台操作和后台调用BAPI BAPI_ACC_DOCUMENT_POST
需求:输入相关字段,调用接口创建一条会计凭证
注意:前台的操作中的过帐码和科目是必填项
过帐码类型:
H表示贷方(金额为负数),S表示借方(金额为正数)
根据过帐码的不同,对应科目也会有所不同,有部分是取供应商,有部分直接取总账科目
前台操作:事务码FB01
![](https://i-blog.csdnimg.cn/blog_migrate/467649a0db1dd65d394a59417dae1f11.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c1d2773b906673c1ae4ad1c80d74b62e.png)
过帐码:31 (贷方 H 金额为-20)
![](https://i-blog.csdnimg.cn/blog_migrate/a6dfe5a90756369c235c8b10c5b836c2.png)
过帐码:31 (贷方 H 金额为-30)
![](https://i-blog.csdnimg.cn/blog_migrate/c0c2816b6d1ce2070001dda02c0430f5.png)
过帐码:40 (借方 S 金额为-50)
![](https://i-blog.csdnimg.cn/blog_migrate/74829d12863f40d3d87818c026ddfa4e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/dacefab408ef8459567157a2473d1cb8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/71ec84357bd00ea5b9bad44c94891ff1.png)
赋值部分:赋值部分有差异根据情况赋值
FIELD-SYMBOLS: <lv_BLDAT> TYPE any. " 凭证日期
FIELD-SYMBOLS: <lv_BUDAT> TYPE any. " 过账日期
FIELD-SYMBOLS: <lv_BLART> TYPE any. " 凭证类型
FIELD-SYMBOLS: <lv_BUKRS> TYPE any. " 公司代码
FIELD-SYMBOLS: <lv_WAERS> TYPE any. " 货币
ASSIGN COMPONENT 'BLDAT' OF STRUCTURE p_input TO <lv_BLDAT>. " 凭证日期
ASSIGN COMPONENT 'BUDAT' OF STRUCTURE p_input TO <lv_BUDAT>. " 过账日期
ASSIGN COMPONENT 'BLART' OF STRUCTURE p_input TO <lv_BLART>. " 凭证类型
ASSIGN COMPONENT 'BUKRS' OF STRUCTURE p_input TO <lv_BUKRS>. " 公司代码
ASSIGN COMPONENT 'WAERS' OF STRUCTURE p_input TO <lv_WAERS>. " 货币
DATA: lt_item TYPE TABLE OF zstms002_line, " zstms002_items_line,
lw_item TYPE zstms002_line. " zstms002_items_line.
DATA: lt_line TYPE TABLE OF zstms002_items_line,
lw_line TYPE zstms002_items_line.
DATA: tp_account TYPE hkont,
tp_kunnr TYPE kna1-kunnr.
DATA: tp_mwdat TYPE STANDARD TABLE OF rtax1u15 WITH HEADER LINE .
MOVE-CORRESPONDING p_input TO lw_item.
MOVE-CORRESPONDING lw_item-po_items TO lt_line.
" 输入 Input
DATA:
ls_documentheader TYPE bapiache09, " 总账信息
lt_documentheader TYPE STANDARD TABLE OF bapiache09, " 总账信息
lt_accountgl TYPE STANDARD TABLE OF bapiacgl09, " 贷方
ls_accountgl TYPE bapiacgl09,
lt_currencyamount TYPE STANDARD TABLE OF bapiaccr09, " 金额数量
ls_currencyamount TYPE bapiaccr09,
lt_extension2 TYPE STANDARD TABLE OF bapiparex, " 扩展字段
lt_accountpayable TYPE STANDARD TABLE OF bapiacap09, " 供应商
ls_accountreceivable TYPE bapiacar09, " 客户
lt_accountreceivable TYPE STANDARD TABLE OF bapiacar09, " 客户
ls_accountpayable TYPE bapiacap09, " 供应商
ls_extension2 TYPE bapiparex,
ls_zexten LIKE zext2,
lt_zexten TYPE STANDARD TABLE OF zext2.
" 输出
DATA:
lt_return TYPE STANDARD TABLE OF bapiret2 WITH HEADER LINE, " 返回值
ls_return TYPE bapiret2.
DATA: lv_line TYPE i.
*----------------------------------------------------------------------抬头数据
CLEAR ls_documentheader.
ls_documentheader-doc_type = <lv_BLART>. " 凭证类型
ls_documentheader-doc_date = <lv_BLDAT>. " 凭证中的凭证日期
ls_documentheader-pstng_date = <lv_BUDAT>. " 凭证中的过账日期
ls_documentheader-comp_code = <lv_BUKRS>. " 公司代码
ls_documentheader-username = sy-uname. " 用户名
*------------------------------------------------------------------------行项目数据
CLEAR: lt_accountgl,ls_accountgl,
lt_currencyamount,ls_currencyamount,
lt_extension2,ls_extension2.
CLEAR lv_line.
LOOP AT lt_line INTO lw_line.
lv_line = lv_line + 1.
IF lw_line-bschl = '40' OR lw_line-bschl = '50'.
ls_accountgl-itemno_acc = lv_line. " 行项目编号
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = lw_line-hkont
IMPORTING
OUTPUT = lw_line-hkont.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = lw_line-KOSTL
IMPORTING
OUTPUT = lw_line-KOSTL.
ls_accountgl-gl_account = lw_line-hkont. " 总分类帐科目
ls_accountgl-comp_code = <lv_BUKRS>. " 公司代码
ls_accountgl-doc_type = <lv_BLART>. " 凭证类型
ls_accountgl-COSTCENTER = lw_line-KOSTL. " 成本中心
ls_accountgl-TAX_CODE = lw_line-MWSKZ. " 税码
APPEND ls_accountgl TO lt_accountgl.
CLEAR:ls_accountgl.
ELSEIF lw_line-bschl >= '01' AND lw_line-bschl <= '19' .
CLEAR: tp_kunnr,tp_account .
tp_kunnr = lw_line-hkont .
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = tp_kunnr
IMPORTING
output = tp_kunnr.
SELECT SINGLE akont "找出供应商统驭科目
INTO tp_account
FROM lfb1
WHERE bukrs = <lv_BUKRS>
AND lifnr = tp_kunnr.
ls_accountreceivable-itemno_acc = lv_line.
ls_accountreceivable-comp_code = <lv_BUKRS>. " 公司代码
ls_accountreceivable-customer = tp_kunnr .
ls_accountreceivable-gl_account = tp_account.
APPEND ls_accountpayable TO lt_accountpayable .
CLEAR ls_accountpayable .
ELSEIF lw_line-bschl >= '21' AND lw_line-bschl <= '39' .
CLEAR: tp_kunnr,tp_account .
tp_kunnr = lw_line-hkont .
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = tp_kunnr
IMPORTING
output = tp_kunnr.
SELECT SINGLE akont " 找出供应商统驭科目
INTO tp_account
FROM lfb1
WHERE bukrs = <lv_BUKRS>
AND lifnr = tp_kunnr.
ls_accountpayable-itemno_acc = lv_line.
ls_accountpayable-vendor_no = tp_kunnr .
ls_accountpayable-comp_code = <lv_BUKRS>. " 公司代码
ls_accountpayable-gl_account = tp_account .
APPEND ls_accountpayable TO lt_accountpayable .
CLEAR ls_accountpayable .
ENDIF.
******************************************************************************* 金额
DATA:tp_shkzg TYPE shkzg . "根据记账码判断是借项还是贷项
CLEAR: tp_shkzg .
SELECT SINGLE shkzg
INTO tp_shkzg
FROM tbsl
WHERE bschl = lw_line-bschl .
IF tp_shkzg = 'H'. "贷项金额取负值
lw_line-wrbtr = - lw_line-wrbtr .
ENDIF.
" CURRENCYAMOUNT 金额数量
ls_currencyamount-itemno_acc = lv_line. " 行项目编号
ls_currencyamount-amt_doccur = lw_line-wrbtr. " 金额
ls_currencyamount-currency = 'CNY'. " 货币
APPEND ls_currencyamount TO lt_currencyamount.
CLEAR:ls_currencyamount.
CLEAR: ls_zexten,ls_extension2.
ls_zexten-posnr = lv_line. " 凭证行项目
ls_zexten-bschl = lw_line-bschl. " 记账码
APPEND ls_zexten TO lt_zexten.
ls_extension2-structure = 'ZEXT2'.
ls_extension2-valuepart1 = ls_zexten.
APPEND ls_extension2 TO lt_extension2.
CLEAR: ls_zexten,ls_extension2.
ENDLOOP.
" 调用BAPI函数
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
EXPORTING
documentheader = ls_documentheader " 总账信息
TABLES
accountgl = lt_accountgl " 贷方,应收
accountreceivable = lt_accountreceivable " 借方,应付
accountpayable = lt_accountpayable " 应付
currencyamount = lt_currencyamount " 借贷的金额
return = lt_return " 返回值
extension2 = lt_extension2. " 扩展字段
READ TABLE lt_return INTO ls_return WITH KEY type = 'E'.
IF sy-subrc NE 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
t_output-error_flag = 'S'.
t_output-message = '会计凭证号:' && lt_return-message_v2+0(10) &&
' 公司代码:' && lt_return-message_v2+10(4) &&
' 会计年度:' && lt_return-message_v2+14(4) && ' 已过账'.
* t_output-BELNR = lt_return-MESSAGE_V2+0(10).
APPEND t_output.
ELSE .
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
t_output-error_flag = 'E'.
t_output-MESSAGE = lt_return-message .
APPEND t_output.
ENDIF.