表格控制(Table Control)和步循环
 
 
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语句。至少在此应有一个空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 语句。
屏幕操作如图
1.    放入field
2.    选择要编组的field,将field定义组
 
 
表格控制(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逻辑流.
 
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)
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中设置的表格控制器和.net中的gridview有点类似,其中的各个列必须和要和与之关联的内表的字段名称一样,否则将无法访问,或者是置无法取出.
2.      另外,那个 w/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 返回其索引的行)来处理它。
 

ABAP 表格控制(Table Control)和步循环的更多相关文章

  1. ABAP 中 Table Control例子

    实现了Table Control的主要的一些功能,可以作为例子参考,实现的功能有是否可编辑切换,选择某一条记录点击按钮显示详细信息,新增记录,删除记录,选择所有记录,选择光标所有记录,取消选择所有,排 ...

  2. SAP ABAP编程 Table Control动态隐藏列

    在SAP DIALOG设计中,有时候须要动态的隐藏某些列,以下是方法. ***数据定义 CONTROLS: table_control TYPE TABLEVIEW USING SCREEN 0100 ...

  3. ABAP table control例子

    [转自]http://blog.csdn.net/lhx20/article/details/3039909Table control用于在screen上以表格的形式显示数据,在table contr ...

  4. ABAP Table Control

    SAP中,Table Control是在Screen中用的最广泛的控件之一了,可以实现对多行数据的编辑.  简单来说,Table Control是一组屏幕元素在Screen上的重复出现,这就是它与普通 ...

  5. ABAP中的Table Control编程

          SAP中,Table Control是在Screen中用的最广泛的控件之一了,可以实现对多行数据的编辑.       简单来说,Table Control是一组屏幕元素在Screen上的重 ...

  6. abap table control里面各种属性和事件的写法

    SAP中,Table Control是在Screen中用的最广泛的控件之一了,可以实现对多行数据的编辑. 简单来说,Table Control是一组屏幕元素在Screen上的重复出现,这就是它与普通屏 ...

  7. ABAP CDS Table Function介绍与示例

    Core data services(以下简称CDS)可以指两样东西,一个是HANA CDS,一个是ABAP CDS. 如我们所知,HANA CDS只支持HANA数据库,ABAP CDS理论上支持多种 ...

  8. TABLE CONTROL隐藏列和固定列的实现

    一.设置固定列 需求:为了方便对主要关心信息地查看,用户希望TABLE CONTROL左边的一列或者几列在屏幕上固定.针对用户这样子的需求, 我们首先会想到类似与屏幕编辑/可见等字段属性设置,但是此方 ...

  9. table control里面各种属性和事件

    [转自]http://blog.csdn.net/hackai886/article/details/7935366 SAP中,Table Control是在Screen中用的最广泛的控件之一了,可以 ...

随机推荐

  1. Safari下默认10位数字为电话号码,点击拨号

    <meta content="telephone=no" name="format-detection"/>

  2. [linux]删除目录下的一类文件

    find 目录 -name "*.类型" | xargs rm -f 通过find命令,查找指定目录下的某一类型的文件.并通过管道传递给xargs,执行后面的rm -f命令. 最终 ...

  3. 【推荐】iOS集合视图的可重新排序的layout

    在实际项目中你或许会遇到在一个集合视图中移动一项到另外一个位置,那么此时我们需要对视图中的元素进行重新排序,今天推荐一个很好用的第三方类LXReorderableCollectionViewFlowL ...

  4. 《构建之法》阅读有疑 与 个人Week1作业

    <构建之法>阅读有疑 在用将近五节课的时间将邹欣老师的书<构建之法——现代软件工程>第二版大致看完.虽然全书是以轻松的口吻与”移山公司”员工的一些趣味谈话来传输一些理念和思想的 ...

  5. C#函数式程序设计之局部套用与部分应用

    函数式设计的核心与函数的应用以及函数如何作为算法的基本模块有关.利用局部套用技术可以把所有函数看成是函数类的成员,这些函数只有一个形参,有了局部套用,才有部分应用.部分应用是使函数模块化成为可能的两个 ...

  6. ThroughRain第一次冲刺个人总结

    团队名:ThroughRain 项目确定:<餐厅到店点餐系统> 项目背景:本次项目是专门为餐厅开发的一套订餐系统.大家有没有发现在节假日去餐厅吃饭会超级麻烦,人很多, 热门的餐厅基本没有座 ...

  7. TinyOS和Deluge的安装模拟(一)

    介绍 TinyOS是一款嵌入式操作系统,相信做无线传感器网络开发的同志们都不陌生.同类型的系统有不少,但是TinyOS的应用较之其他系统更为广泛.TinyOS 1.x版本和2.x版本是目前主要的两个分 ...

  8. 移动端手势库Hammer.js学习

    感觉移动端原生支持的 touch.tap.swipe 几个事件好像还不够用,某些时候还会用到诸如缩放.长按等其他功能. 近日学习了一个手势库 Hammer.js,它是一个轻量级的触屏设备手势库,能识别 ...

  9. P6 Enterprise Project Portfolio Contract Management

    Find documentation for Primavera products here: Primavera Cloud Services Primavera Prime Primavera P ...

  10. mis导入器的加强版——vdproj文件资源浏览器

    上次做的那个导入器不够强大,限制还不小,用起来不方便.于是就再做一个这样的工具.代码基本上不同了,思想还是差不多,但功能肯定比之前的强大.经过了这次编写工具,对vdporj文件的了解又深一层了. 在v ...