表格控制(Table Control)和步循环
1.
两个标准Demo: SAPMTZ60,
SAPMTZ61
两个标准Demo: SAPMTZ60,
SAPMTZ61
2.
简介
简介
3.
建立Table Control程序的基本流程
建立Table Control程序的基本流程
4.
使用步循环
使用步循环
5.
表格控制(Table Control)和步循环注意事项
表格控制(Table Control)和步循环注意事项
6.
在屏幕表格中循环和在内表与屏幕表格中同时循环的区别
在屏幕表格中循环和在内表与屏幕表格中同时循环的区别
7.
确定屏幕循环的记录条目
确定屏幕循环的记录条目
8.
MODIFY
MODIFY
2.
简介
简介
表格控制
和步循环是用于屏幕表格显示的对象。表格控制只是增强了的步循环,它可以使用桌面应用程序中表格工具的“Look” 和“Feel”来显示数据 。表格控制还提供使表格易于查看和使用的专用格式化功能
和步循环是用于屏幕表格显示的对象。表格控制只是增强了的步循环,它可以使用桌面应用程序中表格工具的“Look” 和“Feel”来显示数据 。表格控制还提供使表格易于查看和使用的专用格式化功能
步循环的
一个特点是它们的表行能够在屏幕上跨越多行。 相反,表格控制中的行总是单行,但可以很长。(表格控制的行能够滚动。)
一个特点是它们的表行能够在屏幕上跨越多行。 相反,表格控制中的行总是单行,但可以很长。(表格控制的行能够滚动。)
通常表格控制所提供的许多特征由系统的 SAPGUI 前端操纵, 因此,不必在ABAP/4 事务中编制 任何特征( 除了竖直滚 动)。
LOOP
语句的任务
语句的任务
LOOP
语句负责读取往返传递于屏幕和 ABAP/4 程序之间的屏幕表格值 。
因此必须同时在 PBO 和 PAI 事件中为屏幕中的每一个表格编制LOOP语句。至少在此应有一个空LOOP…ENDLOOP语句。
LOOP
语句还用于驱动滚动。在PBO事件中,LOOP使用一个参数告诉从表格的何处开 始循环。该参数因此导致下一个屏幕表格显示的更新(对于表格控制,该参数是表格控制结构中的TOP_LINE 字段;对于步循环,该参数为用于LOOP语句的CURSOR参数。)。ABAP/4 程序和系统都可以设置该参数。
语句负责读取往返传递于屏幕和 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 中将屏幕表格字段声明为任何类型(数据库表 格、结构或 单个字段) ,内表字段除外。
Table Control
有多少行就循环多少次)
,同时在每个块和程序的对应 ABAP/4 字段之间往复传送数据 。可以在 ABAP/4 中将屏幕表格字段声明为任何类型(数据库表 格、结构或 单个字段) ,内表字段除外。
对于步循环,如果正在执行本身的滚动(例如,使用 F21-F24) ,则必须使用该语句。
LOOP AT <internal table>.
该语句可同时在内表和屏幕表格行中循环。常常将此屏幕表格字段声明为内表字段,但不是非得如此。
对于该 LOOP,步循环显示都带有滚动条。该滚动由系统自动操纵。
7.
在
controls
声明的时候对应的
screen
中可以对
controls
定义的对象进行操作
在
controls
声明的时候对应的
screen
中可以对
controls
定义的对象进行操作
Eg.
在屏幕表格中直接循环
在 ABAP/4 模块中,使用
SY-STEPL
以查找当前正在处理的屏幕表格行的索引。每循环一次,系统就设置一次该变量。SY-STEPL 的值总是介于 1与当前所显示的行数之间。您可以在程序中声明表格偏移量(常称为 BASE,并通常用
SY-LOOPC
初始化)并用它同SY-STEPL 一起获得与当前屏幕表格行相对应的内表行。(IND = BASE + SY-STEPL – 1.)
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参数。
<scroll-var>
以
告诉系统从何处开始显示
。对于表格控制,<scroll-var> 是TABLEVIEW 结构中的TOP_LINE字段(省略的话系统会自动设置)。对于步循环,请声明局部程序变量以用作CURSOR参数。
建立Table Control程序的基本流程.
//
主程序
主程序
1.
声明表格控制
声明表格控制
Eg. CONTROLS: CTRL1 TYPE TABLEVIEW USING SCREEN 0901.
2.
定义要show出来的itab
定义要show出来的itab
DATA SP1 LIKE SPFL1 OCCURS 0 WITH HEADER LINE.
DATA SP1 LIKE TABLE OF SPFL1 WITH HEADER LINE.(
等价)
等价)
3.
增加itab数据
增加itab数据
//
逻辑流
逻辑流
4.
循环读取itab逐行写入Table Control当前行.(BPO)
循环读取itab逐行写入Table Control当前行.(BPO)
LOOP WITH CONTROL <table-control> [cursor tab1-CURRENT_LINE].
5.
当数据有改变时更新itab
当数据有改变时更新itab
LOOP
AT <ITAB>
AT <ITAB>
CHAIN.
FIELD SP1-CARRID.
…
MODULE TAB1_MODIFY ON CHAIN-REQUEST.
ENDCHAIN.
ENDLOOP.
使用步循环.
步循环分为两类:静态的和动态的。静态步循环有固定的大小,运行时无法更改。动态步循环大小可变 。如果用户重置窗口的大小,系统就会自动地增加或减小所显示的步循环块的个数。可以定义任意数量的静态步循环,但动态步循环只能有一个。
可以在屏幕制作器中指定步循环的类型。屏幕中的每一个循环都有“循环类型”(fixed= 静态, variable= 动态)和“ 循环次数” 属性。如果循环是固定的,“循环次数”告诉 系统用于显 示的循环块的数量。该数值可以永久不变。编制动态和静态步循环的方法完全一样。两种类型都可以使用 LOOP 和 LOOP AT 语句。
屏幕操作如图
1.
放入field
放入field
2.
选择要编组的field,将field定义组
选择要编组的field,将field定义组
表格控制(Table Control)和步循环注意事项
1.
在layout设计器中放置的I/O field可以是来自dbtab,也可以是来自itab,其实是个screen可以识别的<work area>
在layout设计器中放置的I/O field可以是来自dbtab,也可以是来自itab,其实是个screen可以识别的<work area>
2.
screen
上放置的I/O field和其它控件如Table Control一定要和主程序中声明的名称一致,如果放置之前没有定义的field,将会出现runtime error或者根本无法激活.
screen
上放置的I/O field和其它控件如Table Control一定要和主程序中声明的名称一致,如果放置之前没有定义的field,将会出现runtime error或者根本无法激活.
3.
无论是触发滚动条还是向下按钮,都会触发PBO/PAI逻辑流.
无论是触发滚动条还是向下按钮,都会触发PBO/PAI逻辑流.
4.
在屏幕表格中循环和在内表与屏幕表格中同时循环的区别
在屏幕表格中循环和在内表与屏幕表格中同时循环的区别
只在屏幕表格中循环,会以屏幕表格为主,在显示的时候需要使所要显示的内表适应屏幕,如果屏幕表格的行数比内表的行数多的话仍然会显示一些空行如
//
逻辑流
逻辑流
LOOP WITH CONTROL CTRL1.
MODULE DISPLAY_CTRL1_101 .
ENDLOOP.
//
程序
程序
READ TABLE IMAKT INDEX CTRL1-CURRENT_LINE.
IF SY-SUBRC = 0.
MAKT-SPRAS = IMAKT-SPRAS.
MAKT-MAKTX = IMAKT-MAKTX.
CTRL1-FLAG = IMAKT-CKBOX.
ENDIF.
在内表与屏幕表格中同时循环可以使屏幕表格和内表同时循环.不必严格控制内表要读取那一行(个人效率较前者要高,因为不用再次搜索和判断),而且,不会显示多于的空白行.
//
逻辑流
逻辑流
LOOP AT IMAKT WITH CONTROL CTRL1 CURSOR CTRL1-TOP_LINE.
MODULE DISPLAY_CTRL1_101 .
ENDLOOP.
//
程序
程序
MAKT-SPRAS = IMAKT-SPRAS.
MAKT-MAKTX = IMAKT-MAKTX.
CTRL1-FLAG = IMAKT-CKBOX.
5.
在屏幕表格中放入内表
(
工作区
).
是屏幕表格和程序内表关联
.
在屏幕表格中放入内表
(
工作区
).
是屏幕表格和程序内表关联
.
l
所要放入的itab一定要使有表头的(其实屏幕要的是wa)
所要放入的itab一定要使有表头的(其实屏幕要的是wa)
l
注意选择的时候要写入内表名称,选择后面的按钮
注意选择的时候要写入内表名称,选择后面的按钮
l
操作的时候直接modify那个内表系统就能自动识别user的更新.只是循环的时候要注意指针的运动,尽量使屏幕和内表一起循环.
操作的时候直接modify那个内表系统就能自动识别user的更新.只是循环的时候要注意指针的运动,尽量使屏幕和内表一起循环.
l
由于屏幕表格和程序内表关联,所以在PAI中LOOP AT <ITAB>的时候仍然可以使用屏幕表格的各种参数eg. index ctrl1-current_line
由于屏幕表格和程序内表关联,所以在PAI中LOOP AT <ITAB>的时候仍然可以使用屏幕表格的各种参数eg. index ctrl1-current_line
//
逻辑流(PAI)
逻辑流(PAI)
LOOP AT IMAKT.
MODULE SET_LINE_COUNT_0901.
ENDLOOP.
//
程序
程序
module SET_LINE_COUNT_0901 input
MODIFY IMAKT index ctrl1-current_line.
endmodule.
再说表格控制器
1.
在layout中设置的表格控制器和.net中的gridview有点类似
,
其中的各个列必须和要和与之关联的内表的字段名称一样,
否则将无法访问,或者是置无法取出.
在layout中设置的表格控制器和.net中的gridview有点类似
,
其中的各个列必须和要和与之关联的内表的字段名称一样,
否则将无法访问,或者是置无法取出.
2.
另外,那个 w/SelColumn选项可以和itab中的一个C类型的字段关联以判断表格行的选中情况.
另外,那个 w/SelColumn选项可以和itab中的一个C类型的字段关联以判断表格行的选中情况.
ABAP—
读取DB中前n行
读取DB中前n行
SELECT * UP TO <N> ROWS
………
………
在屏幕编辑器中设置必须输入的栏位
确定屏幕循环的记录条目
使用
SY-STEPL
以查找当前正在处理的屏幕表格行的索引。每循环一次,系统就设置一次该变量。SY-STEPL 的值总是介于 1与当前所显示的行数之间。您可以在程序中声明表格偏移量(常称为 BASE,并通常用
SY-LOOPC
初始化)并用它同SY-STEPL 一起获得与当前屏幕表格行相对应的内表行。(IND = BASE + SY-STEPL – 1.)
SY-STEPL
以查找当前正在处理的屏幕表格行的索引。每循环一次,系统就设置一次该变量。SY-STEPL 的值总是介于 1与当前所显示的行数之间。您可以在程序中声明表格偏移量(常称为 BASE,并通常用
SY-LOOPC
初始化)并用它同SY-STEPL 一起获得与当前屏幕表格行相对应的内表行。(IND = BASE + SY-STEPL – 1.)
MODIFY
MODIFY <itab> [FROM <wa>] [INDEX <idx>].
FROM
选项中指定的工作区域
<wa>
代替
<itab>
中的行。如果表格有表头行,可以忽略
FROM
选项。这样,表格工作区域就代替
行。
选项中指定的工作区域
<wa>
代替
<itab>
中的行。如果表格有表头行,可以忽略
FROM
选项。这样,表格工作区域就代替
行。
如果使用
INDEX
选项,则新
行代替索引为
<idx>
的现有行。如果替换成功,则将
SY-SUBRC
设置为
0
。
如果内表包含的行少于
<idx>
,则不更改任何行并且
SY-SUBRC
包含
4
。
INDEX
选项,则新
行代替索引为
<idx>
的现有行。如果替换成功,则将
SY-SUBRC
设置为
0
。
如果内表包含的行少于
<idx>
,则不更改任何行并且
SY-SUBRC
包含
4
。
如果使用没
有
INDEX
选项的
MODIFY
语句,则系统只能在
LOOP – ENDLOOP
块中通过更改当前行(
例如由
SY-TABIX
返回其索引的行)来处理它。
有
INDEX
选项的
MODIFY
语句,则系统只能在
LOOP – ENDLOOP
块中通过更改当前行(
例如由
SY-TABIX
返回其索引的行)来处理它。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/18285.html