显示增强与隐式增强

ABAP 增强有显式和隐式两种:
USEREXIT,BADI,ENHANCEMENT-POINT,属于显式增强,这类增强分布在 SAP 源代码的各个地方。我们一进入 TCODE SE37 ,SE38 在 SAP 源代码中可以直接查看得到;
而隐式增强一般在每个 form 或 function 或 method 的第一行和 form 或 function 或 method 的最后一行,需要如下操作才可以发现:TCODE SE37 或 SE38 进入源代码后,点击上面菜单里的编辑->增强操作->显示隐式增强。

VF11 冲销发票增强:禁止跨期间冲销

https://libin961797440.blog.csdn.net/article/details/133796733
销售发票禁止跨期间冲销,财务给出的说法是,在结账期间(通常是[月底 27.次月 051),发票的关账顺序 靠前(在月底),在发票关账后,财务随之生成静态 财务报告只,为配合结账流程,需要控制销售发票禁止跨期间冲销(这种需求有业务流程支持是可以做的,没有的话不要做)。本文以此需求为例,一步步演示 SAP ABAP 增强的实施和开发,不要只看到怎么实现,

查找增强出口:https://blog.csdn.net/qq_30797051/article/details/119912211;
我们需要去实施 SMOD V60A0001,上图是我事后截图,所以 Project 列有值了当然,可以先去 SMOD 看看 V60A0001 信息;

CMOD 实施组件 V60A0001:

1.我习惯这样命名项目:ZVF00001; 2.点击「增强分配」输入 V60A0001,这就相当于实施了增强,但还没具体实现;

3.点击「组件」进入功能出口界面;4.双击「EXIT SAPLV60A 002」进入出口函数;

5.点击「INCLUDE ZXV60AU01.」语句创建/已创建则进入目标程序;

*&---------------------------------------------------------------------*
*& 包含 ZXV60AU01
*&---------------------------------------------------------------------*
*& 1100000576-VF11 冲销发票增强:禁止跨期间冲销
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*" IMPORTING
*" VALUE(INVOICE_TYPE) TYPE VBRK-FKART OPTIONAL
*" VALUE(INVOICE_DATE) TYPE VBRK-FKDAT OPTIONAL
*" VALUE(DELIVERY_DATE) TYPE VBRP-FBUDA OPTIONAL
*" VALUE(PRICING_DATE) TYPE VBRP-PRSDT OPTIONAL
*" TABLES
*" XKOMFK STRUCTURE KOMFK
*"----------------------------------------------------------------------
data:lt_vbrk type table of vbrk with header line,
lt_vbeln type table of zsks_vbeln with header line,
lt_mesg type table of zmesg_scr_s with header line,
lv_on_f_nf2 type zonoff_mt02-on_f.

zcl_abap_enh_mgt=>mark( ).

clear lv_on_f_nf2.
call function 'ZFM_ONOFF_GET_STATUS'
exporting
iv_nfobj = 'NF2'
importing
ev_on_f = lv_on_f_nf2.

if lv_on_f_nf2 = 'X'.
if sy-tcode = 'VF11'.
clear lt_mesg.
refresh lt_mesg[].
if invoice_date is not initial."开票日期为空时,冲销发票开票日期=被冲销发票开票日期,无需检查
if xkomfk[] is not initial. "存在输入发票
move-corresponding xkomfk[] to lt_vbeln[].

sort lt_vbeln by vbeln.
delete adjacent duplicates from lt_vbeln comparing vbeln.

if lt_vbeln[] is not initial.
select * into table lt_vbrk
from vbrk
for all entries in lt_vbeln
where vbeln = lt_vbeln-vbeln.
endif.

sort lt_vbrk by vbeln.

loop at lt_vbeln.
read table lt_vbrk with key vbeln = lt_vbeln-vbeln binary search.
if sy-subrc = 0.
if lt_vbrk-fkdat+0(6) <> invoice_date+0(6).
perform frm_add_mesg_scr(zpublic) if found tables lt_mesg using 'E' text-001 invoice_date lt_vbrk-vbeln lt_vbrk-fkdat.
endif.
else.
"NOT VFDOC
endif.
endloop.

perform frm_only_error_mesg_popup(zpublic) if found tables lt_mesg.

read table lt_mesg with key msgty = 'E' transporting no fields.
if sy-subrc = 0.
message e001(zabap) with text-001.
endif.
endif.
endif.
endif.
endif.

1.只有需求特别明确要求时,才使用事务码作为判断条件。

2.增强开发中,避免使用 check,exit 等退出当前 ABAP 堆栈的语法,除非你非常有把握,特别在含有多个复合业务功能的同- ABAP 堆栈中。
举例: 如果程序 ZXV60AU01 以后追加了一个功能实现,就会被这些语法直接影响。非增强开发中也应如此。

生产订单(工单)CO01/CO02/CO03 屏幕增强实战

这是图片
生产订单屏幕增强点:
SMOD PPCO0012SE
这是图片
0100 屏幕:
这是图片
打开引用字段窗口,完成屏幕字段选择
这是图片
这是图片

交货单创建 BAPI 扩展字段增强

创建 BAPI:BAPI_OUTB_DELIVERY_CREATE_SLS
增强点: SE18->LE_SHP_DELIVERY_PROC
在调用 BAPI 时候内存传值:EXPORT lt_lips lv_likp TO MEMORY ID ‘SD-02’ .
https://blog.csdn.net/weixin_49689040/article/details/132541937

修改 VL02N 屏幕字段增强:

method IF_EX_LE_SHP_DELIVERY_PROC~CHANGE_FIELD_ATTRIBUTES.
data: ls_field_attributes type shp_screen_attributes,
ls_xvbup type vbupvb.
if is_likp-vbeln = '0080003022'.
ls_field_attributes-name = 'LIPSD-G_LFIMG'. "行项目‘交货数量’字段,设置属性为不可输入.
ls_field_attributes-input = 0.
append ls_field_attributes to ct_field_attributes.
endif.
endmethod.

原文链接:https://blog.csdn.net/wangjolly/article/details/13512253

BADI:ME_PROCESS_PO_CUST 采购订单处理增强:客户

影响对话框事务 ME21N,ME22N,ME23N 和 ME29N,以及 BAPI BAPI_PO_CREATE1 和 BAPI_PO_CHANGE

IF_EX_ME_PROCESS_PO_CUST~PROCESS_ACCOUNT: Processing of Account Assignment Data

对 ME21N 的行项目的科目分配做增强。主要用到如下类:
IF_PURCHASE_ORDER_ITEM_MM:获取 PO 行项目内容
IF_PURCHASE_ORDER_ACCOUNT_MM:PO 行项目科目分配相关
需求描述:根绝 ME21N 输入的行项目信息,从自建表 ZMMT003 中自动带出总帐科目字段

1、实施增强ME_PROCESS_PO_CUST并在方法process_account中定义变量
DATA:lc_account TYPE REF TO if_purchase_order_account_mm,
lc_item TYPE REF TO if_purchase_order_item_mm,
ls_poitem TYPE mepoitem,"po item datas
ls_account TYPE mepoaccounting,"科目分配字段结构
lv_sakto TYPE saknr. "总帐科目编号
2、取得PO行项目数据
CALL METHOD lc_account->get_item
RECEIVING
re_item = lc_item.
CALL METHOD lc_item->get_data
RECEIVING
re_data = ls_poitem.
3、根据行项目数据,去自建表ZMMT003取总帐科目放到变量中
SELECT SINGLE saknr
INTO lv_sakto
FROM zmmt003
WHERE werks = ls_poitem-werks
AND knttp = ls_poitem-knttp
AND matkl = ls_poitem-matkl.
4、取得科目分配视图下的数据
CALL METHOD lc_account->get_data
RECEIVING
re_data = ls_account.

MOVE: lv_sakto TO ls_account-sakto.
5、设置科目分配视图中的数据
CALL METHOD lc_account->set_data
EXPORTING
im_data = ls_account.

注意:如果第 4 步没有先获取科目分配视图下的数据,直接进行更新,那么可能会因为传入参数不足,导致报如下错误“没有采用附加业务 ME_PROCESS_PO_CUST 的数据”,消息号为:MEPO151

IF_EX_ME_PROCESS_PO_CUST~PROCESS_ITEM:Processing of Item Data 项目数据处理

业务需求:新建 THPO 类型 po 交货日期为当前 po 的创建日期(今天)

METHOD if_ex_me_process_po_cust~process_item.
*-------------"THPO供应商退货po需求时间是建PO的当日- ------------------------------------------------------*
DATA: obj_header TYPE REF TO if_purchase_order_mm,
re_header TYPE mepoheader,
re_item TYPE mepoitem.
DATA:gs_ekko TYPE ekko.

obj_header = im_item->get_header( ).
re_header = obj_header->get_data( ).
re_item = im_item->get_data( ).

IF sy-tcode = 'ME21N'.
CLEAR gs_ekko.
SELECT SINGLE * INTO gs_ekko FROM ekko WHERE ebeln = re_header-ebeln.
IF sy-subrc <> 0.
IF re_header-bsart EQ 'THPO' .
CALL FUNCTION 'FORMAT_DATE_4_OUTPUT'
EXPORTING
datin = sy-datum
format = 'YYYY/MM/DD'
IMPORTING
datex = re_item-eeind.

re_item-eindt = sy-datum.
im_item->set_data( re_item ).
ENDIF.
ENDIF.
ENDIF.

ENDMETHOD.

https://www.cnblogs.com/freeandeasy/p/13690868.html

BTE 增强

与 USER_EXIT 的思想类似,BTE 增强模式是对 SAP 中预留的标准事件进行增强,所以 BTE 增强实施的核心工作是寻找合适的事件号码

1.寻找事件号及其对应的函数模块
首先进入 tcode-FIBF
https://blog.csdn.net/Sundam/article/details/82895067

ME28/ME2L/ME2N 增强字段

用户希望在 ME28 采购订单审批的时候显示采购订单创建人以及描述,需要通过增强字段来实现,查询了一下 SAP 有标准的 BADI 可以进行增强,好像 ME28、ME2L、ME2N 都是通过这里实现,使用不同的展示结构,这里没有深入测试其他事物,仅以 ME28 作为说明。
👉【增强记录清单…】
https://blog.csdn.net/JYH1999/article/details/118578647

BADI 名称:ME_CHANGE_OUTTAB_CUS
增强结构:MEREP_OUTTAB_PURCHDOC_REL
一、增强字段结构
通过 DEBUG 发现需要最终展示的结构为【MEREP_OUTTAB_PURCHDOC_REL】,所以对这个结构进行增强吧。
二、实施 BADI
增强结构后,开始对 BADI 进行实施,这个 BADI 中的代理类中只有一个方法,而且会有示例类,仿照着示例类写就好了,下面分享一下我的需求代码,均是由动态内表的处理逻辑完成的。

METHOD if_ex_me_change_outtab_cus~fill_outtab.
DATA: ls_ekpo TYPE ekpo.
DATA : ls_outtab TYPE merep_outtab_purchdoc_rel.

IF im_struct_name = 'MEREP_OUTTAB_PURCHDOC_REL'.
LOOP AT ch_outtab ASSIGNING FIELD-SYMBOL(<fs_outtab>).

CLEAR ls_outtab.
"读取订单编号
ASSIGN COMPONENT 'ERNAM' OF STRUCTURE <fs_outtab> TO FIELD-SYMBOL(<fs_ernam>).
IF sy-subrc = 0.
ASSIGN COMPONENT 'EBELN' OF STRUCTURE <fs_outtab> TO FIELD-SYMBOL(<fs_ebeln>) .
IF sy-subrc = 0.
SELECT SINGLE ernam INTO <fs_ernam> FROM ekko WHERE ebeln = <fs_ebeln>.
IF sy-subrc = 0.
ASSIGN COMPONENT 'ZNAME' OF STRUCTURE <fs_outtab> TO FIELD-SYMBOL(<fs_zname>).
IF sy-subrc = 0.
SELECT SINGLE name_textc INTO <fs_zname> FROM user_addr WHERE bname = <fs_ernam>.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
ENDMETHOD.

原文链接:https://blog.csdn.net/JYH1999/article/details/130561251

SO 销售订单增强

采购订单控制价格是否可以修改增强 LV69AFZZ

项目上有个需求,正常的采购订单在创建的时候价格是自动带出来的价格,并且不可以修改,但是对于无料号的行项目或者退货订单的行项目则允许价格可以修改,因此查找增强,最终找到系统 LV69AFZZ 里面预留的用户出口,userexit_field_modification,代码如下,由此可见 LV69AFZZ 不仅仅可以用于销售订单价格字段的控制,也可以用于采购订单价格

form userexit_field_modification.
IF SY-TCODE = 'ME21N' OR SY-TCODE = 'ME22N'.
IF KOMP-MATNR IS INITIAL OR KOMP-RETPO = 'X' .
IF KOMV-KSCHL = 'PBXX' OR KOMV-KSCHL = 'PB00'.
SCREEN-INPUT = '1'.
ENDIF.
ELSE.
IF KOMV-KSCHL = 'PBXX' OR KOMV-KSCHL = 'PB00'.
SCREEN-INPUT = '0'.
ENDIF.
ENDIF.
ENDIF.
MODIFY SCREEN.
endform.

原文链接:https://blog.csdn.net/champaignwolf/article/details/87854327

VA01 销售订单增强 MV45AFZZ 注意点

销售订单的增强比较古老,大部分都是预留了 Perform,一种简单查看增强的方法:SPRO–销售和分销–系统修正–用户出口,可见 SAP 在销售模块预留了很多增强。

CASE:
需求:VA01、VA02 订单保存时,需要做一个 check 的增强
方法:我们确定增强在 Include MV45AFZZ 中
注意检查的增强用的是 USEREXIT_SAVE_DOCUMENT_PREPARE,而不是 USEREXIT_SAVE_DOCUMENT(保存检查不通过会跳号),看看预留 FORM 抬头的描述就知道了。
内表 xvbap:当前订单界面的数据,如果订单界面删除数据,那么会将 xvbap-updkz 状态置为 D,同时数据复制到 yvbap
内表 yvbap:订单界面删除数据
注意使用隐式增强,不要直接修改源码

VA01/VA02 创建或修改 SO 的输入检查

销售管理模块(SD)的创建和修改销售订单必定会有输入字段校验检查的需求,来防止业务人员录入错误或少录入数据,SAP 公司也考虑到这一点,所以这方面的配置功能也非常强大,通常情况下不需要写开发代码,业务顾问通过配置不完整日志就可以非常容易实现大部分需求,但是在实际项目中还是会遇到一些特殊的需求,不能通过配置实现,需要进行增强开发。
下面通过一个项目案例来介绍下如何通过增强实现销售订单创建和修改的字段输入的合规性检查。
业务需求如下:某公司销售模块的业务要求:销售组织为 S010 在创建 ZPE 类型的销售订单时候,如果销售订单行项目类型为 Z001 时,要求检查销售订单行项目的订单号必须输入。
增强点:
USEREXIT_SAVE_DOCUMENT_PREPARE,此增强用户出口主要用来对销售订单保存前的各字段的约束条件的检查。
实施方法:使用隐式增强方法
备注:XVBAP-UPDKZ = ‘D’ 表示删除行,XVBAP-UPDKZ =’ I ‘表示插入行。VA01/VA02 创建 SO 时候,当行项目维护多条数据后,删除其中的一条或者多条,被删除的行项目依在内表 XVBAP 中,如果没有增加这 XVBAP-UPDKZ<>’D’的条件,会发现一个现象:未删除的行项目满足字段必输的条件了,系统依然给出提示:“订单号必须输入!”

原文链接:https://blog.csdn.net/weixin_40672823/article/details/128935202

VA02 删除销售订单增强,根据订单类型确认是否可删

程序:MV45AFZB
FORM:USEREXIT_CHECK_XVBAP_FOR_DELET
原文链接:https://codeantenna.com/a/DmkpEKSYRA

会计凭证检查/替代/合并 OB28/OBBH/OBCY

一文精通 SAP 凭证有效性和替代

https://zhuanlan.zhihu.com/p/165402109
一、FI-Validation 步骤
1、TC:SE38,将程序 RGGBR000 复制为 ZRGGBR000
2、TC:GCX2,维护应用区域 GBLR 退出程序 ZRGGBR000
3、TC:GGB0,维护有效性验证。
4、TC:GGB4/OB28,激活有效性验证。

二、FI-Substitution 替代步骤
1、TC:SE38,将程序 RGGBS000 复制为 ZRGGBS000
2、TC:GCX2,维护应用区域 GBLS 退出程序 ZRGGBS000
3、TC:GGB1,维护替代。
4、TC:GGB4/OBBH,激活替代。

三、凭证有效性和替代激活点
基于公司代码的激活:
0001-凭证抬头 :基于 BKPF 数据
0002-行项目:基于凭证行项目 BSEG 数据
0003-完全凭证:基于 BKPF 和 BSEG 数据,综合进行判断。

四、哪些字段可以校验和替代
se16 表 GB01
字段标记为 EXCLUDE 的表示不允许做替代和有效性校验。若要去掉这些 EXCLUDE 标识,可以直接修改表 GB01。

五、凭证有效性默认消息分类的更改
当新建有效性和替代的时候,Message ID 无法修改

七、凭证有效性和替代出口使用
校验的出口:
c_exit_param_none:callup points with head or line item
c_exit_param_class:callup points with complete document
如果凭证的校验逻辑,既要用到抬头数据,又要用到行项目数据,比如说,校验逻辑为公司代码为 1000,且会计科目为 1001000000,原因代码不能为空的校验,就要用 c_exit_param_class 这种类型编写代码了。

两种类型:
c_exit_param_class. 传参数 代表完全凭证替代
c_exit_param_none. 不传参数 代表行项目替代
如果找不到替代的出口,可能还有一个原因,就是出中的参数和替代中的选择不一致,比如在替代步骤中直接选择“唯一出口”(表示同时替代几个字段),则相应的出口程序中需要使用 c_exit_param_none。反之,如果出口指示替代某一个字段使用,则在 OBBH 中选择相应的字段,然后选择出口,此时替代程序中则使用参数 c_exit_param_field

exits-name = ‘ZFI27’. "
exits-param = c_exit_param_none.
exits-title = ‘参考码3’.
APPEND exits.

FORM zfi27.
DATA: l_bstkd TYPE vbkd-bstkd.
IMPORT c = l_bstkd FROM MEMORY ID ‘SGTXT’.
IF l_bstkd IS NOT INITIAL.
bseg-xref3 = l_bstkd.
ENDIF.
ENDFORM.

exits-name = ‘ZFI29’.
exits-param = c_exit_param_class.
exits-title = ‘销售开票会计凭证数量’.
APPEND exits.
FORM zfi29 USING bool_data TYPE gb002_015.
ENDFORM.

八、凭证校验和替代的 DEBUG

方法一、找到主程序 GBTmmaa0mm 代表根据客户端用 SE37- G_CLIENT_ENCODE 计算出来的一个号,本例客户端为 100,系统计算出来的 CODE 值为 AA,aa 代表模块,比如 FI,CO 等。
方法二、=SHCD 方式
设置断点即可:
Validation 的功能函数:G_VSR_VALIDATION_CALL
Substitution 的功能函数:G_VSR_SUBSTITUTION_CALL

九、有效性校验和替代的常见问题

  1. 如果要在确认中使用“非”条件逻辑如何写语句?
    答:如果要使用“非”条件逻辑,需要在语句前写“NOT”,比如检查条件哦按为凭证类型不等于“SA”,那么需要写“NOT BKPF-BLART = ‘SA’”。

  2. 如果要在确认中使用“集”如何操作?
    答: 首先 GS01 创建集,然后在确认步骤中使用 IN 后面跟集的名称来使用集

  3. 如果要在确认中使用前几位字符的判断语句,如何编写?
    答:格式为:字段加冒号加第几位数字开始加冒号加第几位数字结束,比如要检查会计科目的前四位,则语句为“BSEG-HKONT :1-4:”。

  4. 有的时候确认或替代不起作用怎么办?
    答:如果确认和替代步骤没有问题,则考虑执行程序“RGUGBR00”和“RGUGBR01”重新生成确认和替代程序。

SAP 完全凭证替代出口功能行项目值填入

https://blog.csdn.net/LuciferousYam/article/details/110372248

财务凭证校验(Validation) [GGB0/OB28]

一、校验是什么
判断一个或多个字段输入的数据是否符合业务设置的逻辑。
校验作用范围:抬头、行项目、完全凭证。
校验消息类型:A 取消、E 错误、W 警告、I 信息。

二、实现校验主要包含如下几个步骤:
配置替代-GGB0
配置替代开发增强程序-GCX2(开发人员实施)
将替代和公司代码关联-OB28
激活替代 - RGUGBR00(SE38 中执行)
示例:检查凭证抬头”凭证日期”(BKPF-BLDAT)和过账日期(BKPF-BUDAT)是否相等。

原文链接:https://blog.csdn.net/wangjolly/article/details/105854551

财务校验出口 ZRGGBR000
https://blog.csdn.net/Qunending/article/details/122594136

财务凭证替代(Substitutions) [GGB1/OBBH] 和激活替代 - RGUGBR00

一、替代是什么
根据业务逻辑获取新值对财务凭证中一个或多个字段原有值进行替换,替代值包括:常量值,变量(需要开发实现)。
替代作用范围:抬头、行项目、完全凭证。

二、实现替代主要包含如下几个步骤:
配置替代-GGB1
配置替代开发增强程序-GCX2(开发人员实施)
复制 GGBS000 命名为 ZGGBS000,应用区域为 GBLS [若为检查,使用应用区域 GBLR]
将替代和公司代码关联-OBBH
激活替代 - RGUGBR00(SE38 中执行)

https://blog.csdn.net/wangjolly/article/details/105848328

替代报错出口不存在

VA01 时,报错。提示出口 Z500 在 RGGBS000 中未生成。
一般情况下需要到 程序 RGGBS000 中,在 form:get_exit_titles 中增加下列代码。

exits-name = ‘Z500.
exits-param = c_exit_param_none.
exits-title = text-200. “Cons. transaction type
APPEND exits.
虽然增加了这段代码。重新运行程序,还是会报错。
通常这个时候,参考下列文章即可。需要使用 RGUGBR00 程序重新生成程序

替代不起作用通常有两个原因:
一.系统默认不允许你替代该字段内容。
SAP 将所有的允许字段退代关系维护在 GB01 表中,如果该表中没有出现你的替代字段,你是不能替代的,比如会计科目 BSEG-HKONT 通常是不允许替代的,你就需要在此表增加。
二.替代程序需要重新自动编译。
在一些特殊情况下,你发现你的 Validaton 和 Substitution 都不起作用了,SE38 运行程序 RGUGBR00| RGUGBR00, 将能选的项目全选上手工重新编译就行。

上述内容是转载,我只是再补充一下。我们可以通过维护 VIEW:VWTYGB01.来实现对 GB01 的修改。
https://blog.csdn.net/tsj19881202/article/details/77187727

屏幕增强

新增 tabstrip 的页签视图:
https://blog.csdn.net/weixin_42646630/article/details/113663461

采购订单抬头及行项目增强字段配置

https://blog.csdn.net/weixin_50872152/article/details/124297876

采购申请 ME51N/ME52N/ME54N/ME57 屏幕增强

https://blog.csdn.net/weixin_43734184/article/details/123628279

http://blog.itpub.net/20037923/viewspace-1055263/

https://www.cnblogs.com/zyhcs/p/15759434.html

采购申请屏幕出口增强 MEREQ001

增强方式:出口增强
出口:MEREQ001
出口作用:容制化屏幕增强,更新自建表。

第一步:创建预留屏幕 0111,并把改屏嘉设置成子屏幕。即使此屏幕中不存在自定义字段也必须存在,它的作用是阻止程序 DUMP。
在屏幕 0111 中添加页签,然后将通用数据子屏幕以及各个网省子屏幕分别放到对应的标笠页中,在各个子屏幕中添加自建表对应的字段。
在屏幕 0111 的 PBO 事件中根据条件(例如工厂)设置页签的 ACTIVE 状态,判断哪个页签处干显示状态(页签子屏幕开始为隐藏状态)

第二步:实现 FUNCTION EXITS:
(1) 传输数据到子屏幕,
EXIT_SAPLMEREQ_O01:此 FUNCTION EXIT 的作用是将数据传输到客制化屏幕上(PBO),如果采购申请己经存在,则从数据库中将数据保存到初始状态客制化数据内表中,初始状态
客制化数据只查询一次。
读取最新状态客制化内表,若存在,则将数据赋值给自建屏幕字段:若不存在则读取初始状态客制化数据内表,如存在,则将数据赋值给自建屏帝字段。
(注:最新状态客制化内表数据来源于 EXIT_SAPLMEREQ_003)
此 FUNCTION EXIT 中只有一个 IF_PURCHASE_REQUISITION_ITEM 类型的输入参数 IM_REQ_ITEM,开发人员可以利用比参数得到行项目字段的信息。
EXIT_SAPLMEREQ_002:此 FUNCTIONEXIT 的作用是对子屏幕 PAI 操作前对数据进行操作,将最新状态容制化数据内表的值保存到中问状态客制化内表。
(中间状态容制化内表用于和最新状态内表进行比较以判断子屏幕的值是否进行了更新操作)。

https://blog.csdn.net/sapliumeng/article/details/109651927

交货单屏幕增强:

在内向交货单(VL31N / VL32N / VL33N) 与外向交货单(VL01N / VL02N / VL03N) 的抬头和行项目增加”自定义字段“页签
https://blog.csdn.net/ROYHAO/article/details/119732987

步骤
1、在相应的表里加附加字段(抬头数据 likp, 行项目数据 lips)
2、编写程序 或者 函数组,创建屏幕,画出屏幕布局
3、交货单抬头屏幕增强 BADI:LE_SHP_TAB_CUST_HEAD
交货单行项目屏幕增强 BADI:LE_SHP_TAB_CUST_ITEM
https://blog.csdn.net/qq_31799157/article/details/126102730

VF01/VF02/VF03 Tab Enhancemnt

https://blog.csdn.net/zhongguomao/article/details/76449250

隐式增强实施

https://blog.csdn.net/weixin_40672823/article/details/106055695

FB08、F.80 凭证冲销校验增强

se38 搜索 SAPFF001:
FORM buchungskreis_lesen 此处添加隐式增强,并注意,当点击保存按钮进行过账,并且是执行 FB08 或 F.80 时,才触发该增强。
https://www.cnblogs.com/BinGeneral/p/17236319.html

CMOD 增强

https://blog.csdn.net/sapliumeng/article/details/113355759

From Books

概述

增强(Enhancement) 的概念其实很广,SAP 标淮系统中的所有二次开发都可以理解为增强。做增强的原因是标准的 SAP 业务系统不能满足实际需求,所以在标准的系统基础上增加)不同的功能来达到不同企业的要求,换句话说今天开发过程中所有的 ADD-ON 都可以说是增强开发。但开发人员所说的增强主要是标准系统事先预留好的接口,根据不同业务需求来进行开发,称为增强,又叫出口(EXIT)。
在 SAP 系统没计中,增强被定义为程序执行到最后必经的一段程序。为什么会有出口呢?因为正常的业务系统不能满足实际需求,这时可以在出口中增加一些功能,来达到要求。
在 SAP 中出口就是标准程序最后要调用的一个函数或者功能模块,这个函数或功能模块的输入己经由 SAP 定义好了。
用户写的 SAP 出口程序在系统升级的时候会被保留,而如果更改标准程序在 SAP 系统升级的时候则会被覆盖。

