[SAP ABAP开发技术总结]搜索帮助Search Help (F4)
12.10. Search help ( F4 )
12.10.1. VALUE CHECK 、 fixed Values 、 Value Table
PARAMETERS p_1 TYPE zmy_dm_200 VALUE CHECK . " 注: SELECT-OPTIONS 没有此选项
如果选择屏幕字段参考数据元素所对应的 Domaim 设置了 固定值 ( fixed Values )或 值表 ( Value Table )时,使用 VALUE CHECK 选项后,会验证输入值是否在固定值或值表( 若要使值表检查生效 ,则首先需要将此 Domain 引用到表字段,再对此表字段通过 按钮进行外键分配,并且外键一定是来自的值表的主键,最后使用 PARAMETERS 定义屏幕参数时要参照此表字段,否则如果只是直接参照所对应的 DataElement 是不起作用, 即 Value Table 一定要经过转换为 Check Table 后再起作用 )范围之内
注: 如果要使用 VALUE CHECK 选项,则 Domain 的类型只能是 C 或者 N 类型 , 否则运行会抛异常。另外, 如果未使用该选项,但 F4 Help 还是会出现 (有固定值或检查表的情况下),但不进行有效性检查了
12.10.2. 检查表 Check Table --- Value Table
也可以在 Domain 中指定一个值表( Value Table )作为字段取值范围的限制,但是与指定 固定值 的方式不同的是:为一个 Domain 简单地指定一个取值表不会导致用户的输入被自动校验,也不会自动出现 F4 Help 。 只有 通过表外键 按钮将该 Value Table 指定为主表之后,一个值表才能真正成为 Check Table 。所以要想成为真正有效的 Check Table ,必须要做两个操作:
一是 要为字段对应的 Domain 设置 Value Table (即主表 ,其实这一步不是必须的,在通过 按钮指定主表时,可以不用指定为字段所参照的元素所对应 Domain 所设置的 Value Table ,而是指定其他的主表也是可以的—— 但最好不要这样做 , Value Check 时会出其他问题) ,二是 要为表字段通过 为它设置外键 。
12.10.3. SE11 检查表与搜索帮助 关系
当某个表字段有检查表,并且又有搜索帮助,则 数据一般来自源于检查表 ,而 F4 的 输入输出则由搜索帮助来决定 !
PARAMETERS p_carid TYPE sbook - carrid VALUE CHECK .
PARAMETERS
p_cuter
TYPE
sbook
-
counter
VALUE CHECK
.
命中清单中的 ID 列即 CARRID 背景色不是蓝色,所以选择一条时,不会自动填充屏幕字段 P_CARID , 原因是对应的 Search Help 中的 CARRID 参数对应的 EXP 没有打上钩:
如果将这个钩打上,则会相应列背景色会为蓝色,且会自动填充, 达到联动效果 。
一般 当某个外键所参照主表的主键上如果设置了搜索帮助 (如上面 COUNTER 外键所引用的主表主键字段 SCOUNTER-COUNTNUM 已分配搜索帮助“ SCOUNTER_CARRIER_AIRPORT ”: ), 则这个主表主键上的搜帮助会自动带到从表中相应外键上来 ,请看上面的 SBOOK-COUNTER 外键字段的搜索帮助也为“ SCOUNTER_CARRIER_AIRPORT ”,该搜索帮助 决定了整个 F4 Help 处理及显示过程 (如哪些列将作为联动查询条件、哪些列将显示在 F4 列表中、 F4 列表中的哪些列会输出到相应屏幕字段中)。另外,虽然主表主键上的搜索帮助会带到相应外键上来,但带过来后还可以修改,比如上面示例中带过来的搜索帮助中, CARRID 参数所对应的 EXP 没有钩上,所以不能使用命中清单中的 ID 列来自动填充示例中的屏幕字段 P_CARID ,所以我们可以新建一个搜索帮助,并将 CARRID 搜索参数所对应的 EXP 钩上,则可达到自动上屏幕的效果;
另外, 有些外键所参照的主表主键没有指定搜索帮助 ,此时参照从表的屏幕字段的 F4 Help 就只有简单的一列了 (如何让检查表 SCURX 中的 CURRDEC 字段也显示出来,请看后面的 F4 搜索帮助联动的决定因素 ),如下面 SBOOK-LOCCURKEY 字段:
PARAMETERS p_cur TYPE sbook - LOCCURKEY VALUE CHECK .
12.10.4. F4 搜索帮助联动的决定因素
上节 SE11 检查表与搜索帮助关系 中,屏幕字段参考 sbook - LOCCURKEY 时,搜索帮助输出列表只有简单一列,如果要让主表中的 SCURX - CURRDEC 列也显示出来,则需要为 sbook - LOCCURKEY 字段绑定一个搜索帮助,该搜索帮助数据来源于主表(或检查表) SCURX ,搜索参数包括 CURRKEY 、 CURRDEC 两列,并且让这两列在 F4 输出列表中显示(即在搜索参数“列表”栏位编号):
由于 SBOOK 不能直接修改, ZSBOOK 从 SBOOK 拷贝过来,将搜索帮助 ZSCURX_JZJ 绑定到 ZSBOOK- LOCCURKEY :
PARAMETERS p_cur TYPE zsbook - LOCCURKEY VALUE CHECK .
上面检查表中的 SCURX-CURRDEC 列(即 F4 中的小数位)已显示来了,但如何让其背景色为蓝色( 虽然上面已将搜索参数 CURRDEC 的 EXP 打上了钩,但底色还是白色的 ),即选择时自动填充到屏幕上去?由于上面在将搜索帮助 ZSCURX_JZJ 绑定到从表字段 zsbook - LOCCURKEY 字段上时,搜索帮助中的搜索参数 CURRDEC (即主表中的字段 SCURX- CURRDEC )在从表 ZSBOOK 找不到相应的外键,所以上图绑定过程中,搜索参数 CURRDEC 为空。但在这里可以手动分配一个,由于在从表 ZSBOOK 中找不到此字段,所以就暂时参照自己 ( 主表 SCURX-CURRDEC) 吧:
如果此时选择屏幕的代码还是上面那样:
PARAMETERS
p_cur
TYPE
zsbook
-
LOCCURKEY
VALUE CHECK
.
则 F4 搜索输出列表中的“小数位”列底色还是白色,但如果 加上 以下屏幕参数,但会变以蓝色,并可联动( 如果搜索帮助的 CURRDEC 参数的 IMP 打上钩,还可以实现联动查询 ):
PARAMETERS p_cur2 TYPE SCURX-CURRDEC VALUE CHECK
此时的下拉框也会只有两列:
PARAMETERS p_cur3 TYPE zsbook - LOCCURKEY as LISTBOX VISIBLE LENGTH 20 .
所以,联动的决定性条件是要求选择屏幕上的字段要参照 SE11 为表字段所绑定搜索帮助过程中 所分配的表字段 ,如下图中的 zsbook-loccurkey 、 scurx-currdec ,这两个字段分别与搜索帮助的 CURRKEY 、 CURRDEC 参数绑定了,所以屏幕上参照这两个表字段时,就会具有联动效果了:
12.11. 搜索帮助参数说明
2 IMP :输入参数。表示屏幕上相应字段是否作为搜索帮助的过滤条件(即 报表选择屏幕上的字段的值是否从报表选择屏幕上传递到搜索帮助中去 )
如果是 F4 字段时,屏幕字段中的值包含“ * ”时,才会将 F4 字段传递到 Search Help 中。除开 F4 屏幕字段外,而其他只要是 Link 到了相应的 Search Help 参数的屏幕字段,只要相应屏幕字段中有值,则会传入到搜索中作为过滤条件(而其他非 F4 屏幕字段所对应的 Help 参数不管是否钩上 IMP 都会传递 ? )
2 EXP :输出参数,表示 搜索帮助的此列会从搜索帮助中传递到报表选择屏幕 上(表示 F4 选中一条记录后显示到屏幕上文本框中的值——背景字段为浅蓝色的列的数据会被输出,输出的数据可能是多列。注: 只有当 EXP 钩上且相应字段出现在了屏幕上 ,才会自动填充到相应屏幕字段,如果没有钩上——没钩上的字段背景色为白色,即使相应参数字段出现在了屏幕上,选择命中清单时也不会自动填充),且 F4 字段一定要将 EXP 钩上 (否则选择后 F4 字段不能上屏) 。
2 LPOS (列表): F4 输出 命中清单中各列的显示顺序 ,如果为 0 或留空的列则不会显示
2 SPOS :相应的字段是否在搜索帮助 选择屏幕上显示出来 ,在命中清单显示之前,如果弹出限制对话框,则可以进一步修改那些从选择屏幕上带过来的条件值。此数字就是限制搜索帮助选择条件屏幕字段摆放顺序,如果为 0 或留空的列则不会出在限制条件页中
2 SDis :如果勾选了,则在弹出的限制对话框中对应的字段用户 不可输入 ,是只读的。
12.12. F4IF_SHLP_EXIT_EXAMPLE 帮助出口
12.12.1. 修改数据源
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
,
wbstk
TYPE
wbstk
,
lfdat
TYPE
lfdat_v
,
vbeln
TYPE
vbeln_vl
,
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
,
wa_selopt
LIKE LINE OF
shlp
-
selopt
.
"
"callcontrol-step
该字段的值是由系统设置,并且你可以在程序中进行修改它。出口函数会在处理的每一步(时间点)都会调用一次
IF
callcontrol
-
step
=
'SELECT'
.
"
如果有弹出限制对话框,则会在弹出限制对话框中点击确认按钮后
step
值才为
SELECT
"shlp-selopt
存储的是经过映射转换后选择屏幕上字段的值,而不是直接为
"
选择屏幕字段名,而是转映射为
Help
参数名后再存储到
selopt
内表中,
"
屏幕字段到
Help
参数映射是通过
shlp-interface
来映射的
LOOP AT
shlp
-
selopt
INTO
wa_selopt
.
CASE
wa_selopt
-
shlpfield
.
WHEN
'VBELN'
.
"
由于屏幕字段已映射为了
Help
相应参数,所以这里不是
S_VBELN
MOVE-CORRESPONDING
wa_selopt
TO
r_vbeln
.
APPEND
r_vbeln
.
WHEN
'LFDAT'
.
MOVE-CORRESPONDING
wa_selopt
TO
r_lfdat
.
APPEND
r_lfdat
.
WHEN
'WBSTK'
.
MOVE-CORRESPONDING
wa_selopt
TO
r_wbstk
.
APPEND
r_wbstk
.
ENDCASE
.
ENDLOOP
.
"
根据屏幕上传进的条件查询数据
SELECT
likp
~
vbeln likp
~
lfdat vbuk
~
wbstk
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
.
"
该函数的作用是将内表
lt_tab
中的数据转换成
record_tab
,即将某内表中的数据显示在命中清单中
CALL FUNCTION
'F4UT_RESULTS_MAP'
TABLES
shlp_tab
=
shlp_tab
record_tab
=
record_tab
source_tab
=
lt_tab
CHANGING
shlp
=
shlp
callcontrol
=
callcontrol
.
"
注:下一个时间点一定要直接设置为
DISP
,否则命中清单不会有值,也不显示出来
"
从表面上看,
SELECT
时间点下一个就是
DISP
时间点,按理是不需要设置为
DISP
,
"
但如果不设置为
DISP
,出口函数在执行完后,系统会转入
DISP
时间点执行(即再次调用此出口函数)
"
,但再次进入此出口函数时,
record_tab
内表已经被清空了(是否可以通过判断
callcontrol-step
的值来决定走什么新的逻辑代码来解决此问题?)。如果这里直接设置为
DISP
,就好比欺骗了系统一样,告诉系统当前执行的正是
DISP
时间点,而不是
SELECT
,系统就不会再转到
DISP
时间点了而是直接显示
callcontrol
-
step
=
'DISP'
.
"DISP
:
在命中清单显示之前调用
,表示数据已经查出,下一步就该显示了。该时间用于控制搜索帮助的输出结果。例如,在输出搜索结果时对用户检查权限,删除未授权的数据
ENDIF
.
ENDFUNCTION
.
12.12.2. 删除重复
FUNCTION
zeh_lxsecond
.
IF
callcontrol
-
step
=
'DISP'
.
SORT
RECORD_TAB
.
DELETE ADJACENT DUPLICATES FROM
RECORD_TAB
COMPARING ALL FIELDS
.
"zsecond.
EXIT
.
ENDIF
.
ENDFUNCTION
.
12.13. 搜索帮助优先级
先 P ROCESS O N V ALUE-REQUEST , AT SELECTION-SCREEN ON VALUE-REQUEST
再 PARAMETERS/ SELECT-OPTIONS MATCHCODE OBJECT
先 检查表 Check Table ,再 表 (或 结构 ) 字段是否 绑定 了 搜索帮助
先 data element 是否 绑定 了 帮助 ,再 domain 是否存在 fixed values
最后才是 DATS 、 TIMS
Domain 只设置 Value Table 也可以出 F4 ,同时 Data Element 绑定了搜索帮助,则 DataElement 上绑定的搜索帮助优先于 Domain 上的 Value Table????????
12.14. 搜索帮助创建函数
在屏幕的 ON VALUE-REQUEST 事件里可以通过下面几个函数来创建搜索帮助:
F4IF_ FIELD _VALUE_REQUEST : 函数的作用是在运行时,可以 动态 的为某个屏幕字段 指定 Search Help ,这个被引用的 Help 来自某个表(或结构)字段上绑定的 Help
F4IF_ INT_TABLE _VALUE_REQUEST : 在程序运行时, 将某个内表动态的用作 Search help 的数据来源 ,即使用该函数可以将某个内表转换为 Search help ,可实现联动效果
TR_F4_HELP : 简单实现 Search Help ,数据来源于内表