文章目录
前言
在abap开发中遇到的搜索帮助有两种,一是选择屏幕的搜索帮助,另一种是ALV的搜索帮助。实现方式有很多种,下面我们逐一介绍几种主要实现方式。
- 通过域值的固定值 ( fixed Values )或 值表( Value Table )实现的Search help
- 通过se11创建搜索帮助(数据元素界面,字段界面)
- 搜索帮助出口
- 在AT SELECTION-SCREEN ON VALUE-REQUEST FOR 调用function实现,F4IF_FIELD_VALUE_REQUEST和F4IF_INT_TABLE_VALUE_REQUEST、TR_F4_HELP等
- 在事件POV(PROCESS ON VALUE-REQUEST)中实现的Search help
搜索帮助优先级
先 PROCESS O N V ALUE-REQUEST , AT SELECTION-SCREEN ON VALUE-REQUEST
再 PARAMETERS/ SELECT-OPTIONS MATCHCODE OBJECT
先 检查表 Check Table ,再 表 (或 结构 ) 字段是否 绑定 了 搜索帮助
先 data element 是否 绑定 了 帮助 ,再 domain 是否存在 fixed values
最后才是 DATS 、 TIMS
一、选择屏幕的搜索帮助
通过域值
这里不得不提到一个校验语法,此语法会校验你的输入值是否在搜索帮助的固定值或值表范围内
PARAMETERS p_1 TYPE zmy_dm_200 VALUE CHECK . " 注: SELECT-OPTIONS 没有此选项
如果选择屏幕字段参考数据元素所对应的 Domaim 设置了 固定值 ( fixed Values )或 值表 ( Value Table ),使用 VALUE CHECK 语句后,会验证输入值是否在固定值或值表范围之内( 若要使值表检查生效 ,则首先需要将此 Domain 引用到表字段,再对此表字段通过按钮进行外键分配,并且外键一定是来自的值表的主键,最后使用 PARAMETERS 定义屏幕参数时要参照此表字段,否则如果只是直接参照所对应的 DataElement 是不起作用, 即 Value Table 一定要经过转换为 Check Table 后再起作用 )
注: 如果要使用 VALUE CHECK 选项,则 Domain 的类型只能是 C 或者 N 类型 , 否则运行会抛异常。另外, 如果未使用该选项,但 F4 Help 还是会出现 (有固定值或检查表的情况下),但不进行有效性检查了
1、固定值
在值范围中配置即可
2、值表
为一个 Domain 简单地指定一个取值表不会导致用户的输入被自动校验,也不会自动出现 F4 Help 。 只有 通过表外键按钮将该 Value Table 指定为主表之后,一个值表才能真正成为 Check Table 。
检查表与搜索帮助关系
当某个表字段有检查表,并且又有搜索帮助,则 数据一般来自源于检查表 ,而 F4 的 输入输出则由搜索帮助来决定 !
PARAMETERS p_carid TYPE sbook - carrid VALUE CHECK .
PARAMETERS p_cuter TYPE sbook - counter VALUE CHECK .
命中清单中的 ID 列即 CARRID 背景色不是蓝色,所以选择一条时,不会自动填充屏幕字段 P_CARID , 原因是对应的 Search Help 中的 CARRID 参数对应的 EXP 没有打上钩:
如果将这个钩打上,则会相应列背景色会为蓝色,且会自动填充, 达到联动效果 。
更多关于搜索帮助的联动请参考江老师的搜索帮助Search Help(F4)
se11创建搜索帮助
基本搜索帮助
se11,点击创建
选择基本搜索帮助
搜索帮助出口
上图我们看到,在通过se11创建搜索帮助时也可以参考搜索帮助出口函数。
下面是创建方法:
se37复制F4IF_SHLP_EXIT_EXAMPLE到你的出口函数ZT_HELP1_EXIT
输入输出参数含义:
Changing:
SHLP 搜索帮助描述
CALLCONTROL 具有搜索帮助出口的 F4 处理控制结构
Tables:
SHLP_TAB 替代基本搜索帮助的清单
RECORD_TAB 搜索帮助的结果表
代码:
通常,代码是在CALLCONTROL-STEP = 'DISP’后加的,
例子:针对某用户只显示特定规律物料编码的物料,代码在DISP后,物料编码通过偏移量+长度定位
FUNCTION ZT_HELP1_EXIT.
*"----------------------------------------------------------------------
*"*"本地接口:
*" TABLES
*" SHLP_TAB TYPE SHLP_DESCT
*" RECORD_TAB STRUCTURE SEAHLPRES
*" CHANGING
*" VALUE(SHLP) TYPE SHLP_DESCR
*" VALUE(CALLCONTROL) LIKE DDSHF4CTRL STRUCTURE DDSHF4CTRL
*"----------------------------------------------------------------------
DATA:lwa_tmp LIKE LINE OF record_tab,
lt_tmp LIKE STANDARD TABLE OF record_tab.
* EXIT immediately, if you do not want to handle this step
IF CALLCONTROL-STEP <> 'SELONE' AND
CALLCONTROL-STEP <> 'SELECT' AND
" AND SO ON
CALLCONTROL-STEP <> 'DISP'.
EXIT.
ENDIF.
*"----------------------------------------------------------------------
* STEP SELONE (Select one of the elementary searchhelps)
*"----------------------------------------------------------------------
* This step is only called for collective searchhelps. It may be used
* to reduce the amount of elementary searchhelps given in SHLP_TAB.
* The compound searchhelp is given in SHLP.
* If you do not change CALLCONTROL-STEP, the next step is the
* dialog, to select one of the elementary searchhelps.
* If you want to skip this dialog, you have to return the selected
* elementary searchhelp in SHLP and to change CALLCONTROL-STEP to
* either to 'PRESEL' or to 'SELECT'.
IF CALLCONTROL-STEP = 'SELONE'.
* PERFORM SELONE .........
EXIT.
ENDIF.
*"----------------------------------------------------------------------
* STEP PRESEL (Enter selection conditions)
*"----------------------------------------------------------------------
* This step allows you, to influence the selection conditions either
* before they are displayed or in order to skip the dialog completely.
* If you want to skip the dialog, you should change CALLCONTROL-STEP
* to 'SELECT'.
* Normaly only SHLP-SELOPT should be changed in this step.
IF CALLCONTROL-STEP = 'PRESEL'.
* PERFORM PRESEL ..........
EXIT.
ENDIF.
*"----------------------------------------------------------------------
* STEP SELECT (Select values)
*"----------------------------------------------------------------------
* This step may be used to overtake the data selection completely.
* To skip the standard seletion, you should return 'DISP' as following
* step in CALLCONTROL-STEP.
* Normally RECORD_TAB should be filled after this step.
* Standard function module F4UT_RESULTS_MAP may be very helpfull in this
* step.
IF CALLCONTROL-STEP = 'SELECT'.
* PERFORM STEP_SELECT TABLES RECORD_TAB SHLP_TAB
* CHANGING SHLP CALLCONTROL RC.
* IF RC = 0.
* CALLCONTROL-STEP = 'DISP'.
* ELSE.
* CALLCONTROL-STEP = 'EXIT'.
* ENDIF.
EXIT. "Don't process STEP DISP additionally in this call.
ENDIF.
*"----------------------------------------------------------------------
* STEP DISP (Display values)
*"----------------------------------------------------------------------
* This step is called, before the selected data is displayed.
* You can e.g. modify or reduce the data in RECORD_TAB
* according to the users authority.
* If you want to get the standard display dialog afterwards, you
* should not change CALLCONTROL-STEP.
* If you want to overtake the dialog on you own, you must return
* the following values in CALLCONTROL-STEP:
* - "RETURN" if one line was selected. The selected line must be
* the only record left in RECORD_TAB. The corresponding fields of
* this line are entered into the screen.
* - "EXIT" if the values request should be aborted
* - "PRESEL" if you want to return to the selection dialog
* Standard function modules F4UT_PARAMETER_VALUE_GET and
* F4UT_PARAMETER_RESULTS_PUT may be very helpfull in this step.
IF CALLCONTROL-STEP = 'DISP'.
* PERFORM AUTHORITY_CHECK TABLES RECORD_TAB SHLP_TAB
* CHANGING SHLP CALLCONTROL.
IF sy-uname = 'FJB' AND record_tab[] IS NOT INITIAL.
LOOP AT record_tab INTO lwa_tmp WHERE string+3(2) = 'DA'.
APPEND lwa_tmp TO lt_tmp.
ENDLOOP.
record_tab[] = lt_tmp[].
ENDIF.
EXIT.
ENDIF.
ENDFUNCTION.
运行展示
只输出物料编码为DA开头的
在AT SELECTION-SCREEN ON VALUE-REQUEST FOR 调用function实现,F4IF_FIELD_VALUE_REQUEST和F4IF_INT_TABLE_VALUE_REQUEST、TR_F4_HELP等
在屏幕的AT SELECTION-SCREEN ON VALUE-REQUEST FOR 事件里可以通过下面几个函数来创建搜索帮助:
**F4IF_FIELD_VALUE_REQUEST:**将表里的字段对应的search help引入到屏幕上来,从而打开对话框。也可以任意指定某个search help。
PARAMETERS p_al(2) TYPE c.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_al.
PERFORM frm_f4_help.
FORM frm_f4_help .
CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST'
EXPORTING
tabname = 'SCARR' "指定stucture,必须的
fieldname = 'CARRID' "指定structure中的field
dynpprog = sy-repid "指定屏幕参数所在的程序名称
dynpnr = sy-dynnr "指定参数所在的屏幕编号
dynprofield = 'P_AL'. "指定屏幕参数的名称
ENDFORM. " FRM_F4_HELP
**F4IF_INT_TABLE_VALUE_REQUEST:**支持自定义内表,但是不能通过指定search help的方式打开对话框。自动填充
TYPES: BEGIN OF type_carrid,
carrid TYPE spfli-carrid,
connid TYPE spfli-connid,
carrname TYPE scarr-carrname,
END OF type_carrid.
DATA itab_carrid TYPE STANDARD TABLE OF type_carrid.
PARAMETERS P_AL(2) TYPE c.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_AL.
PERFORM frm_f4_help.
FORM frm_f4_help .
SELECT carrid carrname
FROM scarr
UP TO 10 ROWS
INTO CORRESPONDING FIELDS OF TABLE itab_carrid.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'CARRID' "指定要返回屏幕参数的在内表中的field
value_org = 'S' "S代表structure
dynpprog = sy-repid "指定屏幕参数所在的程序名称
dynpnr = sy-dynnr "指定参数所在的屏幕编号
dynprofield = 'P_AL' "指定屏幕参数的名称
TABLES
value_tab = itab_carrid "内表
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
ENDFORM. " FRM_F4_HELP
**TR_F4_HELP:**简单实现Search Help,数据来源于内表。无法实现自动填充
TYPES: BEGIN OF type_carrid,
carrid TYPE spfli-carrid,
connid TYPE spfli-connid,
carrname TYPE scarr-carrname,
END OF type_carrid.
DATA:itab_carrid TYPE STANDARD TABLE OF type_carrid,
wa_carrid TYPE type_carrid.
PARAMETERS P_1 TYPE CHAR10.
PARAMETERS P_AL(2) TYPE c.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_AL..
PERFORM frm_f4_help.
FORM frm_f4_help .
SELECT carrid carrname
FROM scarr
UP TO 10 ROWS
INTO CORRESPONDING FIELDS OF TABLE itab_carrid WHERE carrid LIKE 'B%' .
TYPES:BEGIN OF STR4_SEL_LINE,
LINE_NO TYPE I,
END OF STR4_SEL_LINE.
TYPES: STR4_SEL_LINES TYPE STR4_SEL_LINE OCCURS 0.
DATA:ld_ev_ext_display_selected TYPE TRPARI-FLAG,
ld_ev_other_view_selected TYPE TRPARI-FLAG .
DATA:l_index_1st LIKE sy-index VALUE '2',
l_index_sel like sy-index,
l_lines TYPE STR4_SEL_LINES.
CALL FUNCTION 'TR_F4_HELP' "General F4 help (with single/multiple selection)
EXPORTING
iv_title = '对话窗口标题' " 对话窗口标题
is_sel_title1 = '列表标题行首行' " 列表标题行首行
is_sel_title2 = '列表标题行第二行' " 列表标题行第二行
iv_start_column = 0 " sy-cucol 对话框起始的列
iv_start_row = 0 " sy-curow 对话框开始的行
iv_number_of_rows = 10 " sy-tabix 对话框行数(高)
iv_no_of_key_columns = 2 " sy-tabix 内表中关键字段的个数
iv_width_of_titles = 'X' "trpari-flag 输出宽度是否要考虑标题长度(自适应宽度)
iv_without_selection = '' "trpari-flag 去除选择选项 without selection option
iv_multiple_selection = 'X' "trpari-flag 具备多选功能
iv_with_sort_icon = 'X' "trpari-flag 具备排序按钮
iv_with_printer_icon = 'X' " trpari-flag 具备打印按钮
iv_with_filter_icon = 'X' " trpari-flag 具备过滤器按钮
iv_with_search_icon = 'X' " trpari-flag 具备查找按钮
* iv_with_other_view_icon = ' ' " trpari-flag 具备其他视图按钮
iv_extended_display = '' " trpari-flag X = 可以显示细节 具备扩展显示按钮
iv_show_also_1 = 'X' " trpari-flag 即使查询内表只有一个条目,也显示对话列表
* IMPORTING
* ev_ext_display_selected = ld_ev_ext_display_selected " trpari-flag 'X': Detail display requested
* ev_other_view_selected = ld_ev_other_view_selected " trpari-flag
TABLES
it_sel_table = itab_carrid "结果内表
CHANGING
cv_first_index = l_index_1st " sy-tabix 打开时默认跳转到指定行的索引数 l_index_1st = 2
cv_selected_index = l_index_sel " sy-tabix 单选或多选时选中的第一行的行数
ct_sel_lines = l_lines " str4_sel_lines 多选时启用:选中的行每一行在内表中的行数
EXCEPTIONS
NO_LINES = 1 " Do not transfer line
NO_LINE_PICKED = 2 " No line selected
.
"如果用户选择了数据
IF sy-subrc = 0.
READ TABLE itab_carrid INTO wa_carrid INDEX l_index_sel."读取用户选中的命中清单中的记录
p_al = wa_carrid-carrid.
*
* "若非F4字段,就不能直接采用上面赋值方式来更新,要使用DYNP_VALUES_UPDATE函数
* dynpfields-fieldname = 'P_AL'.
* dynpfields-fieldvalue = wa_carrid-carrid.
* APPEND dynpfields .
*
* CALL FUNCTION 'DYNP_VALUES_UPDATE'
* EXPORTING
* dyname = sy-repid
* dynumb = sy-dynnr
* TABLES
* dynpfields = dynpfields.
ENDIF.
ENDFORM.
1、在se11已经存在建立好的search help的情况下我们通常使用第一个function module,在需要给某个字段限定一些特殊值的时候,我们通常使用第2种function module.
2、在POV(包括选择屏幕上 AT SELECTION-SCREEN ON VALUE-REQUEST事件)事件中,屏幕上的字段的值不像PAI里那样可以直接读取到,所以使用以下两个函数来读写:DYNP_VALUES_READ、DYNP_VALUES_UPDATE。通常多个选项之间有联动时用到。
POV(PROCESS ON VALUE-REQUEST)
在POV的module方法里通过调用函数实现,和AT SELECTION-SCREEN ON VALUE-REQUEST类似
二、报表搜索帮助
ALV搜索帮助
(1)如果ALV中的需要搜索帮助的字段所在的表有提供搜索帮助,例如:MKAL-MATNR,其中的搜索帮助是参考MARA表的MATNR,而且还带有自动检查编码是否合法的功能,那么我们就可以在设置fieldecat的时候针对字段设置:
WA_FIELDCAT-REF_FIELD = 'MKAL'.
WA_FIELDCAT-REF_TABLE = 'MATNR'.
自建表也可以通过设置fieldecat配置搜索帮助,前提是自建表的字段通过se11创建或domain设置了搜索帮助
(3为alv创建搜索帮助事件,然后注册事件,最后实现事件,步骤如下: