2005年NetWeaver 7.0诞生,它的一个部分,就是enhancement framework。从2005年开始SAP的增强就更加现代化。
2005年之前的增强是什么样的呢?如下图
2005年之后,出现了netweaver 7.0之后
我现在也没有很搞懂2005年以后的状况,但是后面这篇文章很有启发:link
netweaver7.0之前我们可以随意自己创建BADI,但是netweaver7.0之后,SE19被分成两块:classic badi 和 new badi
对于new badi必须创建enhancement spot然后实现enhancement spot,然后在spot实现界面创建badi
BADI早在R3(也就是4.6)的年代就存在了,它代表了一种现代化的增强技术(相对于customer exit和BTE。为什么现代化?因为面向对象)
到了SAP NetWeaver7.0(也就是ECC)的年代,SAP推出了enhancement framework 其中包括new BADI技术和implicit enhancement /explicit enhancement这三种新技术。并且从那时起就开始打算用新的技术来实现从那以后的增强。为什么呢?
什么是老的enhancement technology?
user exit
customer exit
BTE
classic BADI
什么是新的enhancement technology?
new BADI
implicit enhancement
explicit enhancement
为什么要用新的技术呢?
high performance
面向对象
随意插入
在SAP NetWeaver 7.0中的Enhancement Framework中,有些枯燥,我们还是看看图吧。
SE18,可以创建Enhancement Spot和BAdIBADI
我们看到
new BADI 需要创建Enhancement Spot 和Enhancement Implementation
classic
多说无益,我们在hana s4中使用SE18创建一个classic BADI怎么样?
看到了吧,s4年代的SE18根本不让你创建classic BADI了。
那么,我们明确了一点:SE18中是不能自己去创建classic BADI了
那么我们现在不打算自己创建全新的classic BADI了,我们在这个基础上,如何使用SE19呢?
如上图所示,创建classic BADI方式的增强,必须基于系统中SAP官方已经提供的BADI
我们演示一个正确的例子,如下图
我们用一个实际例子看看SE18和SE19对于classic BADI的操作
SE18 查看SAP官方标准classic BADI的内容
SE19 创建、修改classic BADI的实现类
说了这么多我们自己总结一下:
SE18相当于java中看看其他人提供的interface(仅仅是看看)
SE19相当于java中基于别人的interface创建自己的class,然后你还可以用SE19修改自己创建的class(新建、修改)
我们看看SE18 SE19之间的关系
我知道看到这里,各位已经有些不明白,我们回到BC427看看教材中是如何描述这部分逻辑
我们看看,使用classic BADI技术实现的program exit是如何工作的:
执行事务码SE18,也就是执行含义为BADI definition的事务码SE18,然后我们可以在这个事务码中看到,interface和adapter class。
classic BADI类型的BADI的interface的命名:IF_EX_
adapter的命名CL_EX_
我们对照SE18中一个具体的BADI看看
adapter名
interface名
如果,这里我只是说如果,因为s4中已经没有这个如果了。
如果你使用SE18定义了一个classic BADI也为这个全新自定义的classic BADI指定了interface,那么系统会帮助你自动生成一个BADI的adapter类(这个类中自然也就包括了bridging method)。bridging method是干什么用的呢?SAP call这个bridging method就可以顺坡下驴进入(branch to)对应的你自己的代码了。
bridging method的任务,它存在的意义,就是调用industry solution(IS) /partner /customer的实现类中的方法。在此先不要管industry solution(IS) /partner /customer是什么含义,他们只拥有业务含义。
看到了吧,在s4中我们已经无法去自己创建classic BADI了,所以我们在S4的世界中,也感受不到创建BADI然后为BADI指定一个interface然后编写一个adapter class的大快感了。我们能感受到的,只有使用SAP系统官方提供的标准classic BADI以及早就指派好的interface和早就定义好的adapter class得情况下,基于此,创建implementation的小的快感。
下面我们看看这个小快感。
如上图,看到classic BADI的implementation的实现类,双击method看看SAP工程师为它添加的代码
里面代码就不看了
但是如上图所示,坦率的说,classic BADI的interface中的方法的人对应参数,什么也没有。
看到这里,我们回到文章最初,究竟我们想要了解什么?
我们基于SAP的标准classic BADI ,这个BADI的名字是PARTNER_UPDATE,要做一个classic BADI类型的增强,我们增强了什么呢?
说句老实话,你能从上面的图中,看出这个SAP的标准的classic BADI究竟给谁增强,增强在哪里吗?除了点说明,能看出什么?
那问题来了,我们为什么要使用上述这个增强呢?
告诉我,为什么?
这个问题,我始终没有搞明白为什么事务码BP修改业务伙伴的操作中,需要使用名为partner_update的classic BADI进行增强。
BC427中提供的思路如下
说实话逻辑上我觉得根本不通
然后就是网上的各种方法
比如从事务码找到程序,然后找对应的包,然后看包中是否有对应的增强。
我觉得,能够通过这种方法顺利找到的概率比较小。
另外一个确实可以找到的方法就是使用事务码ST05
反正可以看出来PARTNER_UPDATE的出现
st05的使用方法如下
1.进入st05,打开追踪
2.运行事务码bp执行相关的操作
3.关闭st05的追踪
4.查看追踪期间的内容
经过上述四个步骤,就可以看到之前的追踪结果,进行对比,看看哪个是,哪个有可能是我们需要的BADI
badi对应的数据表为 SXS_INTER, SXC_EXIT, SXC_CLASS 和 SXC_ATTR,而这些表都是通过视图V_EXT_IMP 和 V_EXT_ACT来查询
最后,为了让我们这篇文章更加有说服力,我决定补充一些BC425的内容,我所看的BC425发布于2000年,换句话说这个版本的BC425属于R3年代的SAP(R3年代是2004年之前,那时还没有来到ECC的年代,也就是说NetWeaver还没有发布)因此,这个版本的BC425完全没有涉及到net BADI的内容,很单纯专一的讲解了classic BADI.
如何寻找一个classic BADI呢?如下图
上图其实也是扯,我想说的是BC425中提到 Since SAP provided fewer than 50 BADI in release 4.6A,even a list of them all is still manageable.也就是2000年的时候SAP R3 4.6的年代,classic BADI居然只有50个,数目少,容易找。