4.6. Podmínkové jméno Formát: 88 podmínkové-jméno { VALUE IS | VALUES ARE } { údaj-1 [{THRU|THROUGH} údaj-2] } ... . kde údaj-1 a údaj-2 může být literál, figurativní konstanta nebo ALL-klauzule. Význam: Bezprostředně za popisem kterékoliv položky (s výjimkou položek z REPORT SECTION) lze uvést jeden nebo několik popisů podmínkových jmen. Položka, která má za svým popisem uvedeny popisy podmínkových jmen, se vzhledem k těmto podmínkovým jménům nazývá podmínková proměnná. Podmínkové jméno je vlastně jméno, které programátor přidělil jedné nebo několika hodnotám podmínkové proměnné. Podmínkové jméno nepatří mezi položky a nemá přidělen žádný úsek paměti. Může být použito pouze v těchto dvou případech: 1) V podmíněném výrazu jako tzv. "test podmínkového jména" (viz 5.4.5.). Při tomto použití může být podmínkové jméno kvalifikováno pomocí jména své podmínkové proměnné a jmen jejích nadřízených položek (viz 1.5.). Vyžaduje-li podmínková proměnná indexování, je nutno uvést stejný počet indexů i při použití kteréhokoliv z jejích podmínkových jmen (přičemž uvedené indexy se vztahují právě k podmínkové proměnné). 2) V příkazu MOVE jakožto vysílající údaj (viz 6.1.). Při tomto použití se zapisuje pouze podmínkové jméno s případnou kvalifikací, avšak bez indexů. Popis podmínkového jména obsahuje číslo úrovně 88, dále podmínkové jméno (vytvořené dle pravidel pro tvorbu jména položky, viz 1.4.) a pak pouze jedinou klauzuli VALUE resp. VALUES ukončenou tečkou. Slova VALUE a VALUES jsou ekvivalentní, podobně slova THRU a THROUGH jsou ekvivalentní. V klauzuli VALUE je uveden buďto jeden "prvek" formátu "údaj-1 [THRU údaj-2]" (místo THRU lze psát též ekvivalentní THROUGH) nebo několik takových "prvků". Tyto "prvky" určují hodnoty, s nimiž bude při použití tohoto podmínkového jména v podmíněném výrazu hodnota podmínkové proměnné porovnávána. Při "prvku" typu "údaj-1" se podmínková proměnná testuje, zda je rovna tomuto údaji-1. Při "prvku" typu "údaj-1 THRU údaj-2" se podmínková proměnná testuje, zda je větší nebo rovna údaji-1 a současně menší nebo rovna údaji-2. (Údaj-1 by tedy měl být menší nebo roven údaji-2; kdyby byl větší, nebyla by to sice chyba, ale zřejmě by test určený tímto "prvkem" byl vždy nepravdivý.) "Prvky" obou typů mohou být v klauzuli VALUE/VALUES libovolně kombinovány v jakémkoliv pořadí. Test podmínkového jména je pravdivý, je-li splněna alespoň jedna z podmínek určených jednotlivými "prvky", a je nepravdivý, není-li splněna žádná z těchto podmínek (viz 5.4.5.). Poznámky: 1) Srovnávání podmínkové proměnné s údaji uvedenými v klauzuli VALUE/VALUES se provádí vždy dle pravidel relačního testu (viz 5.4.1.). 2) Z bodu 1) vyplývá, že se údaje uvedené v klauzuli VALUE/ VALUES u podmínkových jmen zpracovávají jiným způsobem než údaj uvedené v klauzuli VALUE pro naplnění počáteční hodnoty položky (viz 4.5.8.), a to v těchto případech: - Má-li údaj více znaků resp. dekadických cifer než podmínková proměnná, nebo je-li záporný zatímco podmínková proměnná nemá v popisu příznak znaménka, nejsou tyto přebytečné znaky, cifry resp. znaménko odřezávány, nýbrž podmínková proměnná bude srovnávána s nezkráceným údajem. - Klauzule JUST uvedená u podmínkové proměnné se při srovnávání neuplatní. - Je-li podmínkovou proměnnou numerická editovaná položka bez klauzule SIGN, bude srovnávána s numerickým údajem (tj. s numerickým literálem nebo se ZERO/ZEROS/ZEROES) dle pravidel numerického srovnání a ne alfanumericky. 3) Podmínkové jméno smí být popsáno pro kteroukoliv položku, i pro takovou, u níž by klauzule VALUE nebyla přípustná (pro položku s proměnnou adresou nebo délkou, s USAGE INDEX, s číslem úrovně 66 nebo s délkou větší než 131072) anebo byla pouze poznámková (ve FILE SECTION a v LINKAGE SECTION). 4) Nezávisle na typu podmínkové proměnné lze vždy použít libovolný literál, figurativní konstantu nebo ALL-klauzuli. V praxi je ovšem vhodné u numerických podmínkových proměnných používat jako údaje pouze numerické literály a ZERO (při opatrném použití však mohou být dokonce výrazně efektivnější alfanumerické literály jako např. '3', '263D', #000354#, #FDFFFFFF#, '+12.3E-04', ' -1,234.56$' apod.) a u nenumerických podmínkových proměnných používat pouze alfanumerické literály (nebo celá čísla bez znaménka) o délce shodné s délkou podmínkové proměnné (figurativní konstanty a ALL-klauzule raději nahradit alfanumerickým literálem). 5) Při vyhodnocování testu podmínkového jména se případné indexování podmínkové proměnné a jiné obdobné akce (při vhodných typech podmínkové proměnné též uložení její hodnoty do vhodné pomocné proměnné) provádí pouze jednou na začátku. Při více než jednom údaji je tedy použití podmínkového jména často výhodnější, než kdybychom test podmínkového jména nahradili pomocí ekvivalentních relačních testů. Příklad: 77 AN PIC X(5). 88 AN1 VALUE 'ABCDE'. 88 AN2 VALUE 'ABC'. (neefektivní, lépe 'ABC ') 88 AN3 VALUE 'PRAHA' 'BRNO ' 'SLIAC'. 88 AN4 VALUE 'A ' THRU 'ZZZZZ'. 88 AN5 VALUE SPACE ALL '*' LOW-VALUE HIGH-VALUE. 88 AN6 VALUE #4100000000# THRU #5AFFFFFFFF#. 77 AE XBXBX. 88 AE1 VALUE 'AAAAA' THRU 'ZZZZZ'. 77 DI PIC S9(5). 88 DI1 VALUE ZERO -58 125 THRU 12345 94 15 THROUGH 26. 88 DI2 VALUE 273. 88 DI3 VALUE #3030323733#. (výhodnější, alf.srovnání) 77 PA PIC 9(3)V9(5) COMP-3. 88 PA1 VALUE 2 123.45678 2.E2 5.6E-4 THRU 68.E-5 ZERO. 88 PA2 VALUE #0002000003#. (výhodnější, alf.srovnání) 77 BI PIC S9(4) COMP. 88 BI1 VALUE +30 754 -65 THRU -40. 88 BI2 VALUE 1000. (výhodnější než následující) 88 BI3 VALUE #E803#. (zde je alf.srov. nevýhodné) 77 ED COMP-2. 88 ED1 VALUE 5 -4.56 +1.E+46 -.78E-38. 77 EZ PIC +999E+99. 88 EZ1 VALUE -3 1.2 -4.56E+15 THRU .68E24 ZERO. 88 EZ2 VALUE 5.7. (realizuje se podprogramem) 88 EZ3 VALUE '+570E-02'. (výhodnější, alf.srovnání) 77 NE PIC B(4)+++,++9.99. 88 NE1 VALUE 1234. (realizuje se podprogramem) 88 NE2 VALUE ' +1,234.00'. (výhodnější, alf.srovn.) 01 GR. 88 GR1 VALUE LOW-VALUE HIGH-VALUE. (hodnoty 0 nebo -1) 88 GR2 VALUE ALL #0300# ALL #FDFF#. (hodnoty 3 nebo -3) 02 BIN PIC S999 COMP OCCURS 1000 DEPENDING I. 88 BIN1 VALUE 4 8 THRU 13 22 26 THRU 34 56. 01 SK. 88 SK1 VALUE ALL #414E4F310200#. (hodnoty ANO, 1, 2) 02 SKA OCCURS 10000. 03 SKB PIC XXX. 03 SKC PIC 9. 03 SKD PIC 99 COMP. 4.7. Číslo úrovně 66, klauzule RENAMES Formát: 66 jméno-položky RENAMES položka-1 [ {THRU|THROUGH} položka-2 ]. Pravidla: 1) Bezprostředně za popisem poslední položky nebo podmínkového jména ve struktuře (tj. mezi popisem poslední položky nebo podmínkového jména podřízených k určité 01 a popisem nejbližší následující položky s číslem úrovně 01 nebo 77 anebo klauzulí FD, SD, CD nebo koncem sekce) lze uvést jeden nebo několik popisů s čísly úrovně 66, které budou sloužit ke sdružení a pojmenování určitých posloupností položek z právě ukončené struktury. Popisy s čísly úrovně 66 nesmí být uvedeny na žádném jiném místě. 2) Popis s číslem úrovně 66 musí obsahovat pouze klauzuli RENAMES zakončenou tečkou. Přitom klauzule RENAMES smí být uvedena výhradně v popisu s číslem úrovně 66. 3) Položka-1 a při THRU/THROUGH též položka-2 musí být položky z předcházející struktury s čísly úrovně 01 až 49 (nikoliv 66, 77 nebo 88), které nemají v popisu klauzuli OCCURS ani nejsou podřízeny položce s klauzulí OCCURS. Jejich jména smí být v klauzuli RENAMES uvedena s kvalifikací. (Přitom stačí, aby uvedené jméno resp. kvalifikace byly jednoznačné v rámci předcházející struktury 01; nevadí, pokud mimo tuto strukturu existuje položka se stejným jménem nebo se stejnou kvalifikací.) 4) Popis s číslem úrovně 66 definuje položku, která však nedostává přidělen zvláštní úsek paměti, nýbrž vlastně dodatečně redefinuje jednu položku nebo posloupnost několika položek z předešlé struktury. Platí tato pravidla: a) Není-li uvedena volba "THRU položka-2", pak položka s číslem úrovně 66 bude mít všechny vlastnosti shodné s položkou-1 (jakoby měla týž popis s jiným jménem) a bude jí přidělen týž úsek paměti. Položka s číslem úrovně 66 tedy bude skupinová resp. elementární právě když položka-1 je skupinová resp. elementární. b) Je-li uvedena volba "THRU položka-2", pak položka s číslem úrovně 66 bude vždy skupinová a bude jí přidělen úsek paměti začínající prvním bytem položky-1 a končící posledním bytem položky-2; přitom tento poslední byte položky-2 nesmí v paměti předcházet před prvním bytem položky-1. Položka s číslem úrovně 66 může mít i proměnnou délku. Slova THRU a THROUGH jsou ekvivalentní. 5) Jméno položky s číslem úrovně 66 nesmí být použito jako kvalifikátor. Na druhé straně toto jméno může být při použití kvalifikováno pomocí jména předcházející 01 a případně též pomocí jména souboru, třídicího souboru nebo komunikační oblasti. Příklad: 01 A. 02 B PIC 999. 02 C PIC X. 02 TAB PIC XX OCCURS 5. 02 D. 03 D1 PIC 9. 03 D2 PIC XXX. 03 D3 PIC 99. 66 K RENAMES B. (K je elementární s PIC 999) 66 L RENAMES D2 THRU D3. (L je skupinová, 5 bytů) 66 M RENAMES C THRU D. (M je skupinová, 17 bytů) 66 N RENAMES C THRU D2. (N je skupinová, 15 bytů) 66 P RENAMES D. (P je skupinová, 6 bytů) Příklad: 01 W. 02 X. 03 X1 PIC 9. 03 X2 PIC 999. 03 X3 PIC 99. 02 Y REDEFINES X. 03 Y1 PIC 999. 03 Y2 PIC 99. 03 Y3 PIC 9. 66 Z1 RENAMES X THRU Y. (Z1 skupinová, 6 bytů) 66 Z2 RENAMES X1 THRU Y2. (Z2 skupinová, 5 bytů) 66 Z3 RENAMES X THRU Y1. (Z3 skupinová, 3 byty) 66 Z4 RENAMES X2 THRU Y1. (Z4 skupinová, 2 byty) 66 Z5 RENAMES X3 THRU Y2. (Z5 skupinová, 1 byte) 66 Z6 RENAMES X3 THRU Y. (Z6 skupinová, 2 byty) 66 Z7 RENAMES Y1 THRU X3. (Z7 skupinová, 6 bytů) 66 Z8 RENAMES X2 THRU X2. (Z8 skupinová, 3 byty) 66 Z9 RENAMES X THRU X2. (Z9 skupinová, 4 byty) 66 Z10 RENAMES X2 THRU X. (Z10 skupinová, 5 bytů) 66 Z11 RENAMES W. (Z11 skupinová, 6 bytů) 66 Z12 RENAMES X2. (Z12 elementární s PIC 999) 66 Z13 RENAMES X3 THRU Y1. (nepřípustné, neboť posl. byte Y1 předchází před prvním bytem X3) 4.8. WORKING-STORAGE SECTION Sekce WORKING-STORAGE SECTION obsahuje popisy pracovních položek, které nejsou součástí žádné logické věty některého souboru. Tyto položky mají v přeloženém programu vyhrazeny úseky paměti v plné délce, přičemž adresy těchto úseků paměti se během výpočtu nemění. Počáteční obsahy těchto úseků paměti mohou být naplněny pomocí klauzulí VALUE. Ve WORKING-STORAGE SECTION lze popisovat položky dvou typů: a) Struktury, tj. položky s číslem úrovně 01 a jejich podřízené položky s čísly úrovně 02 až 49. Za každou strukturou mohou následovat ještě popisy položek s čísly úrovně 66. b) Samostatné položky s čísly úrovně 77, které nejsou součástí žádné struktury a nemají žádné nadřízené ani podřízené položky (jsou to tedy elementární položky). Samostatné položky mohou být popisovány před, mezi i za strukturami. Za kteroukoliv položkou (ať už zařazenou ve struktuře nebo samostatnou) mohou být ještě popsána podmínková jména s čísly úrovně 88. Příklad: WORKING-STORAGE SECTION. 01 A. 88 A1 VALUE SPACE. 02 B PIC 9(5) ENTRY. 02 C PIC X VALUE 'T'. 88 C1 VALUE 'H' THRU 'K'. 02 D USAGE INDEX. 66 E RENAMES C THRU D. 66 F RENAMES B THRU C. 77 G PIC 99. 88 G1 VALUE 15 37 THRU 54 83. 01 H. 02 I PIC S999 COMP OCCURS 50 DEPENDING G. 88 I1 VALUE -1. 77 J PIC S9(9) COMP. Poznámka: Úseky paměti přidělené položkám z WORKING-STORAGE SECTION budou v plné délce (!) zahrnuty do spustitelného programu. Je proto nevhodné popisovat ve WORKING-STORAGE SECTION dlouhé položky (o stovkách, tisících nebo ještě více bytech), neboť takové položky zbytečně zabírají místo na disku. Vhodnější je popsat takové položky v LINKAGE SECTION a přidělit jim úsek paměti až v průběhu výpočtu pomocí příkazu CALL 'ICUGETV'. Potřebujeme-li, aby taková položka (nebo některá její podřízená položka) měla na začátku výpočtu nějakou počáteční hodnotu, nemůžeme to pak zařídit pomocí klauzule VALUE, nýbrž musíme na začátku výpočtu provést příkaz MOVE (nebo INITIALIZE apod.): nevhodné: vhodné: WORKING-STORAGE SECTION. LINKAGE SECTION. 01 A VALUE ALL '00001'. 01 A. 02 B PIC 9(5) OCCURS 10000. 02 B PIC 9(5) OCCURS 10000. : : PROCEDURE DIVISION. PROCEDURE DIVISION. CALL 'ICUGETV' USING A. MOVE ALL '00001' TO A.