下面介绍一下什么时候需要使用出口以及出口的种类:

  • 在业务检查时:比如在某个工厂发货,可以设定在某个库位的出货只能使用某种移动类型。
  • 在需要界面增强时:比如用户对某个字段要求大写,但是最终用户不按规范操作,这也可以在出口中自动转换,有些模块甚至能自定义数据库字段,并且可以在出口中增
    加字段输入。还有的模块能对输入数据检查,甚至实现自动替代等功能。
  • 有不规则业务时:比如按某种条件定价,可以设定从自己定义的表中按某种条件取值。
  • 搜索帮助的出口,可以对 SAP 标准的搜索帮助做权限控制等。

第一代增强

SAP 的增强发展至今已有四代,第一代增强基于源代码,是 SAP 提供一个空代码的子过程。在这个子过程中用户可以添加自己的代码,控制自己的需求。这类增强都需要修改 SAP 的标准代码,它们在发布的时候都是空的,集中在一些文件名倒数第二个字符为 Z 的包含程序中。由于是在标准程序中,所以所有程序的全局数据都可以使用,但同时系统升级时会被新版本覆盖; 这种源代码增强和屏幕增强的说明可以从事务码 SPRO 后台配置中相关模块的路径里面找到:一般是以 UserExit 打头的子模块,可形象地称其为用户出口。
找到所要增强的程序,查找 UserExit 关键字。例如 MV50AFZ1 里的 user_exit_save_document。大部分 SD 内的出口都是这种形式的。
查找此类出口的方法:

  • 在增强程序中查找第二个字符为 Z 的 Include 包含程序。
  • 在后台查找对应模块增强;在程序中搜索 USEREXIT_打头的关键字子程序;在 SAP 中以 PERFORM 的形式被调用。
  • 字节列出对象列表 “Display Ohjeot List” 按钮,在子程序列表下查找“UserExit” 打头的子程序。

