文章目录
前言
随着sap的发展它的增强功能也衍生了4代,今天这边文章给大家介绍一下三代增强BADI。从概念上相对来说还是一种比较新的技术,它解决克服了前两代增强的缺陷,查找增强点也比较方便,今天这篇文章来给大家讲解一下三代增强以及一个小案例。笔者也是边学习边写文章有不好或者说错理解不对的地方还望大家多多见谅。也欢迎大家指出问题,感谢!
一、什么是三代增强?
BADI的全称是(Business Add-Ins)是SAP在R/3 release 4.6A后增加的增强技术,可以说是克服了之前两代增强的所有缺点,三代增强是通过OO面向对象的思想去实现的,我们也知道OO的特性是 封装 继承 多态。使用OO的思想去实现功能肯定更易于我们程序的 扩展 维护,并且三代增强会通过断点的方法去查找增强点这也更便于我们快速准确的找到增强点。
二、使用三代增强我们需要了解那些东西?
以下两个内容我先简单介绍一下让大家先有个初始理解,后面的案例实现会有详细操作以及图文流程。主要作用还是可以让大家快速回顾巩固
1.BADI的调用机制
BADI是有一套特别规正的调用方式,它总是通过一个方法来获取需要调用的BADI,例如某个标准程序执行到某一步的时候这个方法始终会执行一下来获取当前所有可以调用的BADI,也就是说我在当前的这个操作步骤都有什么BADI也就是有哪增强。之后就是再通过这些BADI去找它的实现然后执行。这里的每个BADI其实也就是一个类,类中有些许方法以及参数,首先程序会先找到执行某个步骤前的所有BADI,然后去执行这些BADI中的方法代码逻辑。直到执行完所有的BADI之后程序才会执行完当前的步骤,我们可以依据BADI的这种调用机制就可以找到我们需要使用的BADI。因为它执行程序的每一个步骤都会调用这个方法去查找当前的所有调用的BADI,所以我们就可以到此方法处打以断点这样就可以查看每一个步骤都有什么BADI了。
2.如何查找三代增强点
a.
首先通过 se24 输入 CL_EXITHANDLER 这个类 然后点击显示。
b.
接着双击 GET_INSTANCE 这个类方法
c.
进来之后在第一个方法调用处打断点 CALL METHOD 我的当前版本是在14行
CALL METHOD cl_exithandler=>get_class_name_by_interface
d.
下来输入事务码进入想要增强的程序此时程序的每一个步骤都会进入断点我们要判断增强逻辑该写在那个步骤的BADI
e.
当程序进入断点位置后我们可以双击断点方法中的 exit_name 这个参数 查看程序当前步骤所调用的BADI名称
f.
确定我们当前增强业务需要使用那个BADI后使用 se18 查看此BADI 主要看它有哪些 方法 方法中有哪些 参数
g.
查看BADI接口中的方法根据业务需求和SAP所提供的方法描述以及方法中的参数来确定使用的方法
h.
确定要使用的方法后再用此方法中现有的参数思考如何用参数实现编写此增强业务逻辑
i.
方法中参数有两个类型Importing,Changing,也就是导入导出,简单点就是导入用来做判断导出用于保存或界面展示
j.
当我们BADI确定了,方法也确定了,也知道方法中的参数都代表什么了,也就等同于已经准确的找到增强点了。
3.如何配置实施三代增强
a.
例如我们已经确定了BADI为BADI_MATERIAL_REF
此BADI接口中有一个方法CREATE_MATERIAL
。此方法中有些许参数我们要了解参数思考如果运用需要的参数编写增强的业务逻辑,想好之后我们再进行创建实施。
b.
在输入BADI显示刚进来的界面上方的菜单栏中点击实施,再选择创建输入一个名称,再到保存界面输入短文本描述后进行保存。
c.
下来我们就可以在我们创建的这个BADI中去相应的接口方法中编写代码逻辑了,双击即可进入编写代码。
d.
逻辑代码写完后点击激活代码,然后还要激活此BADI,在我们双击接口方法的界面点击 显示/更改
按钮 ,再点击旁边的激活,当此BADI为激活状态时,运行时状态会显示 将调用实施
这样我们的BADI也就创建实施成功了。
三、三代增强实现案例
1、我们要实现的效果
这个案例我们是对 mm01 标准程序进行增强,我们将实现当用户创建物料的销售视图时并且创建 工厂为1109 销售组织是1310 分销渠道是20 的话就自动带入默认税为8。
2、如何查找确定我们使用那个BADI
a.
首先大家思考一个问题,创建物料时候大致可以分为下图三个步骤,那么我们要用的BADI会在下面那个步骤中步骤1有些许BADI,步骤2也有些许BADI,步骤三也一样。有如此多的BADI我们应该缩小查找筛选范围,其实这第一步很简单很明显我们所需要的BADI就是在步骤2出现的BADI,因为步骤1的时候还没有进入到输入税的创建界面,步骤3的时候应该是对我们输入的数据进行检查的一些BADI。按道理也应该是步骤2中的BADI,因为步骤2中的所有BADI执行完之后我们输入税界面也就展示了出来,需求也就是用户到创建界面时默认就输入了税为8。所以接下来我们打断点找BADI的时候应该注重于步骤2所出现的BADI。
b.
使用SE24在调用BADI的方法处打断点。
1、
CL_EXITHANDLER 👈复制这里的
2、
双击此方法 GET_INSTANCE 到逻辑代码界面后 在第14行打断点 (我自己的版本是14行大家根据名称找就行了)。
c.
下来进入我们想要增强的程序,新开一个窗口输入MM01回车或者在调式窗口上面输入/omm01回车,然后我们就来到了找mm01BADI的调试界面,这代表着mm01程序界面展现之前程序就有调用的BADI,只有当我们程序把进入mm01界面之前的所有BADI执行完成之后才可以展现界面。我们此时要做的就是记录每一个步骤的BADI,重复下图片的2、3步骤即可。
3、列出所有BADI后确认使用的BADI
一般有经验的开发当业务顾问提出需求后直接就根据经验可以知道使用的是那个BADI但是对于我们这种新手小白还是得根据sap提供的BADI描述方法描述参数等等信息需要好好了解查找一下。
a.
列出我们查找到的所有BADI,我们先可以大致确定需要的BADI就在我们下图红框中。也就是我们进入输入税的界面之前的BADI。这个是根据操作步骤基本可以确定的上面我们讲过了。也是更符合逻辑的,因为不可能我输入税的界面还没出来就已经将默认值填写进去了。或者是保存的时候再去填写这个时候就太晚了。不符合前后逻辑。应当是我们输入税的界面出来之后这个税就输入好了。
b.
使用se18查看我们找到的BADI的描述以及方法和参数进一步确定使用的BADI.
c.
根据上面sap提供的描述我们其实可以大致判断使用的BADI就是序号为⑤的,但其实在如果翻译正确的情况下序号①和序号⑤都感觉是有可能的,sap在翻译过来后有的意思还是有差异的。如果我们看完描述后还不能确定使用的BADI是那个的话就应该进一步去查看BADI方法中的参数来确定了,因为我要给这个税字段去赋值的话参数中就应该要有这个字段。 我们界面中税字段为 TAXKM
所以参数中应该要有这个字段TAXKM。
4、进一步确定BADI
a.
我们要根据界面中查找到的字段去BADI的方法中查看有没有此字段。如果没有那么一般就不是这个BADI,如果有的话那么再结合BADI的描述方法的描述基本就可以确定是这个BADI了。我们直接看序号⑤这个BADI方法中的参数,这个BADI只有一个方法。
这里要注意的是方法中的参数有导入也有导出,类型有字段也有结构和表类型,表类型是即导入又导出的,简单一点理解其实导入的参数我们可以用来做一下判断因为它不会导出也就不会影响变量的变化,导出的参数可以说就是用来修改变量的值,当然我们导出的参数也可以用作判断。我们要了解这些参数都是什么类型的不然可能会错过我们要找的字段。比如我们的表类型的话双击进入之后是不能直接看见表都有哪些字段的只能看见一个行类型等等的信息,当然一个表肯定是存在些许字段的我们可以双击这个行类型再去查看表有哪些字段说不定我们要找的字段就存在于这个表中。
1、
查看方法中的参数
2、
根据翻译参数的描述进行查找,我们可以看到关于税的参数有两个我们要填充的默认值为销售税所以我们看一下此参数中都有哪些字段。
3、
双击参数MAT_STEUER
后,根据下图我们确实在此参数中找到了我们需要找的字段,按逻辑我们只要在界面展示前给这个表中的这个字段赋值之后。界面展示出来后就有了默认值了,这里它为什么是个表类型?因为在界面当中我们这块的数据就是多行的,所以这里使用表类型是最好的。如果界面中有三行数据那么这个表也就有三行。如果我们想将三行数据的税都默认为8那么循环这个表去更改每一行的值就行了,如果我们只需要将启运国家为中国的行默认税为8,那么只需要用代码根据条件去更改表中对应的那一行就行了。
4、
根据上面的所有信息,我们根据业务的前后逻辑、根据BADI的描述,根据方法以及方法中的参数,和参数的描述,还有参数中的字段。可以确定我们要使用的BADI就是 BADI_MATERIAL_REF
5、BADI的创建实施逻辑代码编写
a.
创建BADI,我们在se18查看BADI进入的界面中点击实施创建即可。
1、
记得名称规范一般Z开头
2、
如果是测试练习的话建议保存为本地对象不用生成请求。
c.
编写逻辑代码,上面我们也说了只需要更改导出的表类型的那个参数中的字段值即可。我们BADI创建好之后双击方法即可进入代码编写界面。这里更改表中字段值的话要循环这个表,循环的时候我们需要一个结构,那么我们的结构就参考参数中这个表的行类型就可以。使用MODIFY关键字来更改就行。或者其他更改表中字段值的方法都可以。
c.
逻辑代码编写完成之后激活代码,然后再激活此BADI即可实施成功。然后当我们再去创建物料的时候输入税的那些行税默认都会为8。
6、添加业务逻辑
a.
当创建物料时工厂为1109 销售组织是1310 分销渠道是20 的话就自动带入默认税为8,要在这样的条件下去执行首先我们肯定是先获取这个三个输入项字段是什么。
b.
然后可以先简写一下代码逻辑,虽然我们现在不知道这三个值是存在于那个参数中但是没关系我们可以先将逻辑写出来。如下图所示此时我们的代码逻辑先写了出来,现在我们只需要找到字段对应的每个参数即可。
c.
我们还是直接在方法中的参数中去找就可以。根据参数所提供的描述缩小范围去逐个查找。如下图我们可以根据参数的描述先去这两个参数中查找我们需要的字段到底有没有。
d.
如下图我们可以去搜索查找字段,如果参数描述不足以让我们确定到底是那个参数我们可以逐个去查找。我们可以看到工厂这个字段在参数I_MARC
中,销售组织和分销渠道根据参数描述应该就是存在于C_MVKE
。我们可以双击进入如下图所示的方式搜索到底有没有,这里我不再展示。
e.
接下来完善逻辑代码激活即可。此时我们不用再去激活BADI因为上面已经激活过了。只需要激活代码即可。
7、最终效果展示
a.
输入mm01勾选填写创建物料的信息
b.
回车后我们可以看到输入税这个输入框自动默认填充了8,我们也可以尝试一下其他销售组织工厂分销渠道,会发现不会自动带入。此时我们这个增强的业务也是完成了。
8、关于三代增强的补充点
a.同一个BADI可能被多个标准程序使用
1.
像这种情况的话我们一般就要加判断条件了,因为我们不能去影响其他程序的执行,我们只是想针对于某个程序去做增强。在sap标准程序中有一些情况是会出现不同的程序会调用相同的BADI,例如MIGO中的这个BADI MB_CHECK_LINE_BADI
在VL02N和CO11N也都有调用的,如果我们代码有操作是用指针获取MIGO屏幕输入变量的话会在VL02N和CO11N都会报错。因为程序执行BADI去屏幕获取变量的时候VL02N和CO11N这两个标准程序根本没有MIGO屏幕中的有些字段。
2.
再比如我们上面做的小案例,这个BADI_MATERIAL_REF
BADI是MM01创建物料时会调用,那么MM02显示物料会不会调用这个BADI呢?实际情况是没调用的,但是我们这里就假如调用了会出现什么情况,按照逻辑的话我们创建物料保存的时候用户输入了税为3,那么我们再MM02查看物料的时候又去修改了这个表中的值,那么界面展示出来会不会也就是我们代码更改的值8了呢?所以说假如MM01和MM02都调用了这个BAID的话我们应该去判断表中税的这个字段是否为空,如果为空的话我们再去更改它的值。这样就不会起冲突了。
b.有些BADI找对了但是参数中缺少我需要的字段
1.
例如在做migo增强的时候,我们可能需要判断下图中红框中的字段用户输入的是什么,然后再根据判断结果去执行相应的业务逻辑。但是我们可能会发现这些个字段在参数中假如没有找到的话就可以使用指针获取屏幕字段值,来达到我们的目的。
2.
语法讲解:我们要使用F1去查看 1、程序名 2、表名 3、字段名,然后使用如下图的语法即可。(程序名)表名-字段名
c.如果后期我想起了有什么要补充的会继续写在这里,或者大家有什么想让我介绍的也可以评论私信我哦。
四、总结
以上就是今天要讲的内容,本文仅仅简单介绍了sap中三代增强以及一个小案例,主要目的是帮助大家对增强有个初始的理解,笔者也是初学增强,如果有说错或者不好的地方还望大家提出来见谅。感觉笔者写的好的别忘了关注点赞加评论哦,也欢迎大家一起来讨论。谢谢!