SAP ABAP BDC 录屏开发
文章目录
- 前言
- 一、案例介绍/笔者需求
- 二、录屏操作的理解和实操
- `01.`案例数据的准备
- `02.`录屏
- `03.`分析录制结果
- 三、将录制结果转为代码调用
- `01.`转为程序
- `02.`转为代码
- 四、常用参数详解
- `01.`处理模式 MODE
- `02.`更新模式 UPDATE
- `03.`批量调用
- `04.`不是批输入会话 Not a Batch Input Session
- `05.`所有参数详解及用法 OPTIONS FROM CTU_PARAMS
- 五、其他调用BDC的方式
- `01.`代码创建插入SESSION
- `02.`SM35查看执行会话
- 六、数据从EXCEL上载至内表
- END、总结
前言
本文目前 1.6w字+,这篇文章会持续更新优化,先 点赞 关注 收藏
制作不易 谢谢🤞
Batch Data Communication (BDC) 是 SAP 系统中最早的一种数据迁移和批量处理技术,随着 SAP ERP 系统的发展而逐渐完善。在早期,企业数据通常存储在不同的遗留系统或非 SAP 系统中,为实现新系统上线或日常业务需求,这些数据需要迁移到 SAP 系统中。作为数据迁移的主要工具之一。其主要通过模拟用户在事务代码中的输入完成对数据的批量处理。在 S/4HANA 及更现代的 SAP 系统中,数据迁移需求更多依赖于更先进的工具,如 LSMW、BAPI、以及最新的 SAP Data Migration Cockpit。尽管 BDC 的地位逐渐被削弱,但在某些特定场景下,它仍具有独特的价值。例如SAP中不是所有的事务操作都可以用BAPI或者其他方式来完成,往往还是需要人工前台操作,那么这就展现出了BDC的价值了。
一、案例介绍/笔者需求
在接下来的案例中,我将尽可能展示前台的各种操作,详细解析 BDC 在模拟人工输入时如何定位和执行输入动作。这些案例虽然可能不完全符合实际业务需求,但它们的设计旨意是帮助你深入理解 BDC 的工作原理与实现方式,来为掌握这一技术打下坚实基础。
二、录屏操作的理解和实操
这个章节我们主要围绕录屏的事务码SHDB做演示讲解。不会涉及到代码层面,其实核心也就是这里,代码其实就是做了重复性的动作而已。只要我们把它的原理和实现方式搞懂了在写代码的时候才能清楚的知道我们要怎么做怎么调整。
01.
案例数据的准备
先说一下我们要实现的效果吧,我们会创建一个消息类,然后用BDC的方式给这个消息类不断添加新的消息。所以在这之前我们先要有一个已经创建的消息类。
a.SE91创建消息类
创建一个消息类这里我就不多说了,这个很简单没必要做图文演示,我这里直接给大家看一下我已经创建的消息类。
b.如何新建一个消息?
如何新建一个消息?这个问题听着很扯,但其实是很有讲究的,在已有的消息类创建一个消息我想这大家都会而且特别简单。但是我们要知道我们现在是要做一个用程序批处理的逻辑来进行新增一个消息,那么既然要用程序我们就是要有规律有逻辑性的去创建,我们每个人的习惯都不一样,在操作SAP前台界面的时候也就有不一样的习惯,有些人可能每次输入完东西都习惯敲回车,有些人点击按钮的时候习惯使用TAB键+回车(懒得动鼠标)。所以我们在做一个录屏的操作之前 要先熟悉我们到底怎么操作才是最合理的,如何点击按钮?如何定位到对应输入框?尤其是在Table Control表格控件中,我们要保证我们每次输入的位置都是正确的,而不是定位到一个已经是灰色不可输入的输入框中。下面我会给出我这次录屏操作的顺序👇
1、 输入SE91进入消息维护初始屏幕 这将是我们进入的第一个屏幕
2、 在输入框中输入对应消息类的名称
在这一步的时候有些人可能习惯性的点击一下输入框但其实是大可不必的,因为这个输入框在你输入事务码进入之后就已经获取了焦点,所以直接输入就行。这块先有个印象后面我还会详细解释
3、 点击更改进入到消息维护更改界面 这将是 我们进入的第二个屏幕
4、 点击下一个可用按钮
这里就是很有讲究了,有些人会想我之前维护的时候都是滑动滚轮直到我看到可以输入的输入框就直接输入保存就可以了,你为什么要点击 下一个可用 这个按钮来定位到对应输入框呢?请继续看下面黄色字体的解释👇👇👇
大家请看下图的两种情况左边是 情况1 右边是 情况2,在情况1的时候我滚轮滑动的比较少停留在了Table Control控件的第45个消息编号这意味着我要给Table Control的第6个输入框输入值,再看情况2 我滚轮滑动的比较多是停留在了47这个消息编号 这意味着我需要给Table Control的第4个输入框 输入值。在这块其实涉及到一个屏幕的知识就是在屏幕中我Table Control的输入框只有这么几个 不是你消息越多Table Control在屏幕中的输入框就越多,这个取决于你Table Control画了多大 你电脑屏幕分辨率有多大。所以你要是以滚动鼠标滚轮多少次停留在了哪个编号计算要输入 输入框的相对位置那么是极其复杂的,但是我点击下一个可用这个按钮就不一样了,它每次都可以给我定位到我要输入的那个输入框,也就是我每次给Table Control的第一个输入框输入值就行了。这样规律规范起来才能使用好录屏做我们数据的批处理。实际上滚轮翻页也不会被我们录制上的 我这个举例只是让大家更好的理解 但是滚动条的上下按键是可以录制起作用的
5、 在第一个输入框输入消息内容
在这里有些人可能又会习惯的点击第一个输入框再输入内容,其实大可不必,因为点击下一个可用按钮的时候这个输入框就已经获取了焦点,但其实你也可以保留这个鼠标点击操作,反正后面也会调整的。你多余的操作多了见到的参数内容也就多了 也可以帮助你了解更多的东西。
6、 点击保存按钮
在点击保存按钮之前有些人可能习惯性的敲一下回车,其实也无所谓 后面会调整的。至此我们添加一个消息的操作就这么6步。下来我们将会使用录屏把这些操作录制下来。
02.
录屏
这里我们将会把我们上面的操作使用录屏录制下来,也会熟悉如何录屏的一个操作流程以及一些选项参数的作用。
a.进入录制界面
我们录屏的事务码是 SHDB 进入之后如下图界面,可以看到有一些按钮这些按钮后面会使用介绍到,还可以看到有一些输入框 这是用来查询我们录制记录的,下面就是一个Table Control用来显示我们的记录。
b.新建记录
点击新建记录根据下图输入操作,记录参数我们都先保持默认,这些参数在后续代码调用的时候也是可以改的,我们录制只是为了记录下我们的操作,后续想要以何种方式调用是由我们自己控制的。下图中最后点对勾和开始记录效果都一样
b.记录操作
在我们点击对勾或者开始录制之后 就会进入我们对应的事务码界面,从现在开始尽量减少不必要的操作,如果多操作了也不影响,后续我们会逐步解读录制后的记录来加以优化,所以也不必那么紧张多操作了一步也不影响不用重新跑一遍。大致就是如下步骤,上面我们也详细介绍过了,在录制的时候呢SAP只是记录你输入框是什么值不会因为你是Ctrl + V 粘贴的 它就记录了你Ctrl + V这个动作。所以可以放心粘贴复制。 保存之后要点击两次返回
才能彻底退出整个SE91事务码,也就是退出这个程序,退出这个程序也就意味着录制结束,我们的记录也就呈现在了我们界面中。
👇下图是录制结束之后的界面,接下来我会带大家熟悉录制后的结果。
03.
分析录制结果
这里我们将详解逐步分解录制结果表格中的数据,这将是对我们后续掌握BDC至关重要的。
a.运行录制结果
要熟悉它首先要会使用运行它,按照如下图操作,点击处理会出现一个弹框 然后点击对勾 参数我们先保持默认。
👇在运行后我们发现进入了SE91界面 并且屏幕上始终有一个小弹框。这个小弹框会有 OK-CODE, 这就是代表我们将会执行操作的按钮,我们也可以观察左上角事务码输入的输入框也有同样的OK-CODE其实在我们正常情况下也可以在这输入对应OK-CODE来执行按钮操作。接下来大家可以点击小弹框的对勾逐步执行观察完整个过程。
👇下图是OK-CODE操作对应的按钮,以及执行完之后的画面,执行完后返回的消息内容在我们最终用代码操作的时候会以内表的形式返回给我们。同时我们会发现在执行的时候添加的消息号Number是56 在我们上面录制的时候是55,也证明我们录制的记录是没问题的,现在也体现出了BDC如何工作的画面。这里我们有重要的一点要说,在我们BDC录制的时候千万不能在生产机执行,因为在你录制的时候你是实实在在的把前台操作执行了,并不是虚的。
b.步骤的优化
在行详解记录之前我想先对整体有个优化,其实我们在新增完消息点击保存之后我们的任务就完成了吧,其实没必要再点击两次返回吧。我们点击返回只是为了结束整个程序而已,所以我们可以先把返回的两个步骤删除掉如下图一样删除。删除的时候鼠标一定要先点击对应行,删除的时候会提醒是否删除dynpro中的所有行,这里我们选是,因为你选中的是新屏幕开始的那一行,既然你整个屏幕都没了在这个屏幕上的后续操作当然也都没了。我们将18和23行都删掉。删完之后我们还是可以点击处理正常运行的。
优化步骤之后如下图👇
c.列的详解
我们可以看到录制的结果一共有6列。
1、行 这个其实没什么解释的就是序号而已
2、程序 这一列代表我们进入运行的是哪个程序,在执行 SE91 之后我们直接打开系统状态来看 很明显事务码 SE91 对应的程序就是 SAPLWBMESSAGES
3、屏幕 屏幕与程序结合起来看 就代表着我们进入的是哪个程序的哪个屏幕,我们SAP的标准程序基本都是有很多个屏幕的。
4、开始 ID 这个字段含义很深,T 代表是 Transaction 也就是事务码,X 代表是不是进入了一个新的屏幕。
5、字段名 这里大部分参数我们看名称也能猜出来,BDC_CURSOR(代表鼠标光标的操作)、BDC_OKCODE(代表按钮的操作)、BDC_SUBSCR(代表程序子屏幕)。。。。在下面行详解的时候就会见到更多了。
6、字段值 这里大部分都是屏幕上的 字段 、字段值 、OK-CODE
c.行的详解
我将拆成三部分详解。
1、第一部分 直接看下图注解就可以,值得注意的是行的顺序并不是BDC执行的顺序,我们可以看到点编辑按钮是在输入消息类之前,可见BDC的逻辑是如果这个按钮会导致进入新的屏幕它就不受顺序的影响,它会最后执行。
2、第二部分 这里要解释两个问题,为什么我鼠标没有点击第一个输入框但是却获取到了焦点,我们可以SE91以编辑模式进入消息维护界面,就可以看到第一个输入框默认获取到了焦点,但其实我们这一步是不用的,但是DBC的录制机制就是这样,我们到时候可以优化省略这些步骤,为什么我没有给字段NUMBER输入000它也被录制到了呢?因为BDC的录制机制就是这样,只要这个地方有值他就会记录下,就好像第一部分的单选框一样我并没有选择它也默认记录下了屏幕中字段的数值。
3、第三部分 为什么我没有进入新的屏幕第三部分也标注我是进入了一个新的屏幕?因为第二部分的时候你点了下一个可用按钮,点击了按钮等于触发了PAI又会触发PBO所以进入新的屏幕不一定是不一样的屏幕而是代表我屏幕刷新了一下。为什么还是获取第一个输入框的焦点?因为对于我Tablecontrol来说它就是第一个输入框对你消息编号来说它可能是第57个输入框。记住按钮会触发PAI->POB->屏幕刷新 = 新的屏幕
d.保存记录
在处理完之后记得保存记录,然后就可以查看到我们的记录了,通过 按钮 也可以反复操作这些记录。
三、将录制结果转为代码调用
相信你看完上述部分已经对录屏有了很好的理解和使用,接下来我们说到如何将录制结果转为代码 如何用代码正确调用运行。
01.
转为程序
这里我们将录制结果生成为一个程序,这是 SHDB 的一项功能,在生成后的这个程序里面会有我们想要的代码,这样只是为了方便我们快捷Copy代码而已,我们也完全自己可以写的出来,只不过没必要浪费这时间。
a.生成程序
按照如下图生成程序
生成之后会直接到程序编辑界面。👇
b.生成程序的详解
这个程序呢我们不用研究透彻而且也不会用这个程序,如果感兴趣的可以看看梳理梳理它的逻辑,我们只看下图中的这部分代码👇,是不是看着就很熟悉的感觉,没错!!!这部分代码其实就是我们之前详解过记录成功之后Tablecontrol中的那些数值,这里也就是用代码的形式把这个表格还原出来,只要我们还原了这个表格那么就可以调用这个表格来实现我们录制的业务操作。我们可以看到这部分主要有三个perform 只要搞明白这个三个perform那么还原这个表格就很容易了。大家接着往下看👇
1、bdc_dynpro 我们只要看到 dynpro 就很明显知道是跟屏幕有关吧,这个perform的注释也写的很明显,意思是开始新的屏幕,它做的就是往这个 BDCDATA 内表添加了数据。 那么添加什么数据我们从上面的图片就看的出来是添加了 ‘SAPLWBMESSAGES’ ‘0100’. 也就是SE91事务码对应程序的0100屏幕吧,其实这些我们也都已经详解过了,后面不在过多赘述。
2、bdc_field 这个perform是插入相关字段,什么字段呢?也就是我们上面解释过的那些 例如:ok_code、屏幕字段、屏幕字段值 这些。。。。但是这个perform是有一个判断逻辑的,这个判断逻辑其实是和这个程序有关的我们到时候会删掉这个判断逻辑。
3、bdc_transaction 这个perform看着是有点复杂,其实你不用看那么多 主要就是BDC的调用方式,我们主要先看下图的②,①不常用后面我们也会讲解到的。这个perform的核心就是用还原出来的表格调用BDC。
02.
转为代码
通过对上面生成程序的详解我相信大家已经大致清楚如何通过代码实现BDC的调用了,下来我们将会创建一个新的程序来实现BDC代码的调用。
a.创建一个新的程序
这里就不用多说了,👇下图是我已经创建好的图片。我就写了一个 START-OF-SELECTION.
b.CV大法主逻辑
现在我们进行CV大法主逻辑并加以优化
1、copy 主逻辑 copy过来有点乱,我将对这些代码的格式进行优化 并加上注释。如果对这些代码有些行看不懂 可以结合录制结果那个表格还有字段名来进行鉴别。字段要是不认识就去对应屏幕疯狂F1 总会找到的。
2、主逻辑格式优化 优化添加注释之后如下图所示,先熟悉一下 其实这些逻辑我们在上面都已经详解过了。转为代码之后就是猫叫咪咪而已。
3、主逻辑代码优化 这些代码其实有好多是没用的,这是因为BDC的录制机制 和 我们自己的操作习惯引起的。我们可以将这些代码优化删除掉,这就很考验你对BDC的理解了,如果你没看懂之前分析录制结果的内容 那么很可能会误删。如下图所示我们删掉了6行代码。
①:因为进入0100屏幕之后输入框会自动获取焦点没必要鼠标再点击一次
②:因为进入0100屏幕之后单选框默认就选择的是 消息 而并非属性
③:进入消息维护界面之后Tablecontrol的第一个输入框会自动获取焦点
④:进入消息维护界面之后Tablecontrol的第一个输入框的消息编号字段有值所以被记录了下来
⑤:点击下一个可用按钮之后Tablecontrol的第一个输入框依然会获取焦点 没必要再指定获取焦点了
⑥:是因为输入框有默认值所以被记录下来了 没必要
c.CV大法perform
已经没什么好解释的了,记得删掉原程序的一个判断逻辑
d.CV大法call BDC
这一步改动比较大 参数也较多,上面我们也提到过我们使用第②种方式调用BDC。我们将第26行用perform调用BDC的代码直接改为下面这样。至此我们所需的代码还有程序的大体逻辑已经可以了。接下来我们要将程序需要定义的数据还有参数进行替换。
e.声明数据 参数替换
按照如下图注解完成我们自己的BDC程序,现在这个程序也就可以正常运行了。
f.运行效果 Copy代码
这是我的运行效果,大家也可以直接Copy代码拿去用测试 改写,记得消息类要替换为自己的消息类。
REPORT zglyn001.
DATA: bdcdata LIKE bdcdata OCCURS 0 WITH HEADER LINE.
DATA: messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.
START-OF-SELECTION.
PERFORM bdc_dynpro USING 'SAPLWBMESSAGES' '0100'."进入程序 SAPLWBMESSAGES 0100屏幕
PERFORM bdc_field USING 'BDC_OKCODE' '=WB_EDIT'."以编辑模式进入消息维护
PERFORM bdc_field USING 'RSDAG-ARBGB' 'ZGLYN'."输入消息类的名称
PERFORM bdc_dynpro USING 'SAPLWBMESSAGES' '1000'."进入程序 SAPLWBMESSAGES 1000屏幕
PERFORM bdc_field USING 'BDC_OKCODE' '=ADDS'."点击下一个可用按钮
PERFORM bdc_dynpro USING 'SAPLWBMESSAGES' '1000'."点击下一个可用按钮之后刷新了一次屏幕(很重要)
PERFORM bdc_field USING 'BDC_OKCODE' '=WB_SAVE'."等所有值输入后 点击保存
PERFORM bdc_field USING 'T100-TEXT(01)' '这是我的第一个BDC程序'."输入了对应消息
CALL TRANSACTION 'SE91' WITH AUTHORITY-CHECK"调用执行BDC
USING bdcdata"BDC内表
MODE 'A' "处理模式
UPDATE 'L' "更新模式
MESSAGES INTO messtab."返回消息
FORM bdc_dynpro USING program dynpro.
CLEAR bdcdata.
bdcdata-program = program.
bdcdata-dynpro = dynpro.
bdcdata-dynbegin = 'X'.
APPEND bdcdata.
ENDFORM.
FORM bdc_field USING fnam fval.
CLEAR bdcdata.
bdcdata-fnam = fnam.
bdcdata-fval = fval.
APPEND bdcdata.
ENDFORM.
四、常用参数详解
掌握了上面内容之后其实你已经掌握BDC的核心了,接下来就是要实现如何重复调用执行的问题。在做批量调用之前我们必须要先了解一些常用参数,因为我们现在还必须人工干预操作才可以让BDC顺利的执行完,所以接下来我们要用一些参数来控制BDC的调用处理方式。
01.
处理模式 MODE
当你使用 CALL TRANSACTION 进行BDC事务处理时,可以通过 MODE 选项控制屏幕的显示方式,从而影响程序的交互体验。
a.MODE 选项的含义
上面测试的时候我们这个MODE 参数一直设置的是A ,它其实还可以设置如下几个值👇,如果传入的 mode 不是 “A”, “E”, “N”, “P” 之一,则系统会自动按照 “A” 处理。
MODE 值 | 处理方式 | 适用场景 |
---|---|---|
“A” (默认) | 正常模式,所有屏幕都会显示 | 适用于调试或需要人工干预的情况 |
“E” | 错误时显示屏幕,否则不显示 | 适用于批处理,只有错误时需要用户手动检查 |
“N” | 完全后台运行,无屏幕显示,遇到断点直接终止失败,不进入 Debugger。sy-subrc 会等于 1001 | 适用于全自动执行,不能人工干预 |
“P” | 无屏幕显示,但遇到断点会进入 Debugger | 适用于后台调试自动化事务 |
b.前台对应选项
前台执行的时候可以通过这个下拉框设置MODE
c.MODE 选项 效果示例
1、 设置为 A 我就不做示例了,因为上面我们用到的都是A,效果就是每个屏幕都会显示 你每次点击对勾然后一步一步的执行完。
2、 设置为 N 之后我们可以循环打印返回的消息 这样也会有明显的效果,当我们点击执行之后可以发现报错或者不报错都没有任何屏幕的显示。
不报错👇
报错👇
LOOP AT messtab INTO DATA(ls_messtab).
MESSAGE ID ls_messtab-msgid
TYPE ls_messtab-msgtyp
NUMBER ls_messtab-msgnr
WITH ls_messtab-msgv1 ls_messtab-msgv2 ls_messtab-msgv3 ls_messtab-msgv4
INTO DATA(lv_mtext).
WRITE / lv_mtext.
ENDLOOP.
3、 设置为 E 之后我们继续输入不存在的消息类查看效果。可以看到直接跳到了报错的屏幕。
3、 设置为 P 就不介绍了 这玩意不常用 而且我也没试出来效果 不知道是手动打的断点有效果 还是 BREAK-POINT. 代码断点 有效果,反正我试下来感觉不管MODE设置成什么 这两种断点都会进入 。
02.
更新模式 UPDATE
当你使用 CALL TRANSACTION 进行BDC事务处理时,可以通过 UPDATE 选项控制事务的更新方式,这回影响到我们程序的执行效率。
a.UPDATE 选项的含义
上面测试的时候我们这个MODE 参数一直设置的是L ,它其实还可以设置如下几个值👇,如果传入的 mode 不是 “A”, “S”, “L” 之一,则系统会自动按照 “A” 处理。
MODE 值 | 处理方式 | 适用场景 |
---|---|---|
“A” (默认) | 异步更新,等效于 ABAP 语句 COMMIT WORK(无 AND WAIT) | 性能优先的更新,适用于大批量数据,不影响前端操作 |
“S” | 同步更新,等效于 ABAP 语句 COMMIT WORK AND WAIT | 确保数据立即更新到数据库,适用于连续的业务逻辑 |
“L” | 本地更新,等效于 ABAP 语句 SET UPDATE TASK LOCAL | 仅在当前 LUW(逻辑单元)内更新,把所有的后台更新变为本地同步执行 等待这些更新任务执行完程序再继续执行 |
b.前台对应选项
前台执行的时候可以通过这个下拉框设置UPDATE
c.UPDATE 选项 详解
1、 设置为 A 之后如果不影响你后续逻辑的执行 那么就设置为A,它是异步更新 可能你点了保存之后程序给你返回:消息被保存 但是其实还没有写入数据库。也就是说不用等待系统数据库写入完成 就可以执行后续代码。
2、 设置为 S 之后 系统会等待数据库写入完成之后在执行后续代码。
3、 设置为 L 它会把你原本有更新模式的任务 拉到本地执行,就会跟主程序的luw绑在一起了,不会等你主程序commit work提交之后再新开一个luw执行更新任务。
03.
批量调用
批量调用其实很简单,就是重复填充bdc内表 然后重复调用对应的事务码然后接受返回消息就行了。
a.实现思路
我们声明一个只有一个字段的内表 然后存储5行数据,分别是消息 1 2 3 4 5 然循环我们这个内表调用BDC就行。记得MODE要设置为N,这样才能丝滑调用。
b.代码实现
这是极其简单的BDC调用,真实业务中可能会根据业务数据判断然后增加或者减少步骤,例如我们可以设计一个给程序设置事务代码的BDC,有的程序设置事务代码是保存本地包里面 有的程序设置事务代码不保存到本地包是需要传输的那么就需要多一个新建请求号的步骤。我们也可以根据数据判断来调整最终生成的BDC内表,灵活的增加或减少步骤,使 BDC 逻辑通用性更强,满足不同场景下的需求,从而提升程序的灵活性和适应性。
REPORT zglyn001.
DATA bdcdata LIKE bdcdata OCCURS 0 WITH HEADER LINE.
DATA messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.
DATA gt_msg_data TYPE TABLE OF char10 . "一个字段的内表
START-OF-SELECTION.
gt_msg_data = VALUE #( ( '消息1' ) ( '消息2' ) ( '消息3' ) ( '消息4' ) ( '消息5' ) )."添加数据
LOOP AT gt_msg_data INTO DATA(lv_msg).
CLEAR: messtab[],messtab[],bdcdata[]."记得一定清空相关数据
PERFORM bdc_dynpro USING 'SAPLWBMESSAGES' '0100'."进入程序 SAPLWBMESSAGES 0100屏幕
PERFORM bdc_field USING 'BDC_OKCODE' '=WB_EDIT'."以编辑模式进入消息维护
PERFORM bdc_field USING 'RSDAG-ARBGB' 'ZGLYN'."输入消息类的名称
PERFORM bdc_dynpro USING 'SAPLWBMESSAGES' '1000'."进入程序 SAPLWBMESSAGES 1000屏幕
PERFORM bdc_field USING 'BDC_OKCODE' '=ADDS'."点击下一个可用按钮
PERFORM bdc_dynpro USING 'SAPLWBMESSAGES' '1000'."点击下一个可用按钮之后刷新了一次屏幕(很重要)
PERFORM bdc_field USING 'BDC_OKCODE' '=WB_SAVE'."等所有值输入后 点击保存
PERFORM bdc_field USING 'T100-TEXT(01)' lv_msg."输入了对应消息
CALL TRANSACTION 'SE91' WITH AUTHORITY-CHECK"调用执行BDC
USING bdcdata"BDC内表
MODE 'N' "处理模式
UPDATE 'A' "更新模式
MESSAGES INTO messtab."返回消息
WRITE /.
WRITE lv_msg && '添加结果:'.
LOOP AT messtab INTO DATA(ls_messtab).
MESSAGE ID ls_messtab-msgid
TYPE ls_messtab-msgtyp
NUMBER ls_messtab-msgnr
WITH ls_messtab-msgv1 ls_messtab-msgv2 ls_messtab-msgv3 ls_messtab-msgv4
INTO DATA(lv_mtext).
WRITE lv_mtext.
ENDLOOP.
ENDLOOP.
FORM bdc_dynpro USING program dynpro.
CLEAR bdcdata.
bdcdata-program = program.
bdcdata-dynpro = dynpro.
bdcdata-dynbegin = 'X'.
APPEND bdcdata.
ENDFORM.
FORM bdc_field USING fnam fval.
CLEAR bdcdata.
bdcdata-fnam = fnam.
bdcdata-fval = fval.
APPEND bdcdata.
ENDFORM.
c.效果演示
这样就能感受到BDC批量处理数据的效果了。
04.
不是批输入会话 Not a Batch Input Session
我们在上面录制和前台执行 BDC 的时候会发现有这么一个选项,这个选项其实不常用,但是很重要 也不难理解,BDC在设计之初呢考虑到了性能问题因为我们有些事务代码界面是非常复杂的有各种输入框选项并且非常多, 为了我们BDC录入数据方便呢它将某些事务界面进行了简化 就是将输入框集合在了一起 并且样式也非常的简单,这种简化界面下有些输入框可能会缺失 而且跟正常操作录入数据的步骤可能也有不同,但是不管是哪种界面下都是可以操作录入成功的,只不过你录入的时候选择的是简化界面 那么你在调用的时候参数一定也要设置为简化界面。这个参数就是我们要介绍到的 不是批输入会话 Not a Batch Input Session
a.体验这个参数的效果
想要直观感受到这个参数的作用可以使用事务码 FK01 创建供应商 ,我们将使用BDC录制进入 和 正常前台输入事务码进入 观察创建界面的区别。
需要注意的是S4系统的BDC好像不支持使用 FK01 了,我现在演示这个参数的案例是在一个ECC系统里面演示的。
正常前台事务码进入创建界面 图①👇
BDC不勾选此参数进入创建界面 图②👇
这个参数其实可以控制我们进入的界面是图①或者图②,如果你勾选了这个参数 那么就和我们正常进入事务码界面一模一样,如果你没有勾选有的事务码进入之后会像我们图②一样是一个简化的界面。所以你录制的时候如果勾选了这个参数那么调用的时候也要设置这个参数,如果你录制的时候没有勾选那么在调用的时候也就不要设置这个参数。
b.代码调用设置此参数
设置这个参数呢不能像 处理模式MODE 和 更新模式 UPDATE 那样设置了。CALL TRANSACTION的时候呢还有一个扩展变式叫做 OPTIONS FROM,这扩展语句需要跟一个结构,这个结构需要参考 CTU_PARAMS,有了这个结构呢我们BDC所有的调用参数都可以在这里面设置 包括: 处理模式MODE、更新模式 UPDATE、不是批输入会话 Not a Batch Input Session 。。。。。
下面这个程序和我们上面的操作步骤一样录制完复制一下 大概随便改一改就行了 主要是观察这个参数的作用 ,OPTIONS FROM 后面跟的这个 opt 我们后面还会介绍到,下面这个例子我们采用 opt 这个参数将MODE 设置为A显示所有屏幕 将Not a Batch Input Session设置为X或者为空 观察界面的变化。
NOBINPT 设置为空 👇
NOBINPT 设置为X 👇
可以看到当我们调用的时候和我们录制的时候NOBINPT参数不对应连输入框值都不能正确输入 所以步骤是不可能正常执行下去的。
如果大家没有ECC系统想试出这种效果的话可以使用SM34 ,SM34是用来维护复杂的配置表的是那种复合式的维护界面,BDC如果不勾选NOBINPT参数为X那么SM34界面也是显示不全的。如下图所示。
05.
所有参数详解及用法 OPTIONS FROM CTU_PARAMS
上面我们已经用过这个变式后缀了 下来我们详细看一下这个后缀的其他参数的作用。
a.已经使用了解过的参数
下图选中的这些参数我们已经使用掌握了,还有其他4个参数我们继续介绍。
b.DEFSIZE 设定屏幕大小
这个参数一般不设置,不然屏幕大小和我们正常进入事务码界面大小不一样。主要影响的是Table Contrlol这种控件。也就是说我正常前台使用事务码进入界面我Table Contrlol可能有10行,但是如果你DEFSIZE 设置为X那么屏幕变小之后Table Contrlol可能只有5行了,就是这个参数会影响我们屏幕的大小一般都是不启用 也就是不设置DEFSIZE 这样可以使用我们 SAP 标准默认屏幕尺寸,避免因窗口大小变化导致的输入字段错位问题。
BDC前台对应参数👇
代码调用参数为空或为X效果对比👇
c.RACOMMIT 控制是否提交
这个参数为 ‘X’:事务不执行提交,可通过后续 ROLLBACK WORK 回滚,为 空:事务执行提交,数据库更改永久保存。这在需要手动控制提交的场景中非常有用,例如在批处理中可能希望在处理完所有数据后再统一提交。 但是这玩意我没试出来效果,可能是我这个案例的原因吧。。。但是这个参数官方文档说就是这个作用 下图是前台和代码调用对应的选项和参数
d.NOBIEND 控制SY-BINPT是否清空
这个参数用于控制系统变量 SY-BINPT 是否被清空。为 ‘X’ 事务执行结束后 SY-BINPT 被清空代表结束批处理模式。设置为空事务执行结束后保持 SY-BINPT 为 ‘X’,继续批处理模式。SY-BINPT 影响后续程序的行为,因为某些逻辑可能依赖于是否处于批处理模式。例如, NOBINPT = ‘X’ 可跳过批处理模式下的某些控件检查。这个玩意我也没试出来效果反正就是用来控制 SY-BINPT 是否被清空的。下图是前台和代码调用对应的选项和参数
e.CATTMODE 是否以计算机辅助测试工具模式运行
CATT 模式通常用于测试场景,CATTMODE 用于指定事务是否以 CATT(计算机辅助测试工具)模式运行。如果设置为 ‘A’,事务不会显示屏幕,适合自动化测试;如果设置为 ‘N’ 或 ’ ',则正常运行,显示屏幕。这在批处理或测试场景中非常有用。下图是前台和代码调用对应的选项和参数,这个玩意我也不太懂 如果我后面有用到了再回来填坑。大家也可研究一下SCAT这个事务码。
五、其他调用BDC的方式
上面介绍的是我们BDC最常用调用方式 除了这个方式我们BDC还有另外一种调用方式,这种方式的操作需要两步,首先我们要用代码创建一个session,然后向我们这个session中插入BDC数据,最后关闭session,然后系统就会保留住这个session,当你需要的时候可以去SM35 查看并手动执行这个会话。至于你选择哪种BDC的调用方式这个是根据你的实际需求来决定的,如果你是要立马调用执行BDC生成数据那么就用 CALL TRANSACTION ,如果你想将上传数据和执行生成数据的这个操作分开 例如你想在这两个步骤中间加一个审批的动作可以说我们执行的人会审批要执行的数据 那么可以考虑使用插入session的这种操作。或者是 数据月中上传 月末的时候执行 或者是你想保留执行日志因为SM35是有完善的日志记录功能的。。。。等等根据自己需求选择就行
01.
代码创建插入SESSION
之前我们使用 CALL TRANSACTION 调用的时候是遇到一个 新 BDC 内表 就直接立马执行,现在我们要做的是遇到一个 新 BDC 内表 就插入我们创建的session。
a.创建session
创建一个session用函数 BDC_OPEN_GROUP 即可,可以参考我们BDC生成的程序中的用法。主要用到的参数有 client(客户端)、group(会话名称) 、keep(保持会话)、user(创建会话的用户名) ,用法很简单 大家到时候想复制代码在最下面。
b.BDC内表插入session
向session插入BDC数据用函数 BDC_INSERT 即可,可以参考我们BDC生成的程序中的用法。
c.关闭session
关闭session非常简单直接调用函数 BDC_CLOSE_GROUP 没任何的参数。
d.执行程序查看结果
可以看到我们程序是没啥问题的,但是有个点需要修改一下,不然后续执行这个会话的时候就会失败。
e.修改点
需要加上这几行代码我们BDC才能完整执行一次,虽然不加的话我们CALL TRANSACTION调用也是可以的 但是在下面使用会话执行的时候会出问题的。这个代码其实本来是有的只是上面我们录制的时候为了精简步骤才砍掉了。
复制代码👇
REPORT zglyn001.
DATA bdcdata LIKE bdcdata OCCURS 0 WITH HEADER LINE.
DATA messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.
DATA gt_msg_data TYPE TABLE OF char10 . "一个字段的内表
START-OF-SELECTION.
gt_msg_data = VALUE #( ( '消息1' ) ( '消息2' ) ( '消息3' ) ( '消息4' ) ( '消息5' ) )."添加数据
DATA group TYPE apq_grpn VALUE 'ZGLYN_SESSION'.
CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING
client = sy-mandt "客户端
* DEST = FILLER8
group = group "会话名称
* HOLDDATE = FILLER8
keep = 'X' "保持会话
user = sy-uname "用户名
* RECORD = FILLER1
* PROG = SY-CPROG
* DCPFM = '%'
* DATFM = '%'
* APP_AREA = FILLER12
* IMPORTING
* QID =
EXCEPTIONS
client_invalid = 1
destination_invalid = 2
group_invalid = 3
group_is_locked = 4
holddate_invalid = 5
internal_error = 6
queue_error = 7
running = 8
system_lock_error = 9
user_invalid = 10
OTHERS = 11
.
IF sy-subrc <> 0.
MESSAGE '创建会话失败' TYPE 'S' DISPLAY LIKE 'E'.
EXIT.
ENDIF.
LOOP AT gt_msg_data INTO DATA(lv_msg).
CLEAR: messtab[],messtab[],bdcdata[]."记得一定清空相关数据
PERFORM bdc_dynpro USING 'SAPLWBMESSAGES' '0100'."进入程序 SAPLWBMESSAGES 0100屏幕
PERFORM bdc_field USING 'BDC_OKCODE' '=WB_EDIT'."以编辑模式进入消息维护
PERFORM bdc_field USING 'RSDAG-ARBGB' 'ZGLYN'."输入消息类的名称
PERFORM bdc_dynpro USING 'SAPLWBMESSAGES' '1000'."进入程序 SAPLWBMESSAGES 1000屏幕
PERFORM bdc_field USING 'BDC_OKCODE' '=ADDS'."点击下一个可用按钮
PERFORM bdc_dynpro USING 'SAPLWBMESSAGES' '1000'."点击下一个可用按钮之后刷新了一次屏幕(很重要)
PERFORM bdc_field USING 'BDC_OKCODE' '=WB_SAVE'."等所有值输入后 点击保存
PERFORM bdc_field USING 'T100-TEXT(01)' lv_msg."输入了对应消息
"连续两次返回退出程序
PERFORM bdc_dynpro USING 'SAPLWBMESSAGES' '1000'.
PERFORM bdc_field USING 'BDC_OKCODE' '=WB_BACK'.
PERFORM bdc_dynpro USING 'SAPLWBMESSAGES' '0100'.
PERFORM bdc_field USING 'BDC_OKCODE' '=WB_BACK'.
CALL FUNCTION 'BDC_INSERT'
EXPORTING
tcode = 'SE91'
* POST_LOCAL = NOVBLOCAL
* PRINTING = NOPRINT
* SIMUBATCH = ' '
* CTUPARAMS = ' '
TABLES
dynprotab = bdcdata[]
EXCEPTIONS
internal_error = 1
not_open = 2
queue_error = 3
tcode_invalid = 4
printing_invalid = 5
posting_invalid = 6
OTHERS = 7.
IF sy-subrc <> 0.
WRITE / lv_msg && '插入失败'.
ELSE.
WRITE / lv_msg && '插入成功'.
ENDIF.
ENDLOOP.
CALL FUNCTION 'BDC_CLOSE_GROUP'
EXCEPTIONS
not_open = 1
queue_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
WRITE / 'session 关闭失败'.
ELSE.
WRITE / 'session 关闭成功'.
ENDIF.
FORM bdc_dynpro USING program dynpro.
CLEAR bdcdata.
bdcdata-program = program.
bdcdata-dynpro = dynpro.
bdcdata-dynbegin = 'X'.
APPEND bdcdata.
ENDFORM.
FORM bdc_field USING fnam fval.
CLEAR bdcdata.
bdcdata-fnam = fnam.
bdcdata-fval = fval.
APPEND bdcdata.
ENDFORM.
02.
SM35查看执行会话
SM35用来查看我们创建的会话 执行会话 查看日志等等操作。
a.执行创建的会话
执行完之后状态会变为绿色对勾。如果需要刷新页面需要敲回车 也就是触发了PAI 整个界面就会刷新。
b.执行参数详解
当我们选中对应行点击执行之后 可以有一些参数选择 这里面的MODE参数我们上面说过了 其他参数都不常用,可以自己了解了解。
c.查看详细步骤
双击对应行项目进来之后可以预览详细界面,可以 分析查看我们这个一步屏幕都做了什么。
六、数据从EXCEL上载至内表
实际业务中要做到数据批量导入系统数据一般都是从EXCEL获取到 然后通过BDC或者其他方式创建到我们系统的,所以我们还需要掌握如何把EXCEL的数据上传至内表然后再操作我们的内表 进行数据的创建导入,这个我会专门出另外一篇文章做介绍 到时候附上链接。敬请期待。
END、总结
以上就是今天要讲的内容,本文仅仅简单介绍了SAP ABAP BDC 录屏开发,感觉这篇文章自己有学到东西或者在今后的工作中能派上用场,可以点赞收藏支持!!!制作不易非常感谢,当然如果有说错或者不好的地方还望大家提出来见谅,欢迎大家评论指出不好的地方。谢谢!