这类增强事先要到 SAP 的 Service Market Place 申请对象建(Access Key),然后才能修改子程序。这种出口据说是第一代的用户出口,它们 Include 在 SAP 标准程序的源代码里,可以说它们是源代码的一部分,更改这种出口就相当于更改 SAP 标准程序,是需要申请对象键才能更改的,不需要建立工程。

很多以 ZZ 或者 Z 结尾的 Include 标准程序里都有以 UsetExit_开始的子程序,例如 MV50AFZ1 里的 user_exit_save_document。大部分 SD 的出口里,都是这种形式的(Form)。由于子程序中带有关键字 UserExit,故被称为 User Exits(用户出口)。与第二代增强相比,User Exit 只能在 SAP 应用程序中添加功能,不能定义自己的菜单、屏幕及关键字处理。

第二代增强

第二代增强(基于函数模块的增强)用事务 SAP 增强管理(事务代码:SMOD)和增强编辑器(事务代码:CMOD)维护。在 SAP 发布的版本中,使用 Call Customer-Function ‘xxx’调用函数模块,所以可以通过在程序中搜索 Customer-Function 来查找第二代增强,第二代增强函数名构成为 Exit程序名’xxx (3 digital number)’。它们在发布的时候只有一句代码
include “zxxxxxxx”,修改时无需像第一代增强一样申请对象键(Access key),直接按两次(Enter)键就可以了。但同时这种增强以及后面几代的增强都不能像第一代一样随便使用程序
的全局数据,只能使用接口中传递进来的参数。由于带有关键字 Customer,故被称为 Customer Exits(客户出口)。
第二代增强主要有 4 类:

  • Ehancement exits:这些出口以 Exit 打头,可以在 SE37 中查看,也可以在数据字典 TFDIR(函数表)中查询 Exit_打头的函数。
  • C.Gul codes (GUI 增强):用于区城菜单和工具菜单栏的增强。
  • S.Subscreens(屏幕增强):用于子屏幕设计增强。
  • T.include structure 增强:用于表结构的增强。

