sap的用户出口总共有三代:
1、第一代ITPUB个人空间_Jv^7K b*q
sap提供一个空代码的子过程,在这个子过程中用户可以添加自己的代码,控制自己的需求。这类增强都需要修改sap的标准代码。ITPUB个人空间s0| s @t iu
示例:USEREXIT.. in SAPMV45A
2、第二代ITPUB个人空间1M0Ea7y:u q;B
sap提供的是CUSTOMER-FUNCTION,它是通过SMOD和CMOD完成实现。参见我的http://blog.csdn.net/CompassButton/archive/2006/08/31/1150258.aspx
3、第三代ITPUB个人空间?Y0ZR$zH b
sap提供的第三代的用户出口就是BADI,他的调用方式是CALL METHOD (instance),(相关的TCODE是SE18和SE19),你可以通过EXIT_HANDLER这个单词查找BADI。
第二代: 如何使用SMOD和CMOD进行SD的用户增强
G:RI m6iW OS72044781、关于增强的简单介绍ITPUB个人空间-hjVK!bY a
1.1 SMOD包含具体的增强,而CMOD是包含一组SMOD编写的增强. ITPUB个人空间D1|1w;t6aj _9j@
1.2 User exits (Function module exits)是sap提供出口,它的命名规则如下:ITPUB个人空间&T*vkk#X0z
EXIT_<3 digit suffix> ITPUB个人空间O{}z\||k
示例:
L L#Yz"Zy{7204478sd的VA01事务,对应的程序是SAPMV45A ,你会在程序里查到(用CALL CUSTOMER-FUNCTION字符串)如下代码:ITPUB个人空间u_ I@9DD,~*s#Xg-~
CALL CUSTOMER-FUNCTION '003'
)ZH:w.i[7204478 exporting
:DQN/iiY{+V1oW7ka7204478 xvbak = vbakITPUB个人空间-i ?W*~S0P
xvbuk = vbuk
(h;\!uV:?6b,P5]7204478 xkomk = tkomkITPUB个人空间/w oDp,\
importing
5AT_SCV o ?7204478 lvf_subrc = lvf_subrc
$\"_"a G2Dl*m7204478 tables
~V4z3AL7^+HN7204478 xvbfa = xvbfa
&aS8~6ZYj.U`*g"cc7204478 xvbap = xvbap
eXF \[/N Y7204478 xvbup = xvbup.ITPUB个人空间`6l$kUZD_m
则exit calls function module的名称就是: EXIT_SAPMV45A_003
+gG,W?&up72044782、先试用SMOD建立一个SAP增强
*|t1c*z+]~9r72044782.1、选择一个增强,如:SDVFX001 ,点击修改,进入sap增强维护屏幕;
8]en+z l D#^6W72044782.2、点击“组件”按钮,进入组件维护屏;
/V~w-d7H GO72044782.3、将光标移到“功能模块名”,输入模块名,如:EXIT_SAPLV60B_001;
'~L;f$`s0T,B2]72044782.4、选择“代码修改”按钮进入函数模块;
t6sm\(F+Y2V]_#T9}72044782.5、双击函数模块的包含单元,进入包含单元加入自定义代码并激活保存;
3、使用CMOD建立增强项目
c%Q6S!G"Bq&Z6C72044783.1、输入自定义的项目名,点击“创建”;ITPUB个人空间b7k`OQ:E8v
3.2、进入增强项目,选择“配置增强”,进入增强配置屏幕;
-r$f9Nb;Nlc#lY72044783.3、输入增强名如:SDVFX001
)ojfT6^\4T72044783.4、保存,并退出;
4、使用CMOD将增强项目激活,便大工告成。
如何查找ITPUB个人空间q%{/_(oQ8H0J~
*判断是否存在相应增强的定义(SMOD)
aN*X:`b6^7204478 select single name from modsapa into mod0-name
.e;N c ?g4v3RW!F7204478 where name = 'PPCO0002'.ITPUB个人空间 BS W4nM-v0u
if sy-subrc = 0.ITPUB个人空间7?6r5e8B^sf'G
endif.
,pDZ8t;nO:V[F1ux7204478 select single * from tadir into ps_tadir_db
hX(IZx7204478 where pgmid = 'R3TR'
3W5wY5Z Rc2y/Xc7s7204478 and object = 'SMOD'
}WR9\?5c}@7204478 and obj_name = 'PPCO0002'.
*判断是否存在相应增强项目的定义(CMOD)ITPUB个人空间)y+s t"y,b^s
SELECT SINGLE name FROM MODATTR into mod0-nameITPUB个人空间c T Br/u5sW$_!gm
WHERE NAME = 'PPCO0002'..
*提取增强的定义的组件 (可以用此反查增强定义)ITPUB个人空间C6m[l"R+~
select * from modsapITPUB个人空间(P%G p4h2R
where name = 'PPCO0002'.
*判断该增强是否移植到BADI实现ITPUB个人空间q.d$vk;YCS
*Enhancement & has already been migrated in Business Add-In definitionITPUB个人空间q9T({PTM |RC"uR
select single migrated badi_def into (migrated, exit_name)ITPUB个人空间+h{6m4~ U&Zl7k
from modsapa where name = modname.
B'k.YZ }Z"L3{(k7204478 if sy-subrc = 0 and migrated = seex_true.
5ta3Q'E?'zL7204478 message s621 with modname exit_name.
f5K"|o9_7204478 check mode ne 'CHAM'.ITPUB个人空间D U MB.l.S5V p2C{
endif.
MODTYP 类型:
eux2Vy9u]#|7204478E : 功能退出ITPUB个人空间9L] sUE
S : 屏幕
p Q#|'LX C)@7204478T : 表
p1P$O"^DB ?0V!N7204478C : GUI代码ITPUB个人空间i/wL,m9b!s(_
sap增强存在MODSAP表内
*获取增强组件的参见函数MOD_SAP_MEMBER_TEXTITPUB个人空间,h)t.WN&Y$HM/|
*获得退出功能模块的信息ITPUB个人空间B#] Z O|BO)v.P*YQM B
select single * from tftit
Ui%Q T/Br7204478 where "SPRAS" = '1' AND "FUNCNAME" = 'EXIT_SAPLCORE_001'
k1H'lfN,Ff;_X L7204478 if sy-subrc = 0.
tO.N3d^?.s.n7204478 endif.
*值得学习的函数
k3oq[!xn#@)zb7204478MOD_KUN_ACTIVATE(会操作相关报表)
ITPUB个人空间&g3EVIE_ZOE
第三代
BADI作为SAP的第三代用户出口,他的应用也越来越广泛,但如何找到合适的badi是许多abap程序员的困惑。我这里就介绍一下我个人的应用的经验,供大家参考。
1、badi对象的信息存储在SXS_INTER, SXC_EXIT, SXC_CLASS 和SXC_ATTR 这四个表中(参见SECE包);
2、sap程序都会调用cl_exithandler=>get_instance来判断对象是否存在,并返回实例;其实get_instance就是对上述几个表和他们的视图(V_EXT_IMP 和 V_EXT_ACT)进行查询和搜索。
3、基于这个机理,我查用ST05来监控一个TCODE来跟踪,然后选择查找有关上述几个表和视图的操作,就可获得相关BADI。
4、se18 查找接口,se19 实现接口就可以实现用户增强。
#b(TF!rV7204478示例:用LE_SHP_DELIVERY_PROC控制跨月Cancel
G4JxKM3\K)lFp7204478
x$YK(]{}I)x~7204478METHOD IF_EX_LE_SHP_DELIVERY_PROC~CHANGE_DELIVERY_HEADER .
#\*jK#gG.B$UdaO7204478data : thismonth(2) type c.ITPUB个人空间w~)Hc^,j8M'N`
data : wa_likp type line of SHP_LIKP_T.
e#Q)diy"@ I7204478data : wa_log type line of SHP_BADI_ERROR_LOG_T.ITPUB个人空间Re;|5]3iN-h3X+k,j
clear ct_log[],thismonth.
3qrh1MjW.}7204478thismonth = sy-datum+4(2). "----->這一個月的月份ITPUB个人空间 fh)q1C_(F [
loop at it_xlikp into wa_likp.ITPUB个人空间 O6Gt1C s5j
check IS_V50AGL-WARENAUSG_STORNO ='X'."--->代表作GI cancelITPUB个人空间3CYY&K2e:j{~I5K
if wa_likp-WADAT_IST+4(2) < thismonth.ITPUB个人空间 s0kgS1N,hq V;x
wa_log-VBELN = cs_likp-vbeln.
o\[(]3TXCU7A7204478wa_log-MSGTY = 'E'. "錯誤訊息ITPUB个人空间v)G;[K7Zt{L
wa_log-MSGID = 'ZDN_ERROR'. "這一個class要自己建ITPUB个人空间]I(V3\ d
wa_log-MSGNO = '001'.
M ^%T'E ]:~7204478append wa_log to ct_log. "Error log寫入
Kgm2Ms#f7204478endif.ITPUB个人空间8a0O}9\-]
endloop.
m RXTh r1X7204478ENDMETHOD.
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7204478/viewspace-624432/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/7204478/viewspace-624432/