當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算法被優化 |