还有一种按照用途分类的标准:

  • 功能模块出口(Function Module Exits):在 SAP 标准事务中添加业务逻辑,一般用于验证标准事务中的字段。
  • 屏幕出口 (Screcn Exits):定义自己的子屏幕用以嵌入应用屏幕,在标准事务中添加子屏幕。
  • 菜单出口(Menu Exits):定义自己的菜单项或激活屏蔽标准事务中的菜单项。
  • 表出口 (Table Exits), 与上节中的 T 型出口一样,属同一类型。
  • 数据元素出口(Dala Element Exits):在 ABAP/4 字典的关键字数据元素中添加文档。
    结果是在使用这些数据元素的字段处按健后会出现自定义的说明文档。
  • 关健字出口 (Keyword Exits): 在 ABAP/4 字典中的关键字数据元素更改表示文本。
  • 字段出口(Field Exis):根据 ABAP/4 字典中域验证某些标准事务的某些屏幕字段。

注:RZ10 配置系统参数

Enhancement 比较重要的表

  • MODSAP:这个表里重要的字段增强名(Name)、组件类型(TYPE:ECST)、组件功能模块名(Member)里面记录了所有 Enhancement 的增强。
  • TEDIR:所有的函数表、重要字段 FuncName(函数名)、功能模块激活状态 MAND(如果是 C,代表此函数模块激活)。
  • TSDIR:动态程序区 CALL CUSTOMER SUBSCREEN(屏幕增强)。
  • CUATEXTS:修改 GVI 界面,菜单文本被客户改变(GUI 菜单文本增强)。
  • MODSAPA: SAP 扩展的属性。
  • MODATTR: SAP 增强项目属性。
  • TADIR:资源库对象的目录。
  • TFTIT: 函数功能的短文本。

