ABAP开发中的增强_第1页
ABAP开发中的增强_第2页
ABAP开发中的增强_第3页
ABAP开发中的增强_第4页
ABAP开发中的增强_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

1、ABAP开发中的增强日期:2008-10-12开始整理版权声明:大部分资料来源于网络,部分文字、格式及排版出自本人,部分截图由本人亲自完成,如 有侵权,请告知本人,欢迎来信讨论 SAP或ERP相关的话题。免责声明:本资料仅供研究、学习、学术讨论之用,不得用于生产环境。对于使用本文档产生的损失, 本人不承担任何责任! 一般说明使用SAP的增强建议系统学习一下SAP标准教材 BC425和BC427。ABAP开发中的增强至少经历了 4代,下面详细说明。第一代:基于源代码的增强源代码增强以子程序形式发布,在SAP的发行版本中,使用PERFORM调用这些子程序,它们在发布时都是空的,sap提供一个空代码

2、的子过程,在这个子过程中用户可以添加自己的代码,控制自己的需求。这类增强需要修改sap的标准代码。示例:USEREXIT . in SAPMV45A。主要集中在一些文件名倒数第二个字符为Z的包含程序中。用户增强时,应首先到service marketplace申请对象键,然后才能修改这些子程序,这些子程序可以使用程序中所有的全局数据。对于第一代增强,可以用以下方法查找增强:打开欲增强的程序,点击工具栏上的"Display Object List ”按钮,选择Subroutines,查找以"UserExit”开头的子程序,根据子程序前面的注释文档来查找用户出口,如下图,事务码

