当at events发生时,break field右边的character field都会被初始化为*,numeric field都会被clear,如果有sum关键字,那么就会按照现在的break level对所有的numeric fields进行汇总,在at events之后,所有的fields的值便会重新恢复到当前的loop pass。在进行control level处理的时候,在进行control level处理时,AT EVENT后面的break field要与内表中定义的fields的顺序保持一致。Extract dataset用来做大量数据的处理,Internal table受application server memory的影响,而extract dataset是通过硬盘上的sequential file来处理的。创建extract dataset的主要步骤包括:
l 通过field group定义extract dataset,每个field group都必须定义header
l 通过INSERT…INTO…来为field group指定内容,用来把变量或field symbol放到相应的field group中,field group中的data object必须是global的。通过在field groups中放field symbol你就可以动态指定field group中的内容了。如果filed symbol没有被assigned时,其在field group中就会被忽略。INSERT不像DATA和TYPES是declarative statement,所以其在START-OF-SELECTIONG事件中执行,一旦field group的第一个EXTRACT执行后,这个field group就不能再被扩展了。
l FILL EXTRACT用来向field group中写入内容,HEADER是必需的,并被放在field group的起始位置,可以用来排序。可以通过LOOP…ENDLOOP来处理filed group。不需要对HEADER field group进行extract,系统会在其它的field group之前自动处理。在其它field group之前向header field group中填充值时,如果field的value为空就会填充16进制的zero,这些zero可以作为hierarchy key,zero越多说明你进的control level层次越深。
通过sort可以按照HEADER中的字段顺序进行排序,通过BY <F1> <F2>可以控制排序的顺序。通过LOOP…ENDLOOP,可以处理extract dataset中的内容,field group中的内容会被重新放回到相同名字的program field中。Control break只能适用于HEARD field group中的fields。可以通过AT <field group>来单独处理extract dataset中的一条记录。Extract中不像internal table那样可以使用SUM,但是在extract dataset中有两种特殊的方法可以实现相似功能,在AT END OF事件中,你可以计算当前control level的记录数量,你可以对指定的字段进行SUM。可以对HEADER field group中的alphanumeric字段使用CNT关键字,而SUM关键字可以使用任何field group中的字段。语法如下:
WRITE: / CNT(<header_field_group_field>),
SUM(<any_numeric_field_goup_field>).
SUM和CNT只能在AT END OF,AT LAST事件中使用。
AT <field_group_1> WITH <field_group_2fg_2>是当field group1后面有field group2时才处理,这在header/detail中,只有detail才显示header的模式中非常有用。Extract dataset的loop不能嵌套。
可以用field symbol来替代data object插入到field group中,可以在一个程序中产生不同格式的list。步骤也非常简单:
l 声明所需的field symbols
l 声明HEADER field group和其他所需的field groups
l 定义radio button group来让用户选择报表样式
l 根据radio button的值将data object分配到field symbol
l 将field symbol insert到相应的field group中
Control level的顺序要与sort的顺序保持一致
Totals只能在control footer中处理
EXTRACT DATASET和internal table的比较
Internal table |
Extract |
一个程序中可以定义多个 |
一个程序中只能有一个 |
在control header中也可以作total |
只能在control footer中做total |
Internal table可以做insert,modify,delete和append |
只能做append sort和sequential processing |
随时可以修改internal table中的内容 |
在sort和loop之后不能进行extract |
每一行的结构都是一样的 |
每一行的结构可以不同 |
Line type是static的 |
Record type是dynamic的 |
Control level的顺序是按照line type中字段的顺序来执行的 |
Control level的顺序是按照sort中字段的顺序来执行的 |
Total的性能负担较大 |
Total算法被优化 |