查找 Enhancement 的方法

(1)查找关键字
在程序中搜索 Customer-function,找到后面的 3 位数字后缀,然后出口函数组成就是 Exit_程序名_3 位数字后缀
(2)代码查找增强
利用如下代码查找 Enhancement(有些 Exit 并不能找到):
ZENHANCEMNET_FIND_EXIT

*-----------------------------------------------------*
*Program ID : ZENHANCEMNET_FIND_EXIT
*Program Description : 增强点查询
*Create User : JacobCai
*Create Date : 2022/02/20
*
*-----------------------------------------------------*
*Function Overview
* 程序实现以非事务代码为参照进行交互式查询
* 技术点:动态下载报表,结构体嵌套
*
*-----------------------------------------------------*
* Change List :
* change NO. Change Date Change User Change Detail
* 0000001 2022/02/20 JacobCai 程序创建
*-----------------------------------------------------*
REPORT ZENHANCEMENT_FIND_EXIT
NO STANDARD PAGE HEADING.
*-----------------------------------------------------*
*TABLES
*-----------------------------------------------------*
TABLES : TSTC, "SAP事务代码
TADIR, "资源库对象的目录
MODSAPT, "SAP增强-短文伴
MODACT, "修正
TRDIR, "系统表TRDIR
TFDIR. "功能模块
ENLFDIR. "功能模块的附加属性
TABLES : TSTCT. "事务代码文本
*-----------------------------------------------------*
*DATA
*-----------------------------------------------------*
* 资源库对象的目录内表
DATA: JTAB LIKE TADIR OCCURS O WITH HEADER LINE.
DATA: CURSOR_FIELD (30). "CURSOR字段
* 传緰组织器的开发类
DATA: V_DEVCLASS LIKE TADIR-DEVCLASS.
*-----------------------------------------------------*
*PARAMETERS
*-----------------------------------------------------*
*事务代码
PARAMETERS: P_TCODE LIKE TSTC-TCODE OBLIGATORY.
*-----------------------------------------------------*
*START-OF-SELECTION
*-----------------------------------------------------*
*事务代码取得
SELECT SINGLE * FROM TSTC WHERE TCODE EQ P_TCODE.
*成功的场合
IF SY-SUBRC EQ O.
* 资源库对家的目录取得
SELECT SINGLE * FROM TADIR
WHERE PGMID = 'R3TR' "请求和任务中的程序标识
AND OBJECT = 'PROG' "对象类型
AND OBJ_NAME = TSTC-PGMNA."对象目录中的对象名
MOVE: TADIR-DEVCLASS TO V_DEVCLASS.
* 失败场合
* 系统表 TRDIR 取得
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 TADIR
INTO 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_TCODE.

