不论是在传统的用户对话程序(Classsical Dypros)的交互屏幕上,还是在报表程序的选择屏幕(Selection Screen)上,对于输入字段,如果有输入值范围限制的,为了方便用户输入,同时避免用户输入不正确的值,最好能提供F4-输入值帮助,并提供输入值的正确性检查功能。
所谓输入值帮助功能,指的是当用户把光标定位到输入字段后,按F4键,或者点击字段右侧的列表按钮,系统弹出输入值值选择窗口,用户在选择窗口中选择值后,选择值自动带入到输入字段。如果输入字段定义为列表字段,则直接在输入字段中列出可选值,用户可以直接选择。
所谓输入值检查功能,就是用户直接在输入字段上输入值,系统会检查输入值是否在允许的值范围内,如果不在,则输出出错信息,提醒用户修改输入值。
本文就SAP系统中给输入字段的提供值帮助的几种方法展开介绍,并给出具体案例,供实施顾问在项目实施中参考和使用。
一、使用域(Domain)中的固定值(Fixed Value)实现F4值帮助
如果屏幕字段直接引用一个数据字典中的结构中的字段或者一个透明表的字段,为该字段定义类型时使用一个数据元素,则可以让该数据元素的类型定义中引用一个域(Domain),然后在Domain的值范围中定义使用的单个值或者值间隔,这些单个值和值间隔可以将用于屏幕字段的F4-值帮助和输入值检查。
![8b377c04103c1557b18480ff734ad494.png](https://i-blog.csdnimg.cn/blog_migrate/cea363499cbeb139c5cd82a73d704d7c.png)
使用Domain只能支持单个字段的值帮助和值检查,但对屏幕字段上有关联关系的几个字段提供值帮助就不合适。
二、使用检查表(CheckTable)
如果一个屏幕字段的可选值来源自一个数据库表,可以使用外码关系定义检查表(Check Table)来实现屏幕字段的F4 值帮助和输入值有效性检查。
定义方法:
1、使用SE11 定义结构类型定义或透明表结构定义,进入字段(Fields)定义窗口;
2、选择需要提供值帮助和输入检查的字段;
3、点击字段上方工具条中的外码按钮(有箭头和钥匙图标),系统弹出更改外码关键字窗口。在表检查字段输入用于检查也就是在屏幕上提供值帮助的值的来源表,点击生成建议,在下方Foreign Key Fields生成检查表(主码表)和外码表的关联关系,一般不需要修改。如果在外码字段对用的数据元素所使用的Domain中定义有Value Table,Value Table会自动用于生成表检查和外码定义,不需要用户输入检查表名。
![4bf9e3636fb28d9908d18bb6c6260b79.png](https://i-blog.csdnimg.cn/blog_migrate/b6399dc2a4871330330760362265e859.png)
4、在中间的屏幕检查部分勾选“要求的检查”检查框,可以输入自定义的错误消息号和消息类,当屏幕输入检查不在允许值范围,则报出错信息。这个检查框通常是要勾选的,,如果不输入错误消息号和消息类,则提示系统默认出错信息。
5、在下方的语义属性部分选择外码字段类型和基数:
1)外码字段类型,用于指定外码字段在外码表中是否是关键字段(包括是主键的一部分)。
未指定的:没有制定关于外码字段连接的信息
非关键字段/候选人:外码字段不是外码表的关键字段,因此也不能独一无二地全部或部分标识一个记录;
关键字段/候选人:外码字段是外码表的关键字段,因此也能独一无二地全部或部分标识一个记录;
一个文本表的关键字段:只用于定义文本表和其对应的主表的外码连接关系。
对用于产生屏幕字段值帮助和输入检查的检查表,一般可以选择非关键字段/候选人和关键字段/候选人,但选择未指定也是可以的。
2) 基数(cardinality)格式为N:M,可能的组合如下表:
N | M | 解释 |
1 | 1 | 外码表字段和检查表字段的值是1:1关系,而且两边都要存在。 |
1 | N | 外码表字段值和检查表字段值是1:N关系,而且两边都要存在,检查表中字段的一个值可以在外码表出现多次。 |
1 | C | 外码表的字段值和检查表中字段值中是1;1关系,但检查表的字段值可以在外码表不存在。 |
1 | CN | 外码表字段值和检查表字段值是1:N关系,检查表中的一个值可以在外码表中出现多次,检查表中的字段值可以在外码表不存在。 |
一般情况下,选择1:N和1:CN是比较合适的。
6、 定义好外码字段连接,点击确认按钮,选择输入帮助和检查按钮,可以看到Check Table的定义已经输入帮助的起源信息。
三、使用搜索帮助(SearchHelp)
使用搜索帮助(SearchHelp)也是实现屏幕字段值帮助的一种常用方法,搜索帮助是一种数据字段对象,可以与数据元素绑定,也可以与结构或者透明表的字段绑定,然后如果屏幕字段直接使用来自数据字段的结构或者透明表字段,屏幕上的字段就会使用绑定的搜索帮助提供的F4值帮助功能。
使用TCODE SE11 在数据字典中定义搜索帮助介绍,搜索帮助分为集合搜索帮助和基本搜索帮助两类,集合搜索帮助包含基本搜索帮助,为基本搜索帮助的组合。文章《三十五、给信息类型输入字段定义搜索值帮助(Search Help)的方法介绍和举例》将会介绍基本搜索帮助的定义方法和使用。
搜索帮助可以在结构和透明表字段上直接分配。运行TCODE SE11维护结构,进入Entry Help/Check页签,选择需要绑定搜索帮助的字段,点击上方的SERACH HELP按钮,在弹出窗口中搜索帮助名称字段输入搜索帮助名称,点击生成建议,可以看到字段分配,点击复制按钮确认分配即可。
注意如果在一个字段上同时分配检查表和搜索帮助,系统优先使用搜索帮助产生值帮助和进行输入值检查。
四、自己编写提供F4值帮助的ABAP代码
在对话程序屏幕(Screen)对应的流逻辑(FlowLogic)中的事件PROCESS ON VALUE-REQUEST 的代码段中使用FIELD XXXMODULE YYY自己编写生成值帮助的代码。这里XXX 是屏幕输入/输出字段名,YYY 是MODULE名。
例如,在信息类型1005的7000 屏幕上,有ESG forCAP 字段,用于表示在指定的国家分组、工资等级类型和工资等级地区下的薪资架构类别,现在需要对这个字段提供F4 Value Help。在屏幕7000的Flow Logic 中增加以下代码:
PROCESS ON VALUE-REQUEST.
FIELD P1005-TRFKZ MODULE TRFKZ_REQUEST.
在MP100530中插入以下代码:
MODULE TRFKZ_REQUEST INPUT.
PERFORM F4_HELP_TRFKZ.
ENDMODULE. " TRFKZ_REQUEST INPUT
在在MP100540中插入以下代码:
FORM F4_HELP_TRFKZ.
DATA: PROG_NAME LIKE SY-REPID.
DATA: DYNP_NUM LIKE SY-DYNNR.
DATA: ONLY_DISPLAY TYPE FLAG VALUE SPACE.
DATA: READ_FIELD_NAME TYPE DYNFNAM.
DATA: UPDT_FIELD_NAME TYPE DYNFNAM.
TABLES:ZHR_XCJG.
DATA: BEGIN OF F4_TAB OCCURS 0,
TRFKZ LIKE P1005-TRFKZ,
TRFKT LIKE P1005-TRFKT,
END OF F4_TAB.
DATA: BEGIN OF MAPPING OCCURS 20. "table - screen
INCLUDE STRUCTURE DSELC.
DATA: END OF MAPPING.
DATA: F4_TAB_STRC LIKE DFIES OCCURS 0 WITH HEADER LINE.
DATA: F4_RETURN LIKE DDSHRETVAL OCCURS 0 WITH HEADER LINE.
DATA: DYNP_READ_TAB LIKE DYNPREAD OCCURS 0 WITH HEADER LINE.
DATA: DYNP_UPDT_TAB LIKE DYNPREAD OCCURS 0 WITH HEADER LINE.
DATA: ACTUAL_TRFKZ LIKE P1005-TRFKZ.
PROG_NAME = SY-REPID.
DYNP_NUM = SY-DYNNR.
FIELD_NAME = 'P1005-TRFKZ'.
READ_FIELD_NAME = 'P1005-TRFKZ'.
UPDT_FIELD_NAME = 'P1005-TRFKZ'.
IF PPPAR-FCODE = 'DISP'. "SRNOTE1338447
ONLY_DISPLAY = 'X'. "SRNOTE1338447
ENDIF. "SRNOTE1338447
CLEAR DYNP_READ_TAB[].
DYNP_READ_TAB-FIELDNAME = READ_FIELD_NAME.
APPEND DYNP_READ_TAB.
READ TABLE DYNP_READ_TAB INDEX 1.
ACTUAL_TRFKZ = DYNP_READ_TAB-FIELDVALUE.
CALL FUNCTION 'DYNP_VALUES_READ'
EXPORTING
DYNAME = PROG_NAME
DYNUMB = DYNP_NUM
TABLES
DYNPFIELDS = DYNP_READ_TAB
EXCEPTIONS
OTHERS = 01.
CLEAR F4_TAB.
REFRESH F4_TAB.
SELECT * FROM ZHR_XCJG.
F4_TAB-TRFKZ = ZHR_XCJG-ZZ_XCJG.
F4_TAB-TRFKT = ZHR_XCJG-ZZ_XCJGWB.
APPEND F4_TAB.
ENDSELECT.
SORT F4_TAB BY TRFKZ ASCENDING AS TEXT.
DELETE ADJACENT DUPLICATES FROM F4_TABCOMPARING TRFKZ.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
RETFIELD = 'TRFKZ'
DYNPPROG = PROG_NAME
DYNPNR = DYNP_NUM
DYNPROFIELD = 'P1005-TRFKZ'
WINDOW_TITLE = '薪酬结构分组选择'
VALUE_ORG = 'S'
TABLES
VALUE_TAB = F4_TAB
* FIELD_TAB = F4_TAB_strc
RETURN_TAB = F4_RETURN
* DYNPFLD_MAPPING = MAPPING
EXCEPTIONS
PARAMETER_ERROR = 1
NO_VALUES_FOUND = 2
OTHERS = 3.
IF SY-SUBRC = 0 AND ONLY_DISPLAY = SPACE. "SRNOTE1338447
CLEAR DYNP_UPDT_TAB[].
DYNP_UPDT_TAB-FIELDNAME = UPDT_FIELD_NAME.
READ TABLE F4_RETURN INDEX 1.
IF SY-SUBRC = 0. "SRNOTE1338447
DYNP_UPDT_TAB-FIELDVALUE = F4_RETURN-FIELDVAL.
APPEND DYNP_UPDT_TAB.
ENDIF. "SRNOTE1338447
CALL FUNCTION 'DYNP_VALUES_UPDATE'
EXPORTING
DYNAME = PROG_NAME
DYNUMB = DYNP_NUM
TABLES
DYNPFIELDS = DYNP_UPDT_TAB
EXCEPTIONS
INVALID_ABAPWORKAREA = 1
INVALID_DYNPROFIELD = 2
INVALID_DYNPRONAME = 3
INVALID_DYNPRONUMMER = 4
INVALID_REQUEST = 5
NO_FIELDDESCRIPTION = 6
UNDEFIND_ERROR = 7
OTHERS = 8.
ENDIF.
ENDFORM. " F4_TRFKZ_VALUE
需要注意的是标准信息类型IT1005并为提供7000屏幕,需要使用TCODEPPCI去生成,然后调整屏幕上的字段显示格式,增加以上程序逻辑,再集成到TCODE PPOME的层次结构框架中,以上实际上已经构成对标准程序MP100500极其包含的Include程序的的修改,需要相关标准对象的AccessKey,并做好文档记录,以备系统升级时再次手工调整之用。
对于报表程序的选择屏幕(Selection Screen,默认屏幕号1000)可以在事件 AT SELECTION-SCREEN ON VALUE-REQUEST FOR Parameter或者Selection Option 下编写代码生成F4 值帮助,使用函数RS_SELECTIONSCREEN_READ和RS_SELECTIONSCREEN_UPDATE去完成相关工作。
当然最好是让屏幕上输入/输出字段、参数和选择标准直接引用一个数据字典中定义的类型、结构类型字段或者数据库字段,这样就可以使用上面几种实用定义生成值帮助的方法,不用自己写程序。