SAP 关于BAPI_ACC_DOCUMENT_POST 使用说明

67 阅读4分钟

1. 函数概述

BAPI_ACC_DOCUMENT_POST 是 SAP 提供的标准 BAPI,用于创建和过账财务会计凭证。该函数支持完整的财务凭证处理,包括总账、客户、供应商等各种业务场景。

主要功能

  • 创建会计凭证
  • 支持多种科目类型(总账、客户、供应商)
  • 处理税收、成本分配等复杂业务
  • 提供详细的错误返回信息

2. 参数说明

2.1 EXPORTING 参数

DOCUMENTHEADER - 凭证抬头信息

类型BAPIACHE09

字段名类型长度说明必填
OBJ_TYPECHAR10对象类型,固定为 'BKPFF'X
OBJ_KEYCHAR40内部对象键值
OBJ_SYSCHAR10系统 ID
USERNAMECHAR12创建用户
TCODECHAR20事务代码
DOC_DATEDATS8凭证日期X
PSTNG_DATEDATS8过账日期X
FISC_YEARNUMC4会计年度
FISC_PERDNUMC3会计期间
COMP_CODECHAR4公司代码X
DOC_TYPECHAR2凭证类型X
HEADER_TXTCHAR25凭证抬头文本
REF_DOC_NOCHAR16参考凭证号

2.2 TABLES 参数

ACCOUNTGL - 总账科目项目

类型TABLE OF BAPIACGL09

字段名类型长度说明必填
ITEMNO_ACCNUMC10项目编号(唯一)X
GL_ACCOUNTCHAR10总账科目X
COMPANY_CODECHAR4公司代码X
ITEM_TEXTCHAR50项目文本
MATERIALCHAR18物料编号
QUANTITYQUAN13数量
UNITUNIT3单位
TAX_CODECHAR2税码
COSTCENTERCHAR10成本中心
PROFIT_CTRCHAR10利润中心
AMOUNTCURR13金额X
CURRENCYCUKY5货币代码X
ORDERIDAUFNR12订单编号
............

CURRENCYAMOUNT - 货币金额信息

类型TABLE OF BAPIACCR09

字段名类型长度说明必填
ITEMNO_ACCNUMC10对应行项目编号X
CURRENCYCUKY5货币代码X
AMOUNTCURR13金额X
AMT_DCCURR13本位币金额
AMT_WTCURR13交易货币金额

RETURN - 返回消息信息

类型TABLE OF BAPIRET2

字段名类型长度说明
TYPECHAR1消息类型 (S = 成功,E = 错误,W = 警告,I = 信息,A = 终止)
IDCHAR20消息 ID
NUMBERNUMC3消息编号
MESSAGECHAR220消息文本
LOG_NOCHAR20日志编号
LOG_MSG_NONUMC6日志消息编号
MESSAGE_V1CHAR50消息变量 1
MESSAGE_V2CHAR50消息变量 2

2.3 OPTIONAL 参数

参数名类型说明
TESTRUNCHAR测试运行标识 ('X'= 测试,空 = 实际运行)
POSTING_DATEDATS过账日期
DOCUMENT_DATEDATS凭证日期

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)