FORMAT COLOR COL_POSITIVE INTENSIFIED OFF.
* 输出事务代码
WRITE: / (19) '事务代码:', 20(20) P_TCODE, 45(50) TSTCT-TTEXT.
SKIP.
* 增强信息不为空的场合
IF NOT JTABD[] IS INITIAL.
WRITE: / (95) SY-ULINE.
FORMAT COLOR COL_HEADING INTENSIFIED ON.
* 增强列表表头
WRITE: /1 SY-VLINE,
2'增强名',
21 SY-VLINE,
22'描述',
95 SY-VLINE.
* 增强列表明细
WRITE: / (95) SY-ULINE.
LOOP AT JTAB.
SELECT SINGLE * FROM MODSAPT
WHERE SPRSL = SY-LANGU AND
NAME = JTAB-OBJ_NAME.
FORMAT COLOR COL_NORMAL INTENSIFIED OFF.
WRITE: /1 SY-VLINE,
2 JTAB-OBJ_NAME HOTSPOT ON,
21 SY-VLINE,
22 MODSAPT-MODTEXT,
95 SY-VLINE.
ENDLOOP.
* 增强列表表尾
DESCRIBE TABLE JTAB.
SKIP.
FORMAT COLOR_COL_TOTAL INTENSIFIED ON.
WRITE:/'增强个数:',SY-TFILL.
* 增强信息为空的场合
ELSE.
FORMAT COLOR_COL_NEGATIVE INTENSIFIED ON.
WRITE: / (95) '没有用户增强'.
ENDIF.
* 失败的场合
ELSE.
FORMAT COLOR_COL_NEGATIVE INTENSIFIED ON.
WRITE: / (95) '事务代码不存在!'.
ENDIF.

*-----------------------------------------------------*
*AT LINE-SELECTION
*-----------------------------------------------------*
AT LINE-SELECTION.
* 取得光标宇段
GET CURSOR FIELD CURSOR FIELD.
CHECK CURSOR_FIELD (4) EQ JTAB:
SET PARAMETER ID 'MON' FIELD SY-LISEL+1(10).
CALL TRANSACTION 'SMOD' AND SKIP FIRST SCREE.

(3)利用系统函数寻找增强
常与出口相关的函数有:

  • DYNP_VALUES_READ。
  • MODX_ALL_ACTIVE_MENUENTRIES (菜单增强)
  • MODX_FUNCTION_ACTIVE_CHECK(出口函数增强)
  • MODX_MENUENTRY_ACTIVE_CHECK(菜单增强)
  • MODX_SUBSCREEN_ACTIVE_CHECK(屏幕增强)

可以在函数最后设置断点,然后通过运行对应的增强程序就会调用这样的函数,这样就可以在调试模式下找到对应的增强。
注:出口的应用要在激活的状态下,也就是在 TFDIR 下的 MAND 宇段为 C。激活的时候同时激活程序和出口函数。一般情况下,如道出口模块可以找到对应的增强,如果未激活状态需要将其激活。

第三代增强

BADI 是一个新的 SAP 增强技术,是基于 ABAP 的面向对象技术。它们可以被插入到 SAP 系统,以适应用户由于行业的不同需要不同的功能以满足具休要求(包括在标准交付)。SAP 让客户在软件中预先确定这些点。

基于面向对象概念的增强 BADI (Business Add-in),源代码的发布是通过接口的方法调用来实现使用的。用户增强实际上是实现一个或多个基于这个接口的实现类,因为接口类实际上是一个抽象类,所以对同一个增强会出现不同的源代码,这些不同的源代码是通过过滤器(Adapter)来区别用于不同的业务场景的。这种增强是用事务 SE18 和 SE19 来实现的。

SAP 预定义了一些接口(Interface),客户可以自行定义实现 Interface 的类(Class),在标准程序中会使用调用客户自定义类(Class)的实例(Instance),获取实例的过程使用了工厂模式,因此获取过程对用户是未知的。不过 BADI 也有一些局限性,就是有一些 Interface 是固定的,有的时候会发现需要 Mix 客户化代码的时候找不到 Interface。

业务交易事件(BTE, Business Transaction Events) 是 SAP 的一种增强方式,技术上讲是介于第二代增强(Customer Exits)和 BAdIs 之间的产物。
BTE (Business Transaction Events)为会计模块独有的增强,这种增强用于财务会计模块(Open FI)、总账会计(FI-GL)、应收账款和应付账款(FI-AR/FI-AP) 及销售和分销(SD)的组件。
BTE 增强有 2 种类型,类似于会计凭证验证和替代。

