转载自:http://www.cnblogs.com/caizjian/p/3712804.html
SAP提供了预定义函数F4IF_SHLP_EXIT_EXAMPLE,创建搜索帮助。
1.
2.
复制SAP的预定义函数F4IF_SHLP_EXIT_EXAMPLE创建函数ZFVBELN_FIND_EXIT
参数和预定义函数一致,这里我们调用‘SELECT’这个时间点来进行数据的查询输出,自定义的帮助出口函数中的具体代码如下:
FUNCTION zfvbeln_find_exit.
*"----------------------------------------------------------------------
*"*"Local interface:
*" TABLES
*" SHLP_TAB TYPE SHLP_DESCT
*" RECORD_TAB STRUCTURE SEAHLPRES
*" CHANGING
*" VALUE(SHLP) TYPE SHLP_DESCR
*" VALUE(CALLCONTROL) LIKE DDSHF4CTRL STRUCTURE DDSHF4CTRL
*"----------------------------------------------------------------------
DATA:BEGIN OF lt_tab OCCURS 0,
vbeln TYPE vbeln_vl,
lfdat TYPE lfdat_v,
wbstk TYPE wbstk,
END OF lt_tab.
DATA:r_vbeln TYPE RANGE OF vbeln_vl WITH HEADER LINE,
r_lfdat TYPE RANGE OF lfdat_v WITH HEADER LINE,
r_wbstk TYPE RANGE OF wbstk WITH HEADER LINE,
ddshselops TYPE ddshselopt.
IF callcontrol-step = 'SELECT'.
LOOP AT shlp-selopt INTO ddshselops.
CASE ddshselops-shlpfield.
WHEN 'VBELN'.
MOVE-CORRESPONDING ddshselops TO r_vbeln.
APPEND r_vbeln.
WHEN 'LFDAT'.
MOVE-CORRESPONDING ddshselops TO r_lfdat.
APPEND r_lfdat.
WHEN 'WBSTK'.
MOVE-CORRESPONDING ddshselops TO r_wbstk.
APPEND r_wbstk.
ENDCASE.
ENDLOOP.
*根据输入参数查询数据
SELECT likp~vbeln likp~lfdat INTO CORRESPONDING FIELDS OF TABLE lt_tab FROM likp
INNER JOIN vbuk
ON likp~vbeln = vbuk~vbeln
WHERE likp~vbeln IN r_vbeln
AND likp~lfdat IN r_lfdat
AND vbuk~wbstk IN r_wbstk.
*将查询结果回执到屏幕上来
CALL FUNCTION 'F4UT_RESULTS_MAP'
* EXPORTING
* SOURCE_STRUCTURE =
* APPLY_RESTRICTIONS = ' '
TABLES
shlp_tab = SHLP_TAB
record_tab = RECORD_TAB
source_tab = LT_TAB
changing
shlp = SHLP
callcontrol = CALLCONTROL
EXCEPTIONS
ILLEGAL_STRUCTURE = 1
OTHERS = 2
.
IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
*下一个时间点直接转到DISP,否则无法再屏幕上显示帮助列表
callcontrol-step = 'DISP'. ""
ENDIF.
ENDFUNCTION.
激活函数和搜索帮助,允许测试搜索帮助结果如下:
如果需要过滤掉重复项,对内表LT_TAB 进行排序过滤操作。
——————————————————————————————————————————
参考上述方法,实现重复项过滤
——————————————————————————————————————————
FUNCTION zsd_r011_f4if_zztzd.
*"----------------------------------------------------------------------
*"*"本地接口:
*" TABLES
*" SHLP_TAB TYPE SHLP_DESCT
*" RECORD_TAB STRUCTURE SEAHLPRES
*" CHANGING
*" VALUE(SHLP) TYPE SHLP_DESCR
*" VALUE(CALLCONTROL) LIKE DDSHF4CTRL STRUCTURE DDSHF4CTRL
*"----------------------------------------------------------------------
*Copy from fm F4IF_SHLP_EXIT_EXAMPLE
*
**********************************************************************
RANGES: ra_zztzd FOR ztsd006-zztzd.
CHECK callcontrol-step = 'SELECT'.
LOOP AT shlp-selopt INTO DATA(ls_selopt).
CASE ls_selopt-shlpfield.
WHEN 'ZZTZD'.
ra_zztzd = CORRESPONDING #( ls_selopt ).
APPEND ra_zztzd.
WHEN OTHERS.
ENDCASE.
ENDLOOP.
*根据输入参数查询数据
SELECT
zztzd
INTO TABLE @DATA(lt_ztsd006)
FROM ztsd006
WHERE zztzd IN @ra_zztzd.
SORT lt_ztsd006 BY zztzd.
DELETE ADJACENT DUPLICATES FROM lt_ztsd006 COMPARING zztzd.
*将查询结果回执到屏幕上来
CALL FUNCTION 'F4UT_RESULTS_MAP'
TABLES
shlp_tab = shlp_tab
record_tab = record_tab
source_tab = lt_ztsd006
CHANGING
shlp = shlp
callcontrol = callcontrol
EXCEPTIONS
illegal_structure = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
*下一个时间点直接转到DISP,否则无法再屏幕上显示帮助列表
callcontrol-step = 'DISP'.
ENDFUNCTION.
根据效果可以发现,实现了重复项过滤