之前一直在玩隐式增强, 看了Palm童鞋的文档, 学习了显式增强. 然后我发现有一个标准程序的explicit enhancement的implementation里面打不了断点,点进去看了一下, 发现有个switch off的东西, 这种implementation之前已经看过一次了,加之前一段时间Palm同学发现一个表的structure也有个switch off的东西,所以打算研究一下, 这个原来就是switch framework.
SAP很多object都可以assign给一个switch(通过package关联起来), 也可以不assign(默认为on), switch可以对object进行开关操作, 这个object才可以正常使用, switch有三个状态: on, stand-by, off.
参考资料:
http://help.sap.com/saphelp_smehp1/helpdata/en/42/f186d1faf93255e10000000a1553f7/content.htm
http://help.sap.com/saphelp_smehp1/helpdata/en/e6/c487410643010de10000000a1550b0/content.htm
现在说说switch是怎么建的
Step 1: Tcode: SFW1 create switch
switch有两种: normal switch和conflict switch, 我们可以把几个normal switch assign给conflict switch. 当这几个normal switch的状态都为on时, conflict switch的状态为on; 当有一个normal switch 的状态为off的话, conflict switch的状态为off.
参考资料http://help.sap.com/saphelp_smehp1/helpdata/en/1b/68934236a50831e10000000a1550b0/content.htm
这个测试是基于normal switch.
assign package to switch, and activate.
Step 2: Tcode SFW2 Create Business Function.
这里type有4种(F1的信息), 我们可以选其中三种. 我估计blank对应第一种, G对应第二种
但我尝试选A, 它报错了
这次测试选G
有个checkbox reversible, 如果勾上了, 这个switch可以在TCODE SFW5随便switch on 和 switch off; 如果没勾上, 一旦switch on后就不能switch off了, 对于一些standard的非reversible switch, 如果switch on后只能通过恢复系统来还原, 估计会造成数据丢失
参考资料:
这里有个tab switch, 下面assign switch to business function, type 有standby和Activation两种: 如果SFW5为active, SFW2为standby, 则switch的状态为Standby; 如果SFW5为active, SFW2为Activation, 则switch的状态是on.
Step 3: Tcode SFW5, activate the business function
把check box勾上, activate changes, Switch的状态就是on了
Switch structure
Step 1: Create structure(只能是SI或CI structure, 其他命名的structure不会assign到switch, 另外SI structure只有SAP可以建),把structure挂在package zzero里, activate it.
参考资料: http://www.architectsap.com/blog/sap/switch-framework-in-sap-example/
Step 2: insert include to table
另外, 我们也可以在table中直接append一个structure, 让它挂在package zzero里, 这个structure也可以assign到switch.
当switch为on或standby的时候, table zzero_switch中的include structure就被激活了状态是switch on.
在标准表 FKKVKP里面, 有几个SI开头的structure也是assign给switch的, 比如SI_FKKVKPR.
Switch Screen field
Step 1: Assign input text field to switch z_zero_test, 这里有个Reaction: D display和H Hide
如果Reaction设置成D, switch状态为on, field Z_LUKE才会显示出来,
如果Reaction设置成H, switch状态为on, field Z_LUKE不会显示出来.
在这里设置也可以
Switch enhancement implementation
当我们把enhancement implementation挂到package zzero里时, 这个implementation也会assign给switch,
如果这个spots是static的话, 这个implementation在状态on或standby里会执行,
如果这个spots是dynamic的话, 这个implementation在状态on时会执行.
如果switch的状态的OFF的话, implementation是不会执行, 连断点也打不了, 这个可以看看EC6的FM MARD_EXTEND第99行
P.S.
1. Switch还有更深入的东西, 比如conflict switch, business function set(TCODE SFW3)这个比较有用, 有兴趣可以研究一下
2. 千万不要随便激活标准的switch, 可能会引发严重后果, 可能需要恢复系统才能回复激活前的状态.
显式增强主要包括两种enhancement-point和enhancement-section. 下面是Palm童鞋的原话, 很通俗地概括了两者的区别.
Enhancement-point和enhancement-section的区别在于,point只是一个勾子,可以在这儿指入代码,section已包含了一段代码(由SAP预定义).当实现section,SAP预定义在section内的代码将会自动被comment掉,这时可以写上新的代码.
打个通俗点的比方,point就是一个空衣架,你可以挂上一件紫色或蓝色的衣服;section是已经挂着红色的衣服,你现在要把红色的衣服换成紫色的.
Enhancement-ponit 例子
Step 1: search, find string 'enhancement-point'.
Step 2: Create implementation
我们拿下面这个point来玩玩
点Enhance这个图标
光标放在ES_SAPLIQSO_01上面, 选择菜单Edit->Enhancement operation->create implementation
其实可以看到下面的implementation我的代码已经写好了, 功能是把TCODE: IW22的M1类型的Text field封住
Step 3: 看效果
创建Enhancement-section
测试过程中发现创建这个东西有点难度, 先记录下来
Step 1: 用光标框住要放在enhancement-section里面的代码, 选菜单edit->enhancement operation->create option, 然后选Enhancement Section, 如果选enhancement point就是创建自定义的enhancement point的.
Step 2: 把光标放在红色区域, 就CTRL+F3就可以激活section, 别忘了程序也要激活...
Enhancement-section实现多个implementation, 只有第一个会执行
REPORT z_zero_enhancement_section. DATA: lv_test(3) TYPE c VALUE '123'. ENHANCEMENT-SECTION Z_ZERO_SECTION SPOTS Z_ZERO_SPOT . BREAK-POINT. lv_test = '321'. END-ENHANCEMENT-SECTION. *$*$-Start: Z_ZERO_SECTION----------------------------------------------------------------------$*$* ENHANCEMENT 1 Z_ZERO_TEST_SECTION. "active version BREAK-POINT. lv_test = '222'. ENDENHANCEMENT. ENHANCEMENT 1 Z_ZERO_TEST_SECTION2. "active version BREAK-POINT. lv_test = '333'. ENDENHANCEMENT. ENHANCEMENT 1 Z_ZERO_TEST_SECTION3. "active version BREAK-POINT. lv_test = '444'. ENDENHANCEMENT. *$*$-End: Z_ZERO_SECTION----------------------------------------------------------------------$*$* WRITE:/ lv_test.