13.6.2. Příkaz GENERATE Formát: GENERATE {jméno-skupiny | jméno-sestavy} Funkce: Příkaz GENERATE provádí vytvoření jedné nebo několika skupin sestavy a mnohé další akce. Pravidla: 1) Příkaz GENERATE musí být proveden až po provedení příkazu INITIATE, avšak před provedením příkazu TERMINATE pro tuto sestavu. 2) Argumentem v příkazu GENERATE musí být buďto jméno některé skupiny (01) typu DETAIL (pak mluvíme o detailním výstupu) anebo přímo jméno sestavy (RD) (pak mluvíme o souhrnném výstupu). Během zpracování sestavy lze obě tyto možnosti libovolně střídat a při více popsaných skupinách typu DETAIL též libovolně střídat příkazy GENERATE s různými jmény skupin typu DETAIL. Funkce příkazu GENERATE: Vytvořením určité skupiny sestavy rozumíme provedení následujících akcí (a to v uvedeném pořadí): 1) Je-li pro skupinu popsána deklarativní sekce, Generátor sestav odskočí na její začátek a vyčká, až uživatel předá řízení na návratový můstek umístěný na jejím konci, což způsobí návrat do Generátoru sestav (viz 5.5.). Po návratu z deklarativní sekce Generátor sestav testuje hodnotu položky PRINT-SWITCH. Je-li PRINT-SWITCH = 1, vytváření skupiny se ukončí a následující body 2 až 4 se neprovádí; pouze se provede příkaz "MOVE 0 TO PRINT-SWITCH" (viz bod 5). Není-li PRINT-SWITCH = 1, přechází se na provádění bodu 2. 2) Je-li vytvářená skupina normální skupinou (CH,DE,CF), přičemž předešle tisknutá normální skupina měla klauzuli "NEXT GROUP k" a po tisku jejího posledního řádku byla hodnota LINE-COUNTERňk, provede se nyní přechod na novou stránku a na této nové stránce se papír posune na k-tý řádek (viz popis klauzulí LINE a NEXT GROUP). Pokud však naše vytvářená skupina nemá v popisu ani jednu klauzuli LINE, zmíněný posuv papíru na novou stránku a na k-tý řádek na ní se neprovede, a dojde k němu až při první následující normální skupině sestavy, jejíž tisk nebude potlačen vložením 1 do položky PRINT-SWITCH a která bude mít v popisu alespoň jednu klauzuli LINE. 3) Prochází se popisem skupiny od začátku do konce, přičemž se provádějí následující akce: a) První klauzule LINE v popisu skupiny způsobí pouze patřičný posuv papíru a změnu položky LINE-COUNTER. b) Každá další klauzule LINE v popisu skupiny způsobí nejprve tisk připraveného řádku na to místo, kde tiskárna právě stojí (a na které byla nastavena předcházející klauzulí LINE), a dále patřičný posuv papíru a odpovídající změnu položky LINE-COUNTER. c) Klauzule COLUMN způsobí přechod příslušné hodnoty (viz popis klauzulí VALUE, SOURCE a SUM) do této tiskové položky, tj. přímo do patřičného úseku tiskového řádku. (Je-li v popisu položky jak klauzule LINE, tak i klauzule COLUMN, uplatní se funkce klauzule LINE dříve.) d) Je-li v popisu skupiny uvedena alespoň jedna klauzule LINE, pak při dosažení konce popisu této skupiny se ještě vytiskne poslední (což může být a většinou též bývá jediný) řádek bez posuvu papíru. e) Není-li v popisu skupiny uvedena ani jedna klauzule LINE (a tedy nutně též ani jedna klauzule COLUMN), neprovádí se žádný tisk ani posuv papíru. Pokud je to možné, spojuje ovšem Generátor sestav posuv papíru s následujícím tiskem řádku do jednoho příkazu WRITE. 4) Je-li v popisu skupiny uvedena klauzule NEXT GROUP, provede se odpovídající posuv papíru, změna položky LINE-COUNTER a při formátu "NEXT GROUP k" vyžadujícím přechod na novou stránku též zaznačení příslušné indikace. 5) Je-li pro skupinu popsána deklarativní sekce, provede se příkaz "MOVE 0 TO PRINT-SWITCH". Má-li se při provádění bodu 2 nebo 3 přejít na novou stránku, vytvoří Generátor sestav na staré stránce skupinu PAGE FOOTING, přejde na novou stránku na tiskárně, zvětší položku PAGE-COUNTER o 1 a vytvoří na nové stránce skupinu PAGE HEADING. Vytvoření skupin PAGE FOOTING a PAGE HEADING (jsou-li popsány) se provádí podle stejných pravidel 1 až 5. Příkaz "GENERATE jméno-skupiny" (detailní výstup) Provedou se následující akce, a to v uvedeném pořadí: 1) Došlo-li k řídicí změně některé řídicí položky, uloží se do položky CBL-CTR zakódovaná úroveň této řídicí změny a provedou se akce a) až g): a) Provede se postupné a křížové přičítání do sumátorů (viz popis klauzule SUM). b) Hodnoty všech řídicích položek platné na začátku provádění příkazu GENERATE se uklidí a všem řídicím položkám se vrátí ty hodnoty, které tyto položky měly při posledním provádění příkazu GENERATE předcházejícím před tímto (neboli před vznikem této řídicí změny, viz bod f). c) Postupně se vytvoří skupiny CONTROL FOOTING počínaje nejnižší úrovní a konče tou úrovní, na níž došlo k řídicí změně; vytvářejí se ovšem jen ty skupiny, které si uživatel popsal. Klauzule NEXT GROUP se přitom může uplatnit jen je-li uvedena u skupiny CONTROL FOOTING té úrovně, na níž došlo k řídicí změně; klauzule NEXT GROUP uvedené u skupin CONTROL FOOTING všech nižších úrovní se ignorují. d) Obnoví se "nové" hodnoty všech řídicích položek, které platily na začátku provádění tohoto příkazu GENERATE, a které byly uklizeny v bodě b). e) Postupně se vytvoří skupiny CONTROL HEADING počínaje tou úrovní, na níž došlo k řídicí změně, a konče nejnižší úrovní; vytvářejí se ovšem jen ty skupiny, které si uživatel popsal. f) "Nové" hodnoty všech řídicích položek (platné na začátku provádění tohoto příkazu GENERATE a obnovené v bodě d) se uschovají, aby mohly být vráceny při příští řídicí změně (v jejím bodě b). g) Vynulují se sumátory popsané ve všech skupinách CONTROL FOOTING téže anebo nižší úrovně než je úroveň řídicí změny; nenulují se však ty sumátory, u nichž je nulování na této úrovni potlačeno pomocí klauzule RESET. 2) Provede se prosté přičítání do sumátorů (viz popis klauzule SUM). 3) Vytvoří se ta skupina typu DETAIL, jejíž jméno je uvedeno v příkazu GENERATE. Nedošlo-li k žádné řídicí změně, provádějí se pouze body 2 a 3. Poznámka: První příkaz GENERATE prováděný bezprostředně po příkazu INITIATE má poněkud odlišnou funkci: - Provede příkaz "MOVE 0 TO CBL-CTR". - Provede přechod na novou stránku (i v případě, že v RD není uvedena klauzule PAGE). - Vytvoří skupinu REPORT HEADING, je-li popsána. - Vytvoří skupinu PAGE HEADING, je-li popsána. - Postupně se vytvoří skupiny CONTROL HEADING počínaje úrovní FINAL a konče nejnižší úrovní; vytvářejí se ovšem jen ty skupiny, které si uživatel popsal (odpovídá to výše popsanému bodu 1e pro řídicí změnu nejvyšší úrovně FINAL). - Provede body 1f, 1g, 2 a 3 popsané výše (v bodě 1g se provede vynulování všech popsaných sumátorů). Příkaz "GENERATE jméno-sestavy" (souhrnný výstup) Liší se od příkazu "GENERATE jméno-skupiny" pouze v tom, že se nevytvoří žádná skupina typu DETAIL (bod 3), a že v případě, že je popsáno více skupin typu DETAIL, se provádí prosté přičítání k sumátorům (bod 2) tak, jako kdyby byly provedeny za sebou příkazy "GENERATE jméno-skupiny" pro všechny popsané skupiny typu DETAIL (a to v tom pořadí, v jakém jsou tyto skupiny popsány). Je-li popsána pouze jedna skupina typu DETAIL, je tedy prosté přičítání přesně stejné jako při detailním výstupu právě této detailní skupiny. Postupné a křížové přičítání (bod 1a) je vždy stejné jako při detailním výstupu. Použití: Souhrnný výstup se používá k vytvoření tzv. "součtové sestavy", která obsahuje přesně stejné skupiny záhlaví a závěrů jako plná tisková sestava, má však vynechány všechny detailní řádky. (Je-li popsána více než jedna skupina typu DETAIL, je ovšem třeba rozmyslet si, zda přičítání k sumátorům odpovídá požadavkům uživatele.)