13.5.8. Klauzule RESET Formát: RESET ON {položka | FINAL} Pravidla: 1) Klauzule RESET smí být uvedena pouze v popisu sumátoru (tj. elementární položky s klauzulí SUM). 2) V klauzuli RESET musí být uvedeno buďto slovo FINAL anebo jedna z řídicích položek (vyjmenovaných v klauzuli CONTROL v RD), jejíž hierarchická úroveň musí být stejná nebo vyšší než je úroveň skupiny CONTROL FOOTING obsahující sumátor s klauzulí RESET. (Má-li řídicí položka v klauzuli CONTROL uvedeny indexy, je nutno uvést přeně tytéž indexy i v klauzuli RESET; nepožaduje se však přesně stejný zápis kvalifikace, pokud určuje touž položku.) 3) Není-li u sumátoru (s výjimkou sumátorů popsaných ve skupině CONTROL FOOTING FINAL) uvedena klauzule RESET, pak Generátor sestav tento sumátor automaticky vynuluje při řídicí změně téže anebo vyšší úrovně, než je úroveň skupiny CONTROL FOOTING obsahující tento sumátor (viz popis příkazu GENERATE). 4) Je-li u sumátoru uvedena klauzule RESET (s výjimkou tvaru RESET FINAL), pak Generátor sestav tento sumátor vynuluje až při řídicí změně řídicí položky uvedené za slovem RESET anebo při řídicích změnách vyšších úrovní. Při řídicích změnách nižších úrovní než je úroveň řídicí položky uvedené za slovem RESET tento sumátor nebude vynulován. 5) Sumátory popsané ve skupině CONTROL FOOTING FINAL a dále sumátory s klauzulí RESET FINAL se nenulují (samozřejmě s výjimkou příkazu INITIATE a dále prvního prováděného příkazu GENERATE) během vytváření sestavy nikdy. 6) Je ekvivalentní neuvést u sumátoru klauzuli RESET vůbec, anebo ji uvést s tou řídicí položkou, k níž patří skupina CONTROL FOOTING obsahující tento sumátor. 7) Klauzule RESET se používá tehdy, nepřeje-li si uživatel vynulování sumátoru při jemu odpovídající řídicí změně, neboť chce v tomto sumátoru místo běžných součtů pouze pro detailní skupiny zpracovávané mezi jednotlivými řídicími změnami (totálů) vytvářet a tisknout průběžné součty za všechny předchozí detailní skupiny zpracovávané od řídicí změny vyšší úrovně (grandtotály). Klauzule RESET FINAL umožňuje vytvářet tyto součty za všechny předchozí detailní skupiny zpracovávané od provedení příkazu INITIATE. Příklad: Uvažujme následující popisy: RD ZPRAVA CONTROLS PRVNI DRUHY PAGE 65. 01 RADEK TYPE DETAIL LINE PLUS 1. 02 COLUMN 20 PIC ZZZ.99 SOURCE B. 02 SOURCE A. 01 CF-DRUHY TYPE CF DRUHY LINE PLUS 2. 02 C COLUMN 20 PIC ZZZ.99 SUM A RESET PRVNI. 01 CF-PRVNI TYPE CF PRVNI LINE PLUS 2. 02 D PIC ***.99 SUM B TALLY UPON RADEK. 01 CF-FINAL TYPE CF FINAL LINE PLUS 5. 02 F COLUMN 60 PIC Z(4).99 SUM E D. 02 G COLUMN 45 PIC Z(4).99 SUM C. 02 H COLUMN 80 PIC *(5).99 SUM F G. Popíšeme akce týkající se sumátorů z tohoto popisu: a) Při provádění příkazu "INITIATE ZPRAVA" a dále při prvním provádění příkazu "GENERATE RADEK" se všechny sumátory C, D, E, F, G a H vynulují. b) Pokud při provádění příkazu "GENERATE RADEK" nebyla zjištěna žádná řídicí změna, provede se pouze prosté přičítání, tzn. přičte se položka A k sumátoru C a dále se přičtou položky B a TALLY k sumátoru D. c) Pokud při provádění příkazu "GENERATE RADEK" byla zjištěna řídicí změna položky DRUHY (nikoliv však též řídicí změna položky PRVNI), přičte se nejprve sumátor C k sumátorům E a G (postupné přičítání) a pak se provedou prostá přičítání uvedená v bodě b). Sumátor C se nenuluje, neboť má uvedenu klauzuli RESET PRVNI. d) Pokud při provádění příkazu "GENERATE RADEK" byla zjištěna řídicí změna položky PRVNI, přičte se nejprve sumátor C k sumátorům E a G, pak sumátory D a E k sumátoru F (postupná přičítání), pak se vynulují sumátory C, D a E a nakonec se provedou prostá přičítání uvedená v bodě b). e) Při provádění příkazu "TERMINATE ZPRAVA" vzniká řídicí změna úrovně FINAL. Provedou se postupná přičítání popsaná v bodě d) (tj. C se přičte k E a G, D se přičte k F a E se přičte k F), načež se přičtou sumátory F a G k sumátoru H (křížové přičítání). Sumátory C, D a E se vynulují, zatímco sumátory F, G a H si podrží svou konečnou hodnotu. Časovou posloupnost výše popsaných akcí vzhledem k ostatním akcím prováděným v rámci provádění příkazů GENERATE a TERMINATE lze zjistit z popisu těchto příkazů. 13.5.9. Klauzule GROUP Formát: GROUP INDICATE Pravidla: 1) Klauzule GROUP smí být uvedena pouze v popisu tiskové položky (tj. položky popsané dle formátu 3 s klauzulemi COLUMN a PICTURE), která patří do skupiny typu DETAIL. 2) Položka s klauzulí GROUP bude při tisku jí nadřízené skupiny typu DETAIL tisknuta pouze tehdy, je-li tato skupina tisknuta poprvé po kterékoliv řídicí změně (včetně FINAL, tj. při prvním tisku této skupiny vůbec) anebo poprvé po přechodu na novou stránku. V ostatních případech se tato položka netiskne a jí přidělený úsek tiskového řádku bude vymezerován. 3) Bývá zvykem používat tiskovou položku s klauzulí GROUP k označení nepřerušené posloupnosti detailních řádků, které všechny mají stejnou hodnotu této tiskové položky (splnění této podmínky však není povinné), chceme-li zabránit opakovanému tisku stále téže hodnoty. Tato společná hodnota se pak tiskne pouze u prvního z těchto řádků. 4) Tisková položka bez klauzule GROUP se při tisku jí nadřízené skupiny sestavy vytiskne vždy. 13.5.10. Klauzule SHIFT Stává se, že programátor napíše program používající Generátor sestav a pak (třeba až po dlouhodobém používání tohoto programu) zjistí, že je třeba posunout část některého řádku o několik sloupců doleva nebo doprava (kvůli vložení nebo vypuštění některé položky na řádku nebo z grafických důvodů apod.). Bylo by nepříjemné, kdyby nyní musel opravit klauzuli COLUMN ve všech položkách měnících svou polohu (a jedná-li se o řádek v detailní skupině, pak většinou i klauzule COLUMN ve všech odpovídajících položkách v záhlavích PH nebo CH a též v závěrech CF), neboť takové opravy jsou velmi pracné a snadno vedou k omylům. Proto byla do MX COBOLu přidána klauzule SHIFT, která umožňuje uživateli vyřešit tento problém s minimální pracností. Formát: číslo-úrovně [jméno-položky] SHIFT {LEFT|RIGHT} celé-číslo. Pravidla: 1) Číslo úrovně musí být 02 až 49, přitom všechny tyto možnosti jsou ekvivalentní. 2) Jméno položky je nepovinné a zcela bezvýznamné. 3) V popisu obsahujícím klauzuli SHIFT nesmí být uvedena žádná jiná klauzule. 4) Celé číslo uvedené v klauzuli SHIFT smí mít nejvýše tři cifry. Funkce: Popis s klauzulí SHIFT smí být uveden kdekoliv mezi položkami patřícími k určité skupině sestavy. Tento popis způsobí, že u všech dále popsaných položek až po nejbližší popis s klauzulí LINE (maximálně ovšem do konce zpracovávané skupiny sestavy) se celé číslo uvedené v klauzuli COLUMN zvětší (při SHIFT RIGHT - tj. posuv vpravo) resp. zmenší (při SHIFT LEFT - tj. posuv vlevo) o celé číslo uvedené v klauzuli SHIFT. Popis s klauzulí SHIFT nemá žádný vliv na ty popisy položek, které mu předcházejí, ani na popisy položek počínaje nejbližší položkou s klauzulí LINE resp. první položkou další skupiny sestavy, ani na popisy netiskových položek (tj. na popisy neobsahující klauzuli COLUMN). Mezi popisy položek patřících k téže klauzuli LINE lze vložit i několik popisů s klauzulí SHIFT. Zvětšení (při SHIFT RIGHT) a zmenšení (při SHIFT LEFT) určená jednotlivými klauzulemi SHIFT se pak sčítají. (Přesněji: Překladač si vede určitý čítač, který při každé klauzuli LINE vynuluje. Při nalezení popisu s "SHIFT RIGHT n" se celé číslo n k tomuto čítači přičte, při nalezení popisu s "SHIFT LEFT n" se celé číslo n od tohoto čítače odečte. Při zpracování kterékoliv klauzule COLUMN se k celému číslu v ní uvedenému přičte okamžitý obsah čítače a takto získané číslo pak bude použito jako pořadové číslo toho znaku řádku, na který přijde první byte položky. Zbývá dodat, že je-li v popisu položky jak klauzule LINE, tak i klauzule COLUMN, zpracovává se vždy nejprve klauzule LINE nezávisle na tom, v jakém pořadí jsou tyto dvě klauzule uvedeny v popisu položky.) Poznámka: Aby bylo možné dodatečně měnit formát řádku pomocí klauzule SHIFT, je výhodné (i když ne povinné), aby popisy tiskových položek na témže řádku byly seřazeny vzestupně dle celých čísel uvedených v klauzulích COLUMN. Příklad: Nechť původní popis skupiny sestavy zní takto: 01 RADEK TYPE DE LINE PLUS 1. 02 A COL 3 PIC X(5) SOURCE AA. 02 B COL 10 PIC X(2) SOURCE BB. 02 C COL 14 PIC 9(4) SOURCE CC. 02 D COL 35 PIC 9(4) SOURCE DD. (Jména položek používáme pouze pro zjednodušení výkladu.) Nyní potřebujeme mezi položky A a B dodatečně vložit položku M. Aniž bychom měnili popisy položek B, C a D, získáme volné místo mezi položkami A a B pomocí klauzule SHIFT. Současně zmenšíme nadbytečně velkou mezeru mezi položkami C a D: 01 RADEK TYPE DE LINE PLUS 1. (původní) 02 A COL 3 PIC X(5) SOURCE AA. (původní) 02 M COL 10 PIC X(20) SOURCE MM. (vložené) 02 SHIFT RIGHT 22. (vložené) 02 B COL 10 PIC X(2) SOURCE BB. (původní) 02 C COL 14 PIC 9(4) SOURCE CC. (původní) 02 SHIFT LEFT 15. (vložené) 02 D COL 35 PIC 9(4) SOURCE DD. (původní) Tento popis je ekvivalentní s následujícím popisem, který vznikl z původního popisu opravou klauzulí COLUMN u položek B, C a D: 01 RADEK TYPE DE LINE PLUS 1. 02 A COL 3 PIC X(5) SOURCE AA. 02 M COL 10 PIC X(20) SOURCE MM. 02 B COL 32 PIC X(2) SOURCE BB. (32=10+22) 02 C COL 36 PIC 9(4) SOURCE CC. (36=14+22) 02 D COL 42 PIC 9(4) SOURCE DD. (42=35+22-15) V případě potřeby je nutné stejným způsobem upravit i odpovídající záhlaví a závěry, u nichž dochází k témuž posunutí, a případně též zvětšit resp. zmenšit celé číslo uvedené v klauzuli RECORD v FD výstupního souboru. Klauzule SHIFT poskytne účinnou pomoc především při značně delších a složitějších popisech, než jak je tomu v tomto příkladě. 13.6. Příkazy pro zpracování sestavy Zpracování sestavy provádí uživatel pomocí příkazů INITIATE, GENERATE a TERMINATE, uvedených v PROCEDURE DIVISION. Nejdříve musí uživatel provést jediný příkaz INITIATE, pak libovolný počet příkazů GENERATE a nakonec jediný příkaz TERMINATE. Mimoto lze při zpracování sestavy použít ještě příkaz SUPPRESS PRINTING.