1、Publish and Subscribe Interface:只提供 SAP 数据源,可以供外部程序使用或者达到数据检查的目的。
用于告诉外部软件在 SAP 标准应用中触发了某些事件,并且把产生的数据提供给它们。外部软件不能给 R/3 系统返回任何数据,可以用在以下地方。

  • 主数据被创建、修改或锁定。
  • 凭证被输入、预制、修改或冲销。
  • 项目被清除或重置。

也可以在附加的开发中基于此事件和数据产生附加的处理:

  • 启动工作流。
  • 产生或修改附加数据。
  • 请求通信。

2、Process Interface:可以达到数据修改的目的,用来增强标准的业务流程。
用于控制与标淮 R/3 系统处理方法不同的业务流程,也就是用 Process Interfoce 替换标准处理。它们干预标准流程,并返回数据给 SAP 应用。

第四代增强

第四代其实是第三代的加强 Switch Framework。当 SAP 进入 NetWeaver 7.0 以后推出的新增强体系,将 BADI 进行了改进,叫新 BADI。还新增了 Enhancement Spot, Enhancement Section 以及隐式增强点的概念,基本可以在面向对象的程序里实现处处皆可增强的最高境界。
SAP 应用 Switch Framework 的主要目的是采用标准系统中的一个或多个行业的解决方案,以简化基于 ABAP 的系统框架。Switch Framework 允许客户通过使用交换机框架,对所有的行业解决方案中的资源库对象或对象的组件的可见性进行外部控制。客户不再需要安装一个行业解决方案,可以在需要时激活相关组件。
在程序中查找字符串 Enhancement,即可以在指定的位置进行增强。

第一代增强的应用

User Exits 是 SAP 第一代增强技术,其技术原理就是在程序中预先放置一个 Form.. EndForm 的子程序,并在事物运行时 Call 这个 Fomm。如果这个 Form 是空的,则不执行任何操作,否则,执行相应的操作。User Exits 的写法和修改标准程序是一致的,要向 SAP 申请 Access Key 才能对这些程序进行修改。它与修改标准程序的区别在于在 SAP 做升级的时候,User Exits 会自动保留,标准程序如果不做特殊处理,就会被猣盖。
在做这样的增强时,一般把所要添加的代码都写在以 Z 开头的函数中,然后在 Form 中调用这个函数。该方法作用有限。

第二代增强的应用

数据元素及关键字

可以在 CMOD->GoTo->Text enhancements->Data elements/Keywords 路径中做字典文档的增强。
数据元素用以增强与其关联的文档帮助:关键字用于增强数据元素关联的文本标签。

字段增强

宇段增强技术基于数据元素(Data Element),如果屏幕的输入框参考了数据元素,定义激活字段增强(Field Exit)后,程序响应一块函数代码,可以触发该字段增强逻辑。
技术上来讲有点像 Customer Exits,两者都是通过 Function 来实现出口的,但是其原理和用途又有很大不同,而且 Field Exits SAP 在 4.6 之后就不再支持了。因此如果要在后续版本中使用,需要增加系统参数 abap/fieldexit = YES,然后重新启动 SAP。

  • 可以在 SE38 里运行程序 RSMODPRF 来寻找己经存在的 Field Exits,同时也可以进入 Field Exits 的管理界面。
  • 可以在 CMOD 界面中输入事务 PRFB,也可以进入 Field Exits 的管理界面。

新建一个 Field Exits 时,只要有相应的 Data Element 在数据库中存在,就能建立出针对,这个 Data Element 的 Field Exits。同时会生成一个 FIELDEXIT开头的 Function,用以做相应的增强。里面有两个参数,Input 和 Output,这两个参数是固定的,不能修改。Input 是将屏幕字段的值传入出口程序,而 Output 则是传出。
例如,对用户进行维护(SU01),只允许 SAP* 和 DDIC 实现用户的维护,其他用户没有权限进行维护。
步骤一:找出用户这个输入字段的数据元素
步骤二:执行程序 RSMODPRF,不输入任何参数,进入字段增强的主界面
步骤三:显示>创建新的字段增强,输入要增强的数据元素 XUBNAME,系统会自动创建一个以 FIELDXIT开头的函数,用以做相应的增强。
点击创建,输入函数组及描述,点击保存。

FUNCTION FIELD_EXIT_XUBNAME.
DATA: M_STRING TYPE STRING.
CONCATENATE '用户名:' SY-UNAME '无维护权限!' INTO M_STRING.
IF SY-UNAME <> 'YIDATEC' AND SY-UNAME <> 'DDIC' AND SY-UNAME <> 'SAP*'.
MESSAGE M_STRING TYPE 'A'.
ENDIF.
ENDFUNCTION.

步骤四:激活新建的字段增强。路径:显示>激活
tips:上述字段增强是对所有程序的增强,只要程序用到数据元素 XUBNAME,那么都会触发。单击 分配程序/屏幕 按钮可以将增强绑定到某个程序。
步骤五:测试新建的字段增强

此类出口程序中,以下 ABAP 语句是受限制的:

  • CALL SCREEN、CALL DIALOG、 CALL TRANSACTION、 SUBMIT
  • COMMIT WORK、 ROLLBACK WORK
  • COMMUNICATION RECEIVE
  • EXIT FROM STEP-LOOP
  • MESSAGEI、 MESSAGE W
  • STOP、 REJECT

所以也给出口的功能带来了限制。同时,调试在 Ficld Exit 会被忽路,这对纠错来说也是一个不利因素,只能做单元测试,而不能做集成测试。要将 Field Exits 做得更细,那就要给
它分配程序及其对应的屏幕号。

GuiXT 增强

在一个事务中,事务变式和屏幕变式是可以一起做的。当制作事务变式的时候,默认也会做一个事务初始屏幕的变式:但是想改变屏幕的布局,就要用到 GuiXT。
GuiXT 是一个第三方的软件,可以用来对 SAP 的界面进行修改,包括登录界面。

实例:事务 SE11 用来维护数据字典,现在需要一与之相仿的事务来维护数据库表。
步骤一:处理变式的维护(第一画面)。通过事务代码 SHDO 进入事务和屏幕变式创建工具。
输入 Transaction Code:SE11, Transaction Variant: ZSE11TABLE,然后单击工具栏中的变式按钮或者按键。
tips:次处 Transaction Variant 交式名称必须以 Z 或 Y 开头。

步骤二:处理变式的维护(第二画面)。按 Enter 键弹出窗口将 “Database table” 以下的输入项隐藏。
tips: Menu function 用于屏蔽工具栏中的功能菜单。上述设定是将 “Database table”以外的选项去掉,而选项所在文本需将 GuiTX Scripts 隐藏。

表增强

