选择屏幕(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之间。
创建选择屏幕
SELECTION-SCREEN
SELECTION-SCREEN - BEGIN OF SCREEN
标准选择屏幕SELECTION-SCREEN - Standard Selection Screens
每一个可执行报表程序(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语句只能放在独立选择屏幕定义块中
普通选择屏幕SELECTION-SCREEN – 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选项使选择屏幕相关的warnings 与error 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 - AS SUBSCREEN
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\'.
SELECTION-SCREEN - screen_elements
选择屏幕的输入字段可以由PARAMETERS与SELECT-OPTIONS 来定义,但这单独(不放在SELECTION-SCREEN BEGIN OF LINE中)使用这两个语句时,每个输入元素需要单独占一行,这时如果需要将多个输入元素放在同一行时,则需要放在SELECTION-SCREEN BEGIN/END OF LINE语句间,除此之外 SELECTION-SCREEN 语句还可以对选择屏幕上的元素进行布局及其他元素的输出(如按钮、水平线、空行等)。
某些选择屏幕元素能够与MODIF ID(modification groups)选项一起使用,并将值自动存储到系统内表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的取值如下表所示:
Abbreviation缩写 |
Meaning of screen element所对应的屏幕元素 |
BLK |
Frame of title of a block |
COF |
Output field that is linked with a parameter or selection criterion with the additionFOR FIELD. |
COM |
Output field that is not linked to a parameter or selection criterion. |
HGH |
Input field for the higher interval limit of a selection criterion. |
ISX |
Input field of a parameter that is linked to a search help by means of the additionAS SEARCH PATTERN. |
LOW |
Input field for the lower interval limit of a selection criterion. |
OPU |
Icon for the selection option of a selection criterion. |
PAR |
Input field of a parameter. |
PBU |
Pushbutton |
TAB |
|
TOT |
Output field for text in front of the input field of the higher interval limit of a selection criterion. |
TST |
Tabstrip |
TXT |
Output field for text in front of the input field of a parameter or the lower interval limit of a selection criterion. |
ULI |
Horizontal rule. |
VPU |
Pushbutton for multiple selection of a selection criterion. |
空行SELECTION-SCREEN - SKIP
产生空行,其中n的值可以是1到9的值,如果是空1行,则可以省略n选项。
水平线SELECTION-SCREEN - ULINE
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
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
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 - LINE
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 - BLOCK
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.
Tabstrip(Tab条)SELECTION-SCREEN - TABBED BLOCK
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
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.
SELECTION-SCREEN INCLUDE
可以将同一程序中的其他已经创建好的选择屏幕中的元素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.
SELECTION-SCREEN - ldb_options
与逻辑数据库相关,以后补充
PARAMETERS
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_optionsFOR {TABLE|NODE} node
[HELP-REQUEST][VALUE-REQUEST][AS SEARCH PATTERN].
para(len)
para为输入参数名,最多为8个字符
len只可用于c、n、 p、 x这几种类型
TYPE type
不能是ABAP预置类型类型F、STRING、XSTRING
LIKE (name)
动态指定参照类型,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
输入框是否为必填
如果某个屏幕输入元素处于隐藏状态,即使它是OBLIGATORY必输入的,则在提交时也不会提示你必输入,只有在显示状态时且不输入时才会提示。
NO-DISPLAY
屏幕上将不会显示该字段。在SUBMIT调用过程中,可以通过该字段传递参数或在自定义选择屏幕被调用之前,对该字段赋值。但该字段已经不是屏幕字段,即使使用MODIFY SCREEN修改其属性,也不能在屏幕中显示
VISIBLE LENGTH vlen
设置可见显示长度,但可以输入超过所显示的长度的值。参数屏幕可见长度一般为其定义长度或参照的数据元素长度
AS CHECKBOX
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.
RADIOBUTTON GROUP group
在屏幕上产生一个单选按钮,当单选按钮被选中时,其值为“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 .
AS LISTBOX
其他下拉框构造请参考这里:F4IF_FIELD_VALUE_REQUEST、TR_F4_HELP
Key显示设置
下拉框中显示的最大项目数通过修改F4 help最大显示数好像不管用?
通过check table实现下拉框
只有表字段所对应的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.
通过 VRM_SET_VALUES 函数手动构造下拉框
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块里即可
USER-COMMAND fcode
复选框、单选按钮、下拉框都可以附加这个选项,其目的是为了在点击这些框时就能触发PAI事件(如AT SELECTION-SCREEN)(默认情况下只有在框上按回车键时才会触发PAI事件————但文本框只能使用回车键来触发PAI事件:当然回车键本身就可以触发复选、单选按钮、下拉框的PAI事件,不加上这个选项时默认情况下通过鼠标点这些框时是不会触发的),如点击某个单选按钮时隐藏或显示其他屏幕元素这种应用。为了使用fcode,则需要使用TABLE SSSCRFIELDS语句来定义一个接口工作区(SSCRFIELDS为数据词典中的结构类型)。当用户点击这些框时,会触发AT SELECTION-SCREEN事件,并且fcode的值会传递到SSCRFIELDS-UCOMM中。
单选按钮、复选框触发PAI/PBO事件
有时有这样的需求,如果用户选择了单选框,则屏幕的外观将会有所调整(如隐藏或显示屏幕上某个输入元素)。
这里需要给单选框通过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.
MODIF ID modi
设置修改组代码,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.
DEFAULT val
分配默认值,可以是字符串字面常量,也可以是定义好的某个变量。如果未设定,则默认值为所对应ABAP基本类型的初始值。
也可以在INITIALIZATION事件块中为屏幕输入变量赋初始值
LOWER CASE
允许输入小写字母。SAP所有屏幕字段输入后都会将字母默认转换为大写,加上该参数后允许输入小写字母。但如果语句中使用TYPE或LIKE选项从ABAP词典中引用某数据库表字段,则参数将依照字典中定义的属性,因而不能使用LOWER CASE选项,所以此时如果需要小写的话,则在ABAP词典中定义Domain时,就要设置成小写。
如何查看某个屏幕字段引用的Data Element的是否是大写,可以通过查看对应的Domain来判断:
MATCHCODE OBJECT search_help
MEMORY ID pid
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,如:
更多参考
VALUE CHECK
如果屏幕字段参考数据元素所对应的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
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
FOR dobj
dobj只能是已定义好的内存变量,不能是数据类型
FOR (name)
动态构造,括号里面只能是变量,不能直接是字符串常量
DATA: name TYPE string VALUE \'MARA-MATNR\'.
SELECT-OPTIONS selcrit FOR (name).
NO-EXTENSION
NO INTERVALS
SELECT-OPTIONS默认会有LOW与HIGH两个字段可以输入范围值,如果加上此选项时,只会出现LOW字段,To后面的HIGH字段不出现在选择屏幕上,但是,用户仍然可以在Mutiple Selection窗口中输入范围选择。也就是说:只要有按钮,就可以选择多个条件与范围值,而且那怕设置了NO INTERVALS 选项,在使用时还是使用 IN 而不是 EQ逻辑操作符(因为可能输入了多个条件)。
DEFAULT
此外,使用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 .
OBLIGATORY
NO DATABASE SELECTION 不采用逻辑数据库中的约束
在调用逻辑数据库的程序中,会对用户输入的数据按权限来进行筛选。倘若在定义的对象后面加上该参数,该字段所输入的对象则不会受到逻辑数据库的约束。
在引用逻辑数据库F1S开发的程序中,通过按F4键只能看到用户权限所的数据,以连接编号CONNID字段为例,通过按F4键只能看到用户被分配的CONNID的聚值范围,加上该参数后,可以读取被限制条件的数据:
AT SELECTION-SCREEN ON HELP-REQUEST FOR xxx(字段F1帮助)
当在某个输入字段上按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.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR xxx(字段F4帮助)
当按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条件内表研究
Ranges条件内表结构
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这两个值的,结果是都不能被排除掉了)。
屏幕中输入的值转存Multiple selection规则
在选择屏幕中输入框中输入的值存储到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程序默认值时,需要加上“=”
如果输入框中输入的值恰为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.
使用SELECT-OPTIONS替代PARAMETERS
实际上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)AT 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的按钮。
事件终止(STOP、EXIT、CHECK、REJECT)
RETURN
RETURN用来退出当前执行的程序块,例如一个FORM、METHOD、报表事件块,不管是否出现在循环(LOOP)中,RETURN都会退出当前执行的程序块,而不仅仅是退出循环(如果是在Form、METHOD中,只会退出Form、METHOD,不会退出Form、METHOD被调用所在的报表事件块,即退Form、METHOD后继续向被调用点后面执行)
STOP
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,这与直接在事件块中的效果是一样的;
EXIT
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
CHECK跳转的前提是<expr>为假时。
l CHECK只是跳出当前事件块,继续下一个事件块的处理,相当于方法的return;
l 另外,如果CHECK在循环(DO、WHILE、LOOP)里,只是跳出当前循环而已;
l 如果CHECK出现在循环以外,退出的是当前执行的程序块(processing block),例如一个FORM,METHOD,或EVENT。????
EXIT和CHECK如果是在循环中时,只是退出循环;如果是在FORM中,则只是退出当前FORM
REJECT
REJECT是用在逻辑数据库GET event blocks中,与EXIT和CHECK不一样的是(EXIT和CHECK如果是在循环中时,只是退出循环;如果是在FORM中,则只是退出当前FORM),REJECT可以从循环或者一个FORM中直接跳出所在的GET事件块:
REJECT [<dbtab>].
终结逻辑数据库当前节点数据行的处理
如果省略选项<dbtab>, 则逻辑数据库会自动读取同一节点的下一行数据,即同一节点的GET事件块会被触发。如果使用了<dbtab>选项,则逻辑数据库会读取节点<dbtab>的下一行数据,此时的<dbtab>节点必须是REJECT所在当前节点的上级节点。
SELECT-OPTIONS的 END OF事件
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
选择屏幕的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.
Calling选择屏幕CALL SELECTION-SCREEN
标准选择屏幕会在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语句,屏幕自身还是会以弹出对话框来显示,只是说此种情况下该屏幕发出的Warnings 与Error 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。
在选择屏幕相关的选择屏幕事件中,SY-DYNNR为当前屏幕的屏幕号
当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 事件之间被调用,但此时不会调用标准选择屏幕。