第6章在屏幕中使用表格.docx
《第6章在屏幕中使用表格.docx》由会员分享,可在线阅读,更多相关《第6章在屏幕中使用表格.docx(16页珍藏版)》请在冰豆网上搜索。
第6章在屏幕中使用表格
第六章1在屏幕中使用表格
概览
ABAP/4提供了两种机理以便在屏幕中显示和使用表格数据。
这两种机理分别为“表格控制”和“步循环”。
表格控制和步循环均为屏幕表格,您可以在屏幕制作器中将此类屏幕表格添加到屏幕里。
例如,下面的屏幕在底部就含有表格控制。
内容
简介
使用LOOP语句
在屏幕表格中直接循环
在内表中循环
使用表格控制
在ABAP/4中声明表格控制
设置表格控制属性
示例事务:
表格控制
使用步循环
本章讲述如何编制允许您使用屏幕表格的屏幕流逻辑和ABAP/4代码。
有关使用屏幕表格的信息,参见:
简介(页1)
使用LOOP语句(页3)
使用表格控制(页7)
使用步循环(页12)
示例事务:
表格控制(页9)
1简介
本节讲述如何在屏幕中使用表格显示,以便用户很快就能大略了解其概况。
要想获取此处所概列的原理示例,请参阅事务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程序的表格行数。
3使用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),则必须使用该语句。
_LOOPAT.
该语句可同时在内表和屏幕表格行中循环。
常常将此屏幕表格字段声明为内表字段,但不是非得如此。
对于该LOOP,步循环显示都带有滚动条。
该滚动由系统自动操纵。
有关不同LOOP语句的详细信息,参见:
在屏幕表格中直接循环(页3)
在内表中循环(页4)
3在屏幕表格中直接循环
使用LOOP语句的简单格式
LOOP.
......
ENDLOOP.
在当前所显示的屏幕表格行中循环。
如果正在使用表格控制,就必须包括附加的WITHCONTROL参数:
LOOPWITHCONTROL.
......
ENDLOOP.
该简单的LOOP是LOOP语句最一般的格式。
如果使用该LOOP,就能够将屏幕表格字段声明为任何类型(内表、数据库表格、结构或单个字段)。
此简单的LOOP将屏幕表格字段往复地复制到相关的ABAP/4字段。
如果要在不同的结构中使用屏幕值,就必须直接将它们移到所要的地方。
每经过一次循环,都将下一表格行置于ABAP/4字段中,并为其执行LOOP(通常为ABAP/4模块调用)。
在PBO事件中,LOOP语句可将程序中的循环字段逐行复制到屏幕。
在PAI事件中,字段被逐行复制到相关的程序字段上。
在ABAP/4模块中,使用系统变量SY-STEPL以查找当前正在处理的屏幕表格行的索引。
每循环一次,系统就设置一次该变量。
SY-STEPL的值总是介于1与当前所显示的行数之间。
当在屏幕表格和内表之间来回地传送字段值时,这很有用。
您可以在程序中声明表格偏移量(常称为BASE,并通常用SY-LOOPC初始化)并用它同SY-STEPL一起获得与当前屏幕表格行相对应的内表行。
(下例中,将屏幕字段声明为内表。
程序读取或修改内表以读取往返传送到屏幕的表格字段。
)
***SCREENFLOWLOGIC***
PROCESSBEFOREOUTPUT.
LOOP.
MODULEREAD_INTTAB.
ENDLOOP.
PROCESSAFTERINPUT.
LOOP.
MODULEMODIFY_INTTAB.
ENDLOOP.
***ABAP/4MODULES***
MODULEREAD_INTTAB.
IND=BASE+SY-STEPL-1.
READTABLEINTTABINDEXIND.
ENDMODULE.
MODULEMODIFY_INTTAB.
IND=BASE+SY-STEPL-1.
MODIFYINTTABINDEXIND.
ENDMODULE.
请记住,系统变量SY-STEPL只在LOOP...ENDLOOP处理的范围之内才有意义。
循环之外,它没有合法值。
4在内表中循环
语句
LOOPAT.
表示同时在内表和屏幕表格中循环。
特别地,LOOPAT在屏幕中当前可见的内表部分中循环。
对于表格控制和步循环都可使用此LOOP语句格式。
该LOOP语句的完整语法格式为:
LOOPATCURSOR
WITHCONTROL
FROMTO.
......
ENDLOOP.
该形式的LOOP语句在内表中循环,对每行都执行。
对于每个内表行,系统将相应程序字段传送到对应的屏幕表格行,或将相应的屏幕表格行传送回对应的程序字段。
使用步循环时,在PAI事件中省略CURSOR参数。
FROM和TO参数只能用于步循环(参见使用步循环(页12)。
)。
WITHCONTROL参数只能用于表格控制。
下列标题提供详细信息:
系统如何传送数据值(页5)
滚动和滚动变量(页6)
5系统如何传送数据值
对于LOOPAT语句,不必将屏幕表格声明为内表。
屏幕表格也可以是数据库表格、结构或其它程序字段。
如果没有将屏幕表格定义为内表,则必须确认在循环中移到内部表头中或从内表头中移出的字段是正确的,
还要注意,在屏幕表格中所使用的字段可能只是相应词典或内表字段的一个子集。
系统在屏幕表格中传送需要的字段。
详细处理过程如下:
_PBO处理
1.内表的一行被放入表头区。
2.为该行执行所有的循环语句
循环语句最通常是调用ABAP/4模块。
只要需要,这些模块就将内表字段移到相关的程序字段中(字典表格或其它字段)。
示例事务TZ60在例程DISPLAY_FLIGHTS中执行下列命令:
MODULEDISPLAY_FLIGHTSOUTPUT.
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.为当前内表行执行所有的循环。
同样也通常是对ABAP/4模块的调用。
只要需要,该模块应当首先将程序字段值移到该内表的表头区。
本步骤用屏幕数据值覆盖了内表数据值。
步骤1对于屏幕表格字段只是为内表所定义的字段的子集的情况是必须的。
如果想使用新的屏幕值更新内表,那么,在表头区必须有作为基础的原表格行。
记住:
如果要使用表头区中的内容来更新内表,就请使用ABAP/4模块中的MODIFY语句。
系统不会自动进行这种更新。
注意,现有动态语言MODIFY语句和ABAP/4MODIFY语句。
请不要使用动态语言MODIFY语句来更新内表。
6滚动和滚动变量
使用LOOPAT语句可以自动进行滚动,也可由编程人员的操作来执行滚动。
用滚动条的滚动是自动的,并由系统来管理。
使用功能键或其它按钮的滚动必须由编程人员来进行操作。
(示例事务TZ60给出了两种方式的例子。
)
对于表格控制和步循环,竖直滚动都由参数控制。
本节说明如何使用该变量。
水平滚动(只用于表格控制)由SAPGUI前端局部执行。
ABAP/4代码不需要支持任何水平滚动。
第一次处理PBO事件时,程序应当设置以告诉系统从何处开始显示。
对于表格控制,是TABLEVIEW结构中的TOP_LINE字段。
对于步循环,请声明局部程序变量以用作CURSOR参数。
之后,系统在两种情形下设置:
_只要用户使用滚动条滚动就更新。
_每次进入LOOPAT块时增加。
这是因为每当用户使用滚动条滚动时,系统执行如下动作:
1.为当前屏幕显示触发PAI。
滚动触发PAI事件就象用户已经执行了一个传送功能代码的动作。
在使用滚动条滚动的PAI事件中,OK_CODE字段没有值。
(如果用功能键来进行滚动,则OK_CODE的值就是该功能键的功能代码。
)
a.将当前显示的屏幕值传送到ABAP/4程序中。
b.使用的当前值,为当前屏幕值执行PAI处理。
每经过一次LOOP,系统就将加一,因此程序能够自动访问相应的内表条目。
(和平常一样,只要程序在此检测出任何错误,都将发送一条警告或错误信息。
PAI过程将重复执行直到不再发生错误为止。
)
2.为新屏幕显示触发PBO(由用户滚动请求)。
对于该PBO,系统将更新为新值(由用户滚动设置)并反复对屏幕进行LOOPAT处理。
结果,内表的新程序段被传送到屏幕上。
***SCREENFLOWLOGIC***
PROCESSBEFOREOUTPUT:
LOOPATINTTABCURSORTABCNTL-TOP_LINE.
ENDLOOP.
PROCESSAFTERINPUT.
LOOPATINTTAB.
MODULEMODIFY_INTTAB.
ENDLOOP.
***ABAP/4MODULE***
MODULEMODIFY_INTTAB.
MODIFYINTTABINDEXCOUNT.
ENDMODULE.
如果想提供除滚动条之外的其它滚动选项(例如,标准工具栏中的F21F24滚动按钮),就必须自己编程。
为此,可以在必要的地方自己设置。
于是PBO中的LOOP语句相应地在下一个屏幕显示中更新屏幕表格。
7使用表格控制
表格控制的结构不同于步循环。
作为屏幕对象的步循环只是一系列字段行,它们表现为一个重复的块。
而作为屏幕对象的表格控制却由以下几部分组成:
_表格字段(在屏幕中显示)
_控制结构,支配着表格显示以及用户可以用它来做什么。
屏幕200的字段列表(在事务TZ60中)显示这两项:
这里可看到控制结构(带有Ftyp=Table的FLIGHTS字段)和实际表字段(带有Ftyp=Text或I/O的SFLIGHT字段)。
FLIGHTS字段的属性(当您按Attribs.for1Field时可用)显示可以静态设置的控制结构字段。
其它控制结构字段可以从ABAP/4程序中动态地设置。
下列标题提供详细信息:
在ABAP/4中声明表格控制(页7)
设置表格控制属性(页8)
7在ABAP/4中声明表格控制
在屏幕中使用表格控制时,必须在ABAP/4程序中同时声明表格控制结构和表格控制字段。
例如,事务TZ60有:
TABLES:
SFLIGHT.
CONTROLS:
FLIGHTSTYPETABLEVIEWUSINGSCREEN200.
CONTROLS语句定义TABLEVIEW类型的控制结构。
系统从给定屏幕的屏幕制作器属性中获得结构的初始值。
TABLEVIEW结构包含如下字段:
字段名
类型
用途
FIXED_COLS
integer
表格左端不可移动列数。
固定列后面的所有列都可以移动,并能在表格中重新排序。
LINES
integer
表格中的可显示的行数。
如果使用表格控制来显示内表,那么,LINES将给出能在屏幕上显示的总行数。
(如果内表不包含行,则屏幕表格将在结尾包含空行)。
系统还使用LINES来设置滚动条的显示以示意用户在表格中向下滚动了多远。
TOP_LINE
integer
屏幕开始显示的表格行。
CURRENT_LINE
integer
循环内当前正被处理的行。
该字段是绝对(非相对)指标,其值为TOP_LINE+SY_STEPL.-1
LEFT_COL
integer
最左边非固定的列。
因为用户可以滚动显示的非固定部分,所以该字段控制着出现在固定列后面的列号。
LEFT_COL给出列的绝对(非相对)值,不管用户是否重新排列了列的顺序。
LINE_SEL_MODE
integer
允许使用行选择。
取值:
0=不选,1=只选一行,2=允许选多行。
COL_SEL_MODE
integer
允许使用列选择。
取值:
0=不选,1=只选一列,2=允许选多列。
LINE_SELECTOR
char1
指示器:
显示行选择栏,这是一个能在ABAP/4程序中进行检查的一般复选框。
用户单击某复选框时,系统就将它设置为X。
H_GRID
char1
指示器:
显示水平网格线
V_GRID
char1
指示器:
显示垂直网格线
COLS(OCCURS10)
TAB_COLUMN
嵌入内表:
表格中每个列的一个表格条目。
TAB_COLUMN结构中的字段说明了屏幕表格中的单个字段及其列:
字段名
类型
用途
SCREEN
SCREEN
嵌入SCREEN结构:
所有的字段出自SCREEN系统表格的单个行。
INDEX
integer
显示中列的当前位置(用于用户重新排列了列顺序的情况)。
SELECTED
char1
用户单击该列时,(系统)将它设为X。
VISLENGTH
int1
字段的可见长度(字符数)。
最大的允许长度为255个字符。
“屏幕”类型指的是SCREEN表格,系统表格说明了屏幕中的所有字段。
关于使用SCREEN表格的完整信息,参见:
修改屏幕(页错误!
链接无效。
).
8设置表格控制属性
使用TABLEVIEW控制结构中的字段在运行时设置屏幕表格属性。
例如,设置滚动变量TOP_LINE,事务TZ60使用语句:
FLIGHTS-TOP_LINE=1。
起初,表格控制字段从屏幕制作器中为控制所指定的属性中获得它们的值。
其后,大部分控制字段可用多种方法来指定:
由系统指定、由ABAP/4程序指定或由用户定制显示。
下表确切地指定每个字段的设置方式:
字段名
初始化方式
后来设置值的方式
FIXED_COLS
在ABAP/4中或默认=0。
在ABAP/4中。
LINES
在ABAP/4中或默认=0。
在ABAP/4中。
如果使用LOOPAT,也可由系统自动设置。
TOP_LINE
在ABAP/4中或默认=1。
在ABAP/4.中,如果用户移动垂直滚动条上的滑块时,也可由系统设置。
CURRENT_LINE
默认=0。
在ABAP/4中不允许修改。
在循环时由系统设置。
(CURRENT_LINE=TOP_LINE+SY_STEPL-1)
LEFT_COL
在ABAP/4中或默认=0。
在ABAP/4中,当用户在水平滚动条上移动滑块时,还可由系统设置。
LINE_SEL_MODE
屏幕制作器或ABAP/4程序。
在ABAP/4中。
COL_SEL_MODE
屏幕制作器或ABAP/4程序。
在ABAP/4中。
LINE_SELECTOR
屏幕制作器或ABAP/4程序。
在ABAP/4中。
H_GRID
屏幕制作器或ABAP/4程序。
在ABAP/4中。
V_GRID
屏幕制作器或ABAP/4程序。
在ABAP/4中。
COLS_SCREEN
屏幕制作器、ABAP/4程序或用户定制。
在ABAP/4中。
COLS_INDEX
屏幕制作器、ABAP/4程序或用户定制。
在ABAP/4中。
COL_SELECTED
在ABAP/4中。
在ABAP/4中。
如果必要,可以始终将表格控制重置为屏幕制作器中所指定的初始值。
为此,请使用语句REFRESHCONTROLFROMSCREEN。
详细信息参见ABAP/4联机关键字帮助。
9示例事务:
表格控制
诸如对表格控制的编程示例,参见事务TZ60的代码。
TZ60