3、:SE38ABAP Editor: Initial ScreenProgramSAPMV45A)Subobjects® Source Code O VariantsO AttributesO Docu mentationO Text elements血 Display夕 Change口I8E0(JiRepository Bro wserSAPlf日1ZJ23邛121315161718LUABAP Editor: Display Mod Pool SAPMV45AABAP Editor: Display Mod. Pool SAPMV45AActive 團禺画1西tnigF面这些以US

4、EEXIT_开头的都是空的子程序,可以添加自己的代码。Mod. Pool二lElllg區固HI西U囤囹SAPMV45AMod. Pool| ProgramObject Name矽|会器| EET IS|SAPMV45A 口 SAPMV45A> Dictionary StnicturesI> Classes口 Typesl> Fieldst> 口 Macrosi卜 口 Events/t> PBO Modules / A PAI Modules j/ S Subroutines' P V W V T !r VB PPhL'WPPF kh'WFP

5、Pkh VW V T h FABHOLFErJSTER.PRUEFENADOICPROFSELECTA DOI CP .SELECTA A i tr II I TMlA /iTr m ILLLiMI *$*$-End:r cEMHANCEMEN1 ENHANCEMEN1 include fc INCLUDE DL EMDEMHArJCEbModulpool zur KundenauftragsbearbeijINCLUDE MV45AT0P.EMHAMCEMENT-POINT SAPMV45A 03 SPOTS ES SAPWlii rkid i Ji m/" rtiirikiT*$

6、-Start: SAPMV45A_03ABAP Editor: Display Include MV45AFZFIncludeMV45AFZFActkfeProgram工|SAPMV45A糾iaRepostoiy Browser和"T可百I需画鬲| E3Object NameU5EREXITUSEREXITUSEREXITUSEREXITUSEREXITUSEF5EXIT,AVAIL_CHECK_CRED1TCHECK_VBAKCHECK_V0APCHECK_V0EPCHECK_VBKD CHECK_VBLB-USR0162!63!64:65|66;67)希7&7172方 F

7、ORM USEREXIT CONFIGURATIO忖 MODE CHANGING CH DISPLAY.* ExampleI申 * user status 91 is set* if vbuk-uvkQl eq chars.* ch_display = charxn -* endif-ENDFORM .*ejctUSEREXITUSEREXIT USEREXITU5EREXIT USEREXIT USEREXn USEREXIT USEftEXlT USEREXIT USEF?EXIT USEREXITUSEREXITCHECK_VBLB-USR02CHECK_VBLB-USR03CHECK_

8、VBLB-USR04CHECK_VBLB-USR05CHECK_VBStJCHECKJCV0AP_FO R_D ELET CHECK_XVBEP_FO R_DELET CHECkZxVBSnZfO R_D ELET COBL_RECEIVE_V6AkCO 肌-RECEIVE_VBAPCOBL SEND HEADERCOBL SEND ITEMUSEREXIT匚OIIFIGUUTIOe mooeUSEFIEXITCONFIG DATE EXPLOSION屏幕增强以客户屏幕形式发布,它们包含在标准程序中,没有什么特别规律。这种源代码增强和屏幕增强的说明可以从事务码spro后台配置中相关模块的路径里

9、面找到。同时使用的针对数据表的增强是appe nd structure,可以在事务码 sell中打开透明表,点击应用工具栏最右边的那个appe nd structure按钮就能为数据表追加新的字段。这种更改标准程序的方法现在很少使用,因为系统升级有可能不能工作。如果在代码中改变了全局变量,还可能会破 坏系统原有的逻辑。第二代:基于函数模块的增强源代码增强以函数模块形式发布,在SAP的发行版本中,使用CALL CUSTOMER-FUNCTION调用这些函数模块,它们在发布时只有一句代码INCLUDE xxxxxxx。用户增强时,无需申请对象键,直接双击这个包含,然后回车,就可以创建相关的包含文件

10、,编写相应的代码了。这些函数模块中只能使用接口中传递的参数,不能使用调用程序的全局 变量。Sap中出口就是标准程序最后首先来讲解一下什么是出口,顾名思义,就是一段程序执行到最后必经的一段程序。在 要调用的一个函数或者功能模块,这个函数或功能模块的输入已经由Sap定义好。为什么会有出口呢?因为正常的业务系统不能满足实际需求,这时可以在出口中增加一些功能,来达到要求,这也就 是为什么它还叫增强。SAP系统升级的时候会被覆盖。自己写的SAP出口程序在系统升级的时候会被保留,而如果更改标准程序在F面介绍一下什么时候需要使用出口以及出口的种类:1、在业务检查时,比如在某个工厂发货,可以设定在某个库位的出

11、货只能使用某种移动类型。2、在需要界面增强时,比如用户对某个字段要求大写,但是最终用户不按规范操作,这也可以在出口中自动转换,有 些模块甚至能自定义数据库字段, 并且可以在出口中增加字段输入。 还有的模块能对输入数据检查, 甚至实现自动 替代等功能。3、有不规则业务时,比如按某种条件定价,可以设定从自己定义的表中按某种条件取值。4、搜索帮助的出口,可以对 Sap 标准的搜索帮助做权限控制,等等。SAP 有四种基本用户出口的类型:1、菜单出口 -Menu Exits ,定义自己的菜单;2、屏幕出口 -Screen Exits ,定义自己的屏幕;3、功能模块出口 -Function Module

12、Exits,在SAP应用程序中添加功能;4、关键字出口 -Keyword Exits,在ABAP/4字典中的关键字数据元素添加文档。结果是你在使用这些数据元素的字段 处按 F1 后会出现你自定义的说明文档。因为出口都是被 Sap预先定义好的,那么怎么寻找自己需要的出口呢?1可以通过配置文档的帮助和SAP library寻找业务系统的出口,sap library在implementation guide '中寻找出口,在配置功能执行按钮左边一般都有一个说明文档,描述相关的出口。2:为了方便我们把所有的出口名称及其描述列在文章的后面。下面具体介绍怎样写出口程序:为了对出口程序的修改进行管理

13、,sap提供了专门用来管理出口程序的事务,事务代码是CMOD。这些出口函数有标准处理程序传入的参数和输出参数,用户可根据系统输入参数作为条件编写适合本企业流程的逻辑,然后通过输出参数传回给 SAP 。屏幕增强也包含在函数模块所属的函数组中。针对数据表的增强是 CI_ 结构,这些结构以 .INCLUDE 结构的形式包含在 SAP 发布的数据表中,用户可以通过向 这些结构中添加字段而对数据表进行增强。上述这类增强通过事务码 SMOD 进行维护, CMOD 进行实现。 SMOD 中的一个增强可以包含上述的源代码、 屏幕和 表结构增强,按照较容易理解的逻辑结构来管理这些增强,使用相对更加便利。对于第二

14、代增强,可以用以下方法查找增强用户增强通常包括下面3类,顾名思义,就是增强SAP的可能没有提供的功能(通过后台配置也不能实现).1. E Enhancement exits :就是常说 User_exit ( 用户出口 )使用SE37搜索EXIT*的函数大都是做 exit用的,通常里面预包含了一个 Z开头的程序 . SE16 查询 TFDIR( 函数表 )输入 EXIT* 也可 .2. C GUI codes( GUI 接口增强 )3. S Subscreens (屏幕增强 )Enhancement在表MODSAP可看到,而 TFDIR字段 MAND(值为C表示此出口函数被激活).使用SMOD

15、(CMOD)当然可 激活exit function,有时候一时难以查询到相关Enhancement时可使用下面程序将出口函数激活REPORT Zactexitfun .data ztfdir like tfdir .* select single * from tfdir into ztfdir* where FUNCNAME =* 'EXIT_SAPMM06E_013'.* ztfdir-MAND = 'C' .* update tfdir from ztfdir.* 将 EXIT_SAPMM06E_013 换成实际所需 exit 函数名update tfdi

16、r set MAND = 'C'.where FUNcname = 'EXIT_SAPMM06E_013'.* 当然也可 SE16:M0DSAP 表 enhancement输入 EXIT_SAPMM06E_013 然后得到 enhancement name MM06E005 后使 用 SMOD 测试激活 exit 函数 .增强相关函数和表格Function:1 .DYNP_V ALUES_READ2 . M0DX_ALL_ACTIVE_MENUENTRIES(菜单增强 )3 .M0DX_FUNCTI0N_ACTIVE_CHECK(出口函数增强 )由于读者可能接触

17、 user exit 最多 ,除了附录光盘有个查找ZFINDEXIT 的程序外 (有些 exit 使用它并不能找到 ),另一个直接有效的方法就是使用这个函数 ,SE37 设好断点后执行 tcode 如其有 exit 就会调用此函数 .4 .M0DX_MENUENTRY_ACTIVE_CHECK(菜单增强 )5 .M0DX_SUBSCREEN_ACTIVE_CHECK(屏幕增强 )Table:1 . TFDIR->function module table2 . M0DSAP->sap enhancement table3 . TSDIR->Dynpro Areas CALL

18、CUST0MER SUBSCREEN(屏幕增强 )4 . CUA TEXTS-> GUI Interface: Menu Texts Changed(GUI 菜单文本增强 )* 注意 ,为了确保一个出口被真正应用,必须同时激活相关程序(SE38) 和出口函数 (SM0D|CM0D, 反正就是要保证tfdir-mandt= ' C',用程序也可.)the third generation enhancement will be discussed in the next post.1 、关于增强的简单介绍1.1 SM0D 包含具体的增强,而 CM0D 是包含一组 SM0D

19、编写的增强 .1.2 User exits (Function module exits) 是 sap 提供出口,它的命名规则如下:EXIT_<program name><3 digit suffix>示例:sd 的 VA01 事务,对应的程序是 SAPMV45A ,你会在程序里查到(用 CALL CUST0MER-FUNCTI0N 字符串) 如下代码:CALL CUST0MER-FUNCTI0N '003'exportingxvbak= vbakxvbuk= vbukxkomk = tkomkimportinglvf_subrc = lvf_subrc

20、tablesxvbfa = xvbfaxvbap = xvbapxvbup = xvbup.则 exit calls function module 的名称就是: EXIT_SAPMV45A_0032、先试用 SM0D 建立一个 SAP 增强2.1、选择一个增强,如:SDVFX001 ,点击修改,进入 sap增强维护屏幕;2.2、点击 "组件 "按钮,进入组件维护屏;2.3、将光标移到 " 功能模块名 " ,输入模块名,如: EXIT_SAPLV60B_001 ;2.4、选择 "代码修改 "按钮进入函数模块;2.5、双击函数模块的包含

21、单元,进入包含单元加入自定义代码并激活保存;3、使用 CMOD 建立增强项目3.1、输入自定义的项目名,点击 "创建 ";3.2、进入增强项目,选择 "配置增强 " ,进入增强配置屏幕;3.3、输入增强名如: SDVFX0013.4、保存,并退出;4、使用 CMOD 将增强项目激活,便大工告成。如何查找* 判断是否存在相应增强的定义 (SMOD) select single name from modsapa into mod0-name where name = 'PPCO0002'.if sy-subrc = 0.endif.sele

22、ct single 获取增强组件的参见函数 MOD_SAP_MEMBER_TEXT from tadir into ps_tadir_dbwhere pgmid= 'R3TR'and object = 'SMOD' and obj_name = 'PPCO0002'.* 判断是否存在相应增强项目的定义 (CMOD)SELECT SINGLE name FROM MODA TTR into mod0-name WHERE NAME= 'PPCO0002'.* 提取增强的定义的组件 (可以用此反查增强定义 )select * from

23、 modsapwhere name = 'PPCO0002'.* 判断该增强是否移植到 BADI 实现*Enhancement & has already been migrated in Business Add-In definition select single migrated badi_def into (migrated, exit_name) from modsapa where name = modname.if sy-subrc = 0 and migrated = seex_true. message s621 with modname exit_

24、name. check mode ne 'CHAM'.endif.MODTYP 类型 :E : 功能退出S : 屏幕T : 表C : GUI 代码sap 增强存在 MODSAP 表内*获得退出功能模块的信息 select single * from tftitwhere "SPRAS" = '1' AND "FUNCNAME" = 'EXIT_SAPLCORE_001' if sy-subrc = 0.endif.*值得学习的函数 MOD_KUN_ACTIVA TE( 会操作相关报表 )小技巧 透视 ERP

25、 增强(一) 什么是增强 (Enhancement)?简单地说,增强就是 ERP 系统中标准程序的出口,在该出口中由用户根据企业实际需求编写客户化逻辑代码。增强是 ERP 系统设计时考虑到企业实际的流程有可能和系统默认标准流程不同,在标准流程框架下专门留的接口,每个接口 对应一个客户化函数 ,这些出口函数有标准处理程序传入的参数和输出参数,用户可根据系统输入参数做条件编写适合 本企业流程的逻辑,然后通过输出参数传输回。(二) 用户增强分类SAP 的用户增强通常包括下面 3 类。1. E类:Enhancement exits,即通常所谓的用户出口( User_exit )用户出口也叫功能出口 (

26、Function Exit) 。使用Tcode:SE37搜索EXIT*,找到的函数大都是做系统预留的出口函数,前面说过,用户出口是标准程序留给用户的接口标准程序通常不允许用户任意修改,如果修改需要申请 Access Key,而且修改标准程序可能导致的错误erp公司通常是不负责的。在SAP中,自定义的程序通常以保留字Y或Z开头,因此,出口函数中都预包含了一个Z开头的程序。2. C 类: GUI 接口 (GUI codes)3.S 类:屏幕增强(Screen Exit) 比如,在建立采购订单,工单和固定资产主数据时,系统都预留屏幕增强,也就是说允许用户自定义用户输入界面并 编写相应的输入输出处理程

27、序。在各类增强中,可能还用户自己定义结构或表格,系统对应类型T类。比如增强 MM06E005允许用户建立两个结构 CI_EKKODB 和 CI_EKPODB 。接下来将重点介绍功能出口的应用。(三) 组织用户增强相关增强表格:MODSAP: 增强表格TFDIR :包括出口函数在内的所有函数表(E类)CUATEXTS: 修改 GVI 界面,界面 : 菜单文本被客户 (C 类)TSDIR:动态程序区 CALL CUSTOMER SUBSCREEN(S 类)*对于以EXIT开头的出口函数,TFDIR-MAND 值为C表示此出口函数被激活。 相关增强检查函数:MODX_FUNCTION_ACTIVE_

28、CHECK:检查 E 类用户出口是否被激活。MODX_MENUENTRY_ACTIVE_CHECK:检查 C 类增强激活状况MODX_SUBSCREEN_ACTIVE_CHECK:检查 S 类增强激活状况你可能会发现,SAP的各模块的任何一个事务码(Tcode)对应的标准程序都留下了大量的用户出口,正是SAP灵活的配置功能和强大的用户出口才使其产品轻松应对各种复杂需求成为可能,系统还为能快速找到和激活这些增强进行了有效组织,各类增强被记录在 table 中并且提供了相关检查函数,从而更方便企业用户。,下表就是一个检测系统熟悉 ABAP 开发的朋友通常都收集了一个可以输入事务码快速找到系统留下的

29、所有出口的程序 增强被激活的简单参考程序。* 该程序可以检测出系统所有被激活的用户增强 * By Stone Fu. on 2006/11/07 .* Used to find out all the activated user-exit of SAP . report zfindactexit . tables: modsap,tfdir.data : begin of itab_exit occurs 0, funcname like tfdir-funcname, mand like tfdir-mand, name like modsap-name, end of itab_exit

30、 .data : field1(30). _select afuncname amand bname into table itab_exit from tfdir as ainner join modsap as b on afuncname = bmember where amand = 'C' and afuncname = bmember . format color col_heading intensified on. write:/1 sy-vline, 2 'Enhancement Name', 21 sy-vline , 22 'Act

31、ivated Exit Function', 95 sy-vline. write:/(95) sy-uline. loop at itab_exit. format color col_normal intensified off. write:/1 sy-vline, 2 itab_exit-name hotspot on, 21 sy-vline , 22 itab_exit-funcname, 95 sy-vline. endloop. at line-selection. get cursor field field1. set parameter id 'MON&#

32、39; field sy-lisel+1(10). call transaction 'SMOD' and skip first screen.有一种直接有效的查找用户出口增强的方法,就是使用函数 MODX_FUNCTION_ACTIVE_CHECK ,如图 1。图1中的判断语句If tfdir-mand = aktiv_flag(常数C)则出口函数active标志='X',表示该用户出口被激活,处理逻辑将 从标准程序转入出口函数,在该语句设置断点然后运行任一个事务码,都会调用该函数判断是否存在用户出口。(四)增强应用实例业务背景 :如果采购订单已经做了发票校验

33、后,则不再允许用户修改价格。相关程序: MM06EFPO_POT_FUELLEN| MM06EF0C_CUSTSCR1_ITEM_SET_DAT相关 Tcode:SMOD|CMOD如果没有启动采购审批功能, SAP 标准功能是允许用户随时修改采购价格的,不同的企业有对采购价格控制有不同的 策略,甲企业规模较小为了省事可能为以后数月的采购开了一个大采购单,如果中途材料价格变动则直接修改价格就 行,乙集团则严格控制采购价格,采购价格由总部集中维护,各企业采购员只需要维护采购数量等信息等,真因如此,ERP 系统显然不会去禁止用户修改价格,如果企业确实需要如此,则可通过增强实现。 前面已经介绍过如何通

34、过在函数 MODX_FUNCTION_ACTIVE_CHECK 设置断点跟踪系统每个事务预留的用户出口, 你很快将发现增强 MM06E005 的 EXIT_SAPMM06E_017 用户出口非常适合此业务背景。首先 来看 看增 强 的 EXIT_SAPMM06E_017 用 户出 口 (以下 称 017 出口 )处理 流程 ,Include 程序 MM06EFPO_POT_FUELLEN 被专门用来处理增强出口 ,调用了子程序 CUSTSCR1_ITEM_SET_DATA_PAI( 对 应 下 一 级 Include 程 序 MM06EF0C_CUSTSCR1_ITEM_SET_DAT), 分

35、 析 Include 程 序 MM06EF0C_CUSTSCR1_ITEM_SET_DAT 的代码 ,如下表 ,这个程序是从系统原本 Copy 出来的 ,注意本人所加的附注粗 体部分 :* User-Exit f r Positionsfelder versorgen (PAI)FORM custscr1_item_set_data_pai USING im_no_screen LIKE fc_call."770427 DATA: l_ucomm LIKE sy-ucomm,l_enj_call TYPE c.STATICS: first_call(1) TYPE c VALUE &

36、#39;X',activeLIKE sy-calld.ENHANCEMENT-POINT CUSTSCR1_ITEM_SET_DATA_PAI_02 SPOTS ES_MM06EF0C_CUSTSCR1_I_SET_DAT INCLUDE BOUND .*$*$-Start: CUSTSCR1_ITEM_SET_DA TA_PAI_02$*$*ENHANCEMENT 1 OI0_COMMON_MM06EF0C_ITEM_S_DA T. "active version* C5030897 I.Twardowski Implementation of BADI for OGSDP

37、ERFORM OI0_BADISCR1_ITEM_SET_DATA_PAI. ENDENHANCEMENT.*$*$-End:CUSTSCR1_ITEM_SET_DATA_PAI_02$*$*IF NOT first_call IS INITIAL.CLEAR first_call.*注释: MODX_FUNCTION_ACTIVE_CHECK 用来检查 017 出口是否被激活 ,如果激活则执行之 .CALL FUNCTION 'MODX_FUNCTION_ACTIVE_CHECK' EXPORTINGcprogname = 'SAPMM06E' funcnum

38、ber = '017'IMPORTINGactive = activeEXCEPTIONSnot_found = 1OTHERS = 2.IF NOT sy-subrc IS INITIAL.CLEAR active.ENDIF.ENDIF.CHECK NOT active IS INITIAL.IF fc_vorga EQ cva_en.l_enj_call = 'X'.ELSE.l_enj_call = space.ENDIF.*-Define Data:DATA: lt_usr_tekpo LIKE bekpo OCCURS 0, lt_usr_teket

39、 LIKE beket OCCURS 0, lt_usr_tekkn LIKE ekknu OCCURS 0, lt_usr_tkomv LIKE tkomv OCCURS 0.*-Copy Tables: lt_usr_tekpo = pot. lt_usr_teket = ett. lt_usr_tekkn = knt.lt_usr_tkomv = tkomv.l_ucomm = ok-code.*注释:调用出口的一般步骤是先定义数据 (Define Data), 多为内表或工作区 ,再将参数赋予这些内表 (Copy Tables), 相当于建立了原始参数的一个镜象 .*-User Exi

40、t:*如果 017 出口增强被激活则执行它 .CALL FUNCTION 'EXIT_SAPMM06E_017'EXPORTINGi_ekpo= ekpoi_ekpo_old =*ekpoi_ekko= ekkoi_aktyp= aktypi_bstyp= ekko-bstypi_no_screen= im_no_screen"770427i_lfa1= lfa1i_lfm1= lfm1i_rekpo= rekpoi_kekpo= kekpoi_aekpo= aekpoi_reban= rebani_mt06e= mt06ei_eina= *einai_eine= *

41、einei_komp= kompi_ucomm= l_ucommi_enj_call = l_enj_callTABLEStekpo= lt_usr_tekpoteket= lt_usr_tekettekkn= lt_usr_tekkntkomv= lt_usr_tkomvEXCEPTIONSOTHERS= 0.ENDFORM. "CUSTSCR1_ITEM_SET_DATA_PAI 上面的程序代码非常简单,相信聪明的读者看了对 ERP 增强的设计思路会开始有一定了解。现在你可以通俗理解,增强就是 ERP 设计者在合适的地点设置了一些合适的游戏规则并提供了一些有意义的游戏给用 户自己

42、玩耍!独乐乐,与人乐乐,孰乐?好玩的东西应该留点给用户自己乐呵乐呵。接下来开始编写增强程序 ,可以使用 Tcode:SMOD 直接激活增强或 CMOD 建立一个项目包含一个或多个增强 ,如图 2,输 入增强 MM06E005 并激活它 ,然后在 EXIT_SAPMM06E_017 出口函数中编写代码。在图2中,我们发现增强 MM06E005包括用户出口和屏幕增强(Screen Exit),屏幕增强允许用户在采购订单自定义用 户界面,从而使采购订单包含更多企业客户化的信息,这种屏幕增强在固定资产模块中更始发挥到极致。EXIT_SAPMM06E_017 包含程序 ZXM06U42 ,程序 ZXM0

43、6U42 示例代码如下表,这段客户化代码逻辑十分简单,为 了方便说明,本人注释出该出口函数的输入参数,该出口没有输出参数,也就是说,你只能根据输入参数进行判断而 不能更改任何数据:* 增强 ZXM06U42 的示例代码*By Stone.Fu 2007/01/02*"判断程序代码如下:DATA ZWATEKPO like BEKPO.TABLES EKBE .* 输入的内表参数 TEKPO 记录该采购单所有的原始旧数据 .* 输入的 I_EKPO 参数表示当前处理的 PO 行项目,其包含的是采购行项目的最新更新数据. READ TABLE TEKPO INTO ZWA TEKPO W

44、ITH KEY EBELP = I_EKPO-EBELP . 只对 ME21N/22/23 才生效 .check SY-TCODE = 'ME22N ' or SY-TCODE = 'ME22N' orSY-TCODE = 'ME23N' .*EKBE 是PO history表,如有Q,R表示有发票校验历史,不允许更改价#SELECT SINGLE_ * FROM EKBEWHERE EBELN = I_EKPO-EBELNAND EBELP = I_EKPO-EBELPAND ( BEWTP = 'Q' OR BEWTP = &

45、#39;R' ) .*如果 SY-SUBRC =0 表示发票已经校验,不允许更改价格。"Lokale Schnittstelle:*IMPORTING/TABLES 是输入的单个参数和输入的内表参数*" IMPORTING*"VALUE(I_EKPO) LIKE EKPO STRUCTURE EKPO*"VALUE(I_AKTYP)*"VALUE(I_BSTYP) LIKE EKKO-BSTYP*"VALUE(I_NO_SCREEN)*"VALUE(I_LFA1) LIKE LFA1 STRUCTURE LFA1*&

46、quot;VALUE(I_LFM1) LIKE LFM1 STRUCTURE LFM1*"VALUE(I_EKKO) LIKE EKKO STRUCTURE EKKO*"VALUE(I_REKPO) LIKE EKPO STRUCTURE EKPO OPTIONAL*"VALUE(I_KEKPO) LIKE EKPO STRUCTURE EKPO OPTIONAL*"VALUE(I_AEKPO) LIKE EKPO STRUCTURE EKPO OPTIONAL*"VALUE(I_REBAN) LIKE EBAN STRUCTURE EBAN

47、OPTIONAL*" VALUE(I_MT06E) LIKE MT06E STRUCTURE MT06E OPTIONAL*"VALUE(I_EINA) LIKE EINA STRUCTURE EINA OPTIONAL*"VALUE(I_EINE) LIKE EINE STRUCTURE EINE OPTIONAL*"VALUE(I_EKPO_OLD) LIKE EKPO STRUCTURE EKPO OPTIONAL*"VALUE(I_KOMP) LIKE KOMP STRUCTURE KOMP OPTIONAL*"VALUE(I

48、_UCOMM) LIKE SY-UCOMM OPTIONAL*"VALUE(I_ENJ_CALL) OPTIONAL*" TABLES*"TEKPO STRUCTURE BEKPO OPTIONAL*"TEKET STRUCTURE BEKET OPTIONAL*"TEKKN STRUCTURE EKKNU OPTIONAL*"TKOMV STRUCTURE KOMV OPTIONALCHECK SY-SUBRC = 0 .*判断数据更改后新采购行项目的单价是否和从数据库读出的原始行项目单价一致IF I_EKPO-NETPR <

49、> ZW ATEKPO-NETPR .MESSAGE E001(00) with ' 采购订单行项目已经进行发票校验,不再允许修改价格ENDIF. 如果你熟悉增强,你会发现一些用户出口都会传入旧数据和更新后的新数据以方便两者比较,和财务模块的替代 (Substitution )不同, ERP 系统一般对增强保留严谨态度,通常只允许在出口中做检查工作,这一点类似财务模块的 检查( Validation )。(五) 再次浅析增强企业实施 ERP 的目的之一就是实现各部门信息共享 ,避免数据孤岛 ,以一个简单的采购收货为实例 ,仓库人员只要在收货 时输入采购订号 ,收货日期 ,物料收货

50、数量和仓位 ,系统将自动产生各模块数据 ,对财务数据 ,系统根据输入的采购订单号找 到采购订单主数据中的工厂 ,通过在组织结构中设置的工厂和公司代码的对应关系找到相应公司代码;通过收货物料的Valuation class 和收货的移动类型找到对应科目 ,通过收货数量 *采购单价得到本次该料库存金额 ,通过物料主数据获得业 务范围和利润中心 ,这样财务凭证数据自动收集完毕; 如果物料采用标准价格出现采购差异并将差异科目的模认成本对象对应到获利分析段 ,则将数据写入利润分析模块等等 ; 我要说的是 ,在这些复杂的逻辑背后 ,任何一个模块收集过程中存 在校验 ,任何校验失败 ERP 系统都将停止业务

51、交易 ,比如说校验收货日期不在物料期间或会计期间允许范围,校验失败向用户提示错误 ,比如预算模块找不到对应基金中心提示错误中止交易等,当所有的校验完毕 ,系统将数据 Commit 到数据库 ,这些校验是系统标准的 ,而增强则是系统预留给用户的 ,和系统的校验一样, 在任何模块的增强中只要是出现错误都将停 止本次业务交易。在图 3中出现的检查 /替代/增强/字段移动 /推导等关键词,实际上这些东东都可看成系统增强,即使 用客户化代码增强标准功能。有趣的是, SAP 的各种增强的代码编写都是极其简单的,象检查/替代/字段移动 /推导 /派生用户甚至只要简单将对应的源字段和目标字段拖拖拽拽关联关联就

52、行, 代码是自动生成的, 即使涉及 Coding 也是非常简单的。 神奇的是, 作为 SAP 顾问你甚至可以对编程和数据库毫不了解,实际上很都 SAP 顾问的确如此,你只要专注于业务蓝图实现就行,这一点 值得国内管理软件设计同行学习,在管理软件设计过程中,同样是细节决定成败。新一代增强 BADI (Tcode:SE17|SE18)BADI(Business Add-In) 是一种新的功能增强概念,它使用类、接口及方法等面向对象的概念,采用一种使用面向对象的方法来进行 SAP 增强。如何查找事务代码所在程序的用户出口(user-exit):1。执行 tcode -> system ->

53、; status , 找出程序名称。2。 SE80;输入第一步中找到的程序名称。用菜单:GOTO -> Attributes ,找出Package名称。(注:也可以用SE93,查 这个程式所在的 Package)3。SE80 -> Repository Information System -> Enhancements -> Customer Exits -> Enhancements -> 将第二步中找到的 Package 名称输入,执行, 就可以找到 tcode 的所有用户出口。*TABLES : tstc, "SAP Transaction

54、 Codes(SAP 事务代码 )tadir, "Directory of Repository Objects( 资源库对象的目录 )modsapt, "SAP Enhancements - Short Texts(SAP 增强 -短文件 )modact, "Modifications( 修正 )trdir, "System table TRDIR( 系统表 TRDIR)tfdir, "Function Module( 功能模块 )enlfdir, "Additional Attributes for Function Module

55、s( 功能模块的附加属性 ) tstct. "Transaction Code Texts( 事务代码文本 )DATA : jtab LIKE tadir OCCURS 0 WITH HEADER LINE.DATA : field1(30).DATA : v_devclass LIKE tadir-devclass.SELECTION-SCREEN BEGIN OF BLOCK a01 WITH FRAME TITLE text-001. SELECTION-SCREEN SKIP.PARAMETERS : p_tcode LIKE tstc-tcode OBLIGATORY .S

56、ELECTION-SCREEN SKIP.SELECTION-SCREEN END OF BLOCK a01.START-OF-SELECTION.SELECT SINGLE * FROM tstc WHERE tcode EQ p_tcode. IF sy-subrc EQ 0.SELECT SINGLE * FROM tadirWHERE pgmid = 'R3TR'AND object = 'PROG' AND obj_name = tstc-pgmna.MOVE : tadir-devclass TO v_devclass.IF sy-subrc NE

57、0.SELECT SINGLE * FROM trdir WHERE name = tstc-pgmna.IF trdir-subc EQ 'F'.SELECT SINGLE * FROM tfdir WHERE pname = tstc-pgmna.SELECT SINGLE * FROM enlfdir WHERE funcname = tfdir-funcname.SELECT SINGLE * FROM tadir WHERE pgmid = 'R3TR' AND object = 'FUGR' AND obj_name = enlfdir-area.MOVE : tadir-devclass TO v_devclass.ENDIF.ENDIF.SELECT * FROM tadirINTO TABLE jtab WHERE pgmid = 'R3TR' AND object = 'SMOD' AND devclass = v_devclass.SELECT SINGLE * FROM tstct WHERE sprsl EQ sy-langu AND tcode EQ p_tcod

温馨提示

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

评论

0/150

提交评论