标准程序选择屏幕的搜索帮助增强
最近遇到一个问题,用标准事务代码PA20/30/40查询员工编号的时候,如果根据姓名查询可能会查到很多同名的员工(如下图)
而且只有编号和日期信息并不能确定自己要查询的员工编号,需要添加部门和岗位或者其他信息用来区分。
通过查看字段的技术信息可以看到他所引用的搜索帮助集合,![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/77ff911b08bf98013924c790247661a3.png)
里面包含了很多基本的搜索帮助,这里我们通过上面的 转到 -> 附加搜索帮助 添加一个自定义的搜索帮助 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.