导语:最近接到一个需求,关于KS03中,成本中心的搜索帮助增强,标准的搜索帮助过于死板了,用户希望在搜索帮助界面先过滤一次数据,只看未冻结的成本中心数据,下面分享一下实现过程。
一、效果展示
二、增强搜索帮助字段
找到了需要增强的搜索帮助是【KOST】,这是个集中检索搜索帮助,最终需要调整的是包含搜索帮助【KOSTN】。
在参数处增加需要增强的字段,我这里是冻结标识,并给了默认值,参照【F4IF_SHLP_EXIT_EXAMPLE】,创建一个新函数【F4IF_SHLP_EXIT_EXAMPLE_KOSTN】。
函数【F4IF_SHLP_EXIT_EXAMPLE_KOSTN】
FUNCTION f4if_shlp_exit_example_kostn.
*"--------------------------------------------------------------------
*"*"局部接口:
*" TABLES
*" SHLP_TAB TYPE SHLP_DESCT
*" RECORD_TAB STRUCTURE SEAHLPRES
*" CHANGING
*" VALUE(SHLP) TYPE SHLP_DESCR
*" VALUE(CALLCONTROL) LIKE DDSHF4CTRL STRUCTURE DDSHF4CTRL
*"--------------------------------------------------------------------
* 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.
DATA : rc TYPE sy-subrc.
IF callcontrol-step = 'SELECT'.
PERFORM step_select_kostn 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.
*----------------------------------------------------------------------*
***INCLUDE LZFG_01F01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form step_select_kostn
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> RECORD_TAB
*& --> SHLP_TAB
*& <-- SHLP
*& <-- CALLCONTROL
*& <-- RC
*&---------------------------------------------------------------------*
FORM step_select_kostn TABLES pt_record_tab STRUCTURE seahlpres
pt_shlp_tab TYPE shlp_desct
CHANGING cs_shlp TYPE shlp_descr
cs_callcontrol TYPE ddshf4ctrl
cv_rc TYPE sy-subrc.
DATA:BEGIN OF gs_data,
kostl TYPE csks-kostl,
kokrs TYPE csks-kokrs,
bukrs TYPE csks-bukrs,
kosar TYPE csks-kosar,
verak TYPE csks-verak,
verak_user TYPE csks-verak_user,
mctxt TYPE cskt-mctxt,
spras TYPE cskt-spras,
datab TYPE csks-datab,
datbi TYPE csks-datbi,
bkzkp TYPE csks-bkzkp,
pkzkp TYPE csks-pkzkp,
pkzks TYPE csks-pkzks,
bkzks TYPE csks-bkzks,
bkzer TYPE csks-bkzer,
pkzer TYPE csks-pkzer,
END OF gs_data.
DATA gt_data LIKE TABLE OF gs_data.
DATA:lw_selopt TYPE ddshselopt,
lr_kostl TYPE RANGE OF csks-kostl,
lr_kokrs TYPE RANGE OF csks-kokrs,
lr_bukrs TYPE RANGE OF csks-bukrs,
lr_kosar TYPE RANGE OF csks-kosar,
lr_verak TYPE RANGE OF csks-verak,
lr_verak_user TYPE RANGE OF csks-verak_user,
lr_mctxt TYPE RANGE OF cskt-mctxt,
lr_spras TYPE RANGE OF cskt-spras,
lr_bkzkp TYPE RANGE OF csks-bkzkp.
DATA : lw_kostl LIKE LINE OF lr_kostl,
lw_kokrs LIKE LINE OF lr_kokrs,
lw_bukrs LIKE LINE OF lr_bukrs,
lw_kosar LIKE LINE OF lr_kosar,
lw_verak LIKE LINE OF lr_verak,
lw_verak_user LIKE LINE OF lr_verak_user,
lw_mctxt LIKE LINE OF lr_mctxt,
lw_spras LIKE LINE OF lr_spras,
lw_bkzkp LIKE LINE OF lr_bkzkp.
LOOP AT cs_shlp-selopt INTO lw_selopt.
CASE lw_selopt-shlpfield.
WHEN 'KOSTL'.
CLEAR lr_kostl.
lw_kostl-sign = lw_selopt-sign.
lw_kostl-option = lw_selopt-option.
lw_kostl-low = lw_selopt-low.
lw_kostl-high = lw_selopt-high.
APPEND lw_kostl TO lr_kostl.
WHEN 'KOKRS'.
lw_kokrs-sign = lw_selopt-sign.
lw_kokrs-option = lw_selopt-option.
lw_kokrs-low = lw_selopt-low.
lw_kokrs-high = lw_selopt-high.
APPEND lw_kokrs TO lr_kokrs.
WHEN 'BUKRS'.
lw_bukrs-sign = lw_selopt-sign.
lw_bukrs-option = lw_selopt-option.
lw_bukrs-low = lw_selopt-low.
lw_bukrs-high = lw_selopt-high.
APPEND lw_bukrs TO lr_bukrs.
WHEN 'KOSAR'.
lw_kosar-sign = lw_selopt-sign.
lw_kosar-option = lw_selopt-option.
lw_kosar-low = lw_selopt-low.
lw_kosar-high = lw_selopt-high.
APPEND lw_kosar TO lr_kosar.
WHEN 'VERAK'.
lw_verak-sign = lw_selopt-sign.
lw_verak-option = lw_selopt-option.
lw_verak-low = lw_selopt-low.
lw_verak-high = lw_selopt-high.
APPEND lw_verak TO lr_verak.
WHEN 'VERAK_USER'.
lw_verak_user-sign = lw_selopt-sign.
lw_verak_user-option = lw_selopt-option.
lw_verak_user-low = lw_selopt-low.
lw_verak_user-high = lw_selopt-high.
APPEND lw_verak_user TO lr_verak_user.
WHEN 'MCTXT'.
lw_mctxt-sign = lw_selopt-sign.
lw_mctxt-option = lw_selopt-option.
lw_mctxt-low = lw_selopt-low.
lw_mctxt-high = lw_selopt-high.
APPEND lw_mctxt TO lr_mctxt.
WHEN 'SPRAS'.
lw_spras-sign = lw_selopt-sign.
lw_spras-option = lw_selopt-option.
lw_spras-low = lw_selopt-low.
lw_spras-high = lw_selopt-high.
APPEND lw_spras TO lr_spras.
WHEN 'BKZKP'.
lw_bkzkp-sign = lw_selopt-sign.
lw_bkzkp-option = lw_selopt-option.
lw_bkzkp-low = lw_selopt-low.
lw_bkzkp-high = lw_selopt-high.
APPEND lw_bkzkp TO lr_bkzkp.
ENDCASE.
ENDLOOP.
SELECT
a~kostl
a~kokrs
a~bukrs
a~kosar
a~verak
a~verak_user
b~mctxt
b~spras
a~datab
a~datbi
FROM csks AS a
INNER JOIN cskt AS b ON a~kokrs = b~kokrs AND a~kostl = b~kostl AND a~datbi = b~datbi
INTO TABLE gt_data
WHERE a~kostl IN lr_kostl
AND a~kokrs IN lr_kokrs
AND a~bukrs IN lr_bukrs
AND a~kosar IN lr_kosar
AND a~verak IN lr_verak
AND a~verak_user IN lr_verak_user
AND b~mctxt IN lr_mctxt
AND b~spras IN lr_spras
AND a~bkzkp IN lr_bkzkp.
CALL FUNCTION 'F4UT_RESULTS_MAP'
TABLES
shlp_tab = pt_shlp_tab
record_tab = pt_record_tab
source_tab = gt_data
CHANGING
shlp = cs_shlp
callcontrol = cs_callcontrol
EXCEPTIONS
illegal_structure = 1
OTHERS = 2.
IF sy-subrc <> 0.
cv_rc = sy-subrc.
ELSE.
cv_rc = sy-subrc.
ENDIF.
ENDFORM.
完成以上步骤就可以实现增强搜索帮助了。
作者:小飞猪猪猪猪猪猪猪–CSDN