选择屏幕(Selection Screen)

时间:2024-03-10 11:23:00

选择屏幕(Selection Screen). 156

创建选择屏幕... 157

SELECTION-SCREEN.. 157

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

TabstripTab条)SELECTION-SCREEN - TABBED BLOCK. 166

动态分配... 167

静态分配... 168

激活工具栏中预设按钮 SELECTION-SCREEN FUNCTION KEY. 168

SELECTION-SCREEN INCLUDE. 170

SELECTION-SCREEN - ldb_options. 170

PARAMETERS. 171

para(len). 171

TYPE type. 171

LIKE (name). 171

OBLIGATORY. 171

NO-DISPLAY. 171

VISIBLE LENGTH vlen. 172

AS CHECKBOX. 172

RADIOBUTTON GROUP group. 173

AS LISTBOX. 173

Key显示设置... 173

通过check table实现下拉框... 173

通过 VRM_SET_VALUES 函数手动构造下拉框... 176

用户对话屏幕中的下拉框... 177

USER-COMMAND fcode. 177

单选按钮、复选框触发PAI/PBO事件... 177

MODIF ID modi179

DEFAULT val179

LOWER CASE. 179

MATCHCODE OBJECT search_help. 180

MEMORY ID pid. 180

VALUE CHECK. 182

SELECT-OPTIONS. 184

FOR dobj184

FOR (name). 184

NO-EXTENSION.. 184

NO INTERVALS. 185

DEFAULT. 185

OBLIGATORY. 185

NO DATABASE SELECTION 不采用逻辑数据库中的约束... 185

AT SELECTION-SCREEN ON HELP-REQUEST FOR xxx(字段F1帮助). 186

AT SELECTION-SCREEN ON VALUE-REQUEST FOR xxx(字段F4帮助). 187

SELECT-OPTIONS条件内表研究... 188

Ranges条件内表结构... 188

选择内表多条件组合规则... 189

屏幕中输入的值转存Multiple selectionimage001规则... 190

输入ABAP程序默认值时,需要加上“=”. 192

示例... 192

各种屏幕元素演示... 192

使用SELECT-OPTIONS替代PARAMETERS. 193

选择屏幕事件处理... 193

事件分类... 194

报表事件... 194

选择屏幕事件... 194

逻辑数据库事件... 195

列表事件... 195

事件流程... 195

选择屏幕事件流图... 197

事件终止(STOPEXITCHECKREJECT... 199

RETURN.. 199

STOP. 199

EXIT. 199

CHECK. 199

REJECT. 200

SELECT-OPTIONS END OF事件... 201

字段级与块级事件... 202

修改标准选择屏幕的GUI Status. 203

Calling选择屏幕CALL SELECTION-SCREEN

选择屏幕(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~1010SAP系统保留使用,并且SAP R/3系统的HR模块仅允许使用屏幕号码9000~9999)。

标准选择屏幕中的屏幕组成元素是由PARAMETERS SELECT-OPTIONSSELECTION-SCREEN语句来定义的。标准选择屏幕不能定义在SELECTION-SCREEN BEGIN/END OF SCREEN之间。

Function groups  module pools中不能定义标准选择屏幕,在Function groups  module pools中的PARAMETERSSELECT-OPTIONSSELECTION-SCREEN语句只能放在独立选择屏幕定义块中

普通选择屏幕SELECTION-SCREEN  SCREEN

ABAP程序中可以使用多个选择屏幕,如果某个选择屏幕的功能被多次使用,则可以将它们封装起来,然后通过ABAP选择屏幕调用语句进行多次调用,达到选择屏幕利用的效果。

SELECTION-SCREEN BEGIN OF SCREEN dynnr [TITLE title][AS WINDOW].
...
SELECTION-SCREEN END OF SCREEN dynnr.

该语法用来定义带屏幕号的普通选择屏幕。dynnr为选择屏幕的四位数字编号

可以通过PARAMETERSSELECT-OPTIONSSELECTION-SCREEN语句来定义独立选择屏幕里的具体元素。

该语句只能在可执行程序、函数组(include文件中)、module pools的全局定义区中使用。

普通选择屏幕,可以使用CALL SELECTION-SCREEN来单独调用。

普通选择屏幕内不能再定义选择屏幕了。

 

TITLE title可以是已定义好的text symbol,格式text-001

image279

也可以直接定义一个类型为c(70)的全局变量(该变量会自动生成,不能使用Data定义,如下面程序中的titletitle2变量),在以后程序中可以为这个变量设置屏幕标题的内容。

 

可以使用AS WINDOW选项使选择屏幕相关的warnings error messages都以 modal dialog box 的方式(弹出对话框形式)来显示(S类型好像固定在状态栏显示,I类型消息好像固定以弹出窗口显示,A类也是固定弹出窗口并且点击后退出整个程序),这与CALL SELECTION-SCREEN语句中的STARTING AT选项的意义是有区别的。

PARAMETERSp_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.

image280

 

如果调用的是主屏幕,则还可以使用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.

image281

 

如果已存在主选屏幕,则只可使用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.

image282

子选择屏幕 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 SUBSCREENinclude,此时这种子选择屏幕还是像标准选择屏幕那样,会触发标准的选择屏幕事件。

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\'.

image283

SELECTION-SCREEN - screen_elements

选择屏幕的输入字段可以由PARAMETERSSELECT-OPTIONS 来定义,但这单独(不放在SELECTION-SCREEN BEGIN OF LINE使用这两个语句时,每个输入元素需要单独占一行,这时如果需要将多个输入元素放在同一行时,则需要放在SELECTION-SCREEN BEGIN/END OF LINE语句间,除此之外 SELECTION-SCREEN 语句还可以对选择屏幕上的元素进行布局及其他元素的输出(如按钮、水平线、空行等)。

某些选择屏幕元素能够与MODIF ID(modification groups)选项一起使用,并将值自动存储到系统内表SCREEN-group1字段中,而系统内表中的SCREEN-group2SCREEN- 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

Tab title

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

SELECTION-SCREEN SKIP [n]

产生空行,其中n的值可以是19的值,如果是空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) .

image284

不带选项参数的unline只能用在SELECTION-SCREEN BEGIN/END OF LINE外面表示会重起一行再画线(即使没有 [/] 参数选项)

POSLEN的取值范围只能是[183],如果想画很长的一条线,则需要使用不带[/]选项的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.

image285

文本标签(带图标)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元素相关,如果用户在该文本标签是按F1F4时,会显示所关联的sel的帮助信息或F4选择值列表。另外,此COMMENTmodification group也将与sel元素相同。

 

注意:另外发现只有使用了FOR FIELD选项,才会出现标签与文本框之间使用下划线:

image286

否则是是这样的:

image287

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.

image288

按钮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(12but1 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.

image289

多元素行 SELECTION-SCREEN - LINE

SELECTION-SCREEN BEGIN OF LINE.
...
[SELECTION-SCREEN POSITION pos.]
...
SELECTION-SCREEN END OF LINE.

如果需要将选择屏幕中的多个不同元素,集中在选择屏幕的一行上输出,可在这之间加上屏幕元素的声明语句,这些元素将出现在屏幕的同一行中,在此之间所有屏幕元素是通过PARAMETERS SELECT-OPTIONSSELECTION-SCREEN 语句来定义的。

SELECTION-SCREEN POSITION posSELECTION-SCREENBEGIN/END OF LINE之间还可以使用此语句,此语句可以指定紧接着后面屏幕元素的输出位置,pos的取值可以是 [1, 83]pos_low 或者 pos_high系统变量。此语句只能在SELECTION-SCREENBEGIN/END OF LINE语句中使用。

 

SELECTION-SCREENBEGIN/END OF LINE之间需要注意以下几点:

1、 PARAMETERSSELECT-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!\'.

image290

屏幕块 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\'.

image291

 

省略TITLE选项:

SELECTION-SCREEN BEGIN OF BLOCK rad1 WITH FRAME.

image292

 

省略WITH FRAME TITLE选项:

SELECTION-SCREEN BEGIN OF BLOCK rad1.

image293

TabstripTab条)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 )

tabTab的标题,可以是选择文本TEXT-XXX,也可以直接是某个变量名,运行时系统会自动创建C(83)类型的全局变量,这样就可以在报表的初始化事件中为这个变量来设置Tab的标题。

lenTab标题显示的宽度

USER-COMMAND fcode每个Tab必须使用USER-COMMAND来定义一个fcode,当切换Tab触发AT SELECTION-SCREEN选择屏幕事件触后,就可以通过sy-ucomm系统变量来确定fcode的值。

 

DEFAULT [PROGRAM prog] SCREEN dynnrTab分配一个子屏幕,分配的方式有动态分配与静态分配:

动态分配

每个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-progtblock-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.

image294

静态分配

如果使用了DEFAULT [PROGRAM prog] SCREEN dynnr,则为静态分配。如果没有使用PROGRAM选项,则表示加载的子屏幕为当前程序中的。静态的可以被动态分配所重写。静态分配例子参考这里

激活工具栏中预设按钮 SELECTION-SCREEN FUNCTION KEY

SELECTION-SCREEN FUNCTION KEY n

在应用工具条上,系统默认就预设了5个未激活的按钮,它们分配的FcodeFC01FC05,该语句的作用就是激活第nn15)个按钮。

为了能够使用这5个按钮,必须使用TABLES SSCRFIELDS.(数据类型为数据词典中的SSCRFIELDS全局结构)语句来定义接口工作区。我们可以通过该接口的SSCRFIELD-FUNCTXT_0n字段设置这些按钮的文本标签信息:

image295

如果想为按钮设置图标、快速提示信息时,需要使用一个全局数据词典结构类型smp_dyntxt,该接口可以将这些信息组织起来,并将它整体赋值给SSCRFIELD-FUNCTXT_0n字段后就能显示这些信息:

image296

当用户点击应用工具条上的按钮时,会触发AT SELECTION-SCREEN事件,并且可以通过sscrfields-ucomm来获取当前被点击按钮相应的Fcode,从而可以知道是点击了哪个按钮。

 

image297

TYPE-POOLS icon.
"使用数据词典中的全局类型来定义工作区,可用来设置应用工具条上的
"FC01FC055个预设按钮的显示信息
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中),sscrfieldsucomm会存储触发的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元素有PARAMETERSSELECT-OPTIONSCOMMENTPUSHBUTTONBLOCKS

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只可用于cn p x这几种类型

TYPE type

不能是ABAP预置类型类型FSTRINGXSTRING

LIKE (name)

动态指定参照类型name为某个变量(注,不能为字面常量字符),该变量的值为ABAP Dictionar数据词典中某个结构或数据库表的组件名,且为大小。当动态参照成功后,如果在没有在Selection texts池中给para分配选择文本,则会使用数据词典中对应组件的文本,并且F1F4也会照着过来:

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.

image298

 

注:如果屏幕字段参照的数据元素的词典类为C(1),且Fixed Value  "X" and " ",即使没有加该选项,也会以复选框的形式显示:

image299

PARAMETERS: p_lvorm LIKE mara-lvorm.

image300

RADIOBUTTON GROUP group

在屏幕上产生一个单选按钮,当单选按钮被选中时,其值为“X”,否则为空。参数字段是长度为1C类型,允许使用LIKETYPE选项,但是必须参照类型为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 .

image301

AS LISTBOX

其他下拉框构造请参考这里:F4IF_FIELD_VALUE_REQUESTTR_F4_HELP

Key显示设置

image302

下拉框中显示的最大项目数通过修改F4 help最大显示数好像不管用?

通过check table实现下拉框

只有表字段所对应的Input help类型为check table实现方式时才能用作下拉框:

image303

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\'.

image304

image305

image306

 

Check Table中除开外键字段与MANDT字段外的第一个字段(依照定义的顺序)会作为下拉框的Value下面再次验证:

PARAMETERS p_posnr1 LIKE vbap-posnr.
PARAMETERS p_posnr2 LIKE vbap-
posnr
                   
AS LISTBOX VISIBLE LENGTH 20
.

image307

image308

通过 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\'.

当改变下拉框选中的值时,会触发PAIAT SELECTION-SCREEN)与PBOAT SELECTION-SCREEN OUTPUT)事件块

image309

用户对话屏幕中的下拉框

当用户从下拉框中选择值时,会触发PAI事件,在Screen Painter中将Dropdown属性的值设置为Listboximage310

即为下拉框。如果为下拉框分配一个Function Code,则会触发PAI如果未分配,还是会触发??)

下拉框中的值可以来至于InputHelp,也可以是ABAP程序中的值列表,这两种方式是可以选择的:image311

在内部实现中,下拉框后台对应着一个行结构两列的内表: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(下拉框)也可以触发PAIPBO。不过文本输入框则不支持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.

image312

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.

image313

DEFAULT val

分配默认值,可以是字符串字面常量,也可以是定义好的某个变量。如果未设定,则默认值为所对应ABAP基本类型的初始值。

也可以在INITIALIZATION事件块中为屏幕输入变量赋初始值

LOWER CASE

允许输入小写字母。SAP所有屏幕字段输入后都会将字母默认转换为大写,加上该参数后允许输入小写字母。但如果语句中使用TYPELIKE选项从ABAP词典中引用某数据库表字段,则参数将依照字典中定义的属性,因而不能使用LOWER CASE选项,所以此时如果需要小写的话,则在ABAP词典中定义Domain时,就要设置成小写。

如何查看某个屏幕字段引用的Data Element的是否是大写,可以通过查看对应的Domain来判断:

image314

MATCHCODE OBJECT search_help

指定一个search_help

image315

image316

MEMORY ID pid

PARAMETERS: field1(10) MEMORY ID ZPARA1.

将参数field1SAP Memory中的ZPARA1进行关联,当selection screen被调用时,它会在AT SELECTION-SCREEN OUTPUT后使用SAP memory 中的SAP/GPA parameter的值来填充相应选择屏幕字段,另外,如果用户在输入框中改变了参数的值,则也会将新的值存储到SAP memory 中相应的SPA/GPA parameter,如果不存在相应的SAP/GPA parameter,则会创建一个新的。选择屏幕中的此选择作用与屏幕设计中的Parameter ID设置作用是一样的(具体请参考《数据共享与传递.docx》文档):

image317

Parameter ID用于SAP Memory中,同一用户下不同窗体屏幕之间可以传递参数值,而ABAP Memory只能在同一程序中调用不同程序时之间进行参数传递

注:DEFAULT选项设置的值会覆盖该选项读到的值

image318

 

许多的数据元素已经设置此参数ID,如:

image319

更多参考

VALUE CHECK

如果屏幕字段参考数据元素所对应的Domaim设置了固定值(fixed Values)或值表(Value Table)时,使用该选项后,会验证输入值是否在固定值或值表(若要使值表检查生效,则首先需要将此Domain引用到表字段,再对此表字段通过image320按钮进行外键分配,并且引用的主键一定要参照此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.

image321 image322

PARAMETERS p_1 TYPE zmy_dm_200 VALUE CHECK .

image323

 

image324

某个表字段是否配置了Fixe Value Check Table,可以查看字段所对应的Domain来查看(其实一般在为表字段分配外键时,默认的使用的主表就是Domain里所设置的Value Table,当然在使用image320[1]进行外键分配时,可以不使用Domain中设置的Value Table,而是指定其他的表为主表):

image325

这里的检查表(Check Table)实质上就是我们平时讲的主表,主表与从表之间进行关联是从通过image326进行设置的:

image327

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

限制选择表为单行,元素输入后面不会出现image001[4]按钮

NO INTERVALS

SELECT-OPTIONS默认会有LOWHIGH两个字段可以输入范围值,如果加上此选项时,只会出现LOW字段To后面的HIGH字段不出现在选择屏幕上,但是,用户仍然可以在Mutiple Selection窗口中输入范围选择。也就是说:只要有image001[5]按钮,就可以选择多个条件与范围值,而且那怕设置了NO INTERVALS 选项,在使用时还是使用 IN 而不是 EQ逻辑操作符(因为可能输入了多个条件)。

DEFAULT

此外,使用DEFAULT选项给选择屏幕上的选择标准分配默认值时,可以给条件内表中的首行LOWHIGH以及SIGNOPTION设定默认值( 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

image328

image329

NO DATABASE SELECTION 不采用逻辑数据库中的约束

在调用逻辑数据库的程序中,会对用户输入的数据按权限来进行筛选。倘若在定义的对象后面加上该参数,该字段所输入的对象则不会受到逻辑数据库的约束。

在引用逻辑数据库F1S开发的程序中,通过按F4键只能看到用户权限所的数据,以连接编号CONNID字段为例,通过按F4键只能看到用户被分配的CONNID的聚值范围,加上该参数后,可以读取被限制条件的数据:

image330

image331

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.

image332

image333

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帮助

更多参考程序实现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\' "
触发事件的屏幕字段名称

image334

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字段是长度为1C类型数据。它是标志位,允许值为IE,用来确定存储在字段OPTION中的运行算是否需要取反。I表示“包含 Include、等于的意义”(在Select Single Values Select Intervals标签里输入的条件表达式就属于此种类型),E表示“排除Exclude、不等于的意义,用此类型标示的数据表示要排除掉”(在Exclude Single ValuesExclude Intervals标签里输入的条件表达式就属于此种类型,等于在逻辑表达式前加上了NOT)。

l  OPTION字段的数据类型是C,长度为2OPTION包含选择运算符。如果HIGH字段为空,则可以填充EQ=)、NE<>)、GT>)、GE>=)、LE<=)、LT<)、CPNP等文字代表相应的比较运算符,其中CP(集合之内的数据)和NP(集合之外数据)只有当在输入字段中使用了通配符(*”或“+)时它们才是有效的,且未定义转换符号。如果HIGH字段被填充,则可以使用BT(之间)和NB(两边),其功能相当于BETWEENNOT BETWEEN

l  LOW字段的数据类型与f类型相同。如果选择表数据行中对应的HIGH字段为空,则该行为单值选择;如果HIGH已填充,则为范围选择,LOWHIGH中的内容为范围上界与下界。

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  如果选择表只包含SIGNI的行“i1”、...、“in”,则相当于条件(i1 OR ... OR in)的组合。

l  如果选择表中只包含SIGNE的行“e1”、...、“em”,则相当于条件(NOT e1AND ...ANDNOT em)的组合。

l  如果选择表中即包含SIGNI的行“i1”、...、“in”,又包含SIGNE的行“e1”、...、“em”,则相当于条件(i1 OR ... OR inANDNOT e1AND ...ANDNOT em)的组合。

l  如果选择表中的某条件记录的LOWHIGH都有时,表示的是一个范围,至于该范围是要被排除还是要在该范围内,这要看该条件记录的SIGNI还是E

((Select Single Values) (Select Intervals)) ((Exclude Single Values) (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) …

 

image335 image336

image337image338

("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 ValuesSelect Intervals选项卡中的条件在内部使用OR进行拼接,然后将拼接好的整个条件串与Exclude Single ValuesExclude Intervals两个选择卡中的每个条件进行AND拼接,这里面要注意的是Exclude Single ValuesExclude Intervals两个选择卡中的生成的条件串恰好与原输入的条件相反(如Exclude Single Values中输入的image339条件最终生成的条件串为< \'13\',仔细观察其他的都是这样)。从生成的条件串来看Exclude Single ValuesExclude 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选项串中,不要增加两个image340这样的条件,如果增加在检测时会弹出警告:

image341

从上面生成的条件串 "MATNR" <> \'6\' OR "MATNR" <> \'7\'可以看出,如果当值为6时,由于"MATNR" <> \'7\'条件会返回真,如果当值为7时,由于"MATNR" <> \'6\'条件也会返回真,此情况下,67其实是不能被排除掉了,这样实质上是违背了选择条件的本意了(本来是要排序67这两个值的,结果是都不能被排除掉了)。

屏幕中输入的值转存Multiple selectionimage001[6]规则

在选择屏幕中输入框中输入的值存储到Select Single ValuesSelect IntervalsExclude Single ValuesExclude Intervals选项卡中的哪一个,则要看Select Options的第一个框框前的符号是什么以及是否输入了High值有关

1、如果只输入LOW值,且第一个框前面的符号为image342或没有时,条件值会存储到Select Single Values选项卡中:

image343

2、如果只输入LOW值,且第一个框前面的符号为image344时,条件值会存储到Exclude Single Values选项卡中:

image345

3、如果输入了LOWHIGH值,且第一个框前面的符号为image346或没有时,条件值会存储到Select Intervals选项卡中:

image347

4、如果输入了LOWHIGH值,且第一个框前面的符号为image348或没有时,条件值会存储到Exclude Intervals选项卡中:

image349

第二个输入框前面是没有image342[1]image350image346[1]image348[1]等这些图标的,只有在第一个框前面才可以选择。

输入ABAP程序默认值时,需要加上“=

image351

如果输入框中输入的值恰为ABAP程序中相应字段所对应的初始值时(如字符类型为空串,时间(日期除外)与数字类型为“0”串时),需要在第一个框前面选择image352操作符,否则程序将会忽略这个值的输入,即查询所有的(由于第一个框前默认就是image352[1],所以输入的值为非初始值时可以不用选择)。上图中,由于时间类型为数字类型,所以默认值就是“0”字符串(由于时间是带格式时,又000000秒是合法的,所以00:00:00就是初始值,但日期不能是0000.00.00,因为00000000日本身就是不合法数据),当你真正需要等于000000这个值时,就要在输入框前选择image352[2],否则在取值时ABAP程序会认为没有输入。注,这个规则只适用于Select-option参数,对于parameters是不适用的。

 

image353

如果用户仅仅在“to”之前的字段不输入,只输入后面的,则此时还是相当于一个范围,只是LOW字段为空而已,如果只输入“to”前面一个值,则表示是单个值条件,而不是一个范围

示例

各种屏幕元素演示

image354

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.

image355

使用SELECT-OPTIONSPARAMETERS的另一个好处时,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:选择开始事件(默认事件,未写在任何事件块里的代码默认属于此事件块),在选择屏幕的处理结束后触发,即在选择屏幕上点击image356执行按钮后触发

END-OF-SELECTION:选择结束事件,在所有逻辑数据库事件处理结束后触发,一般用于输出列表。在输出屏幕还未显示之前执行

选择屏幕事件

INITIALIZATIONSTART-OF-SELECTION之间触发:

AT SELECTION-SCREEN OUTPUT:是选择屏幕的PBO事件,在每次选择屏幕被调用之前(显示之前)触发,可以在其中进行选择屏幕输出之前的准备工作,如在程序中动态地对选择屏幕元素的输出属性进行修改。如果只是在程序的整个运行过程中只希望一次初始化和,则需要在LOAD-OF-PROGRAMINITIALIZATION事件块中进行,因为在些事件中是每次显示之前就会被触发(如通过image357选择多个条件值后,回到选择屏幕时会也触发)。

AT SELECTION-SCREEN ON field:是针对选择屏幕field字段输入的PAI事件(ON事件表示当对应字段的值被传递给程序时被触发),可以应用于该字段的正确性检查,如果系统提示错误,则可以在该字段中重新输入。此时其他元素呈灰色不接受输入。(注:点击后面的多选按键image358也会触发)

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}}:是选择屏幕中的POHPOV事件,当光标位于某屏幕字段时,用户按下F1F4键,将触发分别触发这两个事件。这种用户自定义的F1 HelpF4 Help的机制优先级较高,可以覆盖和屏蔽系统字典库中定义在该字段上的Search Help功能

AT SELECTION-SCREEN:是选择屏幕的基本PAI事件,所有用户输入的数据都被传输到程序中之后再按F8才触发(注:如果单选按钮、复选框、下拉框通过USER-COMMAND选项设置了FunctionCode时,鼠标点这些输入元素时也会触发该事件;另外,在选择屏幕上直接按回车键也会触发),也是选择屏幕中最后被触发的事件。在该事件中主要进行对所有用户输入正确性和全部字段的全面一致性的检查工作,如权限检查(注:点击屏幕字段后面的多选值条件按键image358[1]也会触发所以不要在该事件块中对全局的变量进行写操作,否则会出现问题。如果此时在程序中给出错误消息,则所有元素都可以重新进行输入。

AT SELECTION-SCREEN ON EXIT-COMMAND:当用户点击image359按钮时会触发

注:对于选择屏幕,在点击执行按钮且输入验证通过后,会直接执行报表的START-OF-SELECTION事件,这个流逻辑我们是不能控制的,这不像对话屏幕,在点击执行后:可以跳到本对话屏幕、跳到另外的对话屏幕、或结束对话屏幕到主调程序(即对话屏幕的流逻辑是可以控制的)。

逻辑数据库事件

START-OF-SELECTION事件结束以后触发,用于选择并整理数据:

GET node ... 选择逻辑数据库中当前级别数据中的数据

GET node LATE 选择逻辑数据库中上一级别数据源中的数据

列表事件

在所有报表过程事件和选择屏幕事件结束之后,开始触发列表事件

TOP-OF-PAGE:页眉,每个新页面开始时触发(注:触发的条件是要在Start-of-selectionEnd-of-selection中有Write写屏幕动作,否则是不触发的。如果有此事件,当在Start-of-selectionEnd-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

 

image360

一般报表的触发过程如下:

(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 fieldPOHPOV事件,定义F1F4屏幕的PAI事件如果没有发生任何错误,将执行后续事件,如F8、打印、保存变量等。

整个过程由屏幕处理器和ABAP处理器交互处理,系统自动在其中进行切换

(5)AT SELECTION-SCREEN:选择屏幕PAI事件,检查用户数据正确性和全部字段一致性,发生错误所有元素可重新输入

(6) 当屏幕事件执行完毕后,系统回收对程序的控制,触发报表事件START-OF-SELECTION

(7) 如果有逻辑数据库,则触发GETGET LATE

(8) 最后将触发END-OF-SELECTION报表事件,此后系统运行时环境将控制交给显示服务器

(9) 列表输出过程(触发列表事件前提是要在START/END-OF-SELECTION报表时间中WRITE过,才会调用这两个事件,否则不会自动调用这两个列表事件)中将触发TOP-OF-PAGEEND-OF-PAGE当用户点击Back返回选择屏幕时,回到选择屏幕中(LOAD-OF-PROGRAMINITIALIZATION不会再次触发),可以再次进行选择标准输入和数据选择,这是一个反复循环的过程

(10) 如果程序中定义有交互的列表事件(AT-LINE-COMMANDAT-USER-COMMAND),则系统可以响应用户在输出列表屏幕中的行为,触发各种程序中交互事件。行选择交互事件(AT LINE-SELECTION)允许用户从列表中选择某行,并将触发响应的事件。如果用户选择其他子定义的功能代码(功能代码与相关菜单、按钮或键盘热键有关,由程序员在GUI状态中定义),将触发用户指令交互,即AT USER-COMMAND事件。

选择屏幕事件流图

选择屏幕事件发生在INITIALIZATION  START-OF-SELECTION 事件之间

image361

点击Selection-option后面的多值条件输入按钮image357[1]时会触发一系统的事件,这些事件与点击执行按钮(F8)所触发的事件流 程是一样的;另外,附带USER-COMMAND选项的下拉框、单选框、复选框,以及回车键、带FunctionCode的按钮

事件终止STOPEXITCHECKREJECT

RETURN

RETURN用来退出当前执行的程序块,例如一个FORMMETHOD、报表事件块,不管是否出现在循环(LOOP)中,RETURN都会退出当前执行的程序块,而不仅仅是退出循环(如果是在FormMETHOD中,只会退出FormMETHOD,不会退出FormMETHOD被调用所在的报表事件块,即退FormMETHOD后继续向被调用点后面执行)

STOP

l  INITIALIZATION中的STOP会导致跳转到AT SELECTION-SCREEN OUTPUT事件块;

l  如果STOPAT 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在循环中,还是在FORMMETHOD,也是直接从被调用的点退出所在事件块,而不仅仅只退出当前循环、FORMMETHOD,这与直接在事件块中的效果是一样的;

EXIT

l  INITIALIZATION中的EXIT会导致跳转到AT SELECTION-SCREEN OUTPUT事件块;

l  如果EXITAT SELECTION-SCREEN OUTPUT块里,则只是退出当前块(EXIT后面语句不执行而已),仅接着是显示选择屏幕;

l  AT SELECTION-SCREEN [ON]…选择屏幕事件块中的EXIT也只是退出当前事件块,继续后面的事件块;

l  START-OF-SELECTION开始往后的事件块,如果出现EXIT,则会开始listprocessor(列表处理),并跳转到相应的List输出页面(前提条件是要在退出前已经向屏幕输出内容了,否则也不会跳转);注: END-OF-SELECTION事件块也会被跳过

l  另外,如果EXIT在循环(DOWHILELOOP)里,只是跳出当前循环而已;

l  如果是在FORMMETHOD中,而非循环中,则退出当前的FORMMETHOD,其作用与RETURN类似

CHECK

CHECK跳转的前提是<expr>为假时。

l  CHECK只是跳出当前事件块,继续下一个事件块的处理,相当于方法的return

l  另外,如果CHECK在循环(DOWHILELOOP)里,只是跳出当前循环而已;

l  如果CHECK出现在循环以外,退出的是当前执行的程序块(processing block),例如一个FORMMETHOD,或EVENT????

 

EXITCHECK如果是在循环中时,只是退出循环;如果是在FORM中,则只是退出当前FORM

image362image363image364

REJECT

REJECT是用在逻辑数据库GET event blocks中,与EXITCHECK不一样的是(EXITCHECK如果是在循环中时,只是退出循环;如果是在FORM中,则只是退出当前FORM),REJECT可以从循环或者一个FORM中直接跳出所在的GET事件块:

image365

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\'.

image366

AT SELECTION-SCREEN ON END OF s_matnr.事件只在 CD处触发(不管G块是否为空),且每次只执行一次。

AT SELECTION-SCREEN ON s_matnr.事件在ABCDEF处都会触发,在点击CDEF后,G中有多少条目就会触发多少次,如果G为空,则不会触发该事件。并且在AT SELECTION-SCREEN ON END OF s_matnr之前触发

注:点击B时与点击A所触发的屏幕字段事件是一样的,但在点击CD时,只触发s_matnr屏幕字段的相应事件(AT SELECTION-SCREEN ON s_matnrAT 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_lfmonp_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语句

x1y1x2y2分别表示选择屏幕显示的左上角和右下角的列号、行号

你可以使用STARTING AT ENDING AT选项来将自定义选择屏幕以modal dialog box方式(弹出对话框的形式)来显示(即使在自定义选择屏幕时没有加上AS WINDOW选项时,只要在调用时使用了STARTING AT语句,屏幕自身还是会以弹出对话框来显示,只是说此种情况下该屏幕发出的Warnings Error message类型的消息不会以弹出对话框来显示,而是显示在了状态栏中了,所以自定义选择屏幕的AS WINDOW只是决定相关的WE类型消息将会以弹对话框形式显示,而不能决定该选择屏幕本身以对话框形式来显示,屏幕本身是否以对话框模式来显示是由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 类型的普通屏幕是一样的:

image367

当调用modal dialog box类型的屏幕(不管是选择屏幕还是普通屏幕)时,关于这个屏幕的warnings error messages都将在modal dialog boxes中显示,而不会显示在状态栏中

 

可以在创建Tcode时指定起始屏幕:

image368

与标准选择屏幕一样,该屏幕(500)会在INITIALIZATION  START-OF-SELECTION 事件之间被调用,但此时不会调用标准选择屏幕。