原创 无峰 [ ABAP 技巧与实战 ](javascript:void\(0\);)
一
前言
SAPERP系统中的大部分的单据都会提供对应的BAPI函数.
通过事务代码BAPI可以查找到标准业务的BAPI函数.但有些业务单据可能无法查找对应的BAPI函数,即使小伙伴google和bing也无法帮助你.
此时BDC就成为了一个必选项
**本文主要介绍用BDC开发程序的步骤及注意事项**
二
定义
( BDC – Batch Data Communication)
一种调用事务代码的方式, 通过参数BDC_TAB传递调用过程中所有屏幕的内容及操作.
因为屏幕处理过程繁琐且复杂,所以SAP提供了一个工具SHDB,用于辅助用户在执行事务代码时记录处理过程.
二
记录
TCODE: SHDB
记录时,勾选
• **不是批处理会话**
• **模拟后台模式**
这个很重要,务必勾选,减少可能的错误.
点击开始记录时,系统会执行填写的事务代码. 在记录中尽量最简化与系统的交互过程.
三
完成
完成记录后, 系统会生成一个记录信息.
这份信息包含了执行事务代码过程中的所有输入内容及操作过程.
可以通过点击处理按钮验证记录是否能再次成功执行
四
函数
通过按钮<功能模块>可以把记录的信息创建一个函数. 后续改写函数可以完成业务动作的封装.
五
问题
在SHDB中执行能成功创建单据
但是通过函数调用却总会报错. 特定屏幕无批输入数据
这种问题不是一定会产生的.
问题产生的原因是标准程序在执行过程中会检查一些系统环境变量,比如 SY-BINPT(批输入处理活动) ,根据该环境变量,改变屏幕处理过程.
所以需要确保记录和执行的过程中这些环境变量一致.
六
分析
使用SHDB处理时, 勾选了
• **不是批处理会话**
• **模拟后台模式**
但是生成的函数没有给出这个选项.
查看CALL TRANSACTION的帮助,可以看到在OPTIONS FROM opt 子句中可以填写这些内容
七
改造
• 复制include bdcrecxy-> 自定义的include 名称,并使用
• 改进 CALL TRANSACTION 语句添加 options from opt 子句
• 添加参数 不是批处理会话, 模拟后台处理
• 把BDC的返回调整成BAPIRET2的返回.
八
缺点
BDC严格按照记录的顺序执行.
如果因为填写的内容或配置改变导致了屏幕顺序的变化,或者意外的弹窗信息都会导致BDC处理失败.
实践中,非必要不采用BDC调用系统事务.
其实某些早期的BAPI函数内部也封装的BDC调用. 只是标准函数考虑了屏幕执行的所有过程,不会出现意外.
九
总结
尽量用标准BAPI函数,不使用BDC.
BDC处理可以处理大部分SAP标准程序,但是一些应用了OO对象(比如 ALV修改/显示数据)的事务无法处理.
因为这类事务调用了GUI的前台显示类,而BDC需要后台处理-无法和GUI交互.
BDC记录及后台处理时,最好设置参数 不是批处理会话 / 模拟后台模式. 这样才能确保记录及处理成功.
**约定**
如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.
( **如果你真的喜欢这篇文章,请记得回来打个赏,作为支持我继续下去的动力,这是一个正反馈过程.
越多的人打赏,作者越有动力分享,读者就能享受更多的福利.毕竟打赏的金额富不了我,穷不了你,却能支持这个公众号长久发文.** )
syjf1976
sharry_xlp
Yannick_Duan
申请进入公众号讨论群提问或者参与话题讨论