SAP FI 会计凭证过账bapi BAPI_ACC_DOCUMENT_POST

在使用BAPI_ACC_DOCUMENT_POST进行会计凭证过账时,遇到成功提示但无法获取凭证号的问题。经过排查发现,多余的OBJ_TYPE, OBJ_KEY, OBJ_SYS参数是罪魁祸首。删除这三项参数后,成功从返回的内部表中获取到凭证号码。对于不熟悉此BAPI的用户,推荐参考SAP ECC6.0以上的系统程序ACC_BAPI_TEST_DOCUMENT,以了解其用法和参数设置。" 132330776,18158630,C语言结构体:组织数据的利器,"['C/C++', '数据结构', '程序设计']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.    举个我们这次系统中的一个业务场景
前面讲到我们需要把一个Oracle应付发票的凭证导入到SAP中,但是导入的字段比较多,就会出现如下的问题:
SAP系统中把凭证中的[分支号]作为不同系统的来源,例如凭证来源于Oracle,金蝶,用友,那么分支号分别是'001','002','003'。
我们这里使用BAPI_ACC_DOCUMENT_POST来导入凭证,
大家可以看一下在BKPF表中存在[分支号]字段       

但是在BAPIACHE09(操作代码SE37)结构中却没有[分支号]这个字段,BAPIACHE09是BAPI_ACC_DOCUMENT_POST导入凭证头的入口结构        
        
那么标准API没有[分支号],SAP采用何种方法才能将[分支号]导入系统哪?

很高兴看到SAP提供了增强BAdi(客户化创建BAdi)来导入标准API没有的字段
一般情况下,不需要对BAdi作增强,但是当需要将某个不常用的字段导入到SAP,但是标准的BAPI又不能够支持这个字段,则需要对BAdi作增强,那么如何对BAdi作增强那?
下面简单做个讲解:
1)首先需要我们对标准的BAdi(操作代码SE19)做个实例化,本场景中,我们对ACC_DOCUMENT这个标准的BAdi实例化      

        

        
关键是上图中的CHANGE部分,双击就可以进入BAdi的ABAP程序源代码,是不是感觉很爽,不过别高兴太早,因为进入源代码的编辑器之后,是空的,当然,源代码是需要自己添加的,请看下图:
        
上面的代码看不懂没关系,我来解释一下:
DATA部分是定义变量,liw_accit TYPE accit就是定义一个accit的结构类型的变量liw_accit;
LOOP部分就是对BAPI中的extension2的数据作循环
Liw_accit-bschl就是对bschl这个字段根据实际传入的数据作赋值,当然,bschl就是类似[分支号]的字段;
MODIFY就是将bashl等字段写入到c_accit结构中,相当于更新accit表中的数据


大家看到这里,可能已经明白了BAdi是怎么回事。但是大家可能会问,BAPI怎么会去调用BAdi来做这个事情哪?这个问题可能比较复杂,但是我把他简化了说:
在下图中,BAPI一般会有
[Import]传入参数
[Export]传出参数
[Tabellen]这个是table类型的,用来传入和传出数组类型或table类型的数据,在table类型的数据中有个参数是extension2,作为扩展导入的字段,只要在extension2中作了定义,那么就会执行所有实例化的BAdi,所以这也算是SAP的一个缺点,因为假设你定义了2个相同类型的BAdi,它们都会被执行,假设这两个BAdi逻辑相悖,则会导致所无的数据,所以要在SAP的开发中避免
        
 
1.    SAP导入多个凭证
 
 
不过讲到这里,我们也只是一个凭证,但是在我们实际的业务场景中,我们大部分都需要导入多个凭证,那么如果想要导入多个凭证,使用SAP的API如何来实现那?

