标准程序选择屏幕的搜索帮助增强

标准程序选择屏幕的搜索帮助增强

最近遇到一个问题,用标准事务代码PA20/30/40查询员工编号的时候,如果根据姓名查询可能会查到很多同名的员工(如下图)
员工号的F4搜索帮助

而且只有编号和日期信息并不能确定自己要查询的员工编号,需要添加部门和岗位或者其他信息用来区分。

在这里插入图片描述

通过查看字段的技术信息可以看到他所引用的搜索帮助集合,在这里插入图片描述
里面包含了很多基本的搜索帮助,这里我们通过上面的 转到 -> 附加搜索帮助 添加一个自定义的搜索帮助 ZH_APPEND_PERNR

在附加搜索帮助里面新建一个基本搜索帮助
在这里插入图片描述

填好需要具体展示的字段信息,并控制选择字段和输出字段,

在这里插入图片描述

通过函数 ZF4IF_SHLP_EXIT_PERNR 作为搜索帮助的输出( 这里SAP会预留一个 函数模板 F4IF_SHLP_EXIT_EXAMPLE ,直接复制一个新的函数出来在里面修改就可以 ),每一个step都有详细的说明,大家可以试着研究一下,这里我们在 callcontrol-step = ‘SELECT’ 下做取数逻辑,成功之后直接 callcontrol-step = ‘DISP’ 展示数据,否则直接 callcontrol-step = ‘EXIT’ 退出就可以。
附上代码:
FUNCTION zf4if_shlp_exit_pernr.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  TABLES
*"      SHLP_TAB TYPE  SHLP_DESCT
*"      RECORD_TAB STRUCTURE  SEAHLPRES
*"  CHANGING
*"     VALUE(SHLP) TYPE  SHLP_DESCR
*"     VALUE(CALLCONTROL) LIKE  DDSHF4CTRL STRUCTURE  DDSHF4CTRL
*"----------------------------------------------------------------------

  DATA:rc TYPE i.

  IF callcontrol-step = 'PRESEL1'.
    callcontrol-no_maxdisp = 'X'.
    EXIT.
  ENDIF.

* 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'.
    "检查选择条件是否为空,如果为空直接退出,否则会取出表所有的数据
    CHECK shlp-selopt IS NOT INITIAL.

    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.
    EXIT.
  ENDIF.
ENDFUNCTION.

FORM step_select TABLES     pt_record_tab STRUCTURE seahlpres
                            pt_shlp_tab    TYPE shlp_desct
                CHANGING    ps_shlp        TYPE shlp_descr
                            ps_callcontrol TYPE ddshf4ctrl
                            pv_subrc       TYPE sy-subrc.

  "这里定义的结构要和建立的基本搜索帮助参数一样
  TYPES:BEGIN OF ty_pernr,
          sname TYPE smnam,      "姓名
          pernr TYPE pernr_d,    "人员编号
          plstx TYPE plstx,      "职位
          orgtx TYPE orgtx,      "组织单位
          begda TYPE begda,      "开始日期
          endda TYPE endda,      "结束日期
          gbdat TYPE gbdat,      "出生日期
        END OF ty_pernr.

  DATA:ls_selopt TYPE ddshselopt,
       lr_sname  TYPE RANGE OF smnam WITH HEADER LINE,
       lt_pernr  TYPE STANDARD TABLE OF ty_pernr.

  "取出屏幕的筛选条件,
  LOOP AT ps_shlp-selopt INTO ls_selopt.
    CASE ls_selopt-shlpfield.
      WHEN 'SNAME'.
        lr_sname-sign   = ls_selopt-sign.
        lr_sname-option = ls_selopt-option.
        lr_sname-low    = ls_selopt-low.
        lr_sname-high   = ls_selopt-high.
        APPEND lr_sname.
      WHEN OTHERS.
    ENDCASE.
  ENDLOOP.

  "取数
  SELECT a~pernr,a~sname,
         b~begda,b~endda,b~gbdat,
         c~orgtx,d~plstx
    FROM pa0001 AS a
    INNER JOIN pa0002 AS b ON b~pernr = a~pernr
    LEFT JOIN t527x AS c ON c~orgeh = a~orgeh AND c~sprsl = @sy-langu
    LEFT JOIN t528t AS d ON d~plans = a~plans AND d~sprsl = @sy-langu
    INTO CORRESPONDING FIELDS OF TABLE @lt_pernr
    WHERE sname IN @lr_sname.


  SORT lt_pernr BY pernr.
  DELETE ADJACENT DUPLICATES FROM lt_pernr COMPARING pernr.
*
  CALL FUNCTION 'F4UT_RESULTS_MAP'
    TABLES
      shlp_tab          = pt_shlp_tab
      record_tab        = pt_record_tab
      source_tab        = lt_pernr
    CHANGING
      shlp              = ps_shlp
      callcontrol       = ps_callcontrol
    EXCEPTIONS
      illegal_structure = 1
      OTHERS            = 2.
  IF sy-subrc <> 0.
    pv_subrc = sy-subrc.
  ELSE.
    pv_subrc = sy-subrc.
  ENDIF.

ENDFORM.
最后还要分配一下附加的搜索帮助和基本的搜索帮助,两个都要分配,不分配的话双击搜索出来的员工编号无法带到屏幕中

在这里插入图片描述

最后的效果是 搜索帮助多了一个我们自定义的页签,通过姓名搜索带出员工的部门和岗位信息

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值