第六章在屏幕中使用表格
概览
ABAP/4 提供了两种机理以便在屏幕中显示和使用表格数据。这两种机理分别为“表格控制”和“步
循环”。表格控制和步循环均为屏幕表格,您可以在屏幕制作器中将此类屏幕表格添加到屏幕里。
例如,下面的屏幕在底部就含有表格控制。
内容
简介 .................................................................................................................................................. 1
使用LOOP 语句 ............................................................................................................................. 3在屏幕表格中直接循环 .............................................................................................................. 3
在内表中循环 ............................................................................................................................ 4使用表格控制.................................................................................................................................. 7在ABAP/4 中声明表格控制 ..................................................................................................... 7
设置表格控制属性.................................................................................................................... 8示例事务:表格控制 ....................................................................................................................... 9
使用步循环 ................................................................................................................................... 12
本章讲述如何编制允许您使用屏幕表格的屏幕流逻辑和ABAP/4 代码。有关使用屏幕表格的信息,
参见:
简介(页1)
使用LOOP 语句(页3)
使用表格控制(页7)
使用步循环(页12)
示例事务:表格控制(页9)
简介
本节讲述如何在屏幕中使用表格显示,以便用户很快就能大略了解其概况。
要想获取此处所概列的原理示例,请参阅事务TZ60 和TZ61,它们分别描述了表格控制和步循环
的使用。(TZ60 和TZ61 是同系统一起发布的开发级别SDWA 中的样本事务。)
表格控制和步循环
表格控制和步循环是用于屏幕表格显示的对象,在屏幕制作器中用户可将其添加到屏幕。从编程
的角度来看,表格控制和步循环几乎完全一样。表格控制只是增强了的步循环,此步循环可以使
用桌面应用程序中表格工具的“Look”和“Feel”来显示数据。使用表格控制,用户可以:
沿着表格水平和竖直地滚动
重新调整某一栏的宽度
在字段内滚动(当字段内容比该字段宽时)
选择表格的行数或列数
重新规定栏的顺序
保存当前的显示设置以备后用
表格控制还提供使表格易于查看和使用的专用格式化功能(有些是自动的,有些是可选的)。例如:
当用户调整窗口时,自动进行表格调整(水平或竖直)
行与行之间和列与列之间的分隔线(水平和竖直)
所有列的列表头字段。
步循环的一个特点是它们的表行能够在屏幕上跨越多行。相反,表格控制中的行总是单行,但可以很长。(表格控制的行能够滚动。)
通常,表格控制所提供的许多特征由系统的SAPGUI 前端操纵,因此,不必在ABAP/4 事务中编制任何特征(除了竖直滚动)。
屏幕表格处理
屏幕表格是屏幕中重复的系列表格行。每一条目都包含一个或多个字段,并且所有的行都具有相同的字段结构。屏幕表格要么是表格控制要么是步循环。显示飞行数据的表格控制如下所示:
屏幕表格和LOOP 动态语句
如同在内表中循环来处理内表,用户也可以在屏幕表格中循环以处理屏幕表格。。为此,就必须在屏幕流逻辑中加入一条LOOP...ENDLOOP 动态语句。该循环通常要调用一次ABAP/4 模块,但也允许使用其它流逻辑命令。系统每次通过循环时就运行此模块。
LOOP 动态语句有多种格式。两个最重要的格式的功能如下:
? 只在屏幕 表格中循环
同时在屏幕表格和内表中循环
屏幕表格和程序字段
可以将屏幕表格字段声明为数据库字段、内表字段、结构字段或其它程序字段。屏幕表格字段有时出现在屏幕字段列表中,有时出现在程序中。因此,屏幕表格中所有的行在程序中共用同一个字段集(类似“表头区域”)。在流逻辑的LOOP 过程中,系统将屏幕表格行的所有字段复制到相关的程序字段中或从中复制回来。
LOOP 语句的任务
LOOP 语句负责读取往返传递于屏幕和ABAP/4 程序之间的屏幕表格值。因此必须同时在PBO 和PAI 事件中为屏幕中的每一个表格编制LOOP 语句。至少在此应有一个空LOOP...ENDLOOP 语句。LOOP 语句还用于驱动滚动。在PBO 事件中,LOOP 使用一个参数告诉从表格的何处开始循环。该参数因此导致下一个屏幕表格显示的更新(对于表格控制,该参数是表格控制结构中的TOP_LINE 字段;对于步循环,该参数为用于LOOP 语句的CURSOR 参数。)。ABAP/4 程序和系统都可以设置该参数。
注意,屏幕表格中所显示的行数可以改变。当屏幕表格可调整并且用户更改窗口的高度时就会出现这种情况。在这种情况下,PAI 中的下一个LOOP 就更改PAI 中传到ABAP/4 程序的表格行数。
使用LOOP 语句
LOOP...ENDLOOP 动态命令可在流逻辑中执行循环操作。可以使用该语句在表格控制和步循环中进行循环。在LOOP 和ENDLOOP 之间,可以使用FIELD、MODULE、SELECT、V ALUES 和CHAIN 动态关键字。最为常见的是使用MODULE 语句来调用ABAP/4 模块。
必须同时在PBO 和PAI 事件中为屏幕的每个表格编制LOOP 语句。由于LOOP 语句导致在ABAP/4 程序和屏幕字段之间来回复制屏幕字段。因此,此处至少必须有一个空LOOP...ENDLOOP 语句。LOOP 语句有两种重要的格式:
LOOP。
该语句在屏幕表格行中循环,同时在每个块和程序的对应ABAP/4 字段之间往复
传送数据。可以在ABAP/4 中将屏幕表格字段声明为任何类型(数据库表格、结
构或单个字段),内表字段除外。
对于步循环,如果正在执行本身的滚动(例如,使用F21-F24),则必须使用
该语句。
LOOP AT
该语句可同时在内表和屏幕表格行中循环。常常将此屏幕表格字段声明为内表字
段,但不是非得如此。
对于该LOOP,步循环显示都带有滚动条。该滚动由系统自动操纵。
有关不同LOOP 语句的详细信息,参见:
在屏幕表格中直接循环(页3)
在内表中循环(页4)
在屏幕表格中直接循环
使用LOOP 语句的简单格式
LOOP.
...
ENDLOOP.
在当前所显示的屏幕表格行中循环。如果正在使用表格控制,就必须包括附加的WITH CONTROL 参数:
LOOP WITH CONTROL
...
ENDLOOP.
该简单的LOOP 是LOOP 语句最一般的格式。如果使用该LOOP,就能够将屏幕表格字段声明为任何类型(内表、数据库表格、结构或单个字段)。此简单的LOOP 将屏幕表格字段往复地复制到相关的ABAP/4 字段。如果要在不同的结构中使用屏幕值,就必须直接将它们移到所要的地方。每经过一次循环,都将下一表格行置于ABAP/4 字段中,并为其执行LOOP
在ABAP/4 模块中,使用系统变量SY-STEPL 以查找当前正在处理的屏幕表格行的索引。每循环一次,系统就设置一次该变量。SY-STEPL 的值总是介于 1 与当前所显示的行数之间。当在屏幕表格和内表之间来回地传送字段值时,这很有用。您可以在程序中声明表格偏移量(常称为BASE,并通常用SY-LOOPC 初始化)并用它同SY-STEPL 一起获得与当前屏幕表格行相对应的内表行。(下例中,将屏幕字段声明为内表。程序读取或修改内表以读取往返传送到屏幕的表格字段。)
在内表中循环
语句
LOOP AT
表示同时在内表和屏幕表格中循环。特别地,LOOP A T 在屏幕中当前可见的内表部分中循环。对于表格控制和步循环都可使用此LOOP 语句格式。
该LOOP 语句的完整语法格式为:
LOOP AT
[WITH CONTROL
[FROM
...
ENDLOOP.
该形式的LOOP语句在内表中循环,对每行都执行
使用步循环时,在PAI 事件中省略CURSOR 参数。FROM 和TO 参数只能用于步循环(参见使用步循环(页12) 。)。WITH CONTROL 参数只能用于表格控制。
下列标题提供详细信息:
系统如何传送数据值(页5)
滚动和滚动变量(页6)
系统如何传送数据值
对于LOOP A T
还要注意,在屏幕表格中所使用的字段可能只是相应词典或内表字段的一个子集。系统在屏幕表格中传送需要的字段。详细处理过程如下:
PBO 处理
1. 内表的一行被放入表头区。
2. 为该行执行所有的循环语句
循环语句最通常是调用ABAP/4 模块。只要需要,这些模块就将内表字段移
到相关的程序字段中(字典表格或其它字段)。
示例事务TZ60 在例程DISPLAY_FLIGHTS 中执行下列命令:
MODULE DISPLAY_FLIGHTS OUTPUT.
SFLIGHT-FLDATE = INT_FLIGHTS-FLDATE.
SFLIGHT-PRICE = INT_FLIGHTS-PRICE.
SFLIGHT-CURRENCY = INT_FLIGHTS-CURRENCY.
SFLIGHT-PLANETYPE = INT_FLIGHTS-PLANETYPE.
SFLIGHT-SEATSMAX = INT_FLIGHTS-SEATSMAX.
SFLIGHT-SEATSOCC = INT_FLIGHTS-SEATSOCC.
ENDMODULE.
3. 系统将值从程序字段传送到具有相同名称的屏幕字段中。
PAI 处理
1. 内表的行被放入内表表头区中。
2. 所有的屏幕表格字段被传送到具有相同名称的ABAP/4 程序字段中。
3. 为当前内表行执行所有的循环
同样
将程序字段值移到该内表的表头区。本步骤用屏幕数据值覆盖了内表数据
值。步骤 1 对于屏幕表格字段只是为内表所定义的字段的子集的情况是必须
的。如果想使用新的屏幕值更新内表,那么,在表头区必须有作为基础的原
表格行。
记住:如果要使用表头区中的内容来更新内表,就请使用ABAP/4 模块中的
MODIFY 语句。系统不会自动进行这种更新。
滚动和滚动变量
使用LOOP A T
对于表格控制和步循环,竖直滚动都由
第一次处理PBO 事件时,程序应当设置
之后,系统在两种情形下设置
只要用户使用滚动条滚动就更新
每次进入LOOP AT 块时增加
这是因为每当用户使用滚动条滚动时,系统执行如下动作:
1. 为当前屏幕显示触发PAI。
滚动触发PAI 事件就象用户已经执行了一个传送功能代码的动作。在使用滚动条
滚动的PAI 事件中,OK_CODE 字段没有值。(如果用功能键来进行滚动,则
OK_CODE 的值就是该功能键的功能代码。)
a. 将当前显示的屏幕值传送到ABAP/4 程序中。
b. 使用
系统就将
(和平常一样,只要程序在此检测出任何错误,都将发送一条警告或错误信
息。PAI 过程将重复执行直到不再发生错误为止。)
2. 为新屏幕显示触发PBO (由用户滚动请求)。
对于该PBO,系统将
行LOOP AT 处理。结果,内表的新程序段被传送到屏幕上。
如果想提供除滚动条之外的其它滚动选项(例如,标准工具栏中的 F21 F24 滚动按钮),就必须自己编程。为此,可以在必要的地方自己设置
使用表格控制
表格控制的结构不同于步循环。作为屏幕对象的步循环只是一系列字段行,它们表现为一个重复的块。而作为屏幕对象的表格控制却由以下几部分组成:
表格字段(在屏幕中显示)
控制结构,支配着表格显示以及用户可以用它来做什么。
屏幕200 的字段列表(在事务TZ60 中)显示这两项:
这里可看到控制结构(带有Ftyp = Table 的FLIGHTS 字段)和实际表字段(带有Ftyp = Text或I/O 的SFLIGHT 字段)。FLIGHTS 字段的属性(当您按Attribs.for 1 Field 时可用)显示可以静态设置的控制结构字段。其它控制结构字段可以从ABAP/4 程序中动态地设置。
下列标题提供详细信息:
在ABAP/4 中声明表格控制(页7)
设置表格控制属性(页8)
在ABAP/4 中声明表格控制
在屏幕中使用表格控制时,必须在ABAP/4 程序中同时声明表格控制结构和表格控制字段。例如,事务TZ60 有:
TABLES: SFLIGHT.
CONTROLS: FLIGHTS TYPE TABLEVIEW USING SCREEN 200.
CONTROLS 语句定义TABLEVIEW 类型的控制结构。系统从给定屏幕的屏幕制作器属性中获得结构的初始值。
TABLEVIEW 结构包含如下字段:
TAB_COLUMN 结构中的字段说明了屏幕表格中的单个字段及其列:
“屏幕”类型指的是SCREEN 表格,系统表格说明了屏幕中的所有字段。关于使用SCREEN 表格的完整信息,参见:修改屏幕(页错误!链接无效。) .
设置表格控制属性
使用TABLEVIEW 控制结构中的字段在运行时设置屏幕表格属性。例如,设置滚动变量TOP_LINE,事务TZ60 使用语句:
FLIGHTS-TOP_LINE = 1。
起初,表格控制字段从屏幕制作器中为控制所指定的属性中获得它们的值。其后,大部分控制字段可用多种方法来指定:由系统指定、由ABAP/4 程序指定或由用户定制显示。下表确切地指定每个字段的设置方式:
如果必要,可以始终将表格控制重置为屏幕制作器中所指定的初始值。为此,请使用语句REFRESH CONTROL
示例事务:表格控制
诸如对表格控制的编程示例,参见事务TZ60 的代码。TZ60(开发级别SDWA)使用两个屏幕显示航班信息。在第一屏,用户指定航班的航线并请求显示。在第二屏(屏幕200),事务显示所有计划航线的航班。
查看代码时,要注意的主要问题是:
表格数据是如何获取并向各处传送的
在程序ABAP/4 中将表格控制中的字段声明为数据库字段(表格SFLIGHTS)。
要同时存储几个SFLIGHTS 行,程序将使用内表INT_FLIGHTS。
1. 在屏幕100 的PAI 中,程序选择给定的航线的所有航班并将它们存储到内
表INT_FLIGHTS 中。
2. 在屏幕200 的PBO 中,LOOP 语句在INT_FLIGHTS 中循环,并为每行调用
模块DISPLAY_FLIGHTS。DISPLAY_FLIGHTS 将INT_FLIGHTS 行传送到
SFLIGHTS 工作区。SFLIGHTS 字段匹配屏幕表格名,因此每次循环的结尾,系
统将ABAP/4 值传送到屏幕表格字段中。
使用表格控制字段直接滚动
表格控制包含了管理滚动的信息。这包括告诉已填充的表格行数以及应当首先在
屏幕上显示哪一表格行的字段。对于步循环和表格控制,系统都自动使用滚动条
来管理滚动。这包括滚动实际屏幕显示,以及重置滚动变量。而示例程序提供了
使用F21-F24 键滚动。在这种情况下,程序必须直接执行这些功能。
1. 在屏幕100 的PAI 中,程序将“first-table-row”变量(字段TOP_LINE)初
始化为1。
2. 在屏幕200 的PAI 中,如果用户已经使用F21-F24 功能键做了滚动,那么,
程序将重新设置滚动变量,尤其是TOP_LINE 字段。
屏幕流逻辑
事务TZ60 中屏幕200 的流逻辑(仅对于PAI)如下:
*---------------------------------------------------------------*
* Screen 200: Flow Logic *
*&--------------------------------------------------------------*
PROCESS BEFORE OUTPUT.
MODULE STATUS_0200.
LOOP AT INT_FLIGHTS WITH CONTROL FLIGHTS
CURSOR FLIGHTS-TOP_LINE.
MODULE DISPLAY_FLIGHTS.
ENDLOOP.
*
*
PROCESS AFTER INPUT.
LOOP AT INT_FLIGHTS.
MODULE SET_LINE_COUNT.
ENDLOOP.
MODULE USER_COMMAND_0200.
ABAP/4 代码
TOP 模块代码后面的程序段显示了相应于后面代码的定义。
*----------------------------------------------------------------*
* INCLUDE MTD40TOP *
*----------------------------------------------------------------*
PROGRAM SAPMTZ60 MESSAGE-ID A&.
TABLES: SFLIGHT.
<....Other declarations....>
DATA INT_FLIGHTS LIKE SFLIGHT OCCURS 1 WITH HEADER LINE.
DATA: LINE_COUNT TYPE I.
CONTROLS: FLIGHTS TYPE TABLEVIEW USING SCREEN 200.
下面的PBO 模块将内表字段传送给PBO 中相应的屏幕表格字段。
*&---------------------------------------------------------------*
*& Module DISPLAY_FLIGHTS OUTPUT
*&---------------------------------------------------------------*
MODULE DISPLAY_FLIGHTS OUTPUT.
SFLIGHT-FLDATE = INT_FLIGHTS-FLDATE.
SFLIGHT-PRICE = INT_FLIGHTS-PRICE.
SFLIGHT-CURRENCY = INT_FLIGHTS-CURRENCY.
SFLIGHT-PLANETYPE = INT_FLIGHTS-PLANETYPE.
SFLIGHT-SEATSMAX = INT_FLIGHTS-SEATSMAX.
SFLIGHT-SEATSOCC = INT_FLIGHTS-SEATSOCC.
ENDMODULE.
在PAI 中,程序必须再次循环,以便将屏幕表格字段传送回程序中。在该循环中,程序可以使用SY_LOOPC 来查找所传送的行数。SY_LOOPC 是一个系统变量,它告诉当前显示中的总行数。*&---------------------------------------------------------------*
*& Module SET_LINE_COUNT INPUT
*&---------------------------------------------------------------*
MODULE SET_LINE_COUNT INPUT.
LINE-COUNT = SY-LOOPC.
ENDMODULE
事务TZ60允许用户按功能键(F21-F24)来滚动此显示。系统使用滚动条自动处理滚动,但不用功能键来滚动。因此,屏幕200 的PAI 必须直接执行功能键滚动:
MODULE USER_COMMAND_0200 INPUT.
CASE OK_CODE.
* WHEN 'CANC'...
* WHEN 'EXIT'...
* WHEN 'BACK'...
* WHEN 'NEW'...
WHEN 'P--'.
CLEAR OK_CODE.
PERFORM PAGING USING 'P--'.
WHEN 'P-'.
CLEAR OK_CODE.
PERFORM PAGING USING 'P-'.
WHEN 'P+'.
CLEAR OK_CODE.
PERFORM PAGING USING 'P+'.
WHEN 'P++'.
CLEAR OK_CODE.
PERFORM PAGING USING 'P++'.
ENDCASE.
ENDMODULE.
通过将表格控制字段重置为新值,PAGING 例程使系统可以滚动此显示。TOP_LINE 字段告诉LOOP 语句PBO 中开始循环的位置。
*&---------------------------------------------------------------*
*& Form PAGING
*&---------------------------------------------------------------*
FORM PAGING USING CODE.
DATA: I TYPE I.
J TYPE I.
CASE CODE.
WHEN 'P--'. FLIGHTS-TOP_LINE = 1.
WHEN 'P-'. FLIGHTS-TOP_LINE = FLIGHTS-TOP_LINE - LINE_COUNT.
IF FLIGHTS-TOP_LINE LE 0.
FLIGHTS-TOP_LINE = 1. ENDIF.
WHEN 'P+'. I = FLIGHTS-TOP_LINE + LINE_COUNT.
J = FLIGHTS-LINES - LINE_COUNT + 1.
IF J LE 0.
J = 1. ENDIF.
IF I LE J.
FLIGHTS-TOP_LINE = I.
ELSE. FLIGHTS-TOP_LINE = J.
ENDIF.
WHEN 'P++'.
FLIGHTS-TOP_LINE = FLIGHTS-LINES - LINE_COUNT + 1.
IF FLIGHTS-TOP_LINE LE 0.
FLIGHTS-TOP_LINE = 1. ENDIF.
ENDCASE.
ENDFORM.
使用步循环
步循环是屏幕中的一系列重复的字段块。每一个块可以包含一个或多个字段,并能在屏幕上扩展为多行。
与屏幕中的结构相同,步循环没有独立的名称。屏幕可以包含多个步循环,然而,要是屏幕确有多个步循环,那么,用户必须相应地在流逻辑中编制LOOP...ENDLOOP 语句。LOOP...ENDLOOP 的顺序必须完全同屏幕中步循环的顺序相平行。该顺序告诉系统哪个循环处理应用于哪个循环。屏幕中的步循环首先由屏幕的行来排列顺序,其次才是屏幕的列。
事务TZ61 (开发级别SDWA)执行您在事务TZ60 中看到的表格的步循环的版本。TZ61 的屏幕200,显示下列步循环:
关于如何使用步循环的说明,参见TZ61 代码。
静态和动态步循环
步循环分为两类:静态的和动态的。静态步循环有固定的大小,运行时无法更改。动态步循环大小可变。如果用户重置窗口的大小,系统就会自动地增加或减小所显示的步循环块的个数。在任何给定的屏幕中,您可以定义任意数量的静态步循环,但动态步循环只能有一个。
可以在屏幕制作器中指定步循环的类型。屏幕中的每一个循环都有“循环类型”(fixed=静态, variable=动态)和“循环次数”属性。如果循环是固定的,“循环次数”告诉系统用于显示的循环块的数量。该数值可以永久不变。
编制动态和静态步循环的方法完全一样。两种类型都可以使用LOOP 和LOOP A T 语句。
在步循环中循环
当把LOOP A T
如果需要,使用如下附加参数:
FROM
这些参数限制了在步循环中能够显示或处理的内表部分。如果您使用其中的一个
或两个,请在ABAP/4 中使用LIKE SY-TABIX 声明
不使用它们,则系统仅使用内表的开始/结束部分来限制。
CURSOR
CURSOR 参数告诉哪一个内表行是屏幕显示中的第一行。
程序变量,它能够由程序设置,也可以由系统自动设置。
内表的绝对值(即与FROM 或TO 值无关)。
在PBO 事件中需要CURSOR