1.事件分类,触发,终止
1事件分类
-
报表过程事件
- INITIALIZATION 初始化事件,用于程序初始化
- START-OF-SELECTION 选择开始事件,如果报表中含有选择屏幕,则在选择屏幕的处理结束后触发,是报表程序的默认事件块;如果程序中部分代码不隶属于任何其它事件关键字,则自动被插入该事件块的初始部分。
- END-OF-SELECTION 选择结束事件,如果程序中中使用逻辑数据库,则在所有逻辑数据库处理结束后触发;一般在该事件之中输出列表
-
选择屏幕事件
- AT SELECTION-SCREEN OUTPUT 选择屏幕PBO事件,显示选择屏幕之前触发
- AT SELECTION-SCREEN 选择屏幕PAI事件,用户在选择屏幕中执行某些功能后被触发。
-
逻辑数据库事件
- GET node ... 选择逻辑数据库中当前级别数据中的数据
- GET node LATE 选择逻辑数据库中上一级别数据源中的数据
-
列表事件
- TOP-OF-PAGE 页眉控制,每个新页面开始时触发
- END-OF-PAGE 页脚控制,在当前页面结束前触发
- AT-LINE-SELECTION 行选择控制,用户选择某列表行时触发
- AT-USER-COMMAND 用户交互控制,用户选择某个GUI功能时触发
3 终止
使用STOP, EXIT, CHECK语句。
- STOP 立即退出结束任何当前事件
- EXIT 立即离开任何过程块,并转向列表输出屏幕
- CHECK 先进行条件判断
2.选择屏幕
1 选择屏幕参数
最简单的选择屏幕元素是选择参数,这种形式只能接受用户的单值输入
PARAMETERS name TYPE|LIKE type|dobj.
2 复杂选择标准
使用SELECT-OPTIONS语句可以设定比较复杂的选择标准,选择标准是比选择参数更为复杂的一种用户输入形式。SELECT-OPTIONS seltab FOR f.
该语句将根据定义时的参照类型f(f需为程序中的全局基本类型元素,通常情况下f参照数据字典中的表字段生成,以提供各种帮助,值检查功能)在选择屏幕中生成两个字段,以供用户输入选择的范围。同时还在程序中生成一个包含有四个组件的内表——选择表,该表具体格式如下:
DATA:BEGIN OF seltab OCCURS 0,
SING(1),
OPTION(2),
LOW LIKE f,
HIGH LIKE f,
END OF seltab.
该表的所有字段都可以在选择屏幕中由用户进行设置,且可以包含多行,每一行都代表一个逻辑条件,以实习较为复杂的选择标准设定,各字段含义如下:
- SIGN字段是长度为1的C类型数据。SIGN是标志位,允许值为I和E,其意义为确定存储在字段OPTION中的运算符是否需要取反。I表示包含,E表示排除
- OPTION字段的数据类型是C,长度为2,OPTION包含选择运算符。
- LOW字段的数据类型与f类型相同。与OPTION中的运算符相结合,指定该字段的数据库选择条件。
- HIGH字段的数据类型与f类型相同。该值为范围选择指定了上界。
REPORT z_event_blocks_demo.
DATA: spfli_line TYPE spfli.
SELECT-OPTIONS so_air FOR spfli_line-carrid.
START-OF-SELECTION.
LOOP AT so_air.
WRITE: / 'SIGN:', so_air-sign, 'OPTION:', so_air-option,
'LOW:', so_air-low, 'HIGH:', so_air-high.
ENDLOOP.
SELECT * FROM spfli INTO spfli_line WHERE carrid IN so_air.
WRITE: / spfli_line-cityfrom, spfli_line-cityto.
ENDSELECT.
3 选择标准文字
Goto->Text elements->Selection texts
4 使用选择变式
Goto->Variants->Save as variant 变式保存
Goto->Variants->Get获取
3.格式化屏幕
在程序中使用PARAMETERS和SELECT-OPTIONS语句定义了它们的同时可以通过一些选项对其输入格式进行进一步的控制,并通过SELECTION-SCREEN语句将选择屏幕的外观进行格式化,比如组合一些元素到一个屏幕行中,或在元素块之间添加空行等。
1 选择参数格式选项
选择参数语句PARAMETERS中可以包含附加格式化项PARAMETERS p ...
。其中的
- DEFAULT value 分配默认值
- OBLIGATORY 设置必须项
- LOWER CASE 设置小写
- VISIBLE LENGTH len 减少显示长度
- MATCHCODE OBJECT s_help 分配查询帮助
- VALUE CHECK 进行值检查
- NO-DISPLAY 隐藏显示
- MODIF ID key 分配修改组代码
- MEMORY ID pid 使用内存默认值
- AS CHECKBOX 创建复选框。使用该选项可以把参数定义成复选框,参数按长度为1的类型C创建,而且不允许使用附加项TYPE和LIKE。参数的有效值是‘ ’(空格)和'X'(大写字母X),在用户点击选择屏幕中复选框时赋给参数。如果该复选框被用户选中,则值为‘X’,否则为' '。
- RADIOBUTTON GROUP radi 创建单选按钮组,使用该选项,可将几个参数定义成单选按钮组,每个参数按长度为1的类型C创建,允许使用LIKE或TYPE选项,但是必须参照类型为C,长度为1的字段。参数创建后并分配到组radi,必须为每个组分配至少两个参数,组名称的最大长度是4
REPORT z_event_blocks_demo.
PARAMETERS: r1 RADIOBUTTON GROUP rad1,
r2 RADIOBUTTON GROUP rad1 DEFAULT 'X',
r3 RADIOBUTTON GROUP rad1,
s1 RADIOBUTTON GROUP rad2,
s2 RADIOBUTTON GROUP rad2.
2 选择标准格式选项
SELECT-OPTIONS语句也可以使用OBLIGATORY, MATCHCODE OBJECT和MEMORY ID等选项,其意义和用法类似于PARAMETERS语句,除此之外还有一些属于选择标准的特有设定选项:
- NO-EXTENSION 限制选择表为单行
- NO INTERVALS 限制为单值选择
3 其他选择屏幕
可以使用SELECTION-SCREEN语句添加一些其他的元素。
SELECTION-SCREEN ...
SKIP选项可以在屏幕上产生空行。 SELECTION-SCREEN SKIP [n].
其中n的值可以是1到9,要产生单个空行,可以省略n选项。
ULINE选项可以在选择屏幕中给一行或行中的一部分加下划线。
SELECTION-SCREEN ULINE [[/]pos(len)] [MODIF ID key].
COMMENT选项可以在选择屏幕中添加一些注释性质的文字
SELECTION-SCREEN COMMENT [/]pos(len) comm [FOR FIELD f] [MODIF ID key].
REPORT z_select_element_grouping.
SELECTION-SCREEN COMMENT /1(50) comm1 MODIF ID mg1.
SELECTION-SCREEN ULINE.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN COMMENT /1(30) comm2.
SELECTION-SCREEN ULINE /1(50).
PARAMETERS: r1 RADIOBUTTON GROUP rad1,
r2 RADIOBUTTON GROUP rad1,
r3 RADIOBUTTON GROUP rad1.
SELECTION-SCREEN ULINE /1(50).
AT SELECTION-SCREEN OUTPUT.
comm1 = 'Selection Screen'.
comm2 = 'Select one'.
LOOP AT SCREEN INTO DATA(screen_wa).
IF screen_wa-group1 = 'MG1'.
screen_wa-intensified = '1'.
MODIFY SCREEN FROM screen_wa.
ENDIF.
ENDLOOP.
4 组合选择屏幕
选择屏幕是通过ABAP语句由系统生成的屏幕,不是程序员绘制的,因而元素位置较为固定。SELECTION-SCREEN语句提供进行一些格式化功能,用于部分的改善选择屏幕的外观。SELECTION-SCREEN ...
如果需要将选择屏幕中的多个不同元素,集中在选择屏幕的一行输出,可在BEGIN OF LINE和END OF LINE附加项之间的语句块间声明各元素,这些元素将出现在屏幕的同一行中
SELECTION-SCREEN BEGIN OF LINE.
...
SELECTION-SCREEN END OF LINE.
当把几个元素定位在一行中时,可以在SELECT-SCREEN语句的pos(len)中省略位置说明pos,对象元素将定位在行中的当前位置,此时不可以把 / 选项与格式选项pos(len)一起使用。
将多个元素集中在一行输出之后,可以通过POSITION附加项,把选择屏幕中的元素按照指定的位置输出SELECTION-SCREEN POSITION pos.
只能在SELECTION-SCREEN语句的BEGIN OF LINE和END OF LINE之间使用POSITION选项定位元素。对于pos,可以指定数字或POS_LOW和POS_HIGH。
如果需要将一组选择屏幕组合在一个区域中,可以使用BEGIN OF BLOCK和END OF BLOCK附加项定义选择块组合屏幕元素
SELECTION-SCREEN BEGIN OF BLOCK block
[WITH FRAME [TITLE title]]
[NO INTERVALS].
...
SELECTION-SCREEN END OF BLOCK block.
5 选择屏幕事件
通过一系列事件块的代码实现对运行时选择屏幕处理过程中各种事件的响应。与其他事件块相同,选择屏幕中各个事件在程序中出现的位置是任意的,与其调用顺序无关。对于系统自动调用额报表程序默认的选择屏幕1000,该选择屏幕事件将出现在INITIALIZATION事件和START-OF-SELECTION事件中间,对于使用CALL SELECTION-SCREEN调用的自定义选择屏幕,这些选择屏幕将垂涎在当前处理块中。具体在何事件块中,可以通过系统变量SY-DYNNR来判断当前选择屏幕序号。当选择屏幕中所有的处理结束,系统将触发START-OF-SELECTION事件或者继续执行CALL SELECTION-SCREEN语句后面的代码。
所有选择屏幕事件都使用AT SELECTION SCREEN语句引导,除去选择屏幕的PBO事件之外,大多的选择屏幕事件都用于在不同的状态下给用户提供输入帮助,检查甚至结束当前选择屏幕的处理,并给出错误提示。
- AT SELECTION-SCREEN OUTPUT
是选择屏幕PBO事件,在每次选择屏幕被调用之前触发,可以在其中进行选择屏幕输出之前的准备工作 - AT SELECTION-SCREEN
选择屏幕的基本PAI事件,在用户输入的所有数据都被传输到程序中之后被触发,也是选择屏幕中最后被触发的事件 - AT SELECTION-SCREEN ON field
针对于选择屏幕某字段输入的PAI事件,当该字段的值被传递给程序时触发 - AT SELECTION-SCREEN ON BLOCK block
针对于选择屏幕某元素区域输入的PAI事件,当该区域内的所有字段的值被传递给程序时被触发 - AT SELECTION-SCREEN ON RADIOBUTTON GROUP radi
功能与元素区域PAI事件类似,作为单选按钮,必须整体进行输入检查,不能单独使用ON field选项进行 - AT SELECTION-SCREEN ON seltab
- AT SELECTION-SCREEN ON END OF seltab
这两个事件只有在是哦也能够多行选择对话框时才可能被触发,其中ON seltab用于用户逐行输入后的正确性检查,而ON END OF seltab用于整个选择表输入结束后各行的检查 - AT SELECTION-SCREEN ON HELP-REQUEST FOR field.
- AT SELECTION-SCREEN ON VALUE-REQUEST FOR field.
是选择屏幕中的POH和POV事件,当光标位于某屏幕字段时,用户按下F1和F4,将触发ON HELP-REQUEST和ON VALUE-REQUEST事件,分别用于定义字段帮助和显示查询帮助。
REPORT z_select_element_grouping.
PARAMETERS: p_carrid TYPE spfli-carrid,
p_connid TYPE spfli-connid,
p_cityfr LIKE spfli-cityfrom DEFAULT 'Singapore' MODIF ID scl,
p_cityto LIKE spfli-cityto MODIF ID sc2.
AT SELECTION-SCREEN.
IF p_carrid IS INITIAL.
MESSAGE e888(abapdocu) WITH 'Please input some value'.
ENDIF.
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
IF screen-group1 = 'SC1'.
screen-input = '0'.
MODIFY SCREEN.
CONTINUE.
ENDIF.
ENDLOOP.