------------------------------2007-07-11~2007-07-12---------------------------
在 ABAP/4 中声明表格控制(获取或设置屏幕控件的状态)
用指定偏移量赋值
表格控制和步循环
在 ABAP/4 中声明表格控制(获取或设置屏幕控件的状态)
在屏幕中使用表格控制时,必须在ABAP/4程序中同时声明表格控制结构和表格控制字段。例如,事务TZ60有:
TABLES: SFLIGHT.
CONTROLS: FLIGHTS TYPE TABLEVIEW USING SCREEN 200.
CONTROLS 语句定义TABLEVIEW类型的控制结构。系统从给定屏幕的屏幕制作器属性中获得结构的初始值
Eg. CONTROLS: TAB1 TYPE TABSTRIP. “对tab控件的状态控制.(声明)
//使用
IF SY-UCOMM(4) = 'TAB1'.
TAB1-ACTIVETAB = SY-UCOMM.
用指定偏移量赋值
可以在每条 ABAP/4 语句中为基 本数据类型 指定偏移量 和长度(参 见指定数据对象的偏移量)。在这 种情况下, MOVE 语句语法如 下:
语法:MOVE <f1>[+<o1>][(<l1>)] TO <f2>[+<o2>][(<l2>)].
赋值运算符语法如下:
语法:<f2>[+<o2>][(<l2>)] = <f1>[+<o1>][(<l1>)]。
将字段 <f1> 从 <o1>+1 位置开始且 长度为 <l1> 的段内容赋 给字段 <f2> ,覆盖从 <o2>+1 位置开始且 长度为 <l2> 的段。
Tabstrip Controls 的制作.
1. 在Layout中放上Tabstrip控件.
2. 设置text属性,并在中间放入Subscreen area控件.
3. 设置每个tab的属性,注意一定要吧Ret. Field指向所放置的Subscreen area控件的名称.
4. 在主程序中定义tab控件
CONTROLS <所添加的tab控件名称> TYPE TABSTRIP.
设置初始标签MYTABSTRIP-ACTIVETAB = <标签名称>.(可选)
5. 处理逻辑流(一定要配套使用)
SY-REPID---------获得当前主程序名称
PROCESS BEFORE OUTPUT.
MODULE STATUS_0100.
CALL SUBSCREEN: SUB1 INCLUDING <screen所在主程序名> <屏幕编号>(可用变量),
SUB2 INCLUDING SY-REPID '0120',
SUB3 INCLUDING SY-REPID '0130'.
PROCESS AFTER INPUT.
MODULE CANCEL AT EXIT-COMMAND.
CALL SUBSCREEN: SUB1,
SUB2,
SUB3.
MODULE USER_COMMAND.
6. 处理单击响应.
module USER_COMMAND_0900 input.
IF SY-UCOMM(4) = 'TAB9'.
TAB9-ACTIVETAB = SY-UCOMM.
SUB3_DYN = SY-UCOMM+5(3).
ENDIF.
endmodule. " USER_COMMAND_0900 INPUT
表格控制(Table Control)和步循环
表格控制和步循环是用于屏幕表格显示的对象。表格控制只是增强了的步循环,它可以使用桌面应用程序中表格工具的“Look” 和“Feel”来显示数据 。表格控制还提供使表格易于查看和使用的专用格式化功能
步循环的一个特点是它们的表行能够在屏幕上跨越多行。 相反,表格控制中的行总是单行,但可以很长。(表格控制的行能够滚动。)
通常表格控制所提供的许多特征由系统的 SAPGUI 前端操纵, 因此,不必在ABAP/4 事务中编制 任何特征( 除了竖直滚 动)。
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
如果正在使用表格控 制,就必须 包括附加的 WITH CONTROL 参数:
LOOP WITH CONTROL <table-control>.
<actions>...
ENDLOOP.
该语句在屏幕表格行中循环(Table Control有多少行就循环多少次),同时在每个块和程序的对应 ABAP/4 字段之间往复传送数据 。可以在 ABAP/4 中将屏幕表格字段声明为任何类型(数据库表 格、结构或 单个字段) ,内表字段除外。
对于步循环,如果正在执行本身的滚动(例如,使用 F21-F24) ,则必须使用该语句。
LOOP AT <internal table>.
该语句可同时在内表和屏幕表格行中循环。常常将此屏幕表格字段声明为内表字段,但不是非得如此。
对于该 LOOP,步循环显示都带有滚动条。该滚动由系统自动操纵。
7. 在controls声明的时候对应的screen中可以对controls定义的对象进行操作
Eg.
在屏幕表格中直接循环
在 ABAP/4 模块中,使用 SY-STEPL 以查找当前正在处理的屏幕表格行的索引。每循环一次,系统就设置一次该变量。SY-STEPL 的值总是介于 1与当前所显示的行数之间。您可以在程序中声明表格偏移量(常称为 BASE,并通常用 SY-LOOPC初始化)并用它同SY-STEPL 一起获得与当前屏幕表格行相对应的内表行。(IND = BASE + SY-STEPL - 1.)
请记住,SY-STEPL只在LOOP...ENDLOOP处理的范围之内才有意义。
在内表中循环
LOOP AT <internal table> [CURSOR <scroll-var>]
[WITH CONTROL <table-control>]
[FROM <line1>] [TO <line2>].
...<actions>...
ENDLOOP.
表示同时在内表和屏幕表格中循环 。
该形式的 LOOP语句在内表中循环,对每行都执行 <actions>。 对于每个内表行,系统将相应程序 字段传送到对应的屏幕表格行,或将相应的屏幕表格行传送回对应的程序字段。
使用步循环时,在PAI事件中省略CURSOR 参数。FROM和TO参数只能用于步循环。WITH CONTROL参数只能用于表格控制。
设置<scroll-var>以告诉系统从何处开始显示。对于表格控制,<scroll-var> 是TABLEVIEW 结构中的TOP_LINE字段(省略的话系统会自动设置)。对于步循环,请声明局部程序变量以用作CURSOR参数。
建立Table Control程序的基本流程.
//主程序
1. 声明表格控制
Eg. CONTROLS: CTRL1 TYPE TABLEVIEW USING SCREEN 0901.
2. 定义要show出来的itab
DATA SP1 LIKE SPFL1 OCCURS 0 WITH HEADER LINE.
DATA SP1 LIKE TABLE OF SPFL1 WITH HEADER LINE.(等价)
3. 增加itab数据
//逻辑流
4. 循环读取itab逐行写入Table Control当前行.(BPO)
LOOP WITH CONTROL <table-control> [cursor tab1-CURRENT_LINE].
5. 当数据有改变时更新itab
LOOP AT <ITAB>
CHAIN.
FIELD SP1-CARRID.
…
MODULE TAB1_MODIFY ON CHAIN-REQUEST.
ENDCHAIN.
ENDLOOP.
使用步循环.
步循环分为两类:静态的和动态的 。静态步循环有固定的大小,运行时无法更改。动态步循环大小可变 。如果用户重置窗口的大小,系统就会自动地增加或减小所显示的步循环块的个数。可以定义任意数量的静态步循环,但动态步循环只能有一个。
可以在屏幕制作器中指定步循环的类型。屏幕中的每一个循环都有“循环类型”(fixed= 静态, variable= 动态)和“ 循环次数” 属性。如果循环是固定 的,“循环次数”告诉 系统用于显 示的循环块的数量。该数值可以永久不变。编制动态和静态步循环的方法完全一样。两种类型都可以使用 LOOP 和 LOOP AT 语句。
表格控制(Table Control)和步循环注意事项
1. 在layout设计器中放置的I/O field可以是来自dbtab,也可以是来自itab,其实是个screen可以识别的<work area>
2. screen上放置的I/O field和其它控件如Table Control一定要和主程序中声明的名称一致,如果放置之前没有定义的field,将会出现runtime error或者根本无法激活.
3. 无论是触发滚动条还是向下按钮,都会触发PBO/PAI逻辑流.