SAP里的增强

【博主SAP/ABAP交流群689746838

SAP里要实现客户特定的需求,需要做增强(Enhancement),这篇文章会介绍做增强的一些方法和思路,不过主要是程序功能方面的增强,不涉及屏幕和表之类的增强。

首先,SAP会在标准程序里预留一些可以供开发者添加代码的地方,这种叫做“出口(Exit)”,比如User Exit和Customer Exit(功能部分是Function Exit),也经常被称为第一代增强和第二代增强。ABAP OO引入之后,有了BADI增强,这是第三代增强。从开发角度讲,说得简单点就是,一代增强就是标准程序里调用Form,二代增强是调用FM,三代增强是调用Method。这前三代增强,都是在SAP预留的地方才能够做增强的,只能满足常用增强功能,对于很多很特别的需求依然是不够用的,所以后来又有了第四代增强,它的一大功能点,同时也是实际开发里最常用的一个功能,就是隐式增强(Implicit Enhancement),其实它主要就是可以允许开发者在标准程序的头部和尾部添加自己的代码。虽然这种做法并不像修改标准程序(Modification)那样想怎么改就怎么改,但基本上可以满足大部分增强需求了。不过,隐式增强是一把双刃剑,使用好它的前提是能够看懂标准程序的逻辑,在这个基础上添加自己的逻辑,如果只是为了实现功能,在无关紧要甚至是错误的地方乱加代码,以后标准程序出问题了那就要花很大的精力去慢慢Debug排查错误原因,尤其是有时候这个增强不是你做的,也没有相关的开发文档,那这个时候排错就相当考验Debug功力了。

介绍完了增强技术,然后说下做增强的整体思路。如果想成为一个开发高手,做增强是不能仅仅停留在了解“哪些模块哪些功能有哪些增强”这一水平上的,而是要达到“任意模块任意功能无一不能增强”的境界。要做到这点,首先必须非常了解SAP的程序类型和结构,SAP程序常用的几种类型是是Report,Module Pool(即Dynpro),Function Group(FG)。对于标准程序,除了一些比较老的模块会用Dynpro开发,基本都是由FG和Class组成的,Class的作用和特点和FG有很多类似之处,当然也有很多不同之处,这里不作详细介绍。然后是SAP的模块化(Modulization)程序有三种,分别是Perform(也叫Subroutine),Function Module(FM)和Method,这三种作用都差不多,都是输入一些参数,做完处理后传出一些参数,只是写法不同而已。至于为什么差不多作用的东西要有三种写法,我个人理解是Perform是程序里用的局部功能模块,FM是整个SAP系统下都能使用的全局功能模块(当然Perform其实也是可以全局调用的,只不过这时一般都用FM),而Method是引入ABAP OO后出现的功能模块,所以现在这种情况造成的问题是写法混乱,不像Java等开发语言只有Class和Method,但开发者也只能去适应SAP的做法,总之,尽管这三种写法有所差异,但其实都是程序模块化,是一类东西。FG和Class是绝大部分SAP程序的基础构成,只有熟练掌握了FG和Class,才可能去阅读复杂的标准程序,从而完成一些有难度的增强功能。

了解FG和Class的话,要找Function Exit和BADI其实很容易,一个标准程序基本是由若干个(多的时候可能有20个以上)FG和Class组成的,找Function Exit的做法就是在FG程序里搜‘customer-function’;找BADI的话,由于BADI是个类,在FG或者Class的开头变量定义部分会有这个类的定义,而且往往带有‘badi’这个名字,所以可以尝试直接搜‘badi’。

再介绍一下用Field Symbol(FS)跨FG取值的方法。举个例子,比如当前屏幕是在FG1下的,在逻辑里调用了一个属于FG2的FM,那么在这个FM里是不能用FG1里的那些全局变量的。通过FS,可以拿到FG1里所有全局变量的值。这个方法的主要作用是自开发程序和标准程序的数据交互,比如在做Function Exit和BADI时,应该经常会碰到所需要增强的值不在参数结构里的情况,这时就可以用这个方法拿到需要的值。具体做法如下:

在自开发程序里,先定义一个string,比如text01 TYPE string VALUE ‘(SAPBUD0)GV_BK_LOOPC’,其中括号里是你需要取值的程序的程序名,括号后面是变量,应该是需要大写的,如果变量是带表头的内表,则需要加[]。然后定义一个FS,参考gv_bk_loopc变量,比如<gv_bk_loopc>。最后ASSIGN (text01) TO <gv_bk_loopc>,这样就完成了从标准程序SAPBUD0的取值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值