BAPI_ACC_DOCUMENT_POST 基本用法

使用 BAPI 导入凭证,通过 BAPI BAPI_ACC_DOCUMENT_POST, 可以导入 G/L, 应收账款、应付账款等。如果导入只包含总账科目的会计凭证,也可以用函数 BAPI_ACC_GL_POSTING_POST。

基本使用方法
导入凭证,无非先将数据从文件导入到内表,然后进行校验。校验通过则调用 BAPI 生成会计凭证。为便于理解,直接硬编码,演示 BAPI 的使用要点。

假设我们要生成一张最简单的会计凭证:

借: 现金 100
  贷: 银行存款 100

我们来看看如何编写。首先给出完整代码:

复制代码
report zbapi_ac_document_post_test.

data:
  docheader      like bapiache09, " structure of document header
  accountgl      like bapiacgl09 occurs 0 with header line, " internal table for glaccounts
  currencyamount like bapiaccr09 occurs 0 with header line, " internal table for currency
  return         like bapiret2   occurs 0 with header line. " internal table for return

* Populate required values
data: l_cocd    type bukrs value 'Z900', " company code
      l_curr    type bapiaccr09-currency value 'CNY',
      l_doctype type bapiache09-doc_type value 'SA'.

start-of-selection.
  perform populate_doc_header.
  perform populate_gl_accounts.
  perform populate_currency_amt.
  perform generate_fi_document.

form populate_doc_header.
  clear docheader.
  
  docheader-username = sy-uname.
  docheader-header_txt = 'Test FI doc using BAPI'.
  docheader-comp_code = l_cocd.  " company code
  docheader-doc_date = sy-datum.
  docheader-pstng_date = sy-datum.
  docheader-doc_type = l_doctype.
endform.

form populate_gl_accounts.
  clear accountgl.

  accountgl-itemno_acc = '1'.
  accountgl-gl_account = '0010010100'.
  accountgl-comp_code = l_cocd.
  accountgl-pstng_date = sy-datum.
  accountgl-doc_type = l_doctype.
  accountgl-item_text = '银行取现'.
  append accountgl.

  clear accountgl.
  accountgl-itemno_acc = '2'.
  accountgl-gl_account = '0010020100'.
  accountgl-comp_code = l_cocd.
  accountgl-pstng_date = sy-datum.
  accountgl-value_date = sy-datum.
  accountgl-doc_type = l_doctype.
  accountgl-item_text = '银行取现'.
  append accountgl.
endform.

form populate_currency_amt.
  clear currencyamount.
  currencyamount-itemno_acc = '1'.
  currencyamount-currency = l_curr.
  currencyamount-amt_doccur = '100.00'.
  append currencyamount.

  clear currencyamount.
  currencyamount-itemno_acc = '2'.
  currencyamount-currency = l_curr.
  currencyamount-amt_doccur = '-100.00'.
  append currencyamount.
endform.

form generate_fi_document.
  call function 'BAPI_ACC_DOCUMENT_POST'
    exporting
      documentheader = docheader
    tables
      accountgl      = accountgl
      currencyamount = currencyamount
      return         = return.

  if sy-subrc is initial.
    call function 'BAPI_TRANSACTION_COMMIT'
      exporting
        wait = 'X'.
  endif.

  if sy-subrc is initial.
    write 'Successful'.
  endif.
endform.
复制代码

使用要点说明
不需要 posting key,根据科目和金额的正负自动确定。

在填充 document header 的时候,不要填充 OBJ_KEY, OBJ_TYPE 和 OBJ_SYS,由函数来填充。

一般将下面三个函数配合使用:

先用 BAPI_ACC_DOCUMENT_CHECK 进行检查。如果没有错误,sy-subrc <> 0
调用 BAPI_ACC_DOCUMENT_POST 进行过账。这个函数会占用凭证号码。
如果 POST 函数的 sy-subrc = 0,调用函数 BAPI_TRANSACTION_COMMIT 提交修改。
本示例创建的会计凭证是本位币,没有汇率。

 

凭证过账检查
银行科目需要输入 value date。假设我们注释掉银行存款行的 value date,此时会计凭证时不能过账的,我们使用 BAPI_ACC_DOCUMENT_CHECK 来检查,读取函数 return 返回值获取信息:

复制代码
report zacc_doc_docment_post_test2.

* 相同部分省略
* ...

form generate_fi_document.
  data: has_error    type c,
        message_line type string.
        
  has_error = space.

  call function 'BAPI_ACC_DOCUMENT_CHECK'
    exporting
      documentheader = docheader
    tables
      accountgl      = accountgl
      currencyamount = currencyamount
      return         = return.

  loop at return.
    if return-type = 'E'.
      has_error = 'X'.
      exit.
    endif.
  endloop.

  if has_error = 'X'.
    loop at return.
      concatenate return-id return-number ': ' return-message into message_line.
      write: / message_line.
      clear return.
    endloop.
  endif.

  check has_error = space.
  clear return[].

  call function 'BAPI_ACC_DOCUMENT_POST'
    exporting
      documentheader = docheader
    tables
      accountgl      = accountgl
      currencyamount = currencyamount
      return         = return.

  if sy-subrc is initial.
    call function 'BAPI_TRANSACTION_COMMIT'
      exporting
        wait = 'X'.

    " write messages
    loop at return.
      concatenate return-id return-number ': ' return-message into message_line.
      write: / message_line.
      clear return.
    endloop.
  endif.

  if sy-subrc is initial.
    write: / 'Successful'.
  endif.

endform.
复制代码

————————————————
版权声明:本文为CSDN博主「stone0823」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/stone0823/article/details/96838529

 

 

bapi_acc_document_post使用说明

bapi_acc_document_post适用于创建会计凭证,功能与前台FB01等相同,其输出是创建的会计凭证号。该bapi时常与badi ACC_DOCUMENT配合使用,在标准功能的基础上实现客户化需求。

1.   bapi常用参数说明

参数名

说明

用法举例

DOCUMENTHEADER

财务凭证抬头结构,存放凭证类型、日期等

*  抬头
    ls_documentheader-doc_type   = 'SA'. "总帐科目凭证
    ls_documentheader-username   = sy-uname.
    ls_documentheader-comp_code  = pt_main-bukrs.
    ls_documentheader-doc_date   = pt_main-budat_cb.
    ls_documentheader-pstng_date = pt_main-budat_cb.
    ls_documentheader-fisc_year  = pt_main-budat_cb+0(4).
    ls_documentheader-fis_period = pt_main-budat_cb+4(2).
    ls_documentheader-ref_doc_no = pt_main-belnr.  "CO凭证

ACCOUNTGL

存放与总账相关的行项目信息。

    ls_accountgl-itemno_acc = lv_itemno.         "行项目号
      ls_accountgl-item_text  = pt_main-kstar_txt. "科目描述
      ls_accountgl-gl_account = pt_main-kstar.     "科目
      ls_accountgl-costcenter = pt_main-kostl.     "成本中心
      APPEND ls_accountgl TO lt_accountgl.
      CLEAR ls_accountgl.

ACCOUNTRECEIVABLE

存放与客户相关的行项目信息,可设定特殊总账标识。

  ls_accountreceivable-itemno_acc = 10.                "行项目号
    ls_accountreceivable-customer   = pt_main-bukrs_in.  "转入方公司代码
    ls_accountreceivable-sp_gl_ind  = 'E'.               "特殊总账标识
    APPEND ls_accountreceivable TO lt_accountreceivable.
    CLEAR ls_accountreceivable.

ACCOUNTPAYABLE

存放与供应商相关的行项目信息,可设定特殊总账标识。

  lv_itemno = lv_itemno + 10.
    ls_accountpayable-itemno_acc = lv_itemno.          "行项目号
    ls_accountpayable-vendor_no  = pt_main-bukrs.      "转出方公司代码
    ls_accountpayable-sp_gl_ind  = 'D'.             "特殊总账标识
    APPEND ls_accountpayable TO lt_accountpayable.
    CLEAR ls_accountpayable.

ACCOUNTTAX

存放与税相关行项目

***************行项目30 税
    ls_accounttax-itemno_acc = 30.                      "行项目号
    ls_accounttax-gl_account = '0022210118'.            "科目
    ls_accounttax-tax_code   = 'X3'.                   "税码
    APPEND ls_accounttax TO lt_accounttax.
    CLEAR ls_accounttax.

CURRENCYAMOUNT

存放所有行项目与金额相关的信息,正负对应的记账码系统能自动处理一些,如正40,负50等。

**    行项目金额设定
    lv_sum = lv_sum * ( -1 ).
    ls_currencyamount-itemno_acc = lv_itemno.         "行项目号
    ls_currencyamount-currency   = 'RMB'.             "货币单位
    ls_currencyamount-amt_doccur = lv_sum.            "合计金额
    APPEND ls_currencyamount TO lt_currencyamount.
    CLEAR ls_currencyamount.

2.   实例讲解

通过Tcd:FB01创建一张凭证,分别有以下行项目(无需分析业务合理性,只能技术角度考虑)

行项目号

科目

金额

说明

特殊总账

10

020101

1000

总账科目

20

YH50

500

客户

09E

30

YHG3

1590-

供应商

39E

40

22210118

90

税X3, 6%

 
posted @   往事只能回味---  阅读(1851)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
点击右上角即可分享
微信分享提示