sap增强
[日期:2007-09-11] 来源: 作者: [字体:大 中 小]
SAP-R/3出口(增强)
首先来讲解一下什么是出口,顾名思义,就是一段程序执行到最后必经的一段程序。
为什么会有出口呢?因为正常的业务系统不能满足实际需求,这时可以在出口中增加一些功能,来达到要求,这也就是为什么它还叫增强。我感觉它跟给操作系统打补丁差不多。
在Sap中出口就是标准程序最后要调用的一个函数或者功能模块,这个函数或功能模块的输入已经由Sap定义好。
自己写的SAP出口程序在系统升级的时候会被保留,而如果更改标准程序在SAP系统升级的时候会被覆盖。
下面介绍一下什么时候需要使用出口以及出口的种类: 1:在业务检查时,比如在某个工厂发货,可以设定在某个库位的出货只能使用某种移动类型。
2:在需要界面增强时,比如用户对某个字段要求大写,但是最终用户不按规范操作,这也可以在出口中自动转换,有些模块甚至能自定义数据库字段,并且可以在出口中增加字段输入。还有的模块能对输入数据检查,甚至实现自动替代等功能。
3:有不规则业务时,比如按某种条件定价,可以设定从自己定义的表中按某种条件取值
4:搜索帮助的出口,可以对Sap标准的搜索帮助做权限控制。
等等。
SAP有四种基本用户出口的类型:
1.菜单出口-Menu Exits
定义自己的菜单
2.屏幕出口-Screen Exits
定义自己的屏幕
3.功能模块出口-Function Module Exits
在SAP应用程序中添加功能
4.关键字出口-Keyword Exits
在ABAP/4字典中的关键字数据元素添加文档。结果是你在使用这些数
据元素的字段处按F1后会出现你自定义的说明文档
因为出口都是被Sap预先定义好的,那么怎么寻找自己需要的出口呢?
1:可以通过配置文档的帮助和SAP library 寻找业务系统的出口,sap library
在‘implementation guide’中寻找出口,在配置功能执行按钮左边一般都有一个
说明文档,描述相关的出口。
2:为了方便我们把所有的出口名称及其描述列在文章的后面。
下面具体介绍怎样写出口程序:
为了对出口程序的修改进行管理,sap提供了专门用来管理出口程序的事务,事
务代码是CMOD。
[推荐]SAP-ERP增强[转]
[日期:2009-03-12] 来源: 作者: [字体:大 中 小]
透视ERP增强什么是增强(Enhancement)?
,增强就是ERP系统中标准程序的出口,在该出口中由用户根据企业实际需求编写客户化逻辑代码。增强是ERP系统设计时考虑到有可能和系统默认标准流程不同,在标准流程框架下专门留的接口,每个接口对应一个客户化函数,这些出口函数有标准处理程序传入参数,用户可根据系统输入参数做条件编写适合本企业流程的逻辑,然后通过输出参数传输回。
用户增强分类
户增强通常包括下面3类。
Enhancement exits,即通常所谓的用户出口(User_exit )
户出口也叫功能出口(Function Exit)。
用Tcode:SE37搜索EXIT*,找到的函数大都是做系统预留的出口函数,前面说过,用户出口是标准程序留给用户的接口,标准程序通常不任意修改,如果修改需要申请Access Key,而且修改标准程序可能导致的错误ERP公司通常是不负责的。在SAP中,自定义的程序通常或Z开头,因此,出口函数中都预包含了一个Z开头的程序。
GUI接口(GUI codes)
屏幕增强(Screen Exit)
如,在建立采购订单,工单和固定资产主数据时,系统都预留屏幕增强,也就是说允许用户自定义用户输入界面并编写相应的输入输。
类增强中,可能还用户自己定义结构或表格,系统对应类型T类。比如增强MM06E005
用户建立两个结构CI_EKKODB和CI_EKPODB。
来将重点介绍功能出口的应用。
组织用户增强
强表格:
增强表格
包括出口函数在内的所有函数表(E类)
:修改 GVI 界面,界面: 菜单文本被客户(C类)
动态程序区 CALL CUSTOMER SUBSCREEN(S类)
以EXIT开头的出口函数,TFDIR-MAND值为C表示此出口函数被激活。
强检查函数:
CTION_ACTIVE_CHECK:检查E类用户出口是否被激活。
UENTRY_ACTIVE_CHECK:检查C类增强激活状况
SCREEN_ACTIVE_CHECK: 检查S类增强激活状况
会发现,SAP的各模块的任何一个事务码(Tcode)对应的标准程序都留下了大量的用户出口,正是SAP灵活的配置功能和强大的用户出轻松应对各种复杂需求成为可能,系统还为能快速找到和激活这些增强进行了有效组织,各类增强被记录在table中并且提供了相关检方便企业用户。
P开发的朋友通常都收集了一个可以输入事务码快速找到系统留下的所有出口的程序,下表就是一个检测系统增强被激活的简单参考
直接有效的查找用户出口增强的方法,就是使用函数MODX_FUNCTION_ACTIVE_CHECK,如图1。
的判断语句If tfdir-mand = aktiv_flag(常数C)则出口函数active标志=’X’,表示该用户出口被激活,处理逻辑将从标准程序转入该语句设置断点然后运行任一个事务码,都会调用该函数判断是否存在用户出口。
强应用实例
景:如果采购订单已经做了#5@p校验后,则不再允许用户修改价格。
序:MM06EFPO_POT_FUELLEN| MM06EF0C_CUSTSCR1_ITEM_SET_DAT
de:SMOD|CMOD
有启动采购审批功能,SAP标准功能是允许用户随时修改采购价格的,不同的企业有对采购价格控制有不同的策略,甲企业规模较小以后数月的采购开了一个大采购单,如果中途材料价格变动则直接修改价格就行,乙集团则严格控制采购价格,采购价格由总部集中
购员只需要维护采购数量等信息等,真因如此,ERP系统显然不会去禁止用户修改价格,如果企业确实需要如此,则可通过增强实现经介绍过如何通过在函数MODX_FUNCTION_ACTIVE_CHECK设置断点跟踪系统每个事务预留的用户出口,你很快将发现增强MM06E005的MM06E_017用户出口非常适合此业务背景。
看看增强的EXIT_SAPMM06E_017用户出口(以下称017出口)处理流程,Include程序MM06EFPO_POT_FUELLEN被专门用来处理增强出口USTSCR1_ITEM_SET_DATA_
应下一级Include程序MM06EF0C_CUSTSCR1_ITEM_SET_DAT),分析Include程序MM06EF0C_CUSTSCR1_ITEM_SET_DAT的代码,如下表,这个
*-----------------------------------------------------------------------
* 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 'X',
active LIKE sy-calld.
ENHANCEMENT-POINT CUSTSCR1_ITEM_SET_DATA_PAI_02 SPOTS ES_MM06EF0C_CUSTSCR1_I_SET_DAT INCLUDE BOUND .
*$*$-Start: CUSTSCR1_ITEM_SET_DATA_PAI_02-------------------------------------------------------$*$*
ENHANCEMENT 1 OI0_COMMON_MM06EF0C_ITEM_S_DAT. "active version
* C5030897 I.Twardowski Implementation of BADI for OGSD
PERFORM 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'
EXPORTING
cprogname = 'SAPMM06E'
funcnumber = '017'
IMPORTING
active = active
EXCEPTIONS
not_found = 1
OTHERS = 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. 原本Copy出来的,注意本人所加的附注粗体部分:
*-Define Data:
DATA: lt_usr_tekpo LIKE bekpo OCCURS 0,
lt_usr_teket 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.
个镜象.
*-User Exit:
*如果017出口增强被激活则执行它.
CALL FUNCTION 'EXIT_SAPMM06E_017'
EXPORTING
i_ekpo = ekpo
i_ekpo_old = *ekpo
i_ekko = ekko
i_aktyp = aktyp
i_bstyp = ekko-bstyp
i_no_screen = im_no_screen "770427
i_lfa1 = lfa1
i_lfm1 = lfm1
i_rekpo = rekpo
i_kekpo = kekpo
i_aekpo = aekpo
i_reban = reban
i_mt06e = mt06e
i_eina = *eina
i_eine = *eine
i_komp = komp
i_ucomm = l_ucomm
i_enj_call = l_enj_call
TABLES
tekpo = lt_usr_tekpo
teket = lt_usr_teket
tekkn = lt_usr_tekkn
tkomv = lt_usr_tkomv
EXCEPTIONS
OTHERS = 0.
ENDFORM. "CUSTSCR1_ITEM_SET_DATA_PAI 调用出口的一般步骤是先定义数据(Define Data),多为内表或工作区,再将参数赋予这些内表(Copy Tables),相当于*建立了原始参
程序代码非常简单,相信聪明的读者看了对ERP增强的设计思路会开始有一定了解。
可以通俗理解,增强就是ERP设计者在合适的地点设置了一些合适的游戏规则并提供了一些有意义的游戏给用户自己玩耍!独乐乐,乐?好玩的东西应该留点给用户自己乐呵乐呵。
开始编写增强程序,可以使用Tcode:SMOD直接激活增强或CMOD建立一个项目包含一个或多个增强,如图2,输入增强MM06E005并激活SAPMM06E_017出口函数中编写代码。
中,我们发现增强MM06E005包括用户出口和屏幕增强(Screen Exit),屏幕增强允许用户在采购订单自定义用户界面,从而使采购业客户化的信息,这种屏幕增强在固定资产模块中更始发挥到极致。
MM06E_017包含程序ZXM06U42,程序ZXM06U42示例代码如下表,这段客户化代码逻辑十分简单,为了方便说明,本人注释出该出
熟悉增强,你会发现一些用户出口都会传入旧数据和更新后的新数据以方便两者比较,和财务模块的替代(Substitution)不同,ER强保留严谨态度,通常只允许在出口中做检查工作,这一点类似财务模块的检查(Validation)。
次浅析增强
ERP的目的之一就是实现各部门信息共享,避免数据孤岛,以一个简单的采购收货为实例,仓库人员只要在收货时输入采购订号,收货日期,物料收货数量和仓生各模块数据,对财务数据,系统根据输入的采购订单号找到采购订单主数据中的工厂,通过在组织结构中设置的工厂和公司代码的对应关系找到相应公司代的Valuation class和收货的移动类型找到对应科目,通过收货数量*采购单价得到本次该料库存金额,通过物料主数据获得业务范围和利润中心,这样财务完毕;如果物料采用标准价格出现采购差异并将差异科目的模认成本对象对应到获利分析段,则将数据写入利润分析模块等等;我要说的是,在这些复杂的逻模块收集过程中存在校验,任何校验失败ERP系统都将停止业务交易,比如说校验收货日期不在物料期间或会计期间允许范围,校验失败向用户提示错误,比对应基金中心提示错误中止交易等,当所有的校验完毕,系统将数据Commit到数据库,这些校验是系统标准的,而增强则是系统预留给用户的,和系统的校验的增强中只要是出现错误都将停止本次业务交易。在图3中出现的检查/替代/增强/字段移动/推导等关键词,实际上这些东东都可看成系统增强,即使用准功能。
是,SAP的各种增强的代码编写都是极其简单的,象检查/替代/字段移动/推导/派生用户甚至只要简单将对应的源字段和目标字段拖行,代码是自动生成的,即使涉及Coding也是非常简单的。神奇的是,作为SAP顾问你甚至可以对编程和数据库毫不了解,实际上确如此,你只要专注于业务蓝图实现就行,这一点值得国内管理软件设计同行学习,在管理软件设计过程中,同样是细节决定成败。增强BADI (Tcode:SE17|SE18)
iness Add-In)是一种新的功能增强概念,它使用类、接口及方法等面向对象的概念,采用一种使用面
原创系列之字段出口 field-exit
[日期:2007-09-12]
text enhancement字段出口
常用的查找方法
方法一、通过CMOD 来源:Sapsky 作者:符志强 [字体:大 中 小]
列举出来的可能并不多,如下图
方法二、通过报表 RSMODPRF Tcode:SE38 ,输入报表名
执行后,花啦啦地看到一大堆了,
上面工具栏的是分配程序或屏幕 和 编辑函数(Function Module)
下面分别是字段名、状态、程序名、屏幕,其中状态必须是活动状态(ACTIVE)才能生效 操作方法:
分配字段到屏幕中 选中字段,点Assign prog./screen
编辑函数 选中字段,点Edit FM
如下图是编辑函数界面
具体的代码如下,仅供参考。。。
FUNCTION field_exit_charg_d.
*"---------------------------------------------------------------------- *"*"Local interface:
*" IMPORTING
*" REFERENCE(INPUT)
*" EXPORTING
*" REFERENCE(OUTPUT)
*"---------------------------------------------------------------------- *
output = input.
*****湖南石油移动类型与批次增强 7007.6.13 begin ******
* "output = input.
IF sy-mandt <> '800'.
DATA: li_bwart LIKE rm07m-bwart,
li_sobkz LIKE rm07m-sobkz.
GET PARAMETER ID 'BWA' FIELD li_bwart.
* MESSAGE e398(00) WITH li_bwart i_sobkz input.
* 不区别特殊库存了
************************************************************************ * * *先处理有两种批次的 OWN CUSTOMER
IF li_bwart EQ '561' OR li_bwart EQ 'Y21'.
IF input NE 'OWN' AND input NE 'CUSTOMER' AND input NE space .
MESSAGE e398(00) WITH
'移动类型' li_bwart '不可对应评估类型' input. ENDIF.
*只有一种状态 OWN
ELSEIF ( li_bwart EQ '101' OR li_bwart EQ '161' OR li_bwart EQ 'R21' OR li_bwart EQ '411' OR li_bwart EQ '301' OR li_bwart EQ '401' OR li_bwart EQ '421' OR li_bwart EQ '403' OR li_bwart EQ '321' OR li_bwart EQ '309' OR li_bwart EQ '311' OR li_bwart EQ '351' OR li_bwart EQ '261' OR li_bwart EQ '917' OR li_bwart EQ '977' OR li_bwart EQ '979' OR li_bwart EQ '551' OR li_bwart EQ '969' OR li_bwart EQ '971' OR li_bwart EQ 'Y03' OR li_bwart EQ 'Y05' OR li_bwart EQ 'Y09' OR li_bwart EQ 'Y11' OR li_bwart EQ 'Y13' OR li_bwart EQ 'Y17' OR li_bwart EQ 'Y19' OR li_bwart EQ 'Y23' OR
li_bwart EQ '553' OR li_bwart EQ '601' OR li_bwart EQ '681' OR li_bwart EQ '685' OR li_bwart EQ '691' OR li_bwart EQ '653' OR li_bwart EQ 'ZI3' OR li_bwart EQ '201' ).
IF input NE 'OWN' AND input NE space .
MESSAGE e398(00) WITH
'移动类型' li_bwart '不可对应评估类型' input. ENDIF.
*只有一种状态 CUSTOMER
ELSEIF ( li_bwart EQ 'Y71' OR li_bwart EQ 'Y73' ). IF input NE 'CUSTOMER' AND input NE space .
MESSAGE e398(00) WITH
'移动类型' li_bwart '不可对应评估类型' input.
ENDIF.
*只有一种状态 UNPICKED
ELSEIF ( li_bwart EQ 'Z29' OR li_bwart EQ 'Z2A' OR
li_bwart EQ 'Y83' OR li_bwart EQ 'Y85' ).
IF input NE 'UNPICKED' AND input NE space .
MESSAGE e398(00) WITH
'移动类型' li_bwart '不可对应评估类型' input.
ENDIF.
*只有一种状态 UNPICKED_S
ELSEIF ( li_bwart EQ 'Y75' OR li_bwart EQ 'Y77' OR
li_bwart EQ 'Y79' OR li_bwart EQ 'Y81' ).
IF input NE 'UNPICKED_S' AND input NE space .
MESSAGE e398(00) WITH
'移动类型' li_bwart '不可对应评估类型' input.
ENDIF.
ENDIF.
* * ************************************************************************
ENDIF.
*****湖南石油移动类型与批次增强 2007.6.13 end ******
ENDFUNCTION.
by 符志强(SapSky.com)