![]() |
有腹肌的电影票 · MATLAB字符串调整有关函数总结-百度经验· 3 天前 · |
![]() |
含蓄的眼镜 · Powershell基于文本字符串截取及提取 ...· 7 月前 · |
![]() |
焦虑的春卷 · 歌剧之祖《奥菲欧》推出中国版_央广网· 8 月前 · |
![]() |
旅途中的保温杯 · 【上汽大通MAXUS2024款上汽大通MAX ...· 1 年前 · |
SELECTION-SCREEN - BEGIN OF SCREEN .. 157
标准选择屏幕 SELECTION-SCREEN - Standard Selection Screens . 157
普通选择屏幕 SELECTION-SCREEN – SCREEN .. 157
子选择屏幕 SELECTION-SCREEN - AS SUBSCREEN .. 159
SELECTION-SCREEN - screen_elements . 160
空行 SELECTION-SCREEN - SKIP . 161
水平线 SELECTION-SCREEN - ULINE . 161
文本标签(带图标) SELECTION-SCREEN - COMMENT . 162
按钮 SELECTION-SCREEN - PUSHBUTTON .. 163
多元素行 SELECTION-SCREEN - LINE . 164
屏幕块 SELECTION-SCREEN - BLOCK . 165
Tabstrip ( Tab 条) SELECTION-SCREEN - TABBED BLOCK . 166
激活工具栏中预设按钮 SELECTION-SCREEN FUNCTION KEY . 168
SELECTION-SCREEN INCLUDE . 170
SELECTION-SCREEN - ldb_options . 170
通过 VRM_SET_VALUES 函数手动构造下拉框 ... 176
MATCHCODE OBJECT search_help . 180
NO DATABASE SELECTION 不采用逻辑数据库中的约束 ... 185
AT SELECTION-SCREEN ON HELP-REQUEST FOR xxx ( 字段 F1 帮助 ) . 186
AT SELECTION-SCREEN ON VALUE-REQUEST FOR xxx ( 字段 F4 帮助 ) . 187
屏幕中输入的值转存
Multiple selection
规则
...
190
使用 SELECT-OPTIONS 替代 PARAMETERS . 193
事件终止( STOP 、 EXIT 、 CHECK 、 REJECT ) ... 199
SELECT-OPTIONS 的 END OF 事件 ... 201
Calling 选择屏幕 CALL SELECTION-SCREEN
选择屏幕可以定义在可执行程序、函数组、模块池( executable programs 、 function groups 、 module pools )类型的程序中进行定义,由 SELECT-OPTIONS , SELECTION-SCREEN and PARAMETERS 语句在程序的全局声明区进行定义( 如果在 function groups 中定义时,只能在 include 文件中进行定义),但如果在是 function groups 、 module pools 中定义时选择屏幕时,只能将这些语句写在 SELECTION-SCREEN BEGIN/END OF SCREEN 之间。
每一个可执行报表程序( executable program )都包含了一个屏幕号为 1000 的标准选择屏幕( 屏幕编号 1000~1010 被 SAP 系统保留使用,并且 SAP R/3 系统的 HR 模块仅允许使用屏幕号码 9000~9999 )。
标准选择屏幕中的屏幕组成元素是由 PARAMETERS 、 SELECT-OPTIONS 、 SELECTION-SCREEN 语句来定义的。 标准选择屏幕不能定义在 SELECTION-SCREEN BEGIN/END OF SCREEN 之间。
Function groups 与 module pools 中不能定义标准选择屏幕,在 Function groups 与 module pools 中的 PARAMETERS 、 SELECT-OPTIONS 、 SELECTION-SCREEN 语句只能放在独立选择屏幕定义块中
ABAP 程序中可以使用多个选择屏幕,如果某个选择屏幕的功能被多次使用,则可以将它们封装起来,然后通过 ABAP 选择屏幕调用语句进行多次调用,达到选择屏幕利用的效果。
SELECTION-SCREEN BEGIN OF SCREEN
dynnr
[TITLE
title
][AS WINDOW].
...
SELECTION-SCREEN END OF SCREEN
dynnr
.
该语法用来定义带屏幕号的普通选择屏幕。 dynnr 为选择屏幕的 四位 数字编号
可以通过 PARAMETERS 、 SELECT-OPTIONS 、 SELECTION-SCREEN 语句来定义独立选择屏幕里的具体元素。
该语句只能在可执行程序、函数组( include 文件中)、 module pools 的全局定义区中使用。
普通选择屏幕,可以使用 CALL SELECTION-SCREEN 来单独调用。
普通选择屏幕内不能再定义选择屏幕了。
TITLE title : 可以是已定义好的 text symbol ,格式 text-001 :
也可以直接定义一个类型为 c(70) 的全局变量(该变量会自动生成,不能使用 Data 定义,如下面程序中的 title 、 title2 变量 ),在以后程序中可以为这个变量设置屏幕标题的内容。
可以使用 AS WINDOW 选项使选择屏幕相关的 w arnings 与 e rror messages 都以 modal dialog box 的方式(弹出对话框形式)来显示( S 类型好像固定在状态栏显示, I 类型消息好像固定以弹出窗口显示, A 类也是固定弹出窗口并且点击后退出整个程序),这与 CALL SELECTION-SCREEN 语句中的 STARTING AT 选项的意义是有区别的。
PARAMETERS
:
p_matnr
TYPE
mara
-
matnr
.
SELECTION-SCREEN BEGIN OF SCREEN
500
TITLE title
.
PARAMETERS
p1
(
1
).
SELECTION-SCREEN END OF SCREEN
500
.
SELECTION-SCREEN BEGIN OF SCREEN
600
TITLE
title2
.
PARAMETERS
p2
(
1
).
SELECTION-SCREEN END OF SCREEN
600
.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR
p_matnr
.
title
=
'Input name'
.
CALL SELECTION-SCREEN
'0500'
STARTING AT
10 3
.
AT SELECTION-SCREEN ON HELP-REQUEST FOR
p1
.
title2
=
'Input name2'
.
CALL SELECTION-SCREEN
'0600'
STARTING AT
10 6
.
如果调用的是主屏幕,则还可以使用 CALL SCREEN 来调用:
SELECTION-SCREEN BEGIN OF SCREEN
123
TITLE title
.
PARAMETERS
:
matnr
LIKE
mara
-
matnr
.
PARAMETERS
:
type AS CHECKBOX
.
SELECTION-SCREEN END OF SCREEN
123
.
START-OF-SELECTION
.
CALL SCREEN
123
STARTING AT
10 10
ENDING
AT
80 10
.
如果已存在主选屏幕,则只可使用 CALL SELECTION-SCREEN 来调用:
PARAMETERS
:
type AS CHECKBOX
.
SELECTION-SCREEN BEGIN OF SCREEN
123
TITLE title
.
PARAMETERS
:
matnr
LIKE
mara
-
matnr
.
SELECTION-SCREEN END OF SCREEN
123
.
START-OF-SELECTION
.
CALL SELECTION-SCREEN
123
STARTING AT
10 10
ENDING
AT
80 10
.
SELECTION-SCREEN BEGIN OF SCREEN dynnr
AS SUBSCREEN
[NO INTERVALS][NESTING LEVEL n].
...
SELECTION-SCREEN END OF SCREEN dynnr.
定义一个子屏幕。子屏幕可以 include 到其他屏幕或选择屏幕、甚至是其他的子屏幕、或者 页签控件( Tab 控件) 中去。
但子屏幕不能被 CALL SELECTION-SCREEN 调用,但可以使用 SELECTION-SCREEN 的 TABBED BLOCK 将子屏幕显示到标准选择屏幕中去(示例如下面代码)。
如果将子选择屏幕 include 到屏幕(对话屏幕)中时,需要在 PBO 或者 PAI 中调用 CALL SUBSCREEN 来 include ,此时这种子选择屏幕还是像标准选择屏幕那样,会触发标准的选择屏幕事件。
NO INTERVALS :与 SELECT-OPTIONS 中的相同选择具有同样作用,只不过会所子选择屏幕中的所有 SELECT-OPTIONS 起作用。
SELECTION-SCREEN BEGIN OF SCREEN
100
AS
SUBSCREEN
.
PARAMETERS
:
p1
TYPE c
LENGTH
10
,
p2
TYPE c
LENGTH
10
,
p3
TYPE c
LENGTH
10
.
SELECTION-SCREEN END OF SCREEN
100
.
SELECTION-SCREEN BEGIN OF SCREEN
200
AS
SUBSCREEN
.
PARAMETERS
:
q1
TYPE c
LENGTH
10
,
q2
TYPE c
LENGTH
10
,
q3
TYPE c
LENGTH
10
.
SELECTION-SCREEN END OF SCREEN
200
.
SELECTION
-
SCREEN
:
BEGIN OF
TABBED
BLOCK
mytab
FOR
10
LINES
,
TAB
(
20
)
button1
USER-COMMAND
push1
DEFAULT
SCREEN
100
,
TAB
(
20
)
button2
USER-COMMAND
push2
DEFAULT
SCREEN
200
,
END OF BLOCK
mytab
.
INITIALIZATION
.
button1
=
'Selection Screen 1'
.
button2
=
'Selection Screen 2'
.
选择屏幕的输入字段可以由 PARAMETERS 与 SELECT-OPTIONS 来定义,但这单独( 不放在 SELECTION-SCREEN BEGIN OF LINE 中 ) 使用这两个语句时,每个输入元素需要单独占一行,这时如果需要将多个输入元素放在同一行时,则需要放在 SELECTION-SCREEN BEGIN/END OF LINE 语句间,除此之外 SELECTION-SCREEN 语句还可以对选择屏幕上的元素进行布局及其他元素的输出(如按钮、水平线、空行等)。
某些选择屏幕元素能够与 MODIF ID(modification gr oups )选项一起使用,并将值自动存储到系统内表 SCREEN-group1 字段中,而系统内表中的 SCREEN-group2 与 SCREEN- group3 字段是供系统在选择屏幕生成时使用的, SCREEN-group4 只供系统内部分使用。
SCREEN-group1 一般用来进行屏幕字段的修改,将需要修改的屏幕字段使用 MODIF ID 分为同一组后,使用如下循环方便修改:
LOOP AT SCREEN
.
IF screen
-
group1
=
'MG1'
.
screen
-
intensified
=
'1'
.
MODIFY SCREEN
.
ENDIF
.
ENDLOOP
.
当屏幕选择元素定义在 logical database. 时, SCREEN-group2 的 值为 "DBS"
SCREEN-group3 的取值如下表所示:
产生空行,其中 n 的值可以是 1 到 9 的值,如果是空 1 行,则可以省略 n 选项。
SELECTION-SCREEN ULINE [[/][pos](len)][ MODIF ID key ]
[/][pos](len) : 指定了线所在屏幕上的位置,如果多个屏幕元素显示在一行,则可以省略这些参数,此时将从当前屏幕元素后开始画;如果使用了 / 参数,则必须指定 len 参数,此时将在新行中开始画,如果省略了 / 参数,则会在当前行中画;如果多个元素显示在同一行,则要省略 / 参数。
“ / ”表示新起一行开始画线,所以该选项不能用在 SELECTION-SCREEN BEGIN/END OF LINE. 之间。
如果用在 SELECTION-SCREEN BEGIN/END OF LINE. 之间,且不是用作第一个元素,则可以省略 pos ,省略之后开始画的位置为前一元素的结尾处。
pos 为大于 0 的整数,取值只能是 [1, 83] ,如果指定的 pos 落在了前面元素的所在区域内时,编译时就会出错。 POS_LOW 代表了前一行 PARAMETERS 输入框或 select-options 的第一个 LOW 输入框的起始位置,而 POS_HIGH 代表了 SELECT-OPTIONS 的第二个输入框的起始位置:
TABLES
:
mara
.
SELECT-OPTIONS
:
a
FOR
mara
-
matnr
.
SELECTION-SCREEN
:
ULINE
/pos_low
(
10
) .
SELECT-OPTIONS
:
b
FOR
mara
-
matnr
.
SELECTION-SCREEN
:
ULINE
/pos_high
(
10
) .
PARAMETERS
:
c
(
10
).
SELECTION-SCREEN
:
ULINE
/pos_low
(
10
) .
SELECTION-SCREEN
:
ULINE
/pos_low
(
10
) .
SELECTION-SCREEN
:
ULINE
/pos_high
(
10
) .
不带选项参数的 unline 只能用在 SELECTION-SCREEN BEGIN/END OF LINE 外面 , 表示会重起一行再画线 (即使没有 [/] 参数选项) 。
POS 与 LEN 的取值范围只能是 [1 , 83] ,如果想画很长的一条线,则需要使用不带 [/] 选项的 ULINE ,且从位置为 83 的地方开始画:
tables
:
mara
.
select
-
options
:
bb
for
mara
-
matnr
.
selection
-
screen
:
uline
/1
(
83
)
.
selection
-
screen
:
uline
/1
(
82
)
.
selection
-
screen
:
uline
83
(
83
)
.
"
接着上面线继续画
SELECTION-SCREEN BEGIN OF BLOCK
blk1
WITH FRAME TITLE text
-
020
.
PARAMETERS
:
a
AS CHECKBOX
,
b
AS CHECKBOX DEFAULT
'X'
.
SELECTION-SCREEN END OF BLOCK
blk1
.
SELECTION-SCREEN
COMMENT
[/][pos](len)
{
text
|{[text]
FOR FIELD sel
}}
[VISIBLE LENGTH vlen]
[
MODIF ID modid
].
COMMENT 选项可以在选择屏幕中输出文本标签信息,其中 text 可以为选择文本 text-### ,也可以是变量名,该变量由系统在运行时生成一个类型为 C(83) 的全局变量,这个变量可以在稍后的程序中赋值。
FOR FIELD 表示该文本标签将与 PARAMETERS 或 SELECT-OPTIONS 定义的名为 sel 元素相关,如果用户在该文本标签是按 F1 或 F4 时,会显示所关联的 sel 的帮助信息或 F4 选择值列表。另外,此 COMMENT 的 modification group 也将与 sel 元素相同。
注意:另外发现只有使用了 FOR FIELD 选项,才会出现标签与文本框之间使用 下划线:
否则是是这样的:
SELECTION-SCREEN BEGIN OF LINE
.
SELECTION
-
SCREEN
:
* COMMENT 1(12) text-001 FOR FIELD p_syst1,
COMMENT
1
(
12
)
text
-
001
,
POSITION
POS_LOW
.
PARAMETERS
:
p_syst1
LIKE
tj02t
-
txt04
,
p_sysh1
LIKE
jest
-
stat
NO
-
DISPLAY
.
SELECTION-SCREEN POSITION
41
.
PARAMETERS
p_kz_e1
LIKE
rcosa
-
excl1
.
SELECTION
-
SCREEN
:
COMMENT
46
(
5
)
text
-
002
FOR FIELD
p_kz_e1
,
* COMMENT 54(3) text-003 FOR FIELD p_syst2,
COMMENT
54
(
3
)
text
-
003
,
POSITION
POS_HIGH
.
PARAMETERS
:
p_syst2
LIKE
tj02t
-
txt04
,
p_sysh2
LIKE
jest
-
stat
NO
-
DISPLAY
.
SELECTION-SCREEN POSITION
66
.
PARAMETERS
p_kz_e2
LIKE
rcosa
-
excl1
.
SELECTION-SCREEN COMMENT
67
(
5
)
text
-
002
FOR FIELD
p_kz_e2
.
SELECTION-SCREEN END OF LINE
.
VISIBLE LENGTH vlen : 定义输入文本标签的显示长度,如果 vlen 大于预定的长度 len 时,则显示长度还是设置 成 len ,如果比它小时,则文本标签信息显示不全,但鼠标按下时可以左右拖动,并且显示 quick info 快速提示信息。
标签文本前带图标:
TYPE-POOLS
:
icon
.
SELECTION-SCREEN BEGIN OF LINE
.
SELECTION-SCREEN COMMENT
(
12
)
mytext
.
PARAMETERS
:
name
LIKE
sy
-
uname
.
SELECTION-SCREEN END OF LINE
.
INITIALIZATION
.
CONCATENATE
icon_manager
'
输入人员编号
'
INTO
mytext
.
SELECTION-SCREEN
PUSHBUTTON
[/][pos](len)
button_text
USER-COMMAND fcode
[VISIBLE LENGTH vlen]
[
MODIF ID modid
]
在选择屏幕上创建一个按钮。可以使用 ICON_CREATE 函数为按钮创建图标 , quick info 快速提示信息,以及按钮的文本标签。
USER-COMMAND fcode : 在使按钮能正常工作之前,必须使用 TABLES sscrfields. 语句来为 ABAP 数据词典中的 SSCRFIELDS 结构来定义接口工作区。当用户点击按钮后会触发 AT SELECTION-SCREEN 事件,并且 function code fcode 会存储到 sscrfields-ucomm 字段中。
TYPE-POOLS icon
.
TABLES
sscrfields
.
SELECTION-SCREEN
:
BEGIN OF SCREEN
500
AS WINDOW TITLE title
,
PUSHBUTTON
2
(
12
)
but1
USER-COMMAND
cli1
,
PUSHBUTTON
16
(
30
)
but2
USER-COMMAND
cli2
VISIBLE LENGTH
10
,
END OF SCREEN
500
.
INITIALIZATION
.
"
可以直接拼接文本标签与图标,而不用像下面那样使用
'ICON_CREATE'
函数
CONCATENATE
icon_message_information
'Button 1'
INTO
but1
.
AT SELECTION-SCREEN
.
CASE
sscrfields
-
ucomm
.
WHEN
'CLI1'
.
WHEN
'CLI2'
.
ENDCASE
.
*
也可以使用系统变量
sy-UCOMM
CASE
sy
-
ucomm
.
WHEN
'CLI1'
.
WHEN
'CLI2'
.
ENDCASE
.
START-OF-SELECTION
.
title
=
'Push button'
.
" but1 = 'Button 1'.
"
创建图标(实质上是带图标的字符串),该字符串用来输出到按钮或者直接输出到屏幕上
CALL FUNCTION
'ICON_CREATE'
EXPORTING
name
=
icon_information
"
图标的名称,需从
<ICON>
导入
text
=
'Button 2'
"
显示在图标后面的文本(这里即按钮名称)
info
=
'My Quickinfo'
"
图标的快速提示信息(鼠标移动到按钮上就会提示)
IMPORTING
result
=
but2
"
返回带图标的字符串,然后当作按钮文本使用
EXCEPTIONS
OTHERS
=
0
.
CALL SELECTION-SCREEN
'0500'
STARTING AT
10 10
.
SELECTION-SCREEN
BEGIN OF LINE
.
...
[SELECTION-SCREEN POSITION pos.]
...
SELECTION-SCREEN END OF LINE.
如果需要将选择屏幕中的多个不同元素,集中在选择屏幕的一行上输出,可在这之间加上屏幕元素的声明语句,这些元素将出现在屏幕的同一行中,在此之间所有屏幕元素是通过 PARAMETERS 、 SELECT-OPTIONS 与 SELECTION-SCREEN 语句来定义的。
SELECTION-SCREEN POSITION pos : 在 SELECTION-SCREENBEGIN/END OF LINE 之间还可以使用此语句,此语句可以指定紧接着后面屏幕元素的输出位置, pos 的取值可以是 [1, 83] 、 pos_low 或者 pos_high 系统变量。此语句只能在 SELECTION-SCREENBEGIN/END OF LINE 语句中使用。
SELECTION-SCREENBEGIN/END OF LINE 之间需要注意以下几点:
1、 PARAMETERS 、 SELECT-OPTIONS 输入框前的文本标签不会再显示出来,需要使用 SELECTION-SCREEN COMMENT. 语句来创建。
2、 不能再嵌套 SELECTION-SCREEN BEGIN OF LINE 语句。
3、 不能再在之间使用 SELECTION-SCREEN BEGIN OF BLOCK block 与 SELECTION-SCREEN BEGIN OF [TABBED] BLOCK. 语句。
4、 在一行里最好只使用一个 SELECT-OPTIONS ,其描述使用 SELECTION-SCREEN COMMENT. 语句来创建,除此之外,不要再定义其他屏幕元素,否则会出现意外情况。
5、 在这之间不能使用反杠 / 参数选项。
6、 另外,在一行中不要显示太多的屏幕元素,如果确实很多时,使用元素的 visible length 选项来缩短正常的长度。
SELECTION-SCREEN
:
BEGIN OF LINE
,
PUSHBUTTON
10
(
10
)
push
USER-COMMAND
fcode
,
POSITION
26
.
PARAMETERS
para
TYPE c
LENGTH
20
.
SELECTION-SCREEN
:
COMMENT
50
(
40
)
text
,
END OF LINE
.
INITIALIZATION
.
push
=
'Push'
.
text
=
'<--- Fill field, then push button!'
.
SELECTION-SCREEN
BEGIN OF BLOCK
block
[WITH FRAME [TITLE title]]
[
NO INTERVALS
].
...
SELECTION-SCREEN END OF BLOCK block.
将一组选择屏幕元素组合在一个区域,在块内可以使用 PARAMETERS, 、 SELECT-OPTIONS 与 SELECTION-SCREEN 语句。
块可以相互嵌套
SELECTION-SCREEN BEGIN OF BLOCK
rad1
WITH FRAME TITLE title
.
PARAMETERS
:
r1
RADIOBUTTON GROUP
gr1
,
r2
RADIOBUTTON GROUP
gr1
,
r3
RADIOBUTTON GROUP
gr1
.
SELECTION-SCREEN END OF BLOCK
rad1
.
INITIALIZATION
.
title
=
'Selection'
.
省略 TITLE 选项:
SELECTION-SCREEN BEGIN OF BLOCK rad1 WITH FRAME .
省略 WITH FRAME TITLE 选项:
SELECTION-SCREEN BEGIN OF BLOCK rad1 .
SELECTION-SCREEN
BEGIN OF TABBED BLOCK
tblock
FOR
n
LINES
.
...
[
SELECTION
-
SCREEN TAB
(
len
)
tab
USER-COMMAND
fcode [
DEFAULT
[
PROGRAM
prog]
SCREEN
dynnr]
.
]
...
SELECTION-SCREEN END OF BLOCK
tblock
.
第一行与最后一行在选择屏幕中定义一个 Tab 的区域,名字为 tblock 。在此区域内只能使用 SELECTION-SCREEN TAB 这样的语句,另外 SELECTION-SCREEN TAB 这样的语句也只能使用在这之间使用。 Tab 页签内容的行数由 n 来决定 ( n < 197 ) 。
tab : Tab 的标题 ,可以是选择文本 TEXT-XXX ,也可以直接是某个变量名,运行时系统会自动创建 C(83) 类型的全局变量,这样就可以在报表的初始化事件中为这个变量来设置 Tab 的标题。
len : Tab 标题显示的宽度
USER-COMMAND fcode : 每个 Tab 必须使用 USER-COMMAND 来定义一个 fcode ,当切换 Tab 触发 AT SELECTION-SCREEN 选择屏幕事件触后,就可以通过 sy-ucomm 系统变量来确定 fcode 的值。
DEFAULT [PROGRAM prog] SCREEN dynnr : 给 Tab 分配一个子屏幕 ,分配的方式有动态分配与静态分配:
每个 Tab 块,系统在运行时都会自动为当前程序创建一个全局的结构变量(不管静态还是动态分配都会自动生成这样一个结构),这个全局变量的名称就是 Tab 块的名称 tblock 。其结构如下:
DATA
:
BEGIN OF
tblock
,
prog
(
40
)
,
"
子屏幕定义所在的程序的程序名
dynnr
(
4
)
,
"
定义的子屏幕号
activetab
(
132
)
,
"
当前被激活(选中)的
Tab
所对应的
fcode
END OF
tblock
.
当没有使用 DEFAULT [PROGRAM prog] SCREEN dynnr 语句来定义 TAB 页签中的屏幕内容时,就需要动态的指定 。在显示这个 TAB 时,一定要先给这个全局结构变量赋值(只需为 tblock-prog 与 tblock-dynnr 两个字段, tblock-activetab 程序会自动填充)
TABLES
sscrfields
.
SELECTION-SCREEN BEGIN OF SCREEN
100
AS
SUBSCREEN
.
"
定义子屏幕
100
PARAMETERS
:
p1
TYPE c
LENGTH
10
,
p2
TYPE c
LENGTH
10
,
p3
TYPE c
LENGTH
10
.
SELECTION-SCREEN END OF SCREEN
100
.
SELECTION-SCREEN BEGIN OF SCREEN
200
AS
SUBSCREEN
.
"
定义子屏幕
200
PARAMETERS
:
q1
TYPE c
LENGTH
10
,
q2
TYPE c
LENGTH
10
,
q3
TYPE c
LENGTH
10
.
SELECTION-SCREEN END OF SCREEN
200
.
SELECTION-SCREEN
:
BEGIN OF TABBED
BLOCK
mytab
FOR
10
LINES
,
"
定义
Tab page
"
未分配子屏幕,在运行时需动态分配
TAB
(
20
)
button1
USER-COMMAND
push1
,
TAB
(
20
)
button2
USER-COMMAND
push2
,
END OF BLOCK
mytab
.
INITIALIZATION
.
button1
=
'Selection Screen 1'
.
button2
=
'Selection Screen 2'
.
"mytab
为程序在运行时系统自动生成的结构
mytab
-
prog
=
sy
-
repid
.
"
设置子屏幕所在程序名
mytab
-
dynnr
=
200
.
"
子屏幕号
mytab
-
activetab
=
'PUSH2'
.
"
需激活的
Tab
(通过相应的
fcode
来激活)
AT SELECTION-SCREEN
.
"Tab
切换时会触发此事件
CASE
sy
-
dynnr
.
"
当前屏幕号
WHEN
1000
.
CASE
sy
-
ucomm
.
"
选择屏幕动作用
WHEN
'PUSH1'
.
"
如果是动作是
PUSH1
,则
tab
中的屏幕设置为
100
号子屏幕
mytab
-
dynnr
=
100
.
WHEN
'PUSH2'
.
"
如果是动作是
PUSH2
,则
tab
中的屏幕设置为
200
号子屏幕
mytab
-
dynnr
=
200
.
ENDCASE
.
*
也可以使用全局数据词典中的
sscrfields
结构来实现
* CASE sscrfields-ucomm.
* WHEN 'PUSH1'.
* mytab-dynnr = 100.
* WHEN 'PUSH2'.
* mytab-dynnr = 200.
* ENDCASE.
ENDCASE
.
如果使用了 DEFAULT [PROGRAM prog] SCREEN dynnr ,则为静态分配。如果没有使用 PROGRAM 选项,则表示加载的子屏幕为当前程序中的。静态的可以被动态分配所重写。静态分配例子参考 这里
SELECTION-SCREEN FUNCTION KEY n
在应用工具条上,系统默认就预设了 5 个未激活的按钮,它们分配的 Fcode 为 FC01 到 FC05 ,该语句的作用就是激活第 n ( n 为 1 到 5 )个按钮。
为了能够使用这 5 个按钮,必须使用 TABLES SSCRFIELDS. (数据类型为数据词典中的 SSCRFIELDS 全局结构)语句来定义接口工作区。我们可以通过该接口的 SSCRFIELD-FUNCTXT_0n 字段设置这些按钮的文本标签信息:
如果想为按钮设置图标、快速提示信息时,需要使用一个全局数据词典结构类型 smp_dyntxt ,该接口可以将这些信息组织起来,并将它整体赋值给 SSCRFIELD-FUNCTXT_0n 字段后就能显示这些信息:
当用户点击应用工具条上的按钮时,会触发 AT SELECTION-SCREEN 事件,并且可以通过 sscrfields-ucomm 来获取当前被点击按钮相应的 Fcode ,从而可以知道是点击了哪个按钮。
TYPE-POOLS icon
.
"
使用数据词典中的全局类型来定义工作区,可用来设置应用工具条上的
"FC01
到
FC05
共
5
个预设按钮的显示信息
TABLES
sscrfields
.
"
通过数据词典中全局数据结构类型
smp_dyntxt
变量,可以将
"
按钮上的图标、文本标签、快速提示等信息组织成可显示的按钮信息
DATA
smp_dyntxt
TYPE
smp_dyntxt
.
SELECTION-SCREEN
:
FUNCTION KEY
1
,
FUNCTION KEY
2
.
PARAMETERS
:
p_carrid
TYPE
s_carr_id
,
p_cityfr
TYPE
s_from_cit
.
INITIALIZATION
.
"
设置图标
ID
smp_dyntxt
-
icon_id
=
icon_ws_plane
.
"
按钮提示文本
smp_dyntxt
-
quickinfo
=
'Preselected Carrier'
.
"
按钮文本
smp_dyntxt
-
icon_text
=
'LH'
.
"
直接将结构
smp_dyntxt
赋值给第一个预设按钮显示文本
"
(包括图标信息在内)
sscrfields
-
functxt_01
=
smp_dyntxt
.
smp_dyntxt
-
icon_text
=
'UA'
.
sscrfields
-
functxt_02
=
smp_dyntxt
.
AT SELECTION-SCREEN
.
"
当点击工具条上的预设按钮(其实只要触发了其他带
fcode
的元素也会将
" fcode
存储到
sscrfields-ucomm
中),
sscrfields
的
ucomm
会存储触发的
fcode
CASE
sscrfields
-
ucomm
.
WHEN
'FC01'
.
p_carrid
=
'LH'
.
p_cityfr
=
'Frankfurt'
.
WHEN
'FC02'
.
p_carrid
=
'UA'
.
p_cityfr
=
'Chicago'
.
WHEN OTHERS
.
*
也可以使用
sy-ucomm
来实现
* CASE sy-ucomm.
* WHEN 'FC01'.
* p_carrid = 'LH'.
* p_cityfr = 'Frankfurt'.
* WHEN 'FC02'.
* p_carrid = 'UA'.
* p_cityfr = 'Chicago'.
* WHEN OTHERS.
ENDCASE
.
可以将同一程序中的其他已经创建好的选择屏幕中的元素 include 进来。
不能 include 同一选择屏幕(不在 SELECTION-SCREEN: BEGIN/END OF SCREEN 语句之间的其他所有屏幕元素定义语句 PARAMETERS 、 SELECT-OPTIONS 与 SELECTION-SCREEN 默认都属于标准选择屏幕)中的屏幕元素。
被 Include 的元素要在 Inlude 之前的选择屏幕中定义过(先定义再使用)。
大部分的属性会被 Include 到目标中,并且在 Include 语句中重写某些属性值。
能被 SELECTION-SCREEN INCLUDE 元素有 PARAMETERS 、 SELECT-OPTIONS 、 COMMENT 、 PUSHBUTTON 、 BLOCKS
SELECTION-SCREEN
:
BEGIN OF BLOCK block
,
COMMENT
/1
(
40
)
text
,
ULINE
.
PARAMETERS
:
p1
(
10
)
TYPE c
,
p2
(
10
)
TYPE c
,
p3
(
10
)
TYPE c
.
SELECTION-SCREEN END OF BLOCK block
.
SELECTION-SCREEN
:
BEGIN OF SCREEN
500
AS WINDOW
,
INCLUDE
BLOCKS
block
,
END OF SCREEN
500
.
INITIALIZATION
.
text
=
'Standard Selection'
.
START-OF-SELECTION
.
CALL SELECTION-SCREEN
'0500'
STARTING AT
10 10
.
与逻辑数据库相关,以后补充
PARAMETERS {para[(len)]}|{para [LENGTH len]}
type_options
[{ TYPE type [DECIMALS dec] }| { LIKE dobj }| { LIKE (name) }]
screen_options
[{ {[OBLIGATORY|NO-DISPLAY] [VISIBLE LENGTH vlen]}
| {AS CHECKBOX [
USER-COMMAND
fcode]}
| {RADIOBUTTON GROUP group [
USER-COMMAND
fcode]}
| {AS LISTBOX VISIBLE LENGTH vlen [
USER-COMMAND
fcode][OBLIGATORY]} }
[MODIF ID modid]]
value_options
[DEFAULT val][LOWER CASE][MATCHCODE OBJECT earch_help][MEMORY ID pid][VALUE CHECK]
ldb_options
FOR {TABLE|NODE} node
[
HELP-REQUEST
][
VALUE-REQUEST
][AS SEARCH PATTERN].
para 为输入参数名, 最多为 8 个字符
len 只可用于 c 、 n 、 p 、 x 这几种类型
不能是 ABAP 预置类型类型 F 、 STRING 、 XSTRING
动态指定参照类型 , name 为某个变量(注,不能为字面常量字符),该变量的值为 ABAP Dictionar 数据词典 中某个结构或数据库表的组件名,且为大小。当动态参照成功后,如果在没有在 Selection texts 池中给 para 分配选择文本,则会使用数据词典中对应组件的文本,并且 F1 与 F4 也会照着过来:
DATA
comp
TYPE c
LENGTH
60
.
"
注,括号里不能直接使用
'SPFLI-CARRID'
PARAMETERS
p_dyn
LIKE
(
comp
).
INITIALIZATION
.
comp
=
'SPFLI-CARRID'
.
输入框是否为必填
如果某个屏幕输入元素处于隐藏状态,即使它是 OBLIGATORY 必输入的,则在提交时也不会提示你必输入,只有在显示状态时且不输入时才会提示。
屏幕上将不会显示该字段。在 SUBMIT 调用过程中,可以通过该字段传递参数或在自定义选择屏幕被调用之前,对该字段赋值。但该字段已经不是屏幕字段,即使使用 MODIFY SCREEN 修改其属性,也不能在屏幕中显示
设置可见显示长度,但可以输入超过所显示的长度的值。参数屏幕可见长度一般为其定义长度或参照的数据元素长度
PARAMETERS : p_check as CHECKBOX USER-COMMAND check .
在屏幕上产生一个复选框,当复选框字段被选中时,其值为“ X ”,否则为空。在所对应的字段后面加上命令 USER-COMMAND ,可以定义该复选框的单击事件代码 FunctionCode ,可以在事件 AT SELECTION-SCREEN 中捕获该事件代码,该 FunctionCode 代码被保存到系统变量 SY-UCOMM 中:
PARAMETERS
:
p_check
AS CHECKBOX USER-COMMAND check
.
AT SELECTION-SCREEN
.
IF
sy
-
ucomm
=
'CHECK'
.
"
一定要大小哦
MESSAGE
i001
(
00
)
WITH
'
单击复选框
'
.
ENDIF
.
注:如果屏幕字段参照的数据元素的词典类为 C(1) ,且 Fixed Value 为 "X" and " " ,即使没有加该选项,也会以复选框的形式显示:
PARAMETERS : p_lvorm LIKE mara - lvorm .
在屏幕上产生一个单选按钮,当单选按钮被选中时,其值为“ X ”,否则为空。参数字段是长度为 1 的 C 类型,允许使用 LIKE 或 TYPE 选项,但是必须参照类型为 C 、长度为 1 的字段, group 组名长度最大为 4 。
当定义单选按钮时,至少面要两个或以上,所以需要加上 GROUP 参数来定义分组,每组按钮数量不能小于两个,另外,也仅只能为一个按键加上 DEFAULT 选项 ,且此时的值只能为 "X"
加上 USER-COMMAND fcode 可以定义该单选按钮的单击事件代码, 可以在事件 AT SELECTION-SCREEN 中捕获该事件代码,该 FunctionCode 代码被保存到系统变量 SY-UCOMM 中
PARAMETERS
:
p_radio1
TYPE c RADIOBUTTON GROUP
g1
,
p_radio2
TYPE c RADIOBUTTON GROUP
g1
.
其他下拉框构造请参考这里: F4IF_FIELD_VALUE_REQUEST 、 TR_F4_HELP
下拉框中显示的最大项目数通过修改 F4 help 最大显示数好像不管用?
只有表字段所对应的 Input help 类型为 check table 实现方式时才能用作下拉框:
DATA
:
carrid
(
20
),
cityfrom
(
20
).
PARAMETERS
p_carri1
LIKE
(
carrid
).
PARAMETERS
p_carri2
LIKE
spfli
-
carrid
AS LISTBOX
VISIBLE LENGTH
20
USER-COMMAND
onli
DEFAULT
'LH'
.
SELECTION-SCREEN
:
SKIP
8
.
SELECTION-SCREEN
:
SKIP
2
.
PARAMETERS
p_city1
LIKE
(
cityfrom
).
PARAMETERS
p_city2
LIKE
spfli
-
cityfrom
AS
LISTBOX VISIBLE LENGTH
20
.
INITIALIZATION
.
carrid
=
'SPFLI-CARRID'
.
cityfrom
=
'SPFLI-CITYFROM'
.
Check Table 中除开外键字段与 MANDT 字段外的第一个字段(依照定义的顺序)会作为下拉框的 Value , 下面再次验证:
PARAMETERS
p_posnr1
LIKE
vbap
-
posnr
.
PARAMETERS
p_posnr2
LIKE
vbap
-
posnr
AS LISTBOX
VISIBLE LENGTH
20
.
TYPE-POOLS
:
vrm
.
"
将下拉列表值
lt_vrm_values
内表绑定到哪个参数上
DATA
:
g_vrm_id
TYPE
vrm_id
VALUE
'P_TRCAT'
,
lt_vrm_values
TYPE
vrm_values
,
"
值列
表
ls_vrm_values
LIKE LINE OF
lt_vrm_values
.
DATA
:
c2
TYPE c
LENGTH
2
.
PARAMETERS
:
p_trcat
LIKE
c2
AS LISTBOX
VISIBLE LENGTH
14
DEFAULT
'04'
USER-COMMAND
sel
.
AT SELECTION-SCREEN OUTPUT
.
MESSAGE
i001
(
00
)
WITH
'AT SELECTION-SCREEN OUTPUT'
.
REFRESH
lt_vrm_values
.
ls_vrm_values
-
key
=
'04'
.
ls_vrm_values
-
text
=
'All Transcation'
.
APPEND
ls_vrm_values
TO
lt_vrm_values
.
CALL FUNCTION
'
VRM_SET_VALUES
'
EXPORTING
id
=
g_vrm_id
values
=
lt_vrm_values
.
AT SELECTION-SCREEN
.
MESSAGE
i001
(
00
)
WITH
'AT SELECTION-SCREEN'
.
当改变下拉框选中的值时,会触发 PAI ( AT SELECTION-SCREEN )与 PBO ( AT SELECTION-SCREEN OUTPUT )事件块
当用户从下拉框中选择值时,会触发
PAI
事件,在
Screen Painter
中将
Dropdown
属性的值设置为
Listbox
即为下拉框。如果 为下拉框分配一个 Function Code ,则会触发 PAI ( 如果未分配,还是会触发 ??)
下拉框中的值可以来至于
InputHelp
,也可以是
ABAP
程序中的值列表,这两种方式是可以选择的:
在内部实现中,下拉框后台对应着一个行结构两列的内表: key(40) 与 text filed(80)
示例代码请参考 这里 ,只是将实例中的下拉列表构造的代码要放在 PBO 块里即可
复选框、单选按钮、下拉框都可以附加这个选项,其目的是为了在 点击这些框 时就能触发 PAI 事件(如 AT SELECTION-SCREEN )( 默认情况下只有在框上按回车键时才会触发 PAI 事件 ———— 但文本框只能使用回车键来触发 PAI 事件 :当然回车键本身就可以触发复选、单选按钮、下拉框的 PAI 事件, 不加上这个选项时默认情况下通过鼠标点这些框时是不会触发的 ),如点击某个单选按钮时隐藏或显示其他屏幕元素这种应用。 为了使用 fcode ,则需要使用 TABLE SSSCRFIELDS 语句来定义一个接口工作区( SSCRFIELDS 为数据词典中的结构类型)。当用户点击这些框时,会触发 AT SELECTION-SCREEN 事件,并且 fcode 的值会传递到 SSCRFIELDS-UCOMM 中。
有时有这样的需求,如果用户选择了单选框,则屏幕的外观将会有所调整(如隐藏或显示屏幕上某个输入元素)。
这里需要给单选框通过 USER-COMMAND 选项来设置一个 Function code 。没有 USER Command 的单选框是不会立即出发 PAI (AT SELECTION-SCREEN) 与 PBO (如 AT SELECTION-SCREEN OUTPUT )事件的。
与 Radio Button (单选框)相似, Check Box (复选框)和 List Box (下拉框)也可以触发 PAI 、 PBO 。不过文本输入框则不支持 USER-COMMAND 选项,必须借助回车才可以触发 PAI 。
PARAMETERS
show_all
AS CHECKBOX USER-COMMAND
flag
.
PARAMETERS
hide
RADIOBUTTON GROUP
rd
USER-COMMAND
flag2
DEFAULT
'X'
.
PARAMETERS
show
RADIOBUTTON GROUP
rd
.
SELECTION-SCREEN BEGIN OF BLOCK
b1
WITH FRAME
.
PARAMETERS
:
p1
TYPE c
LENGTH
10
,
p2
TYPE c
LENGTH
10
.
SELECTION-SCREEN END OF BLOCK
b1
.
SELECTION-SCREEN BEGIN OF BLOCK
b2
WITH FRAME TITLE
t
.
PARAMETERS
:
p3
TYPE c
LENGTH
10
MODIF
ID
bl2
,
p4
TYPE c
LENGTH
10
MODIF
ID
bl2
.
SELECTION-SCREEN END OF BLOCK
b2
.
SELECTION-SCREEN BEGIN OF BLOCK
b3
WITH FRAME
.
PARAMETERS
:
p5
TYPE c
LENGTH
10
MODIF
ID
bl3
,
p6
TYPE c
LENGTH
10
MODIF
ID
bl3
.
SELECTION-SCREEN END OF BLOCK
b3
.
INITIALIZATION
.
t
=
'----ALL----'
.
AT SELECTION-SCREEN OUTPUT
.
LOOP AT SCREEN
.
IF
show_all
=
'X'
AND screen
-
group1
=
'BL2'
.
screen
-
active
=
'1'
.
MODIFY SCREEN
.
ELSEIF screen
-
group1
=
'BL2'
.
screen
-
active
=
'0'
.
MODIFY SCREEN
.
ENDIF
.
IF
show
=
'X'
AND screen
-
group1
=
'BL3'
.
screen
-
active
=
'1'
.
MODIFY SCREEN
.
ELSEIF screen
-
group1
=
'BL3'
.
screen
-
active
=
'0'
.
MODIFY SCREEN
.
ENDIF
.
ENDLOOP
.
设置修改组代码, key 中设定的代码将被赋给系统内表 SCREEN-GROUP1 字段
该参数可以将所定义的屏幕字段对象进行分组,以方便在程序运行中对分组的对象属性进行统一修改及控制,例如控制某组对象为不可输入,如下代码中将 G2 分组的字段对象在屏幕输出时设置为不可输入:
TABLES
:
mara
.
SELECT-OPTIONS
:
p1
FOR
mara
-
matnr MODIF
ID
g1
,
p2
FOR
mara
-
matnr MODIF
ID
g2
,
p3
FOR
mara
-
matnr MODIF
ID
g3
,
p4
FOR
mara
-
matnr MODIF
ID
g4
.
AT SELECTION-SCREEN OUTPUT
.
p2-low = 'aaaa'.
APPEND p2 .
LOOP AT SCREEN
.
IF NOT screen
-
group1
IS INITIAL
.
IF screen
-
group1
=
'G2'
.
screen
-
input
=
0
.
MODIFY SCREEN
.
ENDIF
.
ENDIF
.
ENDLOOP
.
分配默认值,可以是字符串字面常量,也可以是定义好的某个变量。如果未设定,则默认值为所对应 ABAP 基本类型的初始值。
也可以在 INITIALIZATION 事件块中为屏幕输入变量赋初始值
允许输入小写字母。 SAP 所有屏幕字段输入后都会将字母默认转换为大写,加上该参数后允许输入小写字母。但如果语句中使用 TYPE 或 LIKE 选项从 ABAP 词典中引用某数据库表字段,则参数将依照字典中定义的属性,因而不能使用 LOWER CASE 选项,所以此时如果需要小写的话,则在 ABAP 词典中定义 Domain 时,就要设置成小写。
如何查看某个屏幕字段引用的 Data Element 的是否是大写,可以通过查看对应的 Domain 来判断:
PARAMETERS : field1 ( 10 ) MEMORY ID ZPARA1 .
将参数 field1 与 SAP Memory 中的 ZPARA1 进行关联,当 selection screen 被调用时, 它会在 AT SELECTION-SCREEN OUTPUT 后使用 SAP memory 中的 SAP/GPA parameter 的值来填充相应选择屏幕字段 ,另外,如果用户在输入框中改变了参数的值,则也会将新的值存储到 SAP memory 中相应的 SPA/GPA parameter 里 ,如果不存在相应的 SAP/GPA parameter ,则会创建一个新的 。选择屏幕中的此选择作用与屏幕设计中的 Parameter ID 设置作用是一样的( 具体请参考《数据共享与传递 .docx 》文档 ):
( Parameter ID 用于 SAP Memory 中, 同一用户下不同窗体屏幕之间可以传递参数值 ,而 ABAP Memory 只能在同一程序中调用不同程序时之间进行参数传递 )
注: DEFAULT 选项设置的值会覆盖该选项读到的值
许多的数据元素已经设置此参数 ID ,如:
更多 参考
如果屏幕字段参考数据元素所对应的
Domaim
设置了固定值(
fixed Values
)或值表(
Value Table
)时,使用该选项后,会验证输入值是否在固定值或值表(若要使值表检查生效,则首先需要将此
Domain
引用到表字段,再对此表字段通过
按钮进行外键分配,并且引用的主键一定要参照此
Domain
所设置的值表,最后使用
PARAMETERS
定义屏幕参数时要参照此表字段,否则如果直接参照所对应的
DataElement
是不起作用,即
Value Table
一定要经过转换为
Check Table
后再起作用)范围之内
如果参照的类型所对应的 DOMAIN 指定了 FixeValue ,则会与 Fixed Value 值列表进行比对;如果这个参数参照的表字段还设置了 Value Table ,则还需要与所对应的 Check Table 进行比对。
注: 如果要使用 VALUE CHECK 选项,则 Domain 的类型只能是 C 或者 N 类型 ,否则运行会抛异常。另外,如果未使用该选项,但 F4 Help 还是会出现(有固定值或检查表的情况下),但不进行有效性检查了
当一个字段所参照的 Domain 中有固定值时,那么当这个字段被定义成屏幕字段时,用户对该字段的输入值将自动被固定值来检查,并用该屏幕字段将自动带有 F4 Help.
PARAMETERS p_1 TYPE zmy_dm_200 VALUE CHECK .
某个表字段是否配置了
Fixe Value
与
Check Table
,可以查看字段所对应的
Domain
来查看(其实一般在为表字段分配外键时,默认的使用的主表就是
Domain
里所设置的
Value Table
,当然在使用
进行外键分配时,可以不使用
Domain
中设置的
Value Table
,而是指定其他的表为主表):
这里的检查表
(Check Table)
实质上就是我们平时讲的主表,主表与从表之间进行关联是从通过
进行设置的:
SELECT-OPTIONS selcrit FOR {dobj|(name)}
screen_options
[OBLIGATORY|NO-DISPLAY][VISIBLE LENGTH vlen][NO-EXTENSION][NO INTERVALS][MODIF ID modid]
value_options
[DEFAULT val1 [TO val2] [OPTION opt] [SIGN sgn]][LOWER CASE]
[MATCHCODE OBJECT search_help][MEMORY ID pid]
ldb_options
[
HELP-REQUEST
[ FOR {LOW|HIGH} ] ][
VALUE-REQUEST
[ FOR {LOW|HIGH} ] ][ NO DATABASE SELECTION ]
系统在运行时会自动生成一个带表头的名为 name 的全局内表,并且其 Key 为默认标准 Key 。
如果某个屏幕输入元素处于 隐藏状态 ,即使它是 OBLIGATORY 必输入的,则在提交时也不会提示你必输入,只有在显示状态时且不输入时才会提示。
其它参数选项还可以请参考 PARAMETERS
dobj 只能是已定义好的内存变量,不能是数据类型
动态构造 ,括号里面只能是变量,不能直接是字符串常量
DATA
:
name
TYPE
string
VALUE
'
MARA-MATNR
'
.
SELECT-OPTIONS
selcrit
FOR
(
name
).
限制选择表为单行,元素输入后面不会出现
按钮
。
SELECT-OPTIONS
默认会有
LOW
与
HIGH
两个字段可以输入范围值,如果加上此选项时,
只会出现
LOW
字段
,
To
后面的
HIGH
字段不出现在选择屏幕上,但是,用户仍然可以在
Mutiple Selection
窗口中输入范围选择。也就是说:只要有
按钮,就可以选择多个条件与范围值
,而且那怕设置了
NO INTERVALS
选项,在使用时还是使用
IN
而不是
EQ
逻辑操作符(因为可能输入了多个条件)。
此外,使用 DEFAULT 选项给选择屏幕上的选择标准分配默认值时,可以给条件内表中的首行 LOW 、 HIGH 以及 SIGN 和 OPTION 设定默认值( s_werks FOR marc - werks OBLIGATORY DEFAULT 1001 to 1007 SIGN I OPTION BT ) 。如果是在程序中给默认值,则如下:
TABLES
:
mara
.
SELECT-OPTIONS
:
p2
FOR
mara
-
matnr MODIF
.
AT SELECTION-SCREEN OUTPUT
.
p2-low = 'aaaa'.
APPEND p2 .
在调用逻辑数据库的程序中,会对用户输入的数据按权限来进行筛选。倘若在定义的对象后面加上该参数,该字段所输入的对象则不会受到逻辑数据库的约束。
在引用逻辑数据库 F1S 开发的程序中,通过按 F4 键只能看到用户权限所的数据,以连接编号 CONNID 字段为例,通过按 F4 键只能看到用户被分配的 CONNID 的聚值范围,加上该参数后,可以读取被限制条件的数据:
当在某个输入字段上按 F1 键时,可以调用自定义的程序或系统帮助文件,该功能称为 F1 帮助。 F1 帮助可以通过 ABAP 事件 AT SELECTION-SCREENON 来控制,在自定义程序中,可以通过调用系统标准函数 HELP_OBJECT_SHOW 或 HELP_OBJECT_SHOW_FOR_FIELD 来实现。下面主要介绍如何在程序中使用自定义的文本作为 F1 帮助提示信息。
TABLES
:
syst
.
DATA
:
t_link
LIKE STANDARD TABLE OF
tline
WITH HEADER LINE
.
SELECT-OPTIONS
:
s_date
FOR
syst
-
datum
.
AT SELECTION-SCREEN ON HELP-REQUEST FOR
s_date
-
low
.
"low
字段按
F1
键触发
CALL FUNCTION
'HELP_OBJECT_SHOW'
EXPORTING
dokclass
=
'DE'
"
帮助文本类型,
DE
代表数据元素,
DO
代表数据域类型
dokname
=
'SYDATUM'
TABLES
links
=
t_link
.
当按 F4 键时,会触发 AT SELECTION-SCREEN ON VALUE-REQUEST FOR xxx 事件。
该事件主要是在按按 F4 帮助数据时使用,在参照数据表建立的屏幕字段一般会取用默认的 F4 帮助。与 F1 不同的是, F1 是进行信息提示,而 F4 是显示可选的填充值列表,所选择的值将返回给所操作的屏幕字段。也可以调用系统函数 F4IF_FIELD_VALUE_REQUEST 参照某个具体表字段来维护 F4 帮助
TABLES
:
syst
.
SELECT-OPTIONS
:
s_date
FOR
syst
-
datum
.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR
s_date
-
low
.
"
按
F4
键时触发
CALL FUNCTION
'
F4IF_FIELD_VALUE_REQUEST
'
EXPORTING
tabname
=
'SYST'
"
参照表
fieldname
=
'DATUM'
"
参照字段
dynpprog
=
sy
-
repid
"
指定执行程序
dynpnr
=
sy
-
dynnr
"
指定执行程序的屏蔽编码
dynprofield
=
'S_DATE'
"
触发事件的屏幕字段名称
SELECT-OPTIONS selcrit FOR {dobj|(name)}
该语句会生成一个名为 selcrit 选择条件内表,行结构类型如下的全局内表:
DATA
:
BEGIN OF
selcrit
OCCURS
0
,
sign
(
1
),
option
(
2
),
low
LIKE
mara-matnr
,
high
LIKE
mara-matnr
,
END OF
selcrit
.
等同于: RANGES aa FOR mara - matnr .
该条件内表的每一行都代表一个逻辑条件:
l SIGN 字段是长度为 1 的 C 类型数据。它是标志位,允许值为 I 和 E ,用来确定存储在字段 OPTION 中的运行算是否需要取反。 I 表示“包含 Include 、等于的意义”(在 Select Single Values 与 Select Intervals 标签里输入的条件表达式就属于此种类型), E 表示“排除 Exclude 、不等于的意义,用此类型标示的数据表示要排除掉”(在 Exclude Single Values 与 Exclude Intervals 标签里输入的条件表达式就属于此种类型,等于在逻辑表达式前加上了 NOT )。
l OPTION 字段的数据类型是 C ,长度为 2 , OPTION 包含选择运算符。如果 HIGH 字段为空,则可以填充 EQ ( = )、 NE ( <> )、 GT ( > )、 GE ( >= )、 LE ( <= )、 LT ( < )、 CP 和 NP 等文字代表相应的比较运算符,其中 CP (集合之内的数据)和 NP (集合之外数据)只有当在输入字段中使用了通配符( “ * ”或“ + ” )时它们才是有效的,且未定义转换符号。如果 HIGH 字段被填充,则可以使用 BT (之间)和 NB (两边),其功能相当于 BETWEEN 和 NOT BETWEEN 。
l LOW 字段的数据类型与 f 类型相同。如果选择表数据行中对应的 HIGH 字段为空,则该行为单值选择;如果 HIGH 已填充,则为范围选择, LOW 和 HIGH 中的内容为范围上界与下界。
l HIGH 字段的数据类型与 f 类型相同,该值为范围选择指定了上界。
该语句会自动生成名称为 selscrit-low 和 selscrit-high 的两个屏幕输入框,如果需要为操作某一个输入框时(如果为某个框手动设置 F4 事件时),就需使用这两个名称具体到某个输入框。
条件内表 selscrit 中的第一行会显示在选择屏幕上的。
如果条件内表 selscrit 为空,则 XX IN selscrit 恒为真, XX NOT IN selscrit 恒为假。
条件内表组合规则是:如果选择表为空,则查询所有的数据,如果选择表有多行,则将所有的 sign 为“ I ”的数据选出后,再排除掉其中所有的满足标志“ E ”的数据行。具体规则如下:
l 如果选择表为空,即用户未输入任何数据,则条件 f IN seltab 恒为真。
l 如果选择表只包含 SIGN 为 I 的行“ i1 ”、 ... 、“ in ”,则相当于条件( i1 OR ... OR in )的组合。
l 如果选择表中只包含 SIGN 为 E 的行“ e1 ”、 ... 、“ em ”,则相当于条件( NOT e1 ) AND ... AND ( NOT em )的组合。
l 如果选择表中即包含 SIGN 为 I 的行“ i1 ”、 ... 、“ in ”,又包含 SIGN 为 E 的行“ e1 ”、 ... 、“ em ”,则相当于条件( i1 OR ... OR in ) AND ( NOT e1 ) AND ... AND ( NOT em )的组合。
l 如果选择表中的某条件记录的 LOW 与 HIGH 都有时,表示的是一个范围,至于该范围是要被排除还是要在该范围内,这要看该条件记录的 SIGN 是 I 还是 E
(( Select Single Values ) U ( Select Intervals )) — (( Exclude Single Values ) U ( Exclude Intervals ))
(( Select Single Values ) OR ( Select Intervals )) AND NOT (( Exclude Single Values ) OR ( Exclude Intervals ))
进一步转换为 SQL 语句:
(( Select Single Values OR … ) OR ( Select Intervals OR … ))( AND NOT Exclude Single Values) … ( AND NOT Exclude Intervals) …
( "MATNR" = '1' OR "MATNR" >= '2' OR "MATNR" <= '3' OR "MATNR" > '4' OR "MATNR" < '5' OR "MATNR" <> '6' OR "MATNR" <> '7' OR "MATNR" LIKE '23%' OR NOT ( "MATNR" LIKE '24_' ) OR "MATNR" BETWEEN '8' AND '9' OR NOT ( "MATNR" BETWEEN '10' AND '11' ) ) AND "MATNR" <> '12' AND "MATNR" < '13' AND "MATNR" > '14' AND "MATNR" <= '15' AND "MATNR" >= '16' AND "MATNR" = '17' AND "MATNR" = '18' AND NOT ( "MATNR" LIKE '25%' ) AND "MATNR" LIKE '26_' AND NOT ("MATNR" BETWEEN '19' AND '20' ) AND "MATNR" BETWEEN '21' AND '22'
从生成的条件可以看出
Select Single Values
与
Select Intervals
选项卡中的条件在内部使用
OR
进行拼接,然后将拼接好的整个条件串与
Exclude Single Values
、
Exclude Intervals
两个选择卡中的每个条件进行
AND
拼接,这里面要注意的是
Exclude Single Values
、
Exclude Intervals
两个选择卡中的生成的条件串恰好与原输入的条件相反(如
Exclude Single Values
中输入的
条件最终生成的条件串为
< '13'
,仔细观察其他的都是这样)。从生成的条件串来看
Exclude Single Values
、
Exclude Intervals
内部也是使用
AND
进行拼接的,好像不是我们想像中的
OR
拼接,但其实这个与面上的推导是相符的:
((
Select Single Values
)
OR
(
Select Intervals
))
AND NOT
((
Exclude Single Values
)
OR
(
Exclude Intervals
))
,将
AND NOT ((Exclude Single Values) OR (Exclude Intervals))
关系式展开,并将
NOT
应用到每一个条件选项后,就可以生成上面这样的最终的条件串。另外,在
Select Single Values
选项串中,不要增加两个
这样的条件,如果增加在检测时会弹出警告:
从上面生成的条件串 "MATNR" <> '6' OR "MATNR" <> '7' 可以看出,如果当值为 6 时,由于 "MATNR" <> '7' 条件会返回真,如果当值为 7 时,由于 "MATNR" <> '6' 条件也会返回真,此情况下, 6 或 7 其实是不能被排除掉了,这样实质上是违背了选择条件的本意了(本来是要排序 6 和 7 这两个值的,结果是都不能被排除掉了)。
在选择屏幕中输入框中输入的值存储到 Select Single Values 、 Select Intervals 、 Exclude Single Values 、 Exclude Intervals 选项卡中的哪一个,则要看 Select Options 的第一个框框前的符号是什么以及是否输入了 High 值有关
1
、如果只输入
LOW
值,且第一个框前面的符号为
或没有时,条件值会存储到
Select Single Values
选项卡中:
2
、如果只输入
LOW
值,且第一个框前面的符号为
时,条件值会存储到
Exclude Single Values
选项卡中:
3
、如果输入了
LOW
与
HIGH
值,且第一个框前面的符号为
或没有时,条件值会存储到
Select Intervals
选项卡中:
4
、如果输入了
LOW
与
HIGH
值,且第一个框前面的符号为
或没有时,条件值会存储到
Exclude Intervals
选项卡中:
第二个输入框前面是没有
等这些图标的,只有在第一个框前面才可以选择。
如果输入框中
输入的值恰为
ABAP
程序中相应字段所对应的初始值时
(如字符类型为空串,时间(日期除外)与数字类型为“
0
”串时),
需要在第一个框前面选择
操作符,否则程序将会忽略这个值的输入
,即查询所有的
(由于第一个框前默认就是
,所以输入的值为非初始值时可以不用选择)。上图中,由于时间类型为数字类型,所以默认值就是“
0
”字符串(由于时间是带格式时,又
00
时
00
分
00
秒是合法的,所以
00:00:00
就是初始值,但日期不能是
0000.00.00
,因为
0000
年
00
月
00
日本身就是不合法数据),当你真正需要等于
000000
这个值时,就要在输入框前选择
,否则在取值时
ABAP
程序会认为没有输入。注,
这个规则只适用于
Select-option
参数
,对于
parameters
是不适用的。
如果用户仅仅在“ to ”之前的字段不输入,只输入后面的,则此时还是相当于一个范围,只是 LOW 字段为空而已,如果只输入“ to ”前面一个值,则表示是单个值条件,而不是一个范围
TABLES
:
mara
,
marc
.
DATA
:
g_pg
(
24
).
SELECTION-SCREEN BEGIN OF BLOCK
bk1
WITH FRAME TITLE text
-
001
.
PARAMETERS
:
p_bukrs
LIKE
t001
-
bukrs OBLIGATORY
.
"Company code
SELECT-OPTIONS
:
s_werks
FOR
marc
-
werks
OBLIGATORY
NO INTERVALS
,
s_matnr
FOR
mara
-
matnr
NO
-
EXTENSION
,
s_segme
FOR
g_pg
.
"
参照普通变量
PARAMETERS
:
p_line
(
6
).
SELECTION-SCREEN SKIP
1
.
PARAMETERS
:
p_x1
RADIOBUTTON GROUP
gp1
DEFAULT
'X'
,
p_x2
RADIOBUTTON GROUP
gp1
.
PARAMETERS
:
p_old
TYPE c AS CHECKBOX
.
PARAMETERS
:
p_oldhir
LIKE
grpdynp
-
name_coall MODIF
ID
m1
DEFAULT
'ABB_CHINA.XXXX'
.
SELECTION-SCREEN
:
SKIP
1
.
SELECTION-SCREEN BEGIN OF LINE
.
PARAMETERS
:
p_dwload
AS CHECKBOX
.
SELECTION-SCREEN COMMENT
5
(
29
)
text
-
001
.
PARAMETERS
:
p_file
TYPE
string
.
SELECTION-SCREEN END OF LINE
.
SELECTION-SCREEN END OF BLOCK
bk1
.
实际上 PARAMETERS 类型的参数完全可以使用 SELECT-OPTIONS 来替代,下面就是使用这种替换方式,外表看上去与 PARAMETERS 是一样的,但双击后可以出现操作符选择界面,所以唯一不同点就是这个可以选择操作符,而且这样做的好处是:当不输入值时,查询所有的, 但 PARAMETERS 值为空是查询就是为空的值 (如果此时要忽略这个条件,则要将单值转换为 Rang 或者是分两种情况来写 SQL 条件):
TABLES
:
marc
.
SELECT-OPTIONS
:
s_werks
FOR
marc
-
werks
NO INTERVALS NO-EXTENSION
.
使用 SELECT-OPTIONS 比 PARAMETERS 的另一个好处时, PARAMETERS 只是一个值,在与这个值进行比较时,是大于,还是小于,还是不等于等这些情况时,需要我们手动去写这些,但 SELECT-OPTIONS 则可以很方便的实现这些,所以完全可以替代它
AT SELECTION-SCREEN { OUTPUT }
| { ON {para|selcrit} }
| { ON END OF selcrit }
| { ON BLOCK block }
| { ON RADIOBUTTON GROUP radi }
| { }
| { ON {HELP-REQUEST|VALUE-REQUEST}
| FOR {para|selcrit-low|selcrit-high} }
| { ON EXIT-COMMAND }.
INITIALIZATION :程序初始化,整个程序运行过程中只执行一次。在屏幕未显示之前执行,对 程序设置值及屏幕元素进行初始化赋值 。
START-OF-SELECTION
:选择开始事件(默认事件,未写在任何事件块里的代码默认属于此事件块),在选择屏幕的处理结束后触发,即在选择屏幕上
点击
执行按钮后触发
。
END-OF-SELECTION :选择结束事件,在所有逻辑数据库事件处理结束后触发,一般用于输出列表。在输出屏幕还未显示之前执行
在 INITIALIZATION 和 START-OF-SELECTION 之间触发:
AT SELECTION-SCREEN OUTPUT
:是选择屏幕的
PBO
事件,在每次选择屏幕被调用之前(显示之前)触发,可以在其中进行选择屏幕输出之前的准备工作,如在程序中动态地对选择屏幕元素的输出属性进行修改。如果只是在程序的整个运行过程中只希望一次初始化和,则需要在
LOAD-OF-PROGRAM
或
INITIALIZATION
事件块中进行
,
因为在些事件中是每次显示之前就会被触发(如通过
选择多个条件值后,回到选择屏幕时会也触发)。
AT SELECTION-SCREEN
ON
field
:是针对选择屏幕
field
字段输入的
PAI
事件(
ON
事件表示当对应字段的值被传递给程序时被触发),可以应用于该字段的正确性检查,如果系统提示错误,则可以在该字段中重新输入。此时其他元素呈灰色不接受输入。
(
注:
点击后面的多选按键
也会触发
)
AT SELECTION-SCREEN ON BLOCK block :是针对于选择屏幕某元素区域输入的 PAI 事件,仅当该区域内的所有字段的值已经传递给程序时被触发(一旦块中的所有字段的字段级事件执行完后立即触发),可以应用于该区域元素整体的正确性检查。如果任一元素出现错误,系统将提示,可以重新输入该区域中所有元素,此时非该 Block 块以外的屏幕字段元素呈灰色不接受输入。
AT SELECTION-SCREEN ON RADIOBUTTON GROUP radi :功能与元素区域的 PAI 事件类似,作为单选择按钮,必须整体进行输入检查,不能单独使用 ON field 选项进行。
AT SELECTION-SCREEN ON END OF seltab . :这个事件只能使 SELECT-OPTIONS 屏幕参数上(触发时机请参考: SELECT-OPTIONS 的 END OF 事件 ),用于整个选择表输入结束后对整个输入的选择条件列表进行检查。
AT SELECTION-SCREEN ON { { HELP-REQUEST | VALUE-REQUEST } FOR{para|selcrit-low|selcrit-high}} :是选择屏幕中的 POH 和 POV 事件,当光标位于某屏幕字段时,用户按下 F1 和 F4 键,将触发分别触发这两个事件。 这种用户自定义的 F1 Help 和 F4 Help 的机制优先级较高,可以覆盖和屏蔽系统字典库中定义在该字段上的 Search Help 功能
AT SELECTION-SCREEN
:是选择屏幕的基本
PAI
事件,所有用户输入的数据都被传输到程序中
之后再按
F8
才触发(注:如果单选按钮、复选框、下拉框通过
USER-COMMAND
选项设置了
FunctionCode
时,鼠标点这些输入元素时也会触发该事件;另外,在选择屏幕上直接按回车键也会触发),也是
选择屏幕中最后被触发的事件
。在该事件中主要进行对所有用户输入正确性和全部字段的全面一致性的检查工作,如权限检查
(
注:
点击屏幕字段后面的多选值条件按键
也会触发
,
所以不要在该事件块中对全局的变量进行写操作,否则会出现问题
)
。如果此时在程序中给出错误消息,则所有元素都可以重新进行输入。
AT SELECTION-SCREEN
ON EXIT-COMMAND
:
当用户点击
按钮时会触发
注:对于选择屏幕,在点击执行按钮且输入验证通过后,会直接执行报表的 START-OF-SELECTION 事件,这个流逻辑我们是不能控制的,这不像对话屏幕,在点击执行后:可以跳到本对话屏幕、跳到另外的对话屏幕、或结束对话屏幕到主调程序(即对话屏幕的流逻辑是可以控制的)。
在 START-OF-SELECTION 事件结束以后触发,用于选择并整理数据:
GET node ... 选择逻辑数据库中当前级别数据中的数据
GET node LATE 选择逻辑数据库中上一级别数据源中的数据
在所有报表过程事件和选择屏幕事件结束之后,开始触发 列表事件
TOP-OF-PAGE :页眉,每个新页面开始时触发(注:触发的条件是要在 Start-of-selection 或 End-of-selection 中有 Write 写屏幕动作,否则是不触发的。如果有此事件,当在 Start-of-selection 或 End-of-selection 中的第一个 Write 写屏动作语句时 (SKIP 也算写屏动作 ) ,立即会跳转到 TOP-OF-PAGE 事件,该 Write 语句会暂停等到 TOP-OF-PAGE 事件执行完后才继续执行)
END-OF-PAGE :页脚,当前页面结束前触发
AT LINE-SELECTION :行选择控制,当用户选择某列表行时触发
AT USER-COMMAND :用户交互控制
AT PF<nn>
搜索“ Event Blocks in Executable Programs ”
一般报表的触发过程如下:
(1) 运行程序开始时, LOAD-OF-PROGRAM 触发,运行时环境将为该程序在应用服务器中分配程序上下文以及相关内存区域存储内表数据对象,接下来的程序流程将由 ABAP 运行时环境控制( ABAP 处理器)
(2) INITIALIZATION 事件触发
(3) 如果有选择屏幕,则 每次 选择屏幕输出(显示)之前,事件 AT SELECTION-SCREEN OUTPUT 被触发,运行时环境将选择屏幕发送至显示服务器
(4) AT SELECTION-SCREEN ON … ( PAI )等一系列的字段级与块级屏幕事件开始执行。 ( 字段屏幕事件的执行顺序是按屏幕上字段的定义位置先后顺序所决定的 )
l AT SELECTION-SCREEN ON field :针对某字段的 PAI 事件。若发生错误,该字段可重新输入,其他元素成灰色
l AT SELECTION-SCREEN ON BLOCK block :针对某元素区域的 PAI 事件。域内任一元素发生错误,重新输入域内所有元素,域外元素成灰色
l AT SELECTION-SCREEN ON RADIOBUTTON GROUP radi :单选按钮整体检查,不可单独使用 ON field
l AT SELECTION-SCREEN ON [END OF] seltab :使用多行选择对话框时触发, ON seltab 用于用户逐行输入后的检查,而 ON END OF seltab 用于整个表输入结束后各行的检查。
l AT SELECTION-SCREEN ON [HELP|VALUE]-REQUEST FOR field : POH 和 POV 事件,定义 F1 和 F4 屏幕的 PAI 事件如果没有发生任何错误,将执行后续事件,如 F8 、打印、保存变量等。
整个过程由屏幕处理器和 ABAP 处理器交互处理,系统自动在其中进行切换
(5)A T SELECTION-SCREEN :选择屏幕 PAI 事件,检查用户数据正确性和全部字段一致性,发生错误所有元素可重新输入
(6) 当屏幕事件执行完毕后,系统回收对程序的控制,触发报表事件 START-OF-SELECTION
(7) 如果有逻辑数据库,则触发 GET 和 GET LATE 。
(8) 最后将触发 END-OF-SELECTION 报表事件,此后系统运行时环境将控制交给显示服务器
(9) 列表输出过程(触发列表事件前提是要在 START/END-OF-SELECTION 报表时间中 WRITE 过,才会调用这两个事件,否则不会自动调用这两个列表事件)中将触发 TOP-OF-PAGE 和 END-OF-PAGE 。 当用户点击 Back 返回选择屏幕时,回到选择屏幕中( LOAD-OF-PROGRAM 和 INITIALIZATION 不会再次触发) ,可以再次进行选择标准输入和数据选择,这是一个反复循环的过程
(10) 如果程序中定义有交互的列表事件( AT-LINE-COMMAND 、 AT-USER-COMMAND ),则系统可以响应用户在输出列表屏幕中的行为,触发各种程序中交互事件。行选择交互事件( AT LINE-SELECTION )允许用户从列表中选择某行,并将触发响应的事件。如果用户选择其他子定义的功能代码(功能代码与相关菜单、按钮或键盘热键有关,由程序员在 GUI 状态中定义),将触发用户指令交互,即 AT USER-COMMAND 事件。
选择屏幕事件发生在 INITIALIZATION 和 START-OF-SELECTION 事件之间
点击
Selection-option
后面的多值条件输入按钮
时会触发一系统的事件,这些事件与点击执行按钮(
F8
)所触发的事件流 程是一样的;另外,附带
USER-COMMAND
选项的下拉框、单选框、复选框,以及回车键、
带FunctionCode
的按钮
。
RETURN 用来退出当前执行的程序块,例如一个 FORM 、 METHOD 、报表事件块,不管是否出现在循环 (LOOP) 中, RETURN 都会退出当前执行的程序块,而不仅仅是退出循环(如果是在 Form 、 METHOD 中,只会退出 Form 、 METHOD ,不会退出 Form 、 METHOD 被调用所在的报表事件块,即退 Form 、 METHOD 后继续向被调用点后面执行)
l INITIALIZATION 中的 STOP 会导致跳转到 AT SELECTION-SCREEN OUTPUT 事件块;
l 如果 STOP 在 AT SELECTION-SCREEN OUTPUT 块里,则只是退出当前块( STOP 后面语句不执行而已),仅接着是显示选择屏幕;
l AT SELECTION-SCREEN [ON]… 选择屏幕事件块中的 STOP 也只是退出当前事件块,继续后面的事件块;
l 从 AT SELECTION-SCREE 开始往后的事件块(除开 AT SELECTION-SCREEN OUTPUT ),如果出现 STOP ,则会 一律跳转到 END-OF-SELECTION 事件块 , 这点与 EXIT 不一样 ; ?????
l 另外,即使 STOP 在循环中 , 还是在 FORM , METHOD ,也是 直接从被调用的点退出所在事件块 ,而不仅仅只退出当前循环、 FORM 、 METHOD ,这与直接在事件块中的效果是一样的;
l INITIALIZATION 中的 EXIT 会导致跳转到 AT SELECTION-SCREEN OUTPUT 事件块;
l 如果 EXIT 在 AT SELECTION-SCREEN OUTPUT 块里,则只是退出当前块( EXIT 后面语句不执行而已),仅接着是显示选择屏幕;
l AT SELECTION-SCREEN [ON]… 选择屏幕事件块中的 EXIT 也只是退出当前事件块,继续后面的事件块;
l 从 START-OF-SELECTION 开始往后的事件块,如果出现 EXIT ,则会开始 listprocessor (列表处理),并 跳转到相应的 List 输出页面 (前提条件是要在退出前已经向屏幕输出内容了,否则也不会跳转);注: END-OF-SELECTION 事件块也会被跳过
l 另外,如果 EXIT 在循环( DO 、 WHILE 、 LOOP )里,只是跳出当前循环而已;
l 如果是在 FORM , METHOD 中,而非循环中,则退出当前的 FORM 、 METHOD ,其作用与 RETURN 类似
CHECK 跳转的前提是 <expr> 为假时。
l CHECK 只是跳出当前事件块,继续下一个事件块的处理,相当于方法的 return ;
l 另外,如果 CHECK 在循环( DO 、 WHILE 、 LOOP )里,只是跳出当前循环而已;
l 如果 CHECK 出现在循环以外 , 退出的是当前执行的程序块 (processing block) ,例如一个 FORM , METHOD ,或 EVENT 。 ????
EXIT 和 CHECK 如果是在循环中时,只是退出循环;如果是在 FORM 中,则只是退出当前 FORM
REJECT 是用在逻辑数据库 GET event blocks 中,与 EXIT 和 CHECK 不一样的是( EXIT 和 CHECK 如果是在循环中时,只是退出循环;如果是在 FORM 中,则只是退出当前 FORM ), REJECT 可以从循环或者一个 FORM 中直接跳出所在的 GET 事件块:
REJECT [<dbtab>] .
终结逻辑数据库当前节点数据行的处理
如果省略选项 <dbtab>, 则逻辑数据库会自动读取同一节点的下一行数据,即同一节点的 GET 事件块会被触发。如果使用了 <dbtab> 选项,则逻辑数据库会读取节点 <dbtab> 的下一行数据,此时的 <dbtab> 节点必须是 REJECT 所在当前节点的上级节点。
TABLES
:
mara
.
SELECTION-SCREEN BEGIN OF BLOCK
b1
.
PARAMETERS
:
p_matnr
LIKE
mara
-
matnr
.
SELECTION-SCREEN END OF BLOCK
b1
.
PARAMETERS
:
p_x1
RADIOBUTTON GROUP
gp1
DEFAULT
'X'
,
p_x2
RADIOBUTTON GROUP
gp1
.
SELECT-OPTIONS
:
s_matnr
FOR
mara
-
matnr
.
AT SELECTION-SCREEN ON
s_matnr
.
WRITE
:
/ s_matnr
-
low
.
AT SELECTION-SCREEN ON END OF
s_matnr
.
DATA
:
i TYPE i
.
i
=
lines
(
s_matnr
).
WRITE
:
/
i
.
AT SELECTION-SCREEN ON
p_matnr
.
WRITE
:
/ p_matnr
.
AT SELECTION-SCREEN ON BLOCK
b1
.
WRITE
:
/
'BLOCK'
.
AT SELECTION-SCREEN ON RADIOBUTTON GROUP
gp1
.
WRITE
:
/ p_x1
,
p_x2
.
AT SELECTION-SCREEN
.
WRITE
:
'AT SELECTION-SCREEN'
.
AT SELECTION-SCREEN ON END OF s_matnr. 事件只在 C 、 D 处触发( 不管 G 块是否为空 ),且每次只执行一次。
AT SELECTION-SCREEN ON s_matnr. 事件在 A 、 B 、 C 、 D 、 E 、 F 处都会触发,在点击 C 、 D 、 E 、 F 后, G 中有多少条目就会触发多少次, 如果 G 为空,则不会触发该事件 。并且在 AT SELECTION-SCREEN ON END OF s_matnr 之前触发
注:点击 B 时与点击 A 所触发的屏幕字段事件是一样的,但在点击 C 或 D 时,只触发 s_matnr 屏幕字段的相应事件( AT SELECTION-SCREEN ON s_matnr 、 AT SELECTION-SCREEN ON END OF s_matnr ),不会触发 p_matnr 屏幕字段相关事件 。
如果某个字段检查不通过,则会要求重新输入,按回车键后会再次进入检测不通过的事件代码块(注意,不是该字段相关的所有事件,如某个字段即有字段级事件 AT SELECTION-SCREEN ON 与块事件 AT SELECTION-SCREEN ON BLOCK , 发生错误是在字段级事件里,则回车后还是只执行字段级事件,而不执行相关的块事件 )
注意:不是将屏幕上所有字段的字段级事件 AT SELECTION-SCREEN ON 执行完后才执行相关块级 AT SELECTION-SCREEN ON BLOCK 事件,而是只要某个块中所包含的所有字段的字段级事件执行完后就立即执行相关块事件。
SELECTION-SCREEN BEGIN OF BLOCK
b1
WITH FRAME
.
PARAMETERS
:
p_bukrs
LIKE
bkpf
-
bukrs OBLIGATORY
DEFAULT
c_bukrs
.
SELECTION-SCREEN BEGIN OF BLOCK
b2
.
PARAMETERS
:
p_lfmon
LIKE
marv
-
lfmon OBLIGATORY
,
p_vmgja
LIKE
marv
-
vmgja OBLIGATORY
.
SELECTION-SCREEN END OF BLOCK
b2
.
SELECTION-SCREEN SKIP
.
PARAMETERS
:
flag
AS CHECKBOX DEFAULT
'X'
,
filename
LIKE
rlgrap
-
filename
DEFAULT
'C:\TEMP\AGESUM.xls'
.
SELECTION-SCREEN END OF BLOCK
b1
.
AT SELECTION-SCREEN ON BLOCK b2. :当 p_lfmon 与 p_vmgja 字段级检测完后才执行这两个字段所在块级检查,即在这之前先需将该块中的所有字段的 AT SELECTION-SCREEN ON 事件执行完毕(这里为 AT SELECTION-SCREEN ON p_lfmon. 与 AT SELECTION-SCREEN ON p_vmgja. 两个事件)后才执行这些字段所在块的块事件,所以块事件是在块中所有字段的字段级事件执行完毕后才执行,一般用来几个字段相关联的检查
选择屏幕的 GUI status 是由系统自动生成的, 标准选择屏幕的 PBO 事件里(即 AT SELECTION-SCREEN OUTPUT )的 SETPF-STATUS 语句将不会再起作用 。如果想修改标准选择屏幕的 GUIstatus (或去激活标准选择屏幕上的 GUI Status 上预设的功能),则可以在选择屏幕的 PBO 事件里调用 RS_SET_SELSCREEN_STATUS 函数来实现。
关于如何获取标准 GUI Status 上功能所对应的 FunCode ,请在 AT SELECTION-SCREEN. 事件里调试即可得到
REPORT
demo_sel_screen_status
.
DATA
itab
TYPE TABLE OF
sy
-
ucomm
.
PARAMETERS
test
(
10
)
TYPE c
.
AT SELECTION-SCREEN OUTPUT
.
"
关于如何获取标准
GUI Status
上功能所对应的
FunCode
,
"
请在
AT SELECTION-SCREEN.
事件里调试即可得到
APPEND
:
'PRIN'
TO
itab
,
"
将打印按钮去激活
'SPOS'
TO
itab
.
"
将保存变式功能去掉
CALL FUNCTION
'RS_SET_SELSCREEN_STATUS'
EXPORTING
p_status
=
sy
-
pfkey
"
设置为当前的
GUI Status
TABLES
p_exclude
=
itab
.
"
哪些按钮将不能使用
AT SELECTION
-
SCREEN
.
"
可以通过此方式来调式标准
GUI Status
上功能所对应的
FunCode
CASE
sy
-
ucomm
.
WHEN
''
.
ENDCASE
.
标准选择屏幕 会在 INITIALIZATION 与 START-OF-SELECTION 事件之间自动调用。
但对应自己定义选择屏幕,可以使用以下语句来调用:
CALL SELECTION-SCREEN <numb> [ STARTING AT <x1> <y1>] [ ENDING AT <x2> <y2>] .
<numb> 可以是标准选择屏幕 (screen number 1000) 或者是自定义的选择屏幕。 只可使用 CALL SELECTION-SCREEN 语句来调用选择屏幕,而不能使用 CALL SCREEN 语句 。
x1 、 y1 、 x2 、 y2 分别表示选择屏幕显示的左上角和右下角的列号、行号
你可以使用 STARTING AT 与 ENDING AT 选项来将自定义选择屏幕以 modal dialog box 方式(弹出对话框的形式)来显示(即使在自定义选择屏幕时没有加上 AS WINDOW 选项时,只要在调用时使用了 STARTING AT 语句,屏幕自身还是会以弹出对话框来显示,只是说此种情况下该屏幕发出的 W arnings 与 E rror message 类型的消息不会以弹出对话框来显示,而是显示在了状态栏中了,所以自定义选择屏幕的 AS WINDOW 只是决定相关的 W 与 E 类型消息将会以弹对话框形式显示,而不能决定该选择屏幕本身以对话框形式来显示,屏幕本身是否以对话框模式来显示是由 STARTING AT 来决定的) 。
那怕是标准选择屏幕,在程序中还是可以使用 CALL SELECTION-SCREEN 1000 来调用,并且还可以使用 STARTING AT 选项来使标准选择屏幕以弹出对话框的形式来显示。
当从 CALL SELECTION-SCREEN 调用选择屏幕完后回到 ABAP 程序调用处时, 如果是用户在 CALL 的选择屏幕中选择了 Execute ,则 SY-SUBRC = 0 ;如果用户选择了 Cancel ,则 SY-SUBRC = 4 。
在选择屏幕相关的选择屏幕事件中, S Y - D YNN R 为当前屏幕的屏幕号
当 W 类型消息出现时(不管是在状态栏中显示,还是以对话框模式显示),只要按 回车键 就能跳过警告消息(如果是按 Execute 按键时显示的 W 类型消息,则按回车键后会继续执行程序;如果这个警告消息本身是由于按回车键后显示出来的,则再次回车则又会回到弹出警告消息的屏幕,仔细想后这是符合逻辑的)。
可以使用 AS WINDOW 选项将普通选择屏幕以 modal dialog box 的方式调用,这与 modal dialog box 类型的普通屏幕是一样的:
当调用 modal dialog box 类型的屏幕(不管是选择屏幕还是普通屏幕)时,关于这个屏幕的 warnings 与 error messages 都将在 modal dialog boxes 中显示,而不会显示在状态栏中
可以在创建 Tcode 时指定起始屏幕:
与标准选择屏幕一样,该屏幕( 500 )会在 INITIALIZATION 与 START-OF-SELECTION 事件之间被调用,但此时不会调用标准选择屏幕。
原文出自 江正军 技术博客,博客链接: www.cnblogs.com/jiangzhengjun
![]() |
有腹肌的电影票 · MATLAB字符串调整有关函数总结-百度经验 3 天前 |
![]() |
焦虑的春卷 · 歌剧之祖《奥菲欧》推出中国版_央广网 8 月前 |