5.5. Deklarativní sekce Deklarativní sekce (zvané též "USE-procedury") umožňují uživateli provádět programová ošetření některých zvláštních stavů, které nemohou být ošetřeny jinými příkazy a klauzulemi jazyka COBOL. Každá z deklarativních sekcí má tvar sekce v PROCEDURE DIVISION, která se od nedeklarativních sekcí liší v těchto znacích: 1) Bezprostředně za záhlavím deklarativní sekce (tj. za "jméno-sekce SECTION.") musí být uvedena klauzule USE ukončená tečkou. Klauzule USE nemá charakter příkazu (neznamená provedení žádné akce), nýbrž pouze určuje typ deklarativní sekce a vymezuje podmínky, při jejichž splnění má být tato deklarativní sekce provedena (viz dále ). 2) Má-li být v programu alespoň jedna deklarativní sekce musí být bezprostředně za záhlavím PROCEDURE DIVISION uvedeno záhlaví DECLARATIVES. Pak následují všechny deklarativní sekce (jejichž pořadí je zcela libovolné a nemá žádný vliv na výpočet), načež za koncem poslední z nich musí být uvedeno záhlaví END DECLARATIVES. Mezi DECLARATIVES a END DECLARATIVES nesmí být žádné nedeklarativní sekce (bez klauzule USE) ani žádné samostatné příkazy (věty) nebo paragrafy. Každá z deklarativních sekcí tedy končí buďto záhlavím následující deklarativní sekce anebo (poslední z nich) záhlavím END DECLARATIVES. Na druhé straně zase žádná deklarativní sekce (s klauzulí USE) nesmí být umístěna až za záhlavím END DECLARATIVES. 3) Při vyvolání programu začíná výpočet prováděním prvního příkazu za END DECLARATIVES (nikoliv tedy prováděním prvního příkazu první deklarativní sekce!). 4) Odskok do deklarativní sekce nastává při vyskytnutí se určitého výjimečného stavu a je prováděn nikoliv explicitně uživatelem, nýbrž odskok zajišťuje překladač vygenerováním příslušných instrukcí. 5) Na konci každé z deklarativních sekcí je překladačem vygenerován jistý "návratový můstek". Přijde-li na něj řízení, činnost deklarativní sekce se ukončí a provede se návrat na dokončení toho příkazu, který způsobil vyvolání deklarativní sekce. (Provedení deklarativní sekce je tedy realizováno obdobně jako příkaz PERFORM). 6) V průběhu deklarativní sekce smí uživatel jakkoliv předávat řízení (příkazem GO apod.) do jiných deklarativních sekcí anebo i do nedeklarativní části PROCEDURE DIVISION (za END DECLARATIVES) anebo provádět (příkazem PERFORM apod.) příkazy tam uvedené. Deklarativní sekci je tedy třeba chápat dynamicky: jsou to ty příkazy, které se provedou od vyvolání deklarativní sekce až do ukončení činnosti deklarativní sekce, ať jsou rozmístěny kdekoliv v programu. Žádný z příkazů není v deklarativní sekci překládán jiným způsobem než v nedeklarativní části PROCEDURE DIVISION. 7) Během činnosti deklarativní sekce nesmí být proveden žádný příkaz pro ten soubor, při jehož zpracování došlo k vyvolání deklarativní sekce. S jinými soubory se pracovat smí; během činnosti deklarativní sekce pro ošetření chyb vstupu/výstupu nesmí dojít k novému vyvolání téže anebo i jiné deklarativní sekce pro ošetření chyb vstupu/výstupu. 8) Při provádění deklarativní sekce je bezpodmínečně nutné ukončit činnost deklarativní sekce příchodem na návratový můstek vygenerovaný na jejím konci. 9) Při normálním ("nedeklarativním") výpočtu smí uživatel předat řízení do některé deklarativní sekce, nesmí však přitom přijít na návratový můstek na konci deklarativní sekce. (V úvahu přichází především příkaz PERFORM provádějící celou deklarativní sekci anebo její část). Poznámka: Dle formátu klauzule USE se deklarativní sekce rozdělují do dvou kategorií: a) nevyužito; b) Deklarativní sekce pro ošetření chyb vstupu/výstupu (USE ERROR PROCEDURE). c) Deklarativní sekce pro Generátor sestav (USE BEFORE REPORTING). Formát: PROCEDURE DIVISION [USING položka ...]. DECLARATIVES. -- -- |jméno-sekce SECTION. USE-klauzule.| | [věta] ... | | [paragraf] ... | -- -- END DECLARATIVES. Příklad: SELECT A ... SELECT B ... SELECT C ... PROCEDURE DIVISION. DECLARATIVES. FENKA SECTION. USE AFTER STANDARD ERROR PROCEDURE ON B C. PES. MOVE ... END DECLARATIVES. OPEN OUTPUT A INPUT B. Jako první příkaz při výpočtu se bude provádět OPEN. 5.5.1. Deklarativní sekce pro zpracování návěští Nejsou v MX COBOLu implementovány 5.5.2. Deklarativní sekce pro ošetření chyb vstupu/výstupu Formát klauzule USE: USE AFTER STANDARD ERROR PROCEDURE ON {jméno-souboru ... } . Pravidla: 1) Klauzule USE určuje, pro které soubory bude tato deklarativní sekce používána. Lze zde uvést jedno nebo několik jmen souborů. Deklarativní sekce bude používána pouze pro ten soubor (ty soubory), který je uveden (které jsou uvedeny) v seznamu. 3) Deklarativní sekce pro ošetření chyb vstupu/výstupu může být uvedena pro soubor kteréhokoliv typu. 4) Jestliže je pro soubor uvedena klauzule FILE STATUS, je v ní při vyvolání deklarativní sekce uložena hodnota označující příčinu chyby v souboru. 5) Deklarativní sekce je vyvolána při chybě vstupu/výstupu (přesněji říkáme: při výjimečném stavu) při provádění příkazů READ, WRITE, REWRITE, START a CLOSE. (Příkaz DELETE nemůže způsobit výjimečný stav, zatímco výjimečné stavy vzniknuvší při provádění příkazu OPEN způsobí vždy ukončení výpočtu, aniž by došlo k vyvolání deklarativní sekce). Tyto výjimečné stavy lze rozdělit do dvou skupin: a) Výjimečné stavy, které "přednostně" způsobují vyvolání deklarativní sekce. Tím je míněno, že je-li deklarativní sekce uvedena, pak tyto výjimečné stavy způsobí její uplatnění nezávisle na tom, zda příslušný příkaz má nebo nemá klauzuli AT END resp. INVALID KEY. b) Výjimečné stavy, které "přednostně" způsobují uplatnění klauzule AT END resp. INVALID KEY v příslušném příkazu. Tím je míněno, že má-li příslušný příkaz uvedenu klauzuli AT END resp. INVALID KEY, pak tyto výjimečné stavy způsobí uplatnění této klauzule nezávisle na tom, zda pro soubor je nebo není uvedena deklarativní sekce. Pokud příslušný příkaz klauzuli AT END resp. INVALID KEY uvedenu nemá, způsobí tyto výjimečné stavy vyvolání deklarativní sekce, pokud je tato ovšem uvedena. Pokud by nebyla uvedena ani deklarativní sekce, pokračoval by výpočet normálně dál, a uživatel by nedostal o výjimečnéím stavu žádnou informaci. 6) Byla-li vyvolána deklarativní sekce, pak po návratu z deklarativní sekce do příkazu způsobivšího výjimečný stav se (jedná-li se o příkaz READ) neuplatní klauzule INTO. Má-li příkaz uvedenu klauzuli INVALID KEY, odskočí se za tečku. Nemá-li příkaz uvedenu klauzuli INVALID KEY, pokračuje se prováděním následujícího příkazu. 5.5.3. Deklarativní sekce pro Generátor sestav Formát klauzule USE: USE BEFORE REPORTING jméno-skupiny ... Pravidla pro práci s deklarativními sekcemi tohoto typu jsou uvedena v odstavci 13.7.