ABAP-选择屏幕(五) 屏幕搜索帮助


前言

在abap开发中遇到的搜索帮助有两种,一是选择屏幕的搜索帮助,另一种是ALV的搜索帮助。实现方式有很多种,下面我们逐一介绍几种主要实现方式。

  1. 通过域值的固定值 ( fixed Values )或 值表( Value Table )实现的Search help
  2. 通过se11创建搜索帮助(数据元素界面,字段界面)
  3. 搜索帮助出口
  4. 在AT SELECTION-SCREEN ON VALUE-REQUEST FOR 调用function实现,F4IF_FIELD_VALUE_REQUEST和F4IF_INT_TABLE_VALUE_REQUEST、TR_F4_HELP等
  5. 在事件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 。 只有 通过表外键image110按钮将该 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创建搜索帮助事件,然后注册事件,最后实现事件,步骤如下:

  • 4
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
ABAP中,屏幕字段的搜索帮助可以通过使用F4帮助来创建。 首先,我们需要在屏幕字段属性中设置搜索帮助属性为“自带搜索帮助”或“值表搜索帮助”。选择“自带搜索帮助”时,系统会自动提供搜索帮助,而选择值表搜索帮助”时,我们需要在相应的数据库表中定义搜索帮助。 接下来,我们需要在数据元素或的定义中指定搜索帮助。在数据元素定义中,可以使用以下语句来指定搜索帮助: SEARCH HELP search_help_name 或者,在的定义中,可以使用以下语句来指定搜索帮助: SEARCH HELP-DOM search_help_name search_help_name代表搜索帮助的名称,这个名称指向一个已经在ABAP词典中定义的搜索帮助对象。 最后,我们需要在屏幕画面上将屏幕字段与搜索帮助连接起来。在屏幕绘制逻辑中,可以使用以下代码片段来连接搜索帮助: MODULE field_name INPUT. CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST' EXPORTING fieldname = 'FIELD_NAME' tabname = 'INTERNAL_TABLE' TABLES return_tab = lt_return. LOOP AT lt_return INTO ls_return. IF ls_return-fieldname = 'FIELD_NAME'. l_value = ls_return-fieldvalue. ENDIF. ENDLOOP. ENDMODULE. 在上述代码中,'FIELD_NAME'代表屏幕字段的名称,'INTERNAL_TABLE'代表一个内部表,用于存储搜索帮助返回的结果。函数模块F4IF_FIELD_VALUE_REQUEST用于调用搜索帮助,并获取所选中的值。 使用以上步骤,我们可以在ABAP中创建屏幕字段的搜索帮助,以便用户能够在运行时选择合适的值。注意,具体的实现可能因为业务需求和系统架构的不同而有所变化,上述仅为一种常见的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值