1. 函数概述
BAPI_ACC_DOCUMENT_POST 是 SAP 提供的标准 BAPI,用于创建和过账财务会计凭证。该函数支持完整的财务凭证处理,包括总账、客户、供应商等各种业务场景。
主要功能
- 创建会计凭证
- 支持多种科目类型(总账、客户、供应商)
- 处理税收、成本分配等复杂业务
- 提供详细的错误返回信息
2. 参数说明
2.1 EXPORTING 参数
DOCUMENTHEADER - 凭证抬头信息
类型: BAPIACHE09
| 字段名 | 类型 | 长度 | 说明 | 必填 |
|---|---|---|---|---|
| OBJ_TYPE | CHAR | 10 | 对象类型,固定为 'BKPFF' | X |
| OBJ_KEY | CHAR | 40 | 内部对象键值 | |
| OBJ_SYS | CHAR | 10 | 系统 ID | |
| USERNAME | CHAR | 12 | 创建用户 | |
| TCODE | CHAR | 20 | 事务代码 | |
| DOC_DATE | DATS | 8 | 凭证日期 | X |
| PSTNG_DATE | DATS | 8 | 过账日期 | X |
| FISC_YEAR | NUMC | 4 | 会计年度 | |
| FISC_PERD | NUMC | 3 | 会计期间 | |
| COMP_CODE | CHAR | 4 | 公司代码 | X |
| DOC_TYPE | CHAR | 2 | 凭证类型 | X |
| HEADER_TXT | CHAR | 25 | 凭证抬头文本 | |
| REF_DOC_NO | CHAR | 16 | 参考凭证号 |
2.2 TABLES 参数
ACCOUNTGL - 总账科目项目
类型: TABLE OF BAPIACGL09
| 字段名 | 类型 | 长度 | 说明 | 必填 |
|---|---|---|---|---|
| ITEMNO_ACC | NUMC | 10 | 项目编号(唯一) | X |
| GL_ACCOUNT | CHAR | 10 | 总账科目 | X |
| COMPANY_CODE | CHAR | 4 | 公司代码 | X |
| ITEM_TEXT | CHAR | 50 | 项目文本 | |
| MATERIAL | CHAR | 18 | 物料编号 | |
| QUANTITY | QUAN | 13 | 数量 | |
| UNIT | UNIT | 3 | 单位 | |
| TAX_CODE | CHAR | 2 | 税码 | |
| COSTCENTER | CHAR | 10 | 成本中心 | |
| PROFIT_CTR | CHAR | 10 | 利润中心 | |
| AMOUNT | CURR | 13 | 金额 | X |
| CURRENCY | CUKY | 5 | 货币代码 | X |
| ORDERID | AUFNR | 12 | 订单编号 | |
| ... | ... | ... | ... |
CURRENCYAMOUNT - 货币金额信息
类型: TABLE OF BAPIACCR09
| 字段名 | 类型 | 长度 | 说明 | 必填 |
|---|---|---|---|---|
| ITEMNO_ACC | NUMC | 10 | 对应行项目编号 | X |
| CURRENCY | CUKY | 5 | 货币代码 | X |
| AMOUNT | CURR | 13 | 金额 | X |
| AMT_DC | CURR | 13 | 本位币金额 | |
| AMT_WT | CURR | 13 | 交易货币金额 |
RETURN - 返回消息信息
类型: TABLE OF BAPIRET2
| 字段名 | 类型 | 长度 | 说明 |
|---|---|---|---|
| TYPE | CHAR | 1 | 消息类型 (S = 成功,E = 错误,W = 警告,I = 信息,A = 终止) |
| ID | CHAR | 20 | 消息 ID |
| NUMBER | NUMC | 3 | 消息编号 |
| MESSAGE | CHAR | 220 | 消息文本 |
| LOG_NO | CHAR | 20 | 日志编号 |
| LOG_MSG_NO | NUMC | 6 | 日志消息编号 |
| MESSAGE_V1 | CHAR | 50 | 消息变量 1 |
| MESSAGE_V2 | CHAR | 50 | 消息变量 2 |
2.3 OPTIONAL 参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| TESTRUN | CHAR | 测试运行标识 ('X'= 测试,空 = 实际运行) |
| POSTING_DATE | DATS | 过账日期 |
| DOCUMENT_DATE | DATS | 凭证日期 |
3. 示例代码
3.1 基本示例 - 总账凭证过账
REPORT ztest_bapi_acc_doc_post.
* 数据声明
DATA:
ls_header TYPE bapiache09,
lt_accountgl TYPE TABLE OF bapiacgl09,
lt_currency TYPE TABLE OF bapiaccr09,
lt_return TYPE TABLE OF bapiret2,
lv_obj_key TYPE bapiache09-obj_key.
* 填充凭证抬头
ls_header-obj_type = 'BKPFF'.
ls_header-doc_date = sy-datum.
ls_header-pstng_date = sy-datum.
ls_header-comp_code = '1000'.
ls_header-doc_type = 'SA'.
ls_header-header_txt = 'BAPI测试凭证'.
* 填充总账项目 - 借方
APPEND INITIAL LINE TO lt_accountgl ASSIGNING FIELD-SYMBOL(<fs_gl1>).
<fs_gl1>-itemno_acc = '0000000001'.
<fs_gl1>-gl_account = '100000'.
<fs_gl1>-company_code = '1000'.
<fs_gl1>-item_text = '银行存款'.
<fs_gl1>-amount = '1000.00'.
<fs_gl1>-currency = 'CNY'.
* 填充总账项目 - 贷方
APPEND INITIAL LINE TO lt_accountgl ASSIGNING FIELD-SYMBOL(<fs_gl2>).
<fs_gl2>-itemno_acc = '0000000002'.
<fs_gl2>-gl_account = '400000'.
<fs_gl2>-company_code = '1000'.
<fs_gl2>-item_text = '主营业务收入'.
<fs_gl2>-amount = '-1000.00'. " 贷方用负数表示
<fs_gl2>-currency = 'CNY'.
* 填充货币金额
APPEND INITIAL LINE TO lt_currency ASSIGNING FIELD-SYMBOL(<fs_curr1>).
<fs_curr1>-itemno_acc = '0000000001'.
<fs_curr1>-currency = 'CNY'.
<fs_curr1>-amount = '1000.00'.
APPEND INITIAL LINE TO lt_currency ASSIGNING FIELD-SYMBOL(<fs_curr2>).
<fs_curr2>-itemno_acc = '0000000002'.
<fs_curr2>-currency = 'CNY'.
<fs_curr2>-amount = '-1000.00'.
* 调用BAPI
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
EXPORTING
documentheader = ls_header
IMPORTING
obj_key = lv_obj_key
TABLES
accountgl = lt_accountgl
currencyamount = lt_currency
return = lt_return.
* 处理返回消息
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
* 显示结果
LOOP AT lt_return INTO DATA(ls_return).
WRITE: / ls_return-type, ls_return-message.
ENDLOOP.
IF lv_obj_key IS NOT INITIAL.
WRITE: / '凭证创建成功,内部编号:', lv_obj_key.
ENDIF.
4.3 性能考虑
- 批量处理时使用内表操作
- 避免在循环中调用 BAPI
- 合理设置 WAIT 参数
4.4 权限检查
- 确保用户有 F-02 等事务代码的权限
- 检查科目组的权限控制
5. 常见问题及解决方案
5.1 凭证不平衡
问题: 借贷金额不相等解决: 确保所有行项目金额总和为零
5.2 字段必输性错误
问题: 某些字段未填写解决: 根据公司代码配置检查必输字段
5.3 科目无效
问题: 总账科目不存在或无效解决: 使用函数 CHECK_GL_ACCOUNT 验证科目
5.4 期间错误
问题: 过账期间未打开解决: 检查会计期间配置 (T-code: OB52)