IDES中有一个T-Code是为了BC425(User Exits)这门课准备的:BC425_FLIGHT## (## : 00~18)。用这个TCode可以练习一下如何开发Table Enhancement、Field Exits、Menu Exits、Screen Exits。
Table Enhancement
为表SFLIGHT08增加两个字段,用来保存航班的飞行员和航空食品。SE11打开SFLIGHT08。点击Append Structure,增加一个structure,取名ZSFLIGHT08:
ZZPLIOT type S_PILNAME
ZZMEAL type S_MEAL
menu->extra->enhancement catagory 设置为'can be enhanced(char-type & numeric)',返回表SFLIGHT08,可以看到增加了一个include structure,蓝色部分:
Field Exits
Field Exits主要用来给Screen上的字段增加check input的,我们可以通过field exits为SAP标准程序增加我们自己的校验逻辑。我们拿TCode:BC425_08做例子,这个TCode用来显示航班的具体信息的,数据来源自上面我们提到的表SFLIGHT08。程序的selection screen如下图:
我们要为Airline Carrier这个field增加一个input check,首先我们在这个字段上点'F1'键,查看一下技术信息:Program Name:'SAPBC425_FLIGHT08'。我们可以用SE38打开这个程序,查找相关的User Exits,不过还有一个更方便的方法就是用另外的一篇blog上写到的那个程序来查看,输入TCode:BC425_08,可以看到有三个Exits:
点击'SBC08E01',转到SMOD,查看一下Component:
这就是系统程序给我们留出来的入口,我们用这个来做个Field Exits。双击'EXIT_SAPBC425_FLIGHT08_001',转到SE37,发现Source Code只有一句:INCLUDE ZXBC425G08U01. 在SE80中新建一个Package(或者使用已经存在的package),create一个include,起名为ZXBC425G08U01, copy下面的code到这个include中,check & active:
*&---------------------------------------------------------------------*
*& Include ZXBC425G08U01
*&---------------------------------------------------------------------*
* FIELD EXITS FOR CHECK INPUT
IF FLIGHT-CARRID EQ 'AA'.
MESSAGE E003(ZBSUN) WITH FLIGHT-CARRID 'IS NOT ALLOWED'.
ENDIF.
黄色标注的FLIGHT其实就是function module 'EXIT_SAPBC425_FLIGHT08_001'传进来的参数,所以我们可以直接使用。如果EXITS函数没有传递Screen上的field的话,可以使用下面的代码取得:
DATA: DYNFIELDS TYPE TABLE OF DYNPREAD WITH HEADER LINE.
DYNFIELDS-FIELDNAME = 'SFLIGHT08-CARRID'.
APPEND DYNFIELDS.
CALL FUNCTION 'DYNP_VALUES_READ'
EXPORTING
DYNAME = 'SAPBC425_FLIGHT08' "program name
DYNUMB = '0100' "screen id
TRANSLATE_TO_UPPER = 'X'
TABLES
DYNPFIELDS = DYNFIELDS.
IF DYNFIELDS-FIELDVALUE EQ 'AA'.
MESSAGE E003(ZBSUN) WITH FLIGHT-CARRID 'IS NOT ALLOWED'.
ENDIF.
增加的代码用来校验不能输入值为'AA'的Airline,测试一下:
最后在TCode: CMOD中新建一个Project用来管理建立的exits.首先填写Enhancement assignments,因为我们要做三个exits,所以把查到的三个component都写上了。然后点击application tool bar上的component按钮看一下:
绿色对号表示已经实施了这个exit,绿色圆点表示这个exit已经激活了。我们下面要做的两个exits都可以在这里看到状态。
Menu Exits
用SMOD查看一下SBC08E02的componet。这个多了下面的Function Code:
我们要处理的就是这个Function Code,回到CMOD,change刚才建立的那个project:
双击红色框的部分,修改菜单的文字为'LIST':
点'Copy' 返回上一个画面,双击'EXIT_SAPBC425_FLIGHT08_002',为这个Function Code创建对应的处理代码。还是一样创建一个include ZXBC425G08U02,想要实现的效果是点击menu上的'LIST'就可以显示对应航班的详细订票信息。IDES上有一个程序'SAPBC425_BOOKING_08'就可以实现显示功能,我们只需要将数据SUBMIT过去就行了(注意这个程序显示的是SFLIGHT表的数据,而不是SFLIGHT08的数据)。代码如下:
*&---------------------------------------------------------------------*
*& Include ZXBC425G08U02
*&---------------------------------------------------------------------*
DATA: SELTAB TYPE TABLE OF RSPARAMS WITH HEADER LINE.
SELTAB-SELNAME = 'SO_CAR'.
SELTAB-SIGN = 'I'.
SELTAB-OPTION = 'EQ'.
SELTAB-LOW = FLIGHT-CARRID.
APPEND SELTAB.
SELTAB-SELNAME = 'SO_CON'.
SELTAB-SIGN = 'I'.
SELTAB-OPTION = 'EQ'.
SELTAB-LOW = FLIGHT-CONNID.
APPEND SELTAB.
SELTAB-SELNAME = 'SO_FLD'.
SELTAB-SIGN = 'I'.
SELTAB-OPTION = 'EQ'.
SELTAB-LOW = FLIGHT-FLDATE.
APPEND SELTAB.
SUBMIT SAPBC425_BOOKING_08 WITH SELECTION-TABLE SELTAB AND RETURN.
SUBMIT后面记得要加'AND RETURN',否则程序点出去就回不来了。
看一下效果:
Screen Exits
Screen Exits用来给标准的SAP程序屏幕上增加显示元素的。一般跟Table Enhancement有关系,table增加了字段,想要在标准程序上输出出来,或者要在标准程序中维护,就会用到screen exits
先看一下原来的程序界面:
现在要在这个屏幕上增加两个字段,这两个字段就是在最开始为表SFLIGHT08上追加的append structure中的ZZPILOT和ZZMEAL。
首先还是在SMOD中查看exit 'SBC08E03':
由上所知screen 0200中调用了一个subscreen 0500,这个subscreen就是我们要创建的Screen Exit。对应的exit function module是'EXIT_SAPBC425_FLIGHT08_003',
在EXIT_SAPBC425_FLIGHT08_003所在的function group 'XBC425G08'中创建一个screen '0500'。Attribute里的Screen type选Subscreen,Element list里头内容如下:
layout:
Flow logic:(可以在这里对字段做进一步处理)
PROCESS BEFORE OUTPUT.
* MODULE STATUS_0500.
PROCESS AFTER INPUT.
* MODULE USER_COMMAND_0500.
这个程序里头我们只是想display,所以没有写具体的MODULE内容,只是在Function Group的top include 'ZXBC425G08TOP'中声明了下面的全局变量:
*&---------------------------------------------------------------------*
*& Include ZXBC425G08TOP
*&---------------------------------------------------------------------*
DATA: ZZPILOT LIKE SFLIGHT08-ZZPLIOT,
ZZMEAL LIKE SFLIGHT08-ZZMEAL.
然后创建include 'ZXBC425G08U03':
*&---------------------------------------------------------------------*
*& Include ZXBC425G08U03
*&---------------------------------------------------------------------*
ZZPILOT = FLIGHT-ZZPLIOT.
ZZMEAL = FLIGHT-ZZMEAL.
看一下效果,红框中的就是增加的字段:
最后在CMOD中激活所有的exits。
--EOF--
本篇文章已有0条评论