abap 自定义搜索帮助

ABAP 选择屏幕 自定义搜索帮助

物料号为例
如图展示的物料,是不经过自定义搜索帮助处理的,如果我只需要物料描述和物料号,且只限定20开头的物料,就需要用到自定义搜索帮助了

当使用自定义帮助后 效果如下:

代码详解

构建选择屏幕

SELECTION-SCREEN BEGIN OF BLOCK blk1.
  PARAMETERS:
    p_matnr TYPE makt-matnr.
SELECTION-SCREEN END OF BLOCK blk1.

构建自定义帮助

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_matnr. " 
  PERFORM frm_create_matnr_help. " 创建自定义帮助的例程

处理帮助字段

"在屏幕初始化前 构建用户自定义帮助的例程 
INITIALIZATION .
  PERFORM frm_get_matnr_f4.  "创建例程 例程里面是 需要的字段 也就啊是 20 开头的物料以及 物料描述

帮助字段的程逻辑

" 构建全局变量内表
TYPES:BEGIN OF ty_f4,
        matnr TYPE mara-matnr,
        maktx TYPE makt-maktx,
      END OF ty_f4.
      
DATA : gt_f4 TYPE STANDARD TABLE OF ty_f4.

"获取数据的例程
FORM frm_get_matnr_f4.
  SELECT
    from makt
  FIELDS
    makt~matnr,
    makt~maktx
  WHERE right( makt~matnr,8 ) LIKE '20%'
    AND makt~spras eq @sy-langu
  INTO CORRESPONDING FIELDS OF TABLE @gt_f4.  "此处取数逻辑按自己的业务需求来

ENDFORM.

创建自定义帮助

FORM frm_create_matnr_help .
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield        = 'MATNR'     " 参考的表字段
      dynpprog        = sy-repid
      dynpnr          = sy-dynnr
      dynprofield     = 'P_MATNR'  " 用于选择屏幕上的哪一个
      value_org       = 'S'
    TABLES
      value_tab       = gt_f4   " 自定义的表 需要全局变量 一般来说也是通过例程处理的 frm_get_matnr_f4
    EXCEPTIONS
      parameter_error = 1
      no_values_found = 2
      OTHERS          = 3.
ENDFORM.

自定义表头描述

例程代码如下

FORM frm_create_matnr_help .

  DATA: lt_dfies    TYPE TABLE OF dfies,
        lr_tabdescr TYPE REF TO cl_abap_structdescr,
        lv_offset   TYPE DOFFSET.

  READ TABLE gt_f4 INTO DATA(gs_f4) INDEX 1.
  IF sy-subrc EQ 0.

    lr_tabdescr ?= cl_abap_structdescr=>describe_by_data( gs_f4 ).  " ?=  显示向下转换
    lt_dfies = cl_salv_data_descr=>read_structdescr( lr_tabdescr ).  " 获取结构

    LOOP AT lt_dfies ASSIGNING FIELD-SYMBOL(<fs_dfies>).  " 填入相关描述
      <fs_dfies>-lfieldname = <fs_dfies>-fieldname.   
      <fs_dfies>-offset     = lv_offset.
      IF <fs_dfies>-fieldname = 'MATNR'.
        <fs_dfies>-scrtext_l = '测试修改表头描述'.
        <fs_dfies>-scrtext_m = '测试修改表头描述'.
        <fs_dfies>-scrtext_s = '测试修改表头描述'.
        <fs_dfies>-reptext = '测试修改表头描述'.
      ELSEIF <fs_dfies>-fieldname = 'MAKTX'.
        <fs_dfies>-scrtext_l = '测试'.
        <fs_dfies>-scrtext_m = '测试'.
        <fs_dfies>-scrtext_s = '测试'.
        <fs_dfies>-reptext = '测试'.
      ENDIF.
      lv_offset = lv_offset + <fs_dfies>-intlen.
    ENDLOOP.
  ENDIF.

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield        = 'MATNR'     " 参考的表字段
      dynpprog        = sy-repid
      dynpnr          = sy-dynnr
      dynprofield     = 'P_MATNR'  " 用于选择屏幕上的哪一个
      value_org       = 'S'
    TABLES
      value_tab       = gt_f4   " 自定义的表 需要全局变量 一般来说也是通过例程处理的 frm_get_matnr_f4
      field_tab       = lt_dfies  " 表头描述
    EXCEPTIONS
      parameter_error = 1
      no_values_found = 2
      OTHERS          = 3.
ENDFORM.

样例展示

posted @ 2022-09-30 09:58  otowa  阅读(566)  评论(3)    收藏  举报