ZHRIS-SAP增强概述_第1页
ZHRIS-SAP增强概述_第2页
ZHRIS-SAP增强概述_第3页
ZHRIS-SAP增强概述_第4页
ZHRIS-SAP增强概述_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 总论Sap增强从种类上可划分为以下几类:l 修改原代码;l 空代码的子过程(第1代);l SAP 增强管理(第2代)(smod);l Badi增强(第3代)。其中“修改原代码”主要使用的sap的hr模块中,在sap的其他模块中使用很少,也不推荐使用此类增强。“空代码的子过程”可以称为sap的第一代增强方法,目前使用不多。BADI(Business Add-Ins ),即业务增强,是SAP基于面向对象的思想提出的新型的增强类型。本文主要讨论:修改原代码增强、badi增强2 修改源代码增强2.1 原理2.1.1 PBO和PAI执行的逻辑PBO(processbeforeoutput):PBO中包含的代码,指在屏幕显示前执行的代码,其代码功能准备或格式化要输入的数据;PAI(processafterinput):PAI中包含的代码,指在触发屏幕控制键所执行的代码,当屏幕显示时,触发屏幕上的任何控制键(含回车键),屏幕将根据PAI代码控制格式化屏幕的输出格式。屏幕显示时,PAI与PBO执行的逻辑:PAI-PBO当屏幕显示时,屏幕的代码运行状态是PBO已经执行完毕,即将开始运行PAI,如果此时触发屏幕上的任何控制键,将开始执行PAI,PAI执行完毕以后,再次运行PBO,重新恢复至PBO执行完毕,即将开始运行PAI的状态,每当触发一个新的屏幕事件时,就执行一次这样的循环。2.1.2 简单的修改屏幕属性每个屏幕字段都有用户在定义屏幕时在屏幕制作器中设置的属性。在运行时,根据用户在上一个屏幕中请求的功能,可能需要更改这些属性。在运行时,每个屏幕字段的属性存储在名为SCREEN的内存表格中。不必在程序中声明该表格,系统内部维护该表格并且在每次屏幕更改时更新它。内存表格SCREEN包括下列字段:名称长度说明NAME30屏幕字段的名称GROUP13属于字段组1的字段GROUP23属于字段组2的字段GROUP33属于字段组3的字段GROUP43属于字段组4的字段ACTIVE1可见并准备输入的字段REQUIRED1字段输入是强制的INPUT1字段准备输入OUTPUT1字段仅用于显示INTENSIFIED1高亮显示字段INVISIBLE1禁用字段LENGTH1减少字段输出长度DISPLAY_3D1以三维框架显示字段VALUE_HELP1显示有值帮助的字段要激活字段属性,则将它的值设置为1。要使它无效,则将它设置为0。将ACTIVE属性设置为0时,系统禁用字段并取消准备输入属性。用户不能查看字段也不能对它输入值。2.1.3 代码示例可以在 PBO 模块中实现 对该字段属性的更改:MODULE MODIFY_SCREEN OUTPUT.LOOP AT SCREEN.IF SCREEN-NAME = 0001.SCREEN-INPUT = 0.ENDIF.MODIFY SCREEN.ENDLOOP. ENDMODULE.2.2 对第1类系统信息类型的字段增强在800client在sap系统hr模块中,可对人事信息类的系统信息类型(00000999)进行增强,包括对此类信息类型的用户字段增加和逻辑增强。下面这个例子是对0021这个信息类型,进行用户字段增加。可以通过信息类型的子类型控制屏幕的显示。以0021地址为例进行说明,首先在pm01的“单个屏”页签的“客户包含”创建增强的ci结构,如下图:在“单个屏”页签中点选“生成对象”按钮,将相应屏幕结构生成。此时系统已自动将增强字段添加的系统屏幕中,如下图:0200子屏幕也自动建立好了接下来,我们通过选择不同的子类型来控制是否显示name字段。首先创建自己的特征z0021在sm30中维护t588m表,建立如下的3条维护记录:注意“变量码”与特征中的“返回值”向对应。当变量码为“none”时,将字段隐藏。结果:当选择子类型1“配偶”时,显示增强字段。当选择其他子类型时,则不显示增强字段。需要特别注意的是:在创建特征时,请不要忘记将其激活!2.3 对第1类9字头信息类型的增强160client当人员的公司代码为A300时:当输入材料转出时间(P9967-ZZ_DAZCSJ)时,则生成材料转递号(P9967-ZZ_DACLZDH)。材料转递号为9位号码,前两位是CC,第三到第六位为四位的年份,第七位到第九位为流水号。如CC2006001。四位的年份取材料转出时间(P9967-ZZ_DAZCSJ)所输入的年份。PA30进入,如下图:2. 详细逻辑说明字段名系统字段取数逻辑说明材料转出时间P9967-ZZ_DAZCSJ材料转递号P9967-ZZ_DACLZDH公司代码PA0001-BUKRSA300此增强只对A300集团公司总部有效3输出显示4关键逻辑技术说明1、2000屏幕PAI中PROCESSAFTERINPUT.MODULEEXITATEXIT-COMMAND.CHAIN.FIELDP9967-BEGDA.FIELDP9967-ZZ_DACLZCYY.FIELDP9967-ZZ_DACLZDH.FIELDP9967-ZZ_DAHZSJ.FIELDP9967-ZZ_DACLSJR.FIELDP9967-ZZ_DACLJSR.FIELDP9967-ZZ_DAZCSJMODULEINPUT_DACLZDH.FIELDP9967-ZZ_DAZRSJ.FIELDP9967-ZZ_DACLZWDW.FIELDP9967-ZZ_DACLYS.FIELDP9967-ZZ_DACLFS.FIELDP9967-ZZ_DACLLY.FIELDP9967-ZZ_DACLMC.MODULEINPUT_STATUSONCHAIN-REQUEST.ENDCHAIN.2、在程序mp996730中包含完成增强功能的formMODULEINPUT_DACLZDHINPUT.PERFORMFRM_DACLZDH.ENDMODULE.INPUT_DACLZDHINPUTFORMFRM_DACLZDH.DATA:L_BUKRS(4)TYPEC,L_VAL1TYPEI,L_VAL2TYPEI,L_VAL(3).DATA:L_ZZ_ZRHLIKEP9967-ZZ_DACLZDH.SELECTSINGLEBUKRSINTOL_BUKRSFROMPA0001WHEREPERNR=P9967-PERNRANDBUKRS=A300.IFSY-SUBRC=0.IFNOTP9967-ZZ_DAZCSJISINITIAL.CLEAR:L_VAL1,L_VAL2,L_VAL.SELECTBZZ_DACLZDHINTOL_ZZ_ZRHFROMPA0001ASAINNERJOINPA9967ASBONAPERNR=BPERNRWHEREABUKRS=A300.IFNOTL_ZZ_ZRHISINITIALANDL_ZZ_ZRH+2(4)=P9967-ZZ_DAZCSJ+0(4).L_VAL1=L_ZZ_ZRH+6(3).IFL_VAL1L_VAL2.L_VAL2=L_VAL1.ENDIF.ENDIF.CLEARL_ZZ_ZRH.ENDSELECT.L_VAL2=L_VAL2+1.L_VAL=L_VAL2.CONDENSEL_VAL.IFSTRLEN(L_VAL)=3.CONCATENATECCP9967-ZZ_DAZCSJ+0(4)L_VALINTOP9967-ZZ_DACLZDH.ELSEIFSTRLEN(L_VAL)=2.CONCATENATECCP9967-ZZ_DAZCSJ+0(4)0L_VALINTOP9967-ZZ_DACLZDH.ELSE.CONCATENATECCP9967-ZZ_DAZCSJ+0(4)00L_VALINTOP9967-ZZ_DACLZDH.ENDIF.ENDIF.ENDIF.ENDFORM.3 Sap第一代增强sap提供一个空代码的子过程,在这个子过程中用户可以添加自己的代码,控制自己的需求。这类增强都需要修改sap的标准代码。例子:销售订单就比较简单,用SE38打开SAPMV45A这个主程序,里面所有以USEREXIT开头的子例程都是用户出口,交货单SAPMV50A也是这样的。不过每个子例程是派啥用的还要在online help里看看清楚,多测试测试。4 Sap第二代增强SMOD包含具体的增强,而CMOD是包含一组SMOD编写的增强. User exits (Function module exits)是sap提供出口,它的命名规则如下: EXIT_ 4.1 使用CMOD建立增强项目输入自定义的项目名(ZHRPA002),点击“创建”;进入增强项目,选择“配置增强”,进入增强配置屏幕;输入增强名如:PBAS0001(PA: 人事管理/招聘: 缺省值和核查),点击修改,进入sap增强维护屏幕点击“组件”按钮,进入组件维护屏;将光标移到“功能模块名”,输入模块名,如:EXIT_SAPFP50M_001;选择“代码修改”按钮进入函数模块;双击函数模块的包含单元,进入包含单元加入自定义代码并激活保存;4.2 示例代码4.2.1 调用点MODULEbefore_outputOUTPUT.IFpsyst-iinitEQyesANDQNO4.0psyst-ioperEQcopyORpsyst-ioperEQinsert.QNO4.0 PERFORMcustomer_function_pbo(sapfp50m). move_cprel_to_pnnnn. 7842ENDIF.ENDMODULE.FORMCUSTOMER_FUNCTION_PBO.CALLCUSTOMER-FUNCTION001EXPORTINGTCLAS=PSPAR-TCLASINNNN=CPRELIPSYST=PSYSTI001P=T001PI503=T503IMPORTINGINNNN=CPRELCHANGINGIPREF=PREFEXCEPTIONSOTHERS=1.ENDFORM.FUNCTIONEXIT_SAPFP50M_001.INCLUDEZXPADU01.ENDFUNCTION.4.2.2 增强代码DATA:I0001LIKEP0001,I0006LIKEP0006,I0008LIKEP0008.CASEINNNN-INFTY.WHEN0001.MOVEINNNNTOI0001.MOVEXXTOI0001-VDSK1.MOVEI0001TOINNNN.WHEN0008.CALLMETHODCL_HR_PNNNN_TYPE_CAST=PRELP_TO_PNNNNEXPORTINGPRELP=INNNNIMPORTINGPNNNN=I0008.MOVEYYTOI0008-TRFGR.CALLMETHODCL_HR_PNNNN_TYPE_CAST=PNNNN_TO_PRELPEXPORTINGPNNNN=I0008IMPORTINGPRELP=INNNN.WHEN0006.CALLMETHODCL_HR_PNNNN_TYPE_CAST=PRELP_TO_PNNNNEXPORTINGPRELP=INNNNIMPORTINGPNNNN=I0006.MOVE100011TOI0006-PSTLZ.CALLMETHODCL_HR_PNNNN_TYPE_CAST=PNNNN_TO_PRELPEXPORTINGPNNNN=I0006IMPORTINGPRELP=INNNN.ENDCASE.4.3 作业找到 EXIT_SAPFP50M_002的调用点并写些代码。4.4 如何查找用户出口此类增强均保存在表“MODSAP”中,如下图:MODTYP 类型:E : 功能退出S : 屏幕T : 表C : GUI代码REPORTZFINDCMOD.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=R3TRandobject=PROGandobj_name=tstc-pgmna.move:tadir-devclasstov_devclass.ifsy-subrcne0.selectsingle*fromtrdirwherename=tstc-pgmna.iftrdir-subceqF.selectsingle*fromtfdirwherepname=tstc-pgmna.selectsingle*fromenlfdirwherefuncname=tfdir-funcname.selectsingle*fromtadirwherepgmid=R3TRandobject=FUGRandobj_nameeqenlfdir-area.move:tadir-devclasstov_devclass.endif.endif.select*fromtadirintotablejtabwherepgmid=R3TRandobject=SMODanddevclass=v_devclass.selectsingle*fromtstctwheresprsleqsy-languandtcodeeqp_tcode.formatcolorcol_positiveintensifiedoff.write:/(19)TransactionCode-,20(20)p_tcode,45(50)tstct-ttext.skip.ifnotjtabisinitial.write:/(95)sy-uline.formatcolorcol_headingintensifiedon.write:/1sy-vline,2ExitName,21sy-vline,22Description,95sy-vline.write:/(95)sy-uline.loopatjtab.selectsingle*frommodsaptwheresprsl=sy-languandname=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)eqJTAB.setparameteridMONfieldsy-lisel+1(10).calltransactionSMODandskipfirstscreen.5 SAP第三代Badi增强5.1 基本知识BADI(Business Add-Ins ),即业务增强,从本质来看,BADI实际上是一个接口类,类里面已经定义好了一些空的方法,包括各种传入、返回的参数。如图所示:一个没有做实例化的Badi有两个名字,一个是Badi名(EXIT_NAME),一个是接口名(INTER_NAME)。我们可以在表“SXS_INTER”中查询到sap预定义的全部Badi名和其对应的接口名称。使用se18命令查看需要的badi名5.2 实例化一个badi当客户需要对某一增强区域做增强时,需要新建一个增强应用。首先找到该增强区域的BADI名;然后创建一个该BADI的应用,此时系统会为这个新应用生成一个类,并使之继承于当前BADI的所有接口方法;接下来由客户实现这些方法;最后,将此创建的BADI应用配置在增强区域中。这样,在相同的增强区域中,只要选择不同的实例化对象或BADI应用,就可以实现不同的增强功能。(以上引自关林涛论文)如上图:BADI名:HRPAD00INFTY创建的BADI实例名:ZHRPAD00INFTYBADI的接口名:IF_EX_HRPAD00INFTY系统为BADI实例生成的类名:ZCL_IM_HRPAD00INFTY可在相应的方法中实现用户需求的增强。5.3 查询系统已有Badi的实例化代码Sap系统中已经将一部分功能封装到Badi实例的方法中,我们通过查找到这些实例代码,在这些代码的基础上进行功能的增强。值得注意的是,在某一区域的badi实例只能有一个是激活状态的,在对badi进行增强时,需要将原系统的badi实例取消激活。根据表“SXC_EXIT”可以通过已知的badi名查找该badi是否实例化了并且可查询到实例化的名字。已上图为例:在系统中激活的实例只有ZR_GET_SUBTYPE_T512Z,并且他的过滤器的值是“0011”蓝色框内的实例为用户创建,目前处于非激活状态。绿色框内的实例“HR_GET_SUBTYPE_T512Z”为系统自带的默认实例名,在创建增强时需要将其状态改为非激活。5.4 示例代码5.4.1 调用点MODULEpost_input_checksINPUT.PERFORMpost_input_edynr.formABPER,formUPDATE_BUFFERENDMODULE.FORMpost_input_edynr.PERFORMcustomer_function_pai(sapfp50m).PERFORMbadi_after_input(sapfp50m).ENDFORM.FORMBADI_AFTER_INPUT.*BusinessAdd-In:getimplementationinformationandinstanceCALLFUNCTIONHR_GET_BUSINESS_ADD_INEXPORTINGEXIT_NAME=INFTY_BADI_NAMEIMPORTINGIS_IMPLEMENTED=IS_IMPLEMENTEDCHANGINGINSTANCE=INFTY_BADI_EXIT.IFNOTIS_IMPLEMENTEDISINITIAL.SY-SUBRC=0.CALLMETHODINFTY_BADI_EXIT-AFTER_INPUTEXPORTINGTCLAS=PSPAR-TCLASOLD_INNNN=CSAVEN0312574NEW_INNNN=CPRELN0312574IPSYST=PSYSTI001P=T001PI503=T503IPREF=PREFXPVPH0K010030EXCEPTIONSERROR_WITH_MESSAGE=1.ENDIF.ENDFORM.5.4.2 增强代码methodIF_EX_HRPAD00INFTYAFTER_INPUT.IFSY-TCODEEQPA30ANDNEW_INNNN-INFTYEQ0006.FIELD-SYMBOLS:TYPEANY.ASSIGN(MP000600)P0006-ORT01)TO.IF=a.message牛!TYPEI.ENDIF.ENDIF.endmethod.5.5 如何搜索Badi1、打开运行事务码: ST05 选择“table buffer trace”而不是常用的SQL trace2、activate trace3、运行事务码:pa304、运行pa30程序,保存5、deactivate trace6、点击display trace,在出来的选择条件中: objects中输入:V_EXT_IMP和V_EXT_ACT;在operations中输入“OPEN”7、查询跟踪结果如下图:在操作pa30过程中捕捉到的BADi名或接口名如下:HRPAD00AUTH_CHECKHRPAD00AUTH_RECORDGOS_SRV_SELECTBADI_LAYERIF_EX_GOS_SRV_SELECTHRPAD00AUTH_CHECKHRPAD00AUTH_RECORDHRPAD00AUTH_CHECKHRPAD00INFTYBADI_LAYERIF_EX_HRPAD00INFTYBADI_LAYER6 其他增强Vofm另外还有一种出口叫BTE相关TCODE: FIBFBusiness Transaction Events (Open FI)The Open FI enhancement technique was developed in the Financial Accounting component. Open FI is based upon the following principles:Application developers must define their interface in a function module, an assignment table is read in the accompanying (generated) code, and the customer modules assig

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论