做维护视图的时候经常需要做搜索帮助供用户选择,简单介绍一下几种方法
一、如果用户没有特别要求,则用数据元素自带出的搜索帮助也可以
二、SE11创建搜索帮助
1.创建搜索帮助
基本索引帮助:单个搜索帮助
集合搜索帮助:多个搜索帮助集合
2.填写搜索帮助相关信息
选择方法:如果搜索帮助字段有参考表,则可在此处填写
对话类型:
- 立即显示值:把参考表中所有信息显示出来
- 根据集合的对话:如果参考表数据大于100条,则显示限制对话框,选择限制数据之后,显示数据;反之则立即显示数据
- 具有限制的对话:显示限制对话框,选择限制数据之后,显示数据
搜索帮助出口:自定义搜索帮助增强,但是要参考F4IF_SHLP_EXIT_EXAMPLEH
Parameter(即复制函数,然后这里调用)
- 搜索帮助参数:需要显示的搜索帮助的参数
- IMP/EXP:输入输出参数
- 列表:显示数据位置顺序
- 选择:限制输入时的位置顺序
- 选择:控制在限制输入时是否可输入
- 已修改:控制数据元素是否可修改
- 缺省值:默认值
3.维护视图屏幕调用
三、利用自定义搜索帮助函数F4IF_INT_TABLE_VALUE_REQUEST
1.在维护视图屏幕写搜索帮助模块
"自定义搜索帮助
PROCESS ON VALUE-REQUEST.
FIELD ZVSD0092-LANDX MODULE MDI_F4_LANDX_20.
FIELD ZVSD0092-AD_CITY1 MODULE MDI_F4_CITY1_20.
2.激活保存,在调用处写上具体搜索帮助的代码即可
*&---------------------------------------------------------------------*
*& Module MDI_F4_LANDX_20 INPUT
*&---------------------------------------------------------------------*
* 国家搜索帮助
*----------------------------------------------------------------------*
MODULE MDI_F4_LANDX_20 INPUT.
IF X_HEADER-MAINTVIEW = 'ZVSD0092'.
DATA:LV_LANDX TYPE CHAR8.
DATA:IT_DYNPFIELDS TYPE STANDARD TABLE OF DYNPREAD.
DATA:LS_ZLANGE TYPE ZVSD0092-ZLANGE.
FIELD-SYMBOLS:<FNAME1> TYPE ZVSD0092.
ASSIGN <TABLE1> TO <FNAME1>.
TYPES: BEGIN OF TY_LANDX,
LANDX_CN TYPE ZTSD0094-LANDX_CN,
ZCITY1_CN TYPE ZTSD0094-ZCITY1_CN,
LANDX_EN TYPE ZTSD0094-LANDX_EN,
ZCITY1_EN TYPE ZTSD0094-ZCITY1_EN,
END OF TY_LANDX.
RANGES: LR_VKORG FOR ZTSD0092-LANDX.
DATA: LS_LANDX TYPE TY_LANDX,
LT_LANDX TYPE TABLE OF TY_LANDX. "搜索帮助内表
DATA: LT_DYNPFIELDS TYPE TABLE OF DYNPREAD WITH HEADER LINE.
LT_DYNPFIELDS-FIELDNAME = 'ZVSD0092-LANDX'. "填入需要读值的字段名
APPEND LT_DYNPFIELDS.
CLEAR: LT_DYNPFIELDS.
CALL FUNCTION 'DYNP_VALUES_READ'
EXPORTING
DYNAME = SY-REPID
DYNUMB = SY-DYNNR
TRANSLATE_TO_UPPER = 'X'
TABLES
DYNPFIELDS = LT_DYNPFIELDS
EXCEPTIONS
OTHERS = 9.
IF SY-SUBRC = 0.
READ TABLE LT_DYNPFIELDS WITH KEY FIELDNAME = 'ZVSD0092-LANDX'.
ZVSD0092-LANDX = LT_DYNPFIELDS-FIELDVALUE. "取值
ENDIF.
CLEAR:ZVSD0092-LANDX.
IF ZVSD0092-ZLANGE = '1'.
SELECT LANDX_CN
ZCITY1_CN
FROM ZTSD0094
INTO CORRESPONDING FIELDS OF TABLE LT_LANDX.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
RETFIELD = 'LANDX_CN' "指定要返回屏幕参数的在内表中的field
VALUE_ORG = 'S' "S代表structure,C代表单元格
DYNPPROG = SY-REPID "指定屏幕参数所在的程序名称
DYNPNR = SY-DYNNR "指定参数所在的屏幕编号
DYNPROFIELD = 'ZVSD0092-LANDX' "指定屏幕参数的名称
TABLES
VALUE_TAB = LT_LANDX "搜索帮助内容内表
EXCEPTIONS
PARAMETER_ERROR = 1
NO_VALUES_FOUND = 2
OTHERS = 3.
IF SY-SUBRC NE 0.
MESSAGE ID SY-MSGID
TYPE SY-MSGTY
NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ELSEIF ZVSD0092-ZLANGE = '2'.
SELECT LANDX_EN
ZCITY1_EN
FROM ZTSD0094
INTO CORRESPONDING FIELDS OF TABLE LT_LANDX.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
RETFIELD = 'LANDX_EN' "指定要返回屏幕参数的在内表中的field
VALUE_ORG = 'S' "S代表structure,C代表单元格
DYNPPROG = SY-REPID "指定屏幕参数所在的程序名称
DYNPNR = SY-DYNNR "指定参数所在的屏幕编号
DYNPROFIELD = 'ZVSD0092-LANDX' "指定屏幕参数的名称
TABLES
VALUE_TAB = LT_LANDX "搜索帮助内容内表
EXCEPTIONS
PARAMETER_ERROR = 1
NO_VALUES_FOUND = 2
OTHERS = 3.
IF SY-SUBRC NE 0.
MESSAGE ID SY-MSGID
TYPE SY-MSGTY
NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ELSE.
SELECT LANDX_CN
ZCITY1_CN
FROM ZTSD0094
INTO CORRESPONDING FIELDS OF TABLE LT_LANDX.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
RETFIELD = 'LANDX_CN' "指定要返回屏幕参数的在内表中的field
VALUE_ORG = 'S' "S代表structure,C代表单元格
DYNPPROG = SY-REPID "指定屏幕参数所在的程序名称
DYNPNR = SY-DYNNR "指定参数所在的屏幕编号
DYNPROFIELD = 'ZVSD0092-LANDX' "指定屏幕参数的名称
TABLES
VALUE_TAB = LT_LANDX "搜索帮助内容内表
EXCEPTIONS
PARAMETER_ERROR = 1
NO_VALUES_FOUND = 2
OTHERS = 3.
IF SY-SUBRC NE 0.
MESSAGE ID SY-MSGID
TYPE SY-MSGTY
NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDIF.
ENDIF.
ENDMODULE.
完事儿
用户实际的需求是,根据他已填写的字段,展示不同的搜索帮助结果。但我没有找到如何在没有回车事件和保存时间发生时,获取用户已填写的值。中间使用过内存传值,但是效果不太理想,所以我用了第三种方法。在用户还没有回车时,获取所有搜索帮助的值,用户回车之后,搜索帮助的值会变化。如果大家有更好的方法,希望可以留言指出。