13.5. Popis skupiny sestavy Za každou klauzulí RD musí následovat jeden nebo (obvykle) více popisů skupin pro tuto sestavu. Popis skupiny sestavy se skládá z jednoho popisu položky s číslem úrovně 01, za nímž mohou (leč nemusí) následovat popisy podřízených položek s čísly úrovně 02 až 49. Popis skupiny sestavy (01 spolu s podřízenými položkami) představuje jeden řádek anebo několik (vždy týž počet) po sobě jdoucích řádků předepsaného formátu a struktury, které se do tiskové sestavy zařazují (vždy jako nedílný celek) tolikrát, kolikrát dojde k vytvoření této skupiny sestavy. Tisková sestava je pak tvořena posloupností těchto vytisknutých skupin sestavy (viz 13.1.). Popis skupiny sestavy zadává tyto nejdůležitější informace: 1) Kdy a kde má být skupina tisknuta. 2) Počet řádků skupiny a případné vynechané řádky mezi nimi. 3) Pro všechny položky, které mají být tisknuty, jejich polohu na řádku, typ, délku, strukturu a způsob naplňování. 4) Způsob provádění netiskových funkcí (sumarizace a nulování sumátorů). Při popisu a použití položek v REPORT SECTION platí jiná pravidla než v ostatních sekcích, a to zejména ohledně čísel úrovně a podřízenosti položek: 1) Čísla úrovně 02 až 49 se považují za zcela rovnocenná. Rozlišují se tedy pouze položky s číslem úrovně 01 oproti podřízeným položkám s rovnocennými čísly úrovně 02 až 49. 2) Nejsou přípustné popisy s čísly úrovně 66, 77 a 88. 3) V popisech položek nejsou přípustné klauzule REDEFINES, OCCURS, SIGN, SYNCHRONIZED, ENTRY, EXTRN a RENAMES. Klauzule USAGE smí být uvedena výhradně s volbou DISPLAY. 4) Na jméno položky popsané v REPORT SECTION se lze ve zdrojovém programu odvolávat pouze v těchto případech: a) Sumátory (tj. položky mající v popisu uvedenu klauzuli SUM) mohou být použity kdekoliv ve zdrojovém programu, nikoliv však jako argumenty v klauzuli SUM v popisu položky patřící k jiné sestavě anebo v klauzuli SOURCE v popisu položky patřící k sestavě, jejíž popis předchází před popisem sestavy, do níž patří náš sumátor. b) Položky PAGE-COUNTER, LINE-COUNTER, PRINT-SWITCH a CBL-CTR smí být použity kdekoliv ve zdrojovém programu; nesmí však být použity jako argumenty v klauzuli SUM. Položky PAGE-COUNTER, LINE-COUNTER a CBL-CTR od jedné sestavy nesmí být použity jako argumenty v klauzuli SOURCE u předcházejících sestav (zatímco u téže sestavy a u následujících sestav v SOURCE použity být smí). c) Jméno skupiny (01) typu DETAIL smí být použito v příkazu GENERATE a dále v podklauzuli UPON klauzule SUM v popisu položky patřící k téže sestavě. d) Jméno kterékoliv skupiny (01) smí být použito v klauzuli USE BEFORE REPORTING. Ostatní položky popsané v REPORT SECTION nesmí být nikde použity; jejich popisy jsou určeny výhradně pro Generátor sestav. Přitom položka, která není nikde použita, nemusí mít vůbec v popisu přiděleno jméno; i kdyby totiž jméno přiděleno měla, překladač by je stejně ignoroval. 5) Položku z REPORT SECTION lze při použití kvalifikovat pouze jménem sestavy, k níž položka patří (nikoliv tedy též jménem nadřízené položky s číslem úrovně 01!). Při použití položky z REPORT SECTION v rámci téže sestavy, k níž položka patří (jedná se o použití sumátorů a položek PAGE-COUNTER, LINE-COUNTER a CBL-CTR v klauzulích SUM a SOURCE a o použití detailních skupin v podklauzuli UPON klauzule SUM) není třeba uvádět kvalifikaci, i kdyby v jiné sestavě existovala stejnojmenná položka. Každá položka z REPORT SECTION musí být popsána podle jednoho z těchto tří formátů: Formát 1: 01 [jméno-skupiny] TYPE klauzule [LINE klauzule] [NEXT GROUP klauzule] [USAGE klauzule]. Formát 2 (číslo úrovně je 02 až 49): číslo-úrovně [jméno-položky] [LINE klauzule] [USAGE klauzule]. Formát 3 (číslo úrovně je 02 až 49): číslo úrovně [jméno-položky] [LINE klauzule] [COLUMN klauzule] [PICTURE klauzule] [BLANK klauzule] [JUSTIFIED klauzule] {VALUE | SOURCE | SUM} klauzule [RESET klauzule] [GROUP klauzule] [USAGE klauzule]. Mimo uvedené tři formáty existuje ještě následující formát, jenž však nepopisuje položku, nýbrž slouží pro modifikaci umístění na řádku pro ty položky, jejichž popisy následují za ním v rámci téhož řádku (viz 13.5.10.): Formát 4 (číslo úrovně je 02 až 49): číslo-úrovně [jméno-položky] SHIFT klauzule. Pravidla: 1) První položka v popisu skupiny sestavy musí být vždy popsána dle formátu 1, to jest s číslem úrovně 01. Její popis obsahuje klauzule platné pro celou tuto skupinu sestavy. Za ní pak může být popsán libovolný počet položek dle formátu 2 nebo dle formátu 3 (tedy s čísly úrovně 02 až 49), mezi nimiž mohou být ještě popisy dle formátu 4. K této skupině sestavy patří všechny položky počínaje položkou s číslem úrovně 01 až k další položce s číslem úrovně 01 anebo k další klauzuli RD resp. až k PROCEDURE DIVISION. 2) Pokud se celý popis skupiny sestavy skládá pouze z jediné položky, to jest pouze z položky s číslem úrovně 01, nevytisknou se sice při vytváření této skupiny žádné řádky, nicméně všechny ostatní netiskové akce (viz popis příkazu GENERATE) se provedou normálně. Uplatní se tedy klauzule LINE a NEXT GROUP (jsou-li uvedeny), vyvolá se případná deklarativní sekce atd. Stejná situace je i v případě, že sice jsou popsány i nějaké podřízené položky s čísly úrovně 02 až 49, nicméně žádná z nich nemá uvedenu klauzuli COLUMN. 3) Jednotlivé klauzule v popisu položky mohou být uvedeny v libovolném vzájemném pořadí. 4) Položku popsanou dle formátu 3 nazýváme (pouze v kapitole 13) elementární položka. V popisu elementární položky musí být uvedena právě jedna z klauzulí VALUE, SOURCE nebo SUM. Následující tabulka ukazuje, které další klauzule jsou pak v popisu elementární položky povinné (+), přípustné leč nepovinné (*) anebo zakázané (-): Tabulka 17: Přípustné klauzule v popisech v REPORT SECTION. ------------------------------------------------------------ | |LINE COLUMN PIC BLANK JUST RESET GROUP USAGE| |------|---------------------------------------------------| |VALUE | * + * * * - * * | |SOURCE| * * * * * - * * | |SUM | * * + * - * - * | ------------------------------------------------------------ V tabulce nejsou zachycena následující pravidla: a) Je-li uvedena klauzule COLUMN, musí být uvedena i klauzule PICTURE (nikoliv však naopak) anebo klauzule VALUE s alfanumerickým literálem (srv. dále bod 5b). b) Klauzule GROUP je přípustná pouze tehdy, je-li zároveň uvedena i klauzule COLUMN (a tedy i PICTURE nebo VALUE), a to pouze u položky patřící do skupiny typu DETAIL. 5) Klauzule PICTURE, BLANK a JUSTIFIED mají stejný formát a význam jako v ostatních sekcích v DATA DIVISION (viz kapitolu 4). Zbývá dodat pouze následující: a) U položek s klauzulí VALUE nebo SOURCE smí vzor v klauzuli PICTURE určovat položku libovolného typu. U položek s klauzulí SUM musí být vzor v klauzuli PICTURE numerický, tzn. musí určovat rozpakovanou, exponenciální znakovou nebo numerickou editovanou položku. b) Klauzule PICTURE smí být vynechána v těchto případech: - U položky, která má klauzuli SOURCE, avšak nemá uvedenu klauzuli COLUMN. Klauzule BLANK a JUSTIFIED mohou být sice uvedeny i v tomto případě, překladač je však ignoruje. - U položky, která má klauzuli VALUE s alfanumerickým literálem bez ALL. Předpokládá se pak implicitní klauzule PICTURE se vzorem obsahujícím tolik znaků X, kolik znaků má alfanumerický literál uvedený za VALUE. c) Klauzule BLANK smí být uvedena pouze u numerické editované položky. d) Klauzule JUST smí být uvedena pouze u alfanumerické nebo u alfanumerické editované položky. 6) Klauzule USAGE je v popisu položky z REPORT SECTION přípustná pouze s volbou DISPLAY a je tedy pouze poznámková. Znamená to, že v REPORT SECTION mohou být popisovány pouze položky alfanumerické, alfanumerické editované, rozpakované, exponenciální znakové a numerické editované; tyto typy jsou však přípustné v plném rozsahu (s výjimkou klauzule SIGN), tak jak jsou popsány v kapitole 4. 7) Tiskovou položkou nazýváme takovou elementární položku (tzn. položku popsanou dle formátu 3), která má uvedenu klauzuli COLUMN. Při tisku skupiny sestavy se tisknou právě všechny tyto tiskové položky (s výjimkou těch, jejichž tisk je potlačen pomocí klauzule GROUP) a to v pozicích (sloupcích) na řádku určených klauzulí COLUMN. Elementární položky popsané dle formátů 1 a 2 (tzv. netiskové položky) se nikdy netisknou. Neobsazené části řádků mezi tiskovými položkami budou vždy vymezerovány. 8) Položka popsaná dle formátu 2 není určena pro tisk. Má význam pouze tehdy, má-li uvedenu klauzuli LINE; pak způsobí posuv papíru dle pravidel popsaných v 13.5.2. Protože však tato klauzule LINE může být v přesně témže významu uvedena až u první následující tiskové položky, má položka popsaná dle formátu 2 význam vlastně jen tehdy, pokud za ní na témže řádku již žádná tisková položka nenásleduje, tj. když tato položka má způsobit pouze posuv papíru bez tisku (anebo pro přehlednost zdrojového programu). 9) Položkám popsaným dle formátů 1 a 2 není přidělen žádný úsek paměti, jsou to pouze popisy využívané Generátorem sestav. Přidělování paměti pro elementární položky (tj. pro položky popsané dle formátu 3) je popsáno u klauzulí VALUE, SOURCE a SUM. 13.5.1. Klauzule TYPE Formát: - - | {REPORT HEADING | RH} | | {PAGE HEADING | PH} | | {CONTROL HEADING | CH} {položka | FINAL} | TYPE IS < {DETAIL | DE} > | {CONTROL FOOTING | CF} {položka | FINAL} | | {PAGE FOOTING | PF} | | {REPORT FOOTING | RF} | - - Funkce: Klauzule TYPE určuje typ skupiny sestavy (viz 13.1.). Poznámka: Skupiny typu CONTROL HEADING, DETAIL a CONTROL FOOTING budeme v dalším textu nazývat normální skupiny. Pravidla: 1) Zkrácený dvoupísmenový tvar je vždy ekvivalentní s nezkráceným tvarem. Jsou tedy ekvivalentní tyto zápisy: - REPORT HEADING a RH (skupina záhlaví sestavy), - PAGE HEADING a PH (skupina záhlaví stránky), - CONTROL HEADING a CH (skupina řízeného záhlaví), - DETAIL a DE (detailní skupina sestavy), - CONTROL FOOTING a CF (skupina řízeného závěru), - PAGE FOOTING a PF (skupina závěru stránky), - REPORT FOOTING a RF (skupina závěru sestavy). Budeme-li uvažovat pouze dvoupísmenové tvary, můžeme říci, že klauzule TYPE má formát TYPE IS typ kde "typ" je jedna z možností RH, PH, CH položka, CH FINAL, DE, CF položka, CF FINAL, PF a RF. 2) Pro určitou sestavu smí být popsána každá ze skupin typu REPORT HEADING, PAGE HEADING, PAGE FOOTING a REPORT FOOTING nejvýše jedenkrát; přitom není-li v RD uvedena klauzule PAGE, nesmí být skupiny PAGE HEADING a PAGE FOOTING popsány vůbec. Skupin typu DETAIL může uživatel popsat libovolný počet. 3) Za slovy CONTROL HEADING (resp. CH) a CONTROL FOOTING (resp. CF) musí uživatel zapsat navíc ještě buďto jednu z řídicích položek této sestavy (tj. jednu z položek vyjmenovaných v klauzuli CONTROL v RD) anebo reservované slovo FINAL. (Má-li řídicí položka v klauzuli CONTROL uvedeny indexy, je nutno uvést tytéž indexy i zde; nepožaduje se však přesně stejný zápis kvalifikace, pokud určuje touž položku.) Pro každou z řídicích položek této sestavy vyjmenovaných v klauzuli CONTROL v RD smí být popsána nejvýše jedna skupina typu CONTROL HEADING a nejvýše jedna skupina typu CONTROL FOOTING. Mimoto smí být popsána nejvýše jedna skupina typu CONTROL HEADING FINAL a nejvýše jedna skupina typu CONTROL FOOTING FINAL. 4) Skupina REPORT HEADING se vytvoří právě jedenkrát během celého vytváření sestavy, a to jakožto první skupina celé tiskové sestavy při provádění prvního příkazu GENERATE následujícího po provedení příkazu INITIATE. 5) Skupina REPORT FOOTING se vytvoří právě jedenkrát během celého vytváření sestavy, a to jakožto poslední skupina celé tiskové sestavy při provádění příkazu TERMINATE. 6) Skupina PAGE HEADING se vytvoří automaticky na začátku každé stránky tiskové sestavy po přechodu na tuto stránku. Jsou tyto výjimky: a) Vytváří-li se skupina REPORT HEADING, pak skupina PAGE HEADING nebude vytvořena před ní, nýbrž za ní, a to buďto ještě na téže (první) stránce tiskové sestavy, anebo až na začátku druhé stránky (přechází-li se po tisku RH na novou stránku). b) Přechází-li se před tiskem skupiny REPORT FOOTING na novou stránku, nevytváří se na této poslední stránce tiskové sestavy skupina PAGE HEADING. 7) Skupina PAGE FOOTING se vytvoří automaticky na konci každé stránky tiskové sestavy před přechodem na následující stránku. Jsou tyto výjimky: a) Přechází-li se po tisku skupiny REPORT HEADING na novou stránku, nevytváří se na konci první stránky tiskové sestavy skupina PAGE FOOTING. b) Vytváří-li se skupina REPORT FOOTING, pak skupina PAGE FOOTING nebude vytvořena za ní, nýbrž již před ní, a to buďto na téže (poslední) stránce tiskové sestavy, anebo na konci předposlední stránky (přechází-li se před tiskem RF na novou stránku). 8) Skupina typu DETAIL se vytváří při provádění takového příkazu GENERATE, který má jako argument uvedeno jméno této detailní skupiny. Skupina typu DETAIL se vytváří vždy až za všemi skupinami typu CONTROL FOOTING a CONTROL HEADING (viz bod 9). 9) Skupiny typu CONTROL HEADING a CONTROL FOOTING se vytvářejí automaticky při zjištění řídicí změny jisté úrovně. Je-li v klauzuli CONTROL v RD vyjmenováno n řídicích položek (položka-1 až položka-n), znamená to následující: a) Při provádění prvního příkazu GENERATE následujícího po provedení příkazu INITIATE nastává řídicí změna nejvyšší úrovně (FINAL) a vytvářejí se postupně skupiny REPORT HEADING PAGE HEADING CONTROL HEADING FINAL CONTROL HEADING položka-1 . . . CONTROL HEADING položka-n DETAIL b) Pokud při provádění nikoliv prvního příkazu GENERATE není zjištěna žádná řídicí změna, vytváří se pouze skupina typu DETAIL. c) Pokud při provádění nikoliv prvního příkazu GENERATE je zjištěna řídicí změna m-té úrovně (tzn. od posledně prováděného příkazu GENERATE se první až (m-1)-ní řídicí položka nezměnila, zatímco m-tá řídicí položka se změnila), testování následujících řídicích položek ((m+1)-ní až n-té) se již neprovádí. Vytvářejí se postupně skupiny CONTROL FOOTING položka-n . . . CONTROL FOOTING položka-m CONTROL HEADING položka-m . . . CONTROL HEADING položka-n DETAIL d) Při provádění příkazu TERMINATE nastává řídicí změna nejvyšší úrovně (FINAL) a vytvářejí se postupně skupiny CONTROL FOOTING položka-n . . . CONTROL FOOTING položka-1 CONTROL FOOTING FINAL PAGE FOOTING REPORT FOOTING e) Pokud se ta normální skupina sestavy (CH, DE, CF), která se má právě tisknout, již nevejde na právě zpracovávanou stránku (srv. klauzuli PAGE), provede Generátor sestav automaticky - vytvoření skupiny PAGE FOOTING na staré stránce, - přechod na novou stránku na tiskárně, - zvětšení položky PAGE-COUNTER o 1, - vytvoření skupiny PAGE HEADING na nové stránce, - tisk příslušné normální skupiny na nové stránce. Uvedené skupiny se ovšem vytvářejí pouze tehdy, pokud si je uživatel popsal. Skupina typu DETAIL se vytváří pouze při provádění příkazu "GENERATE jméno-skupiny" a nikoliv při provádění příkazu "GENERATE jméno-sestavy". Z výše uvedeného přehledu je vidět následující: - Skupiny CONTROL HEADING se vždy vytvářejí od nejvyšší úrovně k nejnižší úrovni, zatímco skupiny CONTROL FOOTING se vždy vytvářejí od nejnižší úrovně k nejvyšší úrovni. - Skupina CONTROL HEADING FINAL se vytváří pouze jedenkrát během celého vytváření sestavy, a to jakožto první ze všech normálních skupin při provádění prvního příkazu GENERATE následujícího po provedení příkazu INITIATE. - Skupina CONTROL FOOTING FINAL se vytváří pouze jedenkrát během celého vytváření sestavy, a to jakožto poslední ze všech normálních skupin při provádění příkazu TERMINATE. Podrobné informace včetně informací o netiskových funkcích Generátoru sestav jsou uvedeny v popisu příkazu GENERATE (viz 13.6.2.). Příklad: Předpokládejme, že v RD je uvedena klauzule CONTROL PRVNI DRUHY a že uživatel skutečně popsal všechny přípustné skupiny sestavy. a) Příkaz INITIATE nevytváří žádné skupiny. b) První příkaz GENERATE následující po provedení příkazu INITIATE provede přechod na novou stránku a vytvoří skupiny RH, PH, CH FINAL, CH PRVNI, CH DRUHY, DE. c) Při druhém až posledním provádění příkazu GENERATE se testují hodnoty řídicích položek PRVNI a DRUHY vzhledem k hodnotám, které tyto položky měly při provádění předcházejícího příkazu GENERATE: - Nezměnila-li se žádná z položek PRVNI a DRUHY, vytvoří příkaz GENERATE pouze skupinu DE. - Změnila-li se položka DRUHY, nikoliv však položka PRVNI, vytvoří příkaz GENERATE skupiny CF DRUHY, CH DRUHY, DE. - Změnila-li se položka PRVNI, pak se změna položky DRUHY již netestuje a příkaz GENERATE vytvoří skupiny CF DRUHY, CF PRVNI, CH PRVNI, CH DRUHY, DE. d) Příkaz TERMINATE vytvoří skupiny CF DRUHY, CF PRVNI, CF FINAL, PF, RF. Předpokládejme, že po určité řídicí změně (kterékoliv úrovně) následovalo za sebou několik příkazů GENERATE, při nichž se žádná z řídicích položek PRVNI ani DRUHY nezměnila, načež opět došlo k nějaké řídicí změně. Neuvažujeme-li skupiny PH a PF, následují v tiskové sestavě za sebou skupiny ..., CH DRUHY, DE, DE, DE, ..., DE, CF DRUHY, ... Označme tuto posloupnost skupin jako (DRUHY). Předpokládejme dále, že po řídicí změně úrovně FINAL nebo PRVNI následovaly příkazy GENERATE, při nichž se řídicí položka PRVNI nezměnila, načež opět došlo k řídicí změně úrovně FINAL nebo PRVNI. Neuvažujeme-li opět skupiny PH a PF, budou v tiskové sestavě následovat za sebou tyto skupiny a posloupnosti skupin: ...CH PRVNI, (DRUHY), (DRUHY), ..., (DRUHY), CF PRVNI, ... Označme tuto posloupnost skupin jako (PRVNI). Celá tisková sestava má pak tvar: RH, PH, CH FINAL, (PRVNI), ..., (PRVNI), CF FINAL, PF,RF Vytváření posloupností skupin nejnižší úrovně a vyšších úrovní, v našem příkladě tedy posloupností (DRUHY) a (PRVNI), je základní funkcí Generátoru sestav.