对于透明表及结构的增强,主要有两种,一种是 Append Structure,另一种就是 Include 形式。
Append Structure 可以扩展原来的表结构,但并不是在原来的表上加字段,而是再建一个附加的结构,物理上,数据是保存在两处的。而且,一个 Append Structure 只能有一张表结构。如果把有 Append Structure 结构的表进行复制的话,那么在新的表中,原有的 Append Structure 就变成了固定字段,物理表也变成了一张。
Include 格式多见于由于增强而自动生成的表字段,比如做屏幕增强的字段。当然,也可以自定义。相比 Append Structure, Include 可以包含多张表结构(Include 的 Data Elements 可以 Append Structure)。它不具有 Append Structure 的复制性能,即使复制,还是会以原结构存在于新表中。

做完增强后,如果想所加字段也出现在 SM30 表维护中,则需要通过以下路径生成表维护程序:
SE11 > 进入相应表,并做完增强 > Utilties > Table Maintenance Generator
如果要反复更改增强,比如改变某一字段的长度,那么在减少字段时,需用 SE14 进行物理表的修改,否则无法激活。
实例:透明表 SFLIGHT08 是航班信息表,现在想将飞行员及误餐的信息加进去

函数增强

函数增强即代码增强,是指利用代码完成某项功能,一般和其他增强共同完成某项业务需要。
实例:事务 BC425_08 是用来预定航班的,想实现在预定”AA”航班时给出提示信息。
步骤一:SAP 增强项目管理器(第一画面)Project Management of SAP Enhancements
在项目处输入要建立的工程名,单击创建按钮,编辑工程描述。

菜单增强

菜单增强是指利用标准菜单中留下的接口新增相应的其他功能,一般和代码增强共同完成某项业务需要。
实例:事务 BC425_08 是用来预定航班的,想实现此画面来查询相关历史信息。
步骤一:SAP 增强项目管理器(第一画面)

屏幕增强

屏幕增强是指利用标准屏幕中留下的字屏幕新增相应的其他项目,一般和代码增强共同完成某项业务需要。
实例:事务 BC425_08 是用来预定航班的,想实现此画面中更多的信息。
步骤一:SAP 增强项目管理器(第一画面)

第三代增强的应用

BADI(Business Add-Ins) 是 SAP 在 R/3 release 4.6A 后增加的增强技术。总的来说,BAdIs 克服了之前出口的所有缺点,并且用最新的面向对象技术实现。不过在项目中,用 BAdIs 的顾问还是比较少,多数是用 Customer Exit 和 User Exit 完成。
其实,BADI 就是综合了 SAP 之前一些增强技术的优点,在标准程序预留了出口,通过面向对象的接口技术,使增强更加灵活。一个出口可以有多个实现,但是一个 client 只有一个是起作用的。通过实验发现它是按创建的先后顺序及是否 active 来判断的。不过一般一个实现就够了。

BADI 增强

实例:事务 BC425_CHNGO8 是用来更改预定航班的,想用 BADI 增强实现此画面中的更多信息
tips:此处增强一般有两种方式:
1、用”Module pool”类型的程序
2、用函数组作为增强的程序

BTE 增强

BTE (Business Transaction Events) 是 SAP 的一种增强方式,技术上讲是介于 Customer Exits 和 BADI 的产物。
它主要有两种类型的接口:

  1. PS 函数模块:
  • 一个事件触发时,允许开始一个或多个附加换作,它们不影啊标准的 R/3 程序。

  • 多个操作相互不影响。

  • 附加开发的组件只能从 SAP 导入数据。

  • 可能使用附加的检查,例如权限、查重等。

    2.处理函数模块:

  • 会发生双向的数据交换,因此限制了一个接口可以附加开发的组件个数。

  • 事件触发时,一个标准处理流程只能被一个外部流程所替换。

  • 对于一个 process interface,如果你使用 SAP 合作伙伴附加开发的组件,运行时会使用它的增强:如果后来对此 process interface 使用自己开发的组件,在运行时将会用此增强替换合作伙伴的。

BTE 增强比较核心的理念是使一个接口重复利用,完成多种实现并且互不干扰。而技术实现的时候,就采用在标准程序中 Call 固定的一个 function,然后再用这个 function 动态调用自己定义的增强 function,从而达到预期目的。这样的接口,在标准程序中常常是以 OPENFI_PERFORM 或者 OUTBOUND*CALL*开头的函数。由于采用这种技术架构,SAP 就使这些按口分为 Made by SAP、 Made by SAP’s Partner 和 Made by SAP’s Customer,三方可以各取所需。至于 Publish and Subscribe Interface 和 Process Interface 的区别,主要还是体现在用途上。前者是给外部软件提供信息的,而后者主要用于 R/3 流程。不过前者也可以生成或修改一些 additional data。

BTE 主要用于总账,应收、应付和销售分销模块。
实例:事务 FB01 是用来创建凭证的,想用 BTE 增强实现凭证各项被分配给某个固定字符串。
步骤一:按照以下路径 IMG Menu Path: Financial Accounting》Financial Accounting Global Settings》Business Transaction Events 或运行事务:FIBF

第四代增强(Code Enhancement)的应用

普通的 report 与一般程序没任何区别
步骤一:光标放置在要增强的代码位置,插入一个增强点(enhancement-point)输入名称,点击创建增强点。
tips: 实际项目中要做的事情是实现(implementation)SAP 预留的 enhancement point

语法

源代码扩张

自 Ecc5.0 版本之后,SAP 提供这个标准的增强方式,也是未来 SAP 增强的趋势,其应用场合十分广泛,好处是不像 USER-EXIT 那么难找,不像 BADI 那么麻烦,只需在业务所对应的程序中找到 ENHANCEMENT - POINT 即可,系统升级也不会有影响。

  • 默认增强
    可执行程序、函数组、模块池,子程序池及包含程序的源代码的最后,是 SAP 的默认增强点。
  • 明示增强
  1. ENHANCEMENT - POINT
    语法:
ENHANCEMENT - POINT enh_id SPOTS spot1 spot2 ...
[STATIC]
[INCLUDE BOUND].

说明:
明示程序的增强点 enh_id,SPOTS 选项指定时,至少要分配其中一个增强点,STATIC 指定时为静态增强,INCLUDE BOUND 选项没有指定时该增强为任意的增强,指定时该增强仅限于所在程序。

  1. ENHANCEMENT-SECTION
    语法:
ENHANCEMENT - SECTION enh_id SPOTS spot1 spot2 ...
[STATIC]
[INCLUDE BOUND].
...
END - ENHANCEMENT - SECTION

说明:
明示程序的增强段 enh_id,SPOTS 选项指定时,至少要分配其中一个增强点,STATIC 指定时为静态增强,INCLUDE BOUND 选项没有指定时该增强为任意的增强,指定时该增强仅限于所在程序。

  1. 扩张实例化
    语法:
ENHANCEMENT id.
...
ENDENHANCEMENT.

说明:
为增强点所需增强内容进行实例化。

BADI 使用增强