既然可以使用BAPI_ACC_DOCUMENT_POST可以导入单个凭证,只要对它循环操作就可以实现多个凭证的导入了,大家看了下面的代码就会理解,红色的部分就是循环调用BAPI_ACC_DOCUMENT_POST就可以批量导入凭证
 
 
主要关于BAPI_ACC_DOCUMENT_POST的用法,懂ABAP的人都知道这是用于过账的,而BAPI_ACC_DOCUMENT_CHECK是用于做过账前的Check处理的。

我程序里明明设置好了参数,但是Debug测试时只看到Post Successfully的消息,却看不到我要的会计凭证号,当时很奇怪。百翻思考,网上查资料,后来问题终于得到解决。原来是因为我在 documentheader里多传进去了三个参数:OBJ_TYPE, OBJ_KEY,OBJ_SYS。如果删除这三个参数的话就能在返回的内部table里抓去我想要的凭证号码了。呵呵!问题搞定,当时真的很兴奋!

如果谁对BAPI_ACC_DOCUMENT_POST和BAPI_ACC_DOCUMENT_CHECK这两个BAPI不太熟悉的话,那麽在 SAP ECC6.0以上的版本上有一本系统程序ACC_BAPI_TEST_DOCUMENT,可供参考。里面有关于他们的用法以及参数设置。。。

 
 
 
实例代码:
*         当前行过账-header信息设定
          PERFORM FRM_HEADER_DOCUMENT    USING LV_INDEX
                                      CHANGING LW_HEADER_DOCU.

*         当前行过账-明细信息设定
          PERFORM FRM_EDIT_BAPIITEMS    USING LV_INDEX
                                              LW_ALVDATA.

*         登录会计凭证
          PERFORM FRM_CALL_BAPI         USING LW_HEADER_DOCU.
 
 
*&---------------------------------------------------------------------*
*&      Form  FRM_HEADER_DOCUMENT
*&---------------------------------------------------------------------*
*       header信息设定
*----------------------------------------------------------------------*
*      -->P_IN_FLG          处理FLG
*      <--PW_OUT_HEADER     表头
*----------------------------------------------------------------------*
FORM FRM_HEADER_DOCUMENT     USING P_IN_FLG 
### 使用 `BAPI_ACC_DOCUMENT_POST` 进行会计凭证过账 #### 函数模块概述 `BAPI_ACC_DOCUMENT_POST` 是 SAP 提供的一个函数模块,主要用于创建财务会计 (FI) 和管理会计 (CO) 的记账凭证。此功能允许通过编程方式处理复杂的财务交易。 #### 参数结构 为了正确调用 `BAPI_ACC_DOCUMENT_POST` 并实现资产或其他类型的过账操作,需准备一系列输入参数: - **HEADER**:头部数据,包含公司代码 (`COMP_CODE`)、过账日期 (`POSTING_DATE`) 等基本信息。 - **ITEM[]**:项目列表,定义具体的分录条目,包括科目账户、金额方向及数值等细节[^1]。 - **TEXTS[]**:文本描述数组,提供额外的文字说明支持。 - **REFERENCE1, REFERENCE2**:参考字段,可用于存储关联信息或备注。 对于扩展需求,则可通过 `EXTENSIONIN` 参数传递自定义的数据集来补充标准接口未覆盖的内容[^3]。 #### 实现预制凭证的方法 当希望生成的是预制而非正式的过账凭证时,在增强实施过程中可以通过修改特定状态变量的方式达成目的。具体做法是在 SE19 工具中激活相应增强点,并在变更方法内设置目标状态码为 `'2'`,以此指示系统仅构建而不实际提交凭证记录[^4]。 ```abap MOVE '2' TO c_acchd-status_new. ``` 以上代码片段展示了如何调整内部工作区中的状态标志位以影响最终的行为模式。 #### 错误处理机制 每次执行后应检查 RETURN 表格内的反馈信息,确保操作顺利完成并及时响应任何潜在异常情况。RETURN 结构体包含了多种属性如 TYPE(E=Error,W=Warning,S=Success,I=Information),帮助开发者了解事务的具体进展状况以及是否存在阻碍因素[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值