ABAP表格控制(TableControl)和步循环(STEP-LOOP)..表格控制(TableControl)和步循环
1.两个标准Demo: SAPMTZ60,SAPMTZ61
2.简介
3.建⽴Table Control程序的基本流程
4.使⽤步循环
5.表格控制(Table Control)和步循环注意事项
6.在屏幕表格中循环和在内表与屏幕表格中同时循环的区别
7.确定屏幕循环的记录条⽬
8.MODIFY
2. 简介
表格控制和步循环是⽤于屏幕表格显⽰的对象。表格控制只是增强了的步循环,它可以使⽤桌⾯应⽤程序中表格⼯具的“Look” 和“Feel”来显⽰数据。表格控制还提供使表格易于查看和使⽤的专⽤格式化功能
步循环的⼀个特点是它们的表⾏能够在屏幕上跨越多⾏。相反,表格控制中的⾏总是单⾏,但可以很长。(表格控制的⾏能够滚动。)通常表格控制所提供的许多特征由系统的 SAPGUI 前端操纵,因此,不必在ABAP/4 事务中编制任何特征(除了竖直滚动)。
LOOP 语句的任务
LOOP 语句负责读取往返传递于屏幕和 ABAP/4 程序之间的屏幕表格值。因此必须同时在 PBO 和 PAI 事件中为屏幕中的每⼀个表格编制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.
该语句在屏幕表格⾏中循环(TableControl有多少⾏就循环多少次),同时在每个块和程序的对应 ABAP/4 字段之间往复传送数据。可以在ABAP/4 中将屏幕表格字段声明为任何类型(数据库表格、结构或单个字段),内表字段除外。
对于步循环,如果正在执⾏本⾝的滚动(例如,使⽤ F21-F24),则必须使⽤该语句。
LOOP AT <internaltable>.
该语句可同时在内表和屏幕表格⾏中循环。常常将此屏幕表格字段声明为内表字段,但不是⾮得如此。
对于该 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只在ENDLOOP处理的范围之内才有意义。
在内表中循环
LOOP AT <internal table> [CURSOR <scroll-var>]
[WITHCONTROL <table-control>]
[FROM <line1>] [TO <line2>].
...<actions>...
ENDLOOP.
表⽰同时在内表和屏幕表格中循环。
该形式的 LOOP语句在内表中循环,对每⾏都执⾏ <actions>。对于每个内表⾏,系统将相应程序字段传送到对应的屏幕表格⾏,或将
相应的屏幕表格⾏传送回对应的程序字段。
使⽤步循环时,在PAI事件中省略CURSOR 参数。FROM和TO参数只能⽤于步循环。WITHCONTROL参数只能⽤于表格控制。
设置<scroll-var>以告诉系统从何处开始显⽰。对于表格控制,<scroll-var> 是TABLEVIEW 结构中的TOP_LINE字段(省略的话系统会⾃动设置)。对于步循环,请声明局部程序变量以⽤作CURSOR参数。
建⽴TableControl程序的基本流程.
//主程序
1.声明表格控制
Eg. CONTROLS: CTRL1 TYPE TABLEVIEW USING SCREEN 0901.
2.定义要show出来的itab
DATA SP1 LIKE SPFL1 OCCURS 0 WITH HEADER LINE.
DATA SP1 LIKETABLE OF SPFL1 WITH HEADER LINE.(等价)
3.增加itab数据
//逻辑流
4.循环读取itab逐⾏写⼊TableControl当前⾏.(BPO)
LOOP WITHCONTROL <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 语句。
屏幕操作如图
1.放⼊field
2.选择要编组的field,将field定义组
表格控制(TableControl)和步循环注意事项
1.在layout设计器中放置的I/O field可以是来⾃dbtab,也可以是来⾃itab,其实是个screen可以识别的<work area>
2. screen上放置的I/O field和其它控件如TableControl⼀定要和主程序中声明的名称⼀致,如果放置之前没有定义的field,将会出现
runtime error或者根本⽆法激活.
3.⽆论是触发滚动条还是向下按钮,都会触发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.
gridview不显示//程序
MAKT-SPRAS = IMAKT-SPRAS.
MAKT-MAKTX = IMAKT-MAKTX.
CTRL1-FLAG = IMAKT-CKBOX.
5.在屏幕表格中放⼊内表(⼯作区).是屏幕表格和程序内表关联.
l所要放⼊的itab⼀定要使有表头的(其实屏幕要的是wa)
l注意选择的时候要写⼊内表名称,选择后⾯的按钮
l操作的时候直接modify那个内表系统就能⾃动识别user的更新.只是循环的时候要注意指针的运动,尽量使屏幕和内表⼀起循环.
l由于屏幕表格和程序内表关联,所以在PAI中LOOP AT <ITAB>的时候仍然可以使⽤屏幕表格的各种参数eg.index ctrl1-current_line //逻辑流(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中设置的表格控制器和中的gridview有点类似,其中的各个列必须和要和与之关联的内表的字段名称⼀样,否则将⽆法
访问,或者是置⽆法取出.
2.另外,那个/SelColumn选项可以和itab中的⼀个C类型的字段关联以判断表格⾏的选中情况.
ABAP---读取DB中前n⾏
SELECT * UP TO <N> ROWS………
在屏幕编辑器中设置必须输⼊的栏位
确定屏幕循环的记录条⽬
使⽤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 选项。这样,表格⼯作区域就代替⾏。
如果使⽤INDEX选项,则新⾏代替索引为<idx> 的现有⾏。如果替换成功,则将SY-SUBRC 设置为0。如果内表包含的⾏少于
<idx>,则不更改任何⾏并且SY-SUBRC包含4。
如果使⽤没有INDEX选项的MODIFY语句,则系统只能在LOOP - ENDLOOP 块中通过更改当前⾏(例如由SY-TABIX 返回其索引的⾏)来处理它。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论