[SAP ABAP开发技术总结]搜索帮助Search Help (F4)

时间:2022-03-25 12:57:29
[SAP ABAP开发技术总结]搜索帮助Search Help (F4)
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4265212.html

12.10.

Search help

F4

...

95

12.10.1.

VALUE CHECK

fixed Values

Value Table

.

95

12.10.2.

检查表

Check Table --- Value Table

.

96

12.10.3.

SE11

检查表与搜索帮助关系

...

96

12.10.4.

F4

搜索帮助联动的决定因素

...

98

12.11.

搜索帮助参数说明

...

100

12.12.

F4IF_SHLP_EXIT_EXAMPLE

帮助出口

...

102

12.12.1.

修改数据源

...

102

12.12.2.

删除重复

...

103

12.13.

搜索帮助优先级

...

103

12.14.

搜索帮助创建函数

...

103

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

引用到表字段,再对此表字段通过

[SAP ABAP开发技术总结]搜索帮助Search Help (F4)

按钮进行外键分配,并且外键一定是来自的值表的主键,最后使用

PARAMETERS

定义屏幕参数时要参照此表字段,否则如果只是直接参照所对应的

DataElement

是不起作用,


Value Table


一定要经过转换为

Check Table


后再起作用

)范围之内

注:

如果要使用

VALUE CHECK

选项,则

Domain

的类型只能是

C

或者

N

类型

否则运行会抛异常。另外,

如果未使用该选项,但

F4 Help


还是会出现

(有固定值或检查表的情况下),但不进行有效性检查了

[SAP ABAP开发技术总结]搜索帮助Search Help (F4)

12.10.2.

检查表

Check Table --- Value Table

也可以在

Domain

中指定一个值表(

Value Table

)作为字段取值范围的限制,但是与指定

固定值

的方式不同的是:为一个

Domain

简单地指定一个取值表不会导致用户的输入被自动校验,也不会自动出现

F4 Help

只有

通过表外键

[SAP ABAP开发技术总结]搜索帮助Search Help (F4)

按钮将该

Value Table

指定为主表之后,一个值表才能真正成为

Check Table

。所以要想成为真正有效的

Check Table

,必须要做两个操作:

一是

要为字段对应的

Domain

设置

Value Table

(即主表

,其实这一步不是必须的,在通过

[SAP ABAP开发技术总结]搜索帮助Search Help (F4)

按钮指定主表时,可以不用指定为字段所参照的元素所对应

Domain

所设置的

Value Table

,而是指定其他的主表也是可以的——

但最好不要这样做

Value Check

时会出其他问题)

,二是

要为表字段通过

[SAP ABAP开发技术总结]搜索帮助Search Help (F4)

为它设置外键

12.10.3.

SE11

检查表与搜索帮助

关系

当某个表字段有检查表,并且又有搜索帮助,则

数据一般来自源于检查表

,而

F4



输入输出则由搜索帮助来决定

PARAMETERS

p_carid

TYPE

sbook

-

carrid

VALUE CHECK

.

PARAMETERS

p_cuter

TYPE

sbook

-

counter

VALUE CHECK

.

[SAP ABAP开发技术总结]搜索帮助Search Help (F4)

命中清单中的

ID

列即

CARRID

背景色不是蓝色,所以选择一条时,不会自动填充屏幕字段

P_CARID

原因是对应的

Search Help

中的

CARRID

参数对应的

EXP

没有打上钩:

[SAP ABAP开发技术总结]搜索帮助Search Help (F4)

如果将这个钩打上,则会相应列背景色会为蓝色,且会自动填充,

达到联动效果


[SAP ABAP开发技术总结]搜索帮助Search Help (F4)

一般

当某个外键所参照主表的主键上如果设置了搜索帮助

(如上面

COUNTER

外键所引用的主表主键字段

SCOUNTER-COUNTNUM

已分配搜索帮助“

SCOUNTER_CARRIER_AIRPORT

”:

[SAP ABAP开发技术总结]搜索帮助Search Help (F4)

),

则这个主表主键上的搜帮助会自动带到从表中相应外键上来

,请看上面的

SBOOK-COUNTER

外键字段的搜索帮助也为“

SCOUNTER_CARRIER_AIRPORT

”,该搜索帮助

决定了整个

F4 Help


处理及显示过程

(如哪些列将作为联动查询条件、哪些列将显示在

F4

列表中、

F4

列表中的哪些列会输出到相应屏幕字段中)。另外,虽然主表主键上的搜索帮助会带到相应外键上来,但带过来后还可以修改,比如上面示例中带过来的搜索帮助中,

CARRID

参数所对应的

EXP

没有钩上,所以不能使用命中清单中的

ID

列来自动填充示例中的屏幕字段

P_CARID

,所以我们可以新建一个搜索帮助,并将

CARRID

搜索参数所对应的

EXP

钩上,则可达到自动上屏幕的效果;

另外,

有些外键所参照的主表主键没有指定搜索帮助

,此时参照从表的屏幕字段的

F4 Help


就只有简单的一列了

(如何让检查表

SCURX

中的

CURRDEC

字段也显示出来,请看后面的

F4

搜索帮助联动的决定因素

),如下面

SBOOK-LOCCURKEY

字段:

[SAP ABAP开发技术总结]搜索帮助Search Help (F4)

PARAMETERS

p_cur

TYPE

sbook

-

LOCCURKEY

VALUE CHECK

.

[SAP ABAP开发技术总结]搜索帮助Search Help (F4)

12.10.4.

F4

搜索帮助联动的决定因素

上节

SE11

检查表与搜索帮助关系

中,屏幕字段参考

sbook

-

LOCCURKEY

时,搜索帮助输出列表只有简单一列,如果要让主表中的

SCURX

-

CURRDEC

列也显示出来,则需要为

sbook

-

LOCCURKEY

字段绑定一个搜索帮助,该搜索帮助数据来源于主表(或检查表)

SCURX

,搜索参数包括

CURRKEY

CURRDEC

两列,并且让这两列在

F4

输出列表中显示(即在搜索参数“列表”栏位编号):

[SAP ABAP开发技术总结]搜索帮助Search Help (F4)

由于

SBOOK

不能直接修改,

ZSBOOK

SBOOK

拷贝过来,将搜索帮助

ZSCURX_JZJ

绑定到

ZSBOOK-

LOCCURKEY

[SAP ABAP开发技术总结]搜索帮助Search Help (F4)

PARAMETERS

p_cur

TYPE

zsbook

-

LOCCURKEY

VALUE CHECK

.

[SAP ABAP开发技术总结]搜索帮助Search Help (F4)

上面检查表中的

SCURX-CURRDEC

列(即

F4

中的小数位)已显示来了,但如何让其背景色为蓝色(

虽然上面已将搜索参数

CURRDEC



EXP

打上了钩,但底色还是白色的

),即选择时自动填充到屏幕上去?由于上面在将搜索帮助

ZSCURX_JZJ

绑定到从表字段

zsbook

-

LOCCURKEY

字段上时,搜索帮助中的搜索参数

CURRDEC

(即主表中的字段

SCURX-
CURRDEC

)在从表

ZSBOOK

找不到相应的外键,所以上图绑定过程中,搜索参数

CURRDEC

为空。但在这里可以手动分配一个,由于在从表

ZSBOOK

中找不到此字段,所以就暂时参照自己

(

主表

SCURX-CURRDEC)

吧:

[SAP ABAP开发技术总结]搜索帮助Search Help (F4)

如果此时选择屏幕的代码还是上面那样:

PARAMETERS

p_cur

TYPE

zsbook

-

LOCCURKEY

VALUE CHECK

.

F4

搜索输出列表中的“小数位”列底色还是白色,但如果

加上


以下屏幕参数,但会变以蓝色,并可联动(

如果搜索帮助的

CURRDEC

参数的


IMP

打上钩,还可以实现联动查询

):

PARAMETERS

p_cur2

TYPE

SCURX-CURRDEC

VALUE CHECK

[SAP ABAP开发技术总结]搜索帮助Search Help (F4)

此时的下拉框也会只有两列:

PARAMETERS

p_cur3

TYPE

zsbook

-

LOCCURKEY

as LISTBOX VISIBLE LENGTH

20

.

[SAP ABAP开发技术总结]搜索帮助Search Help (F4)

所以,联动的决定性条件是要求选择屏幕上的字段要参照

SE11

为表字段所绑定搜索帮助过程中

所分配的表字段

,如下图中的

zsbook-loccurkey

scurx-currdec

,这两个字段分别与搜索帮助的

CURRKEY

CURRDEC

参数绑定了,所以屏幕上参照这两个表字段时,就会具有联动效果了:

[SAP ABAP开发技术总结]搜索帮助Search Help (F4)

12.11.

搜索帮助参数说明

[SAP ABAP开发技术总结]搜索帮助Search Help (F4)

2

IMP

:输入参数。表示屏幕上相应字段是否作为搜索帮助的过滤条件(即

报表选择屏幕上的字段的值是否从报表选择屏幕上传递到搜索帮助中去

如果是

F4

字段时,屏幕字段中的值包含“

*

”时,才会将

F4

字段传递到

Search Help

中。除开

F4

屏幕字段外,而其他只要是

Link

到了相应的

Search Help

参数的屏幕字段,只要相应屏幕字段中有值,则会传入到搜索中作为过滤条件(而其他非

F4

屏幕字段所对应的

Help

参数不管是否钩上

IMP

都会传递


[SAP ABAP开发技术总结]搜索帮助Search Help (F4)

[SAP ABAP开发技术总结]搜索帮助Search Help (F4)

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

,数据来源于内表