第六章在屏幕中使用表格概览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、VALUES 和CHAIN 动态关键字。
最为常见的是使用MODULE 语句来调用ABAP/4 模块。
必须同时在PBO 和PAI 事件中为屏幕的每个表格编制LOOP 语句。
由于LOOP 语句导致在ABAP/4 程序和屏幕字段之间来回复制屏幕字段。
因此,此处至少必须有一个空LOOP...ENDLOOP 语句。
LOOP 语句有两种重要的格式:LOOP。
该语句在屏幕表格行中循环,同时在每个块和程序的对应ABAP/4 字段之间往复传送数据。
可以在ABAP/4 中将屏幕表格字段声明为任何类型(数据库表格、结构或单个字段),内表字段除外。
对于步循环,如果正在执行本身的滚动(例如,使用F21-F24),则必须使用该语句。
LOOP AT <internal table>.该语句可同时在内表和屏幕表格行中循环。
常常将此屏幕表格字段声明为内表字段,但不是非得如此。
对于该LOOP,步循环显示都带有滚动条。
该滚动由系统自动操纵。
有关不同LOOP 语句的详细信息,参见:在屏幕表格中直接循环(页3)在内表中循环(页4)在屏幕表格中直接循环使用LOOP 语句的简单格式LOOP....<actions>...ENDLOOP.在当前所显示的屏幕表格行中循环。
如果正在使用表格控制,就必须包括附加的WITH CONTROL 参数:LOOP WITH CONTROL <table-control>....<actions>...ENDLOOP.该简单的LOOP 是LOOP 语句最一般的格式。
如果使用该LOOP,就能够将屏幕表格字段声明为任何类型(内表、数据库表格、结构或单个字段)。
此简单的LOOP 将屏幕表格字段往复地复制到相关的ABAP/4 字段。
如果要在不同的结构中使用屏幕值,就必须直接将它们移到所要的地方。
每经过一次循环,都将下一表格行置于ABAP/4 字段中,并为其执行LOOP <actions>(通常为ABAP/4 模块调用)。
在PBO 事件中,LOOP 语句可将程序中的循环字段逐行复制到屏幕。
在PAI 事件中,字段被逐行复制到相关的程序字段上。
在ABAP/4 模块中,使用系统变量SY-STEPL 以查找当前正在处理的屏幕表格行的索引。
每循环一次,系统就设置一次该变量。
SY-STEPL 的值总是介于1 与当前所显示的行数之间。
当在屏幕表格和内表之间来回地传送字段值时,这很有用。
您可以在程序中声明表格偏移量(常称为BASE,并通常用SY-LOOPC 初始化)并用它同SY-STEPL 一起获得与当前屏幕表格行相对应的内表行。
(下例中,将屏幕字段声明为内表。
程序读取或修改内表以读取往返传送到屏幕的表格字段。
)MODULE MODIFY_INTTAB.IND = BASE + SY-STEPL - 1.MODIFY INTTAB INDEX IND.ENDMODULE.请记住,系统变量SY-STEPL 只在LOOP...ENDLOOP 处理的范围之内才有意义。
循环之外,它没有合法值。
在内表中循环语句LOOP AT <internal table>.表示同时在内表和屏幕表格中循环。
特别地,LOOP AT 在屏幕中当前可见的内表部分中循环。
对于表格控制和步循环都可使用此LOOP 语句格式。
该LOOP 语句的完整语法格式为:LOOP AT <internal table> CURSOR <scroll-var>WITH CONTROL <table-control>FROM <line1>TO <line2>....<actions>...ENDLOOP.该形式的LOOP语句在内表中循环,对每行都执行<actions>。
对于每个内表行,系统将相应程序字段传送到对应的屏幕表格行,或将相应的屏幕表格行传送回对应的程序字段。
使用步循环时,在PAI 事件中省略CURSOR 参数。
FROM 和TO 参数只能用于步循环(参见使用步循环(页12) 。
)。
WITH CONTROL 参数只能用于表格控制。
下列标题提供详细信息:系统如何传送数据值(页5)滚动和滚动变量(页6)系统如何传送数据值对于LOOP AT <internal table> 语句,不必将屏幕表格声明为内表。
屏幕表格也可以是数据库表格、结构或其它程序字段。
如果没有将屏幕表格定义为内表,则必须确认在循环中移到内部表头中或从内表头中移出的字段是正确的,还要注意,在屏幕表格中所使用的字段可能只是相应词典或内表字段的一个子集。