SAP 增强.docx
- 文档编号:15456085
- 上传时间:2023-07-04
- 格式:DOCX
- 页数:9
- 大小:18.46KB
SAP 增强.docx
《SAP 增强.docx》由会员分享,可在线阅读,更多相关《SAP 增强.docx(9页珍藏版)》请在冰点文库上搜索。
SAP增强
增强(enhancement)的概念其实很广,SAP标准系统之上的所有二次开发,我们都可以理解为增强,做增强的目的就是标准的sap正常的业务系统不能满足实际需求,所以我们在标准的系统基础进行增加不同的功能来达到不同企业的要求,换句话说我们今天开发过程中所有的ADD-ON都可以说是增强开发。
但作为开发人员所说的增强主要是标准系统事先预留好的接口,根据不同业务需求,进行开发,我们称为增强,又叫出口。
比如:
1:
在业务检查时,比如在某个工厂发货,可以设定在某个库位的出货只能使用某种移动类型。
2:
在需要界面增强时,比如用户对某个字段要求大写,但是最终用户不按规范操作,这也可以在出口中自动转换,有些模块甚至能自定义数据库字段,并且可以在出口中增加字段输入。
还有的模块能对输入数据检查,甚至实现自动替代等功能。
3:
有不规则业务时,比如按某种条件定价,可以设定从自己定义的表中按某种条件取值
4:
搜索帮助的出口,可以对Sap标准的搜索帮助做权限控制。
等等。
Sap的用户出口发展至今有四代:
一、第一代(基于源代码的增强)是sap提供一个空代码的子过程,在这个子过程中用户可以添加自己的代码,控制自己的需求。
这类增强都需要修改sap的标准代码,它们在发布的时候都是空的,集中在一些文件名倒数第二个字符为Z的包含程序中,由于在标准程序中,所以所有程序的全局数据都可以使用,但同时系统升级时会被新版本覆盖;这种源代码增强和屏幕增强的说明可以从事务码spro后台配置中相关模块的路径里面找到;一般是以UserExit_打头的子模块。
找到所要增强的的程序,查找UserExit关键字。
这类增强事先要到servicemarketplace申请对象键(ACCESSKEY),然后才能修改这些子程序。
查找此类出口的方法:
1、在增强程序中找第二个字符为Z的包含程序;
2、在后台找对应模块增强;
3、在程序中搜索USEREXIT_打头的关键字子程序;
4、字节列出对象列表“DisplayObjectList”按钮,在Subroutines列表下找“userexit”打头的子程序;
二、第二代增强(基于函数模块的增强),用SMOD和CMOD维护;在SAP发布的版本中,使用Callcustomer-function‘xxx’调用函数模块的,所以你可以通过在程序中收cusomer-function来查找第二代增强,第二代增强函数名构成:
Exit_程序名_’xxx(3digitalnumber)’,这样你就可以找到对应的增强函数模块了,它们在发布的时候只有一句代码include‘xxxxxxx’,修改时无需像第一代增强一样需要ACCESSkey,直接双击回车就可以了,但同时这种增强以及后面几代的增强都不能像第一代一样随便使用程序的全局数据,只能使用接口中传递进来的参数。
第二代增强中主要有3类:
1)E.Ehancementexits:
这些出口Exit_打头,你可以到SE37中查看,也可以在数据字典中TFDIR(函数表)中查询Exit_打头的函数。
2)C.GUIcodes(GUI增强)
3)S.Subscreens(屏幕增强)。
4)T.Includestructure增强
Enhancement比较重要的表MODSAP,这个表里重要的字段增强名(Name),组件类型(TYP:
ECST),组件功能模块名(Member):
里面记录了所有enhancement的增强.TFDIR所有的函数表,重要字段FUNCName(函数名),MAND(功能模块激活状态如果是C代表此函数模块激活)。
查找Enhancement的方法:
1、在程序中搜索Customer-function找到后面的3为digitsuffix,然后出口函数组成就是Exit_程序名_3digitsuffix.
2、代码找增强利用如下代码找enhancement(有些exit使用它并不能找到)
REPORTZLC_FIND_EXITnostandardpageheading.
tables:
tstc,tadir,modsapt,modact,trdir,tfdir,enlfdir.
tables:
tstct.
data:
jtabliketadiroccurs0withheaderline.
data:
field1(30).
data:
v_devclassliketadir-devclass.
parameters:
p_tcodeliketstc-tcodeobligatory.
selectsingle*fromtstcwheretcodeeqp_tcode.
ifsy-subrceq0.
selectsingle*fromtadirwherepgmid='R3TR'
andobject='PROG'
andobj_name=tstc-pgmna.
move:
tadir-devclasstov_devclass.
ifsy-subrcne0.
selectsingle*fromtrdirwherename=tstc-pgmna.
iftrdir-subceq'F'.
selectsingle*fromtfdirwherepname=tstc-pgmna.
selectsingle*fromenlfdirwherefuncname=
tfdir-funcname.
selectsingle*fromtadirwherepgmid='R3TR'
andobject='FUGR'
andobj_nameeqenlfdir-area.
move:
tadir-devclasstov_devclass.
endif.
endif.
select*fromtadirintotablejtab
wherepgmid='R3TR'
andobject='SMOD'
anddevclass=v_devclass.
selectsingle*fromtstctwheresprsleqsy-languand
tcodeeqp_tcode.
formatcolorcol_positiveintensifiedoff.
write:
/(19)'TransactionCode-',
20(20)p_tcode,
45(50)tstct-ttext.
skip.
ifnotjtab[]isinitial.
write:
/(95)sy-uline.
formatcolorcol_headingintensifiedon.
write:
/1sy-vline,
2'ExitName',
21sy-vline,
22'Description',
95sy-vline.
write:
/(95)sy-uline.
loopatjtab.
selectsingle*frommodsapt
wheresprsl=sy-languand
name=jtab-obj_name.
formatcolorcol_normalintensifiedoff.
write:
/1sy-vline,
2jtab-obj_namehotspoton,
21sy-vline,
22modsapt-modtext,
95sy-vline.
endloop.
write:
/(95)sy-uline.
describetablejtab.
skip.
formatcolorcol_totalintensifiedon.
write:
/'NoofExits:
',sy-tfill.
else.
formatcolorcol_negativeintensifiedon.
write:
/(95)'NoUserExitexists'.
endif.
else.
formatcolorcol_negativeintensifiedon.
write:
/(95)'TransactionCodeDoesNotExist'.
endif.
atline-selection.
getcursorfieldfield1.
checkfield1(4)eq'JTAB'.
setparameterid'MON'fieldsy-lisel+1(10).
calltransaction'SMOD'andskipfirstscreen.
3、利用系统函数寻找增强
Function:
[1].DYNP_VALUES_READ
[2].MODX_ALL_ACTIVE_MENUENTRIES(菜单增强)
[3].MODX_FUNCTION_ACTIVE_CHECK(出口函数增强)
[4].MODX_MENUENTRY_ACTIVE_CHECK(菜单增强)
[5].MODX_SUBSCREEN_ACTIVE_CHECK(屏幕增强)
我们可以在函数最后设置断点,然后通过跑对应的增强程序就会去调用这样的函数,这样你就可以在调试模式下找到对应的增强。
下面附加出几个重要的表:
Table:
[1].TFDIR->functionmoduletable
[2].MODSAP->sapenhancementtable
[3].TSDIR->DynproAreasCALLCUSTOMERSUBSCREEN(屏幕增强)
[4].CUATEXTS->GUIInterface:
MenuTextsChanged(GUI菜单文本增强)
[5].MODSAPAàsap增强的属性
[6]MODATTRàsap增强项目属性
[7]TADIRà资源库对象的目录
[8]TFTITà函数功能的短文本
注意:
出口真正应用是要在激活的状态下,也就是在TFIDR下的MAND字段为C.激活的时候要同时激活程序(se38)和出口函数(smod,cmod,出口程序都可)
当然一般情况,我们知道出口模块到modsap中找到对应的增强。
可以通过下面的程序将其激活。
REPORTZactexitfun.
updatetfdirsetMAND='C'.
whereFUNcname='EXIT_SAPMM06E_013'.
*判断是否存在相应增强的定义(SMOD)
selectsinglename
frommodsapa
intomod0-name
wherename='PPCO0002'.
ifsy-subrc=0.
endif.
selectsingle*
fromtadir
intops_tadir_db
wherepgmid='R3TR'
andobject='SMOD'
andobj_name='PPCO0002'.
*判断是否存在相应增强项目的定义(CMOD)
SELECTSINGLEnameFROMMODATTRintomod0-name
WHERENAME='PPCO0002'.
*提取增强的定义的组件(可以用此反查增强定义)
select*frommodsap
wherename='PPCO0002'.
当然我们可以用下面的函数来找增强的组件。
MOD_SAP_MEMBER_TEXT
*获得出口功能模块的信息
selectsingle*fromtftit
where"SPRAS"='1'AND"FUNCNAME"='EXIT_SAPLCORE_001'
ifsy-subrc=0.
endif.
*判断该增强是否移植到BADI实现
selectsinglemigratedintomigrated
frommodsapawherename=modname.
ifsy-subrc=0andmigrated=‘x’.
说明此增强已经移植到BADI实现了
endif.
三、第三代增强(基于面向对象概念的增强BADI(businessadd-in)),源代码发布以接口的方式,通过接口的方法调用来实现使用的。
用户增强实际上是实现一个或多个基于这个接口的实现类,因为接口类实际上是一个抽象类,所以对同一个增强会出现不同的源代码,这些不同的源代码是通过过滤器(adapter)来区别用于不同的业务场景的。
这种增强是用SE18SE19来实现的。
BADI的查找方法:
1、BADI对象的信息存储在SXS_INTER,SXC_EXIT,SXC_CLASS和SXC_ATTR这四个表中。
2、SAPBADI程序都会调用cl_exithandler=>get_instance来判断对象是否存在,并返回实例,这个方法实际就是对上面4个表和视图V_EXT_IMP和V_EXT_ACT进行查询和搜索的。
我们可以在这个方法处设置断点,获取实例。
3、它的调用方式是callmethod(instance),可以通过exit_handler关键词来查找。
4、ST05选择“tablebuffertrace”而不是常用的"SQLtrace",然后查找上面的几个表和视图找到对应的BADI.
5、se18查找接口,se19实现接口就可以实现用户增强
四、第四代其实是第三代的加强switchFramework
当sap进入newweaver7.0以后推出的新增强体系,将BADI进行了改进,叫新BADI了。
还新增EnhancementSpot和EnhancementSection以及隐式增强点的概念,基本可以在面向对象的程序里实现处处皆可增强的最高境界。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SAP 增强