4. DATA DIVISION Oddíl DATA DIVISION obsahuje popisy všech souborů, třídících souborů, komunikačních oblastí, sestav, položek, podmínkových jmen a speciálních indexů. Dělí se do pěti sekcí: 1) FILE SECTION obsahuje pro každý soubor a pro každý třídicí soubor jeho popis FD/SD a popisy jeho logických vět (01). 2) WORKING-STORAGE SECTION obsahuje popisy pracovních položek, které mají úsek paměti přidělen pevně v přeloženém programu. 3) LINKAGE SECTION obsahuje popisy položek, jímž je skutečný úsek paměti přidělován dynamicky až v průběhu výpočtu (většinou se tyto položky používají při spojování programů). 4) COMMUNICATION SECTION obsahuje popisy komunikačních oblastí CD a popisy položek používaných při dálkovém zpracování dat. 5) REPORT SECTION obsahuje popisy sestav RD a skupin sestavy (01), které budou vytvářeny Generátorem sestav (pro položky z REPORT SECTION platí zvláštní pravidla, viz kapitola 13). Formát: DATA DIVISION. - - | FILE SECTION. | | - - | | | popis souboru FD resp. třídícího souboru SD | | | | [popis log.věty (01) a podřízených položek]...|...| - - - - - - | WORKING-STORAGE SECTION. | | [popisy pracovních položek]...| - - - - | LINKAGE SECTION. | | [popisy položek s dynamickým přidělováním paměti]...| - - - - | COMMUNICATION SECTION. | | - - | | | popis komunikační oblasti CD | | | | [popisy položek využívaných při telekomunikaci]...|...| - - - - - - | REPORT SECTION. | | - - | | | popis sestavy RD | | | | {popis skupiny sestavy (01) a podřízených pol.}...|...| - - - - Záhlaví DATA DIVISION musí být uvedeno vždy s výjimkou případu, že oddíl je prázdný, tj. že neobsahuje žádnou sekci. Jednotlivé sekce jsou však nepovinné a programátor může uvést jen ty z nich, v nichž hodlá uvést nějaký popis. Jestliže by tedy nějaká sekce měla být prázdná, není nutno zapisovat ani její záhlaví. Jednotlivé sekce je nutno ve zdrojovém programu zapisovat v tom pořadí, v jakém jsou uvedeny ve formátu. 4.1. Podřízenost položek Jednou ze základních vlastností jazyka COBOL je možnost zařazovat položky do hierarchických struktur. Základním pojmem při definování těchto struktur jsou vztahy podřízenosti a nadřízenosti mezi položkami. Každá položka má přiděleno určité číslo úrovně (viz 4.5.1.) a právě na něm jsou tyto vztahy podřízenosti a nadřízenosti založeny. O podřízenosti a nadřízenosti mluvíme pouze u položek s čísly úrovně 01 až 49, nikoliv u položek s čísly úrovně 66 nebo 77 ani u podmínkových jmen s čísly úrovně 88, které mají zvláštní určení. Je-li popsána položka s jistým číslem úrovně (01 až 49), pak jejími podřízenými položkami nazýváme ty položky, které jsou popsány za ní a to až do prvního popisu se stejným nebo s menším číslem úrovně, nejvýše však po nejbližší popis s číslem úrovně 66 nebo 77 nebo po nejbližší klauzuli FD, SD, CD resp. RD anebo po záhlaví další sekce resp. oddílu. Je-li jedna položka podřízena k druhé, pak říkáme, že tato druhá položka je nadřízena k první položce. (Z definice je vidět, že podřízená položka má vždy vyšší číslo úrovně než její nadřízená položka a že všechny položky popsané mezi nimi jsou též podřízeny ke zmíněné nadřízené položce.) Položka, která nemá žádné podřízené položky, se nazývá elementární položka. Položka, která má alespoň jednu podřízenou položku, se nazývá skupinová položka. Položka podřízená k jiné položce může mít sama další podřízené položky, tzn. může být skupinovou položkou. Položka s číslem úrovně 77 (tzv. samostatná položka) není zařazena do žádné struktury a nemá žádné nadřízené ani žádné podřízené položky; vždy je to tedy elementární položka. Položka, která nemá žádné nadřízené položky, musí mít povinně číslo úrovně 77 nebo 01. Tedy první položka popsaná na začátku kterékoliv sekce nebo po některé z klauzulí FD, SD, CD nebo RD anebo po skupině položek s čísly úrovně 66 resp. po položce s číslem úrovně 77 musí mít číslo úrovně 77 nebo 01; přitom ovšem položky s čísly úrovně 77 jsou přípustné pouze ve WORKING-STORAGE SECTION a v LINKAGE SECTION. Položku s číslem úrovně 01 spolu se všemi jejími podřízenými položkami nazýváme struktura. Položka s číslem úrovně 01 nemusí mít žádné podřízené položky, tj. může být elementární položkou. Každá elementární položka má přidělen úsek virtuální paměti o určité délce (v závislosti na jejím popisu). Až na některé výjimky (viz 4.10.) se tyto úseky pro jednotlivé elementární položky přidělují bezprostředně za sebou. Úsek paměti přidělený skupinové položce pak vznikne spojením úseků paměti všech elementárních položek, které jsou této skupinové položce podřízeny. Příklad: 01 A. 02 B. 03 C PIC XX. 03 D PIC XXX. 02 E. 04 E1 PIC 999. 04 E2. 08 AB PIC 999. 08 XYZ PIC 99. 02 CISLO PIC 999. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |-----|--------|--------|--------|-----|--------| |--C--|---D----|---E1---|---AB---|-XYZ-|--CISLO-| | | |------E2------| | |------B-------|-----------E-----------| | |-----------------------A-----------------------| Skupinová položka A je nadřízena položkám B, C, D, E, E1, E2, AB, XYZ a CISLO. Skupinová položka B je nadřízena položkám C a D. Skupinová položka E je nadřízena položkám E1, E2, AB a XYZ. Skupinová položka E2 je nadřízena položkám AB a XYZ. Položky C, D, E1, AB, XYZ a CISLO jsou elementární. Příklad: Bývá zvykem, aby všem položkám podřízeným k určité skupinové položce bez mezistupně (říkáme též: bezprostředně) bylo přiděleno stejné číslo úrovně. Povinné to však není: je přípustný i zápis uvedený vlevo (zatímco vpravo je popis téže struktury při obvyklém použití čísel úrovní): 01 K. 01 K. 04 L. 04 L. 08 M PIC X(5). 08 M PIC X(5). 06 N PIC 9. 08 N PIC 9. 05 P PIC XX. 08 P PIC XX. 03 Q PIC 999. 04 Q PIC 999. 02 R. 04 R. 11 S. 11 S. 12 T PIC X. 12 T PIC X. 03 U PIC 99. 11 U PIC 99. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |-------------------|---|-------|-----------|---|-------| |---------M---------|-N-|---P---|-----Q-----|-T-|---U---| |---------------L---------------| |-S-| | | |-----R-----| |---------------------------K---------------------------| Položky K, L, R a S jsou skupinové, položky M, N, P, Q, T a U jsou elementární. Položky L, Q a R jsou na téže hierarchické úrovni, rovněž tak položky M, N a P a rovněž tak položky S a U. Při psaní zdrojového programu nepřináší tento nestandardní způsob použití čísel úrovní žádné výhody a způsobil by zbytečnou nepřehlednost programu. Někdy však při dodatečném vkládání popisů za účelem spojení několika položek do jedné skupinové položky ušetří tento způsob zápisu vkládání několika dalších nepotřebných popisů. Poznámka: Skupinová položka v kterékoliv sekci smí mít nejvýše 2147483647 bytů. Ve FILE SECTION je ovšem maximální délka 01 omezena maximální délkou logické věty přípustnou na tom fyzickém zařízení, jemuž bude soubor při výpočtu přidělen (s přihlédnutím k případným řídícím polím připojeným k logické větě, viz 4.4.). Při překročení maximální délky logické věty přípustné pro přiřazené fyzické zařízení dojde při otevírání souboru k chybě. 4.2. Kvalifikace Pojmenujeme-li několik objektů (položek, podmínkových jmen nebo speciálních indexů) týmž jménem, musíme pak toto jméno při každém použití opatřit kvalifikací určující, o který z těchto objektů se jedná. (V určitých výjimečných případech je však i při nejednoznačném jméně kvalifikace nepovinná nebo zakázaná; viz Poznámku na konci tohoto odstavce.) Obecný formát pro jméno opatřené kvalifikací je - - | jméno-položky | - - < podmínkové-jméno > | {OF|IN} jméno-položky | ... | jméno-speciálního-indexu | - - - - - - - - | | jméno-souboru | | | {OF|IN} < jméno-třídicího-souboru > | | | jméno-komunikační-oblasti | | | | jméno-sestavy | | - - - - Vytváření kvalifikace se provádí tak, jakoby podmínkové jméno bylo podřízeno své podmínkové proměnné a jejím nadřízeným položkám, jakoby speciální index byl podřízen té položce, v jejímž popisu je definován v klauzuli OCCURS s podklauzulí INDEXED, a jejím nadřízeným položkám a jakoby položka s číslem úrovně 66 byla podřízena té položce s číslem úrovně 01, k níž patří. Na prvním místě v kvalifikační řadě stojí jméno položky, podmínkové jméno nebo jméno speciálního indexu, o které se jedná. Pak následuje jeden nebo několik kvalifikátorů, což jsou jména nadřízených položek, oddělená slovy OF nebo IN (tato slova jsou ekvivalentní). Jako kvalifikátor nejvyšší úrovně (tj. poslední v řadě) může být uvedeno pro položky z FILE SECTION jméno souboru resp. třídicího souboru, k němuž patří, pro položky z COMMUNICATION SECTION jméno komunikační oblasti, k níž patří, a pro položky z REPORT SECTION jméno sestavy, k níž patří. Kvalifikační řada musí určovat právě jeden objekt z DATA DIVISION. Význam tohoto pravidla např. při zápisu A OF B IN C OF D je tento: V celé DATA DIVISION musí existovat jediný objekt (položka, soubor, třídicí soubor, komunikační oblast, sestava, podmínkové jméno nebo speciální index) se jménem D. Toto D musí mít právě jednu podřízenou položku se jménem C. Tato položka C musí mít právě jednu podřízenou položku se jménem B. Tato položka B musí mít právě jednu podřízenou položku nebo podmínkové jméno nebo speciální index se jménem A. Celá kvalifikační řada pak určuje právě toto A. Je-li použito jméno bez kvalifikace, musí v celé DATA DIVISION existovat právě jeden objekt s tímto jménem. (Při existenci více objektů s tímto jménem bude ohlášena chyba závažnosti 1 a předpokládá se ten z těchto stejnojmenných objektů, který je popsán naposledy; příkaz resp. klauzule se však přijímá.) Tato implementace COBOLu však připouští výjimku: Jméno položky, podmínkové jméno nebo jméno speciálního indexu se smí shodovat s kterýmkoliv jménem souboru, třídicího souboru, komunikační oblasti nebo sestavy. Takové jméno může být používáno bez kvalifikace a bude vždy správně interpretováno (dle kontextu) s výjimkou příkazů CALL, UFO, MATCH a GENERATE, kdy se bude hlásit chyba zmíněná výše. Takovéto nejednoznačné jméno navíc nesmí být použito jako kvalifikátor nejvyšší úrovně. Jména položek s čísly úrovně 01 a 77 z WORKING-STORAGE SECTION nebo z LINKAGE SECTION nemohou být opatřena žádnou kvalifikací a proto se nesmí shodovat se jménem žádného jiného objektu z DATA DIVISION s výjimkou jmen souborů, třídicích souborů, komunikačních oblastí a sestav. Jednoznačnost jmen se kontroluje až při použití; proto položky (resp. jiné objekty), které nejsou nikde použity, nemusí mít jednoznačná jména (resp. jména, která mohou být učiněna jednoznačnými pomocí vhodné kvalifikace). Jména položek, podmínková jména a jména speciálních indexů (jakož i jména souborů, třídicích souborů, komunikačních oblastí a sestav) se smí shodovat se jmény procedur (sekcí a paragrafů) nebo se speciálními jmény. Při kvalifikaci není nutné uvádět všechny nadřízené položky, pokud lze zajistit jednoznačnost uvedením jen některých z nich. Je dovoleno použít nadbytečnou kvalifikaci pro položku, jejíž jméno je již samo o sobě jednoznačné. Příklad: 01 CLOVEK 02 JMENO PIC X(20). 02 NAROZENI. 04 DATUM. 07 DEN PIC 99. 07 MESIC PIC 99. 07 ROK PIC 9999. 04 MISTO PIC X(10). 02 UMRTI. 05 DATUM. 06 DEN PIC 99. 06 MESIC PIC 99. 06 ROK PIC 9999. 05 MISTO PIC X(10). Správně: ROK OF NAROZENI DEN IN UMRTI DATUM OF NAROZENI MISTO OF UMRTI MESIC OF DATUM OF UMRTI ("OF DATUM" je nadbytečné) DEN IN DATUM OF NAROZENI OF CLOVEK ("IN DATUM" a "OF CLOVEK" jsou nadbytečné) JMENO IN CLOVEK ("IN CLOVEK" je nadbytečné) Chybně: ROK OF DATUM (jméno DATUM se vyskytuje v DATA DIVISION více než jednou) ROK IN DATUM OF CLOVEK (položka CLOVEK má dvě podřízené položky se jménem DATUM) ROK OF CLOVEK (položka CLOVEK má dvě podřízené položky se jménem ROK) Příklad: 01 A. 02 B. 03 C PIC X. 03 A. 04 C PIC 9. Předpokládejme, že v celé DATA DIVISION není popsán žádný jiný objekt se jménem B. Pak zápis "C OF A OF B" je správný, neboť při postupu kvalifikační řadou zprava doleva zjistíme, že položka B má jednoznačné jméno, že má právě jednu podřízenou položku A (s číslem úrovně 03) a že tato položka A má právě jednu podřízenou položku C (s číslem úrovně 04). Zápis "A OF B" je také správný a znamená položku A s číslem úrovně 03. Jméno položky B je možno (a dokonce nutno) používat bez kvalifikace; zápis "B OF A" by byl dokonce chybný. Všechny ostatní možné zápisy (ať už s kvalifikací nebo bez ní) jsou chybné; proto jména položek A (s číslem úrovně 01) a C (s číslem úrovně 03) nemohou být žádnou kvalifikací určena jednoznačně a nesmí být tedy nikde používána. Poznámka: Nejednoznačná jména a z toho vyplývající povinné kvalifikace prodlužují zápisy a činí program nepřehledným. Proto by měl uživatel používat nejednoznačná jména jen tehdy, potřebuje-li použít příkazy s CORRESPONDING (viz 6.10.) anebo vzniknou-li tato jména při kopírování popisů logických vět příkazem COPY. Poznámka: Z výše uvedených obecných pravidel existují následující výjimky, kdy i při nejednoznačném jméně je kvalifikace nepovinná nebo zakázaná: a) V klauzuli REDEFINES a v podklauzulích ASCENDING, DESCENDING a INDEXED klauzule OCCURS je kvalifikace zakázaná a při uvedení se ignoruje (hlásí se přitom chyba závažnosti 1). b) Pro položky uvedené v klauzuli RENAMES stačí jednoznačnost uvedeného jména resp. uvedené kvalifikace v rámci předcházející struktury 01, nevyžaduje se jednoznačnost v rámci celé DATA DIVISION. c) Pro jméno skupiny uvedené v podklauzuli UPON klauzule SUM stačí jednoznačnost v rámci příslušné sestavy RD. d) Je-li sumátor nebo některá z položek PAGE-COUNTER, LINE-COUNTER nebo CBL-CTR použita jako argument v klauzuli SOURCE nebo SUM v rámci téže sestavy, k níž tento argument patří, není třeba uvádět kvalifikaci, i kdyby v jiné sestavě (nikoliv však v ostatních sekcích DATA DIVISION) existovala stejnojmenná položka. e) U třídicích klíčů uvedených v klauzulích ASCENDING a DESCENDING v příkazu SORT nebo MERGE stačí jednoznačnost v rámci položek patřících k příslušnému třídicímu souboru. f) Je přípustné uvést nejednoznačné jméno položky bez kvalifikace resp. s nejednoznačnou kvalifikací, pokud všechny položky vyhovující uvedenému zápisu označují týž úsek paměti a mají přesně stejné popisy (až na číslo úrovně a klauzule REDEFINES, SYNCHRONIZED, VALUE, ENTRY, EXTRN, ASCENDING/DESCENDING a INDEXED), přičemž se nejedná o skupinovou položku uvedenou v některém příkazu s klauzulí CORRESPONDING nebo uvedenou jakožto příjmová položka v příkazu INITIALIZE ani o argument při volání podprogramu ICVERIF ani o položku uvedenou za SEARCH (ALL) ani o položku s proměnnou délkou nebo o položku ležící ve struktuře za položkou s OCCURS DEPENDING. Přitom nejednoznačnost se smí týkat pouze prvního jména v kvalifikační řadě; jména kvalifikátorů musí být jednoznačná. (Tato výjimka je vhodná např. pro třídicí klíče, RECORD-položky, společné části několika 01 patřících k témuž souboru resp. třídicímu souboru atd.) 4.3. Indexování Má-li položka klauzuli OCCURS anebo je-li podřízena položce s klauzulí OCCURS, pak při každém použití této položky (s výjimkou použití v klauzuli REDEFINES, v podklauzuli ASCENDING/DESCENDING klauzule OCCURS a v příkazech SEARCH, INITIALIZE, CALL 'ICSORT', CALL 'ICSORTM' a CALL 'ICSORTP') je nutno použít indexování. Je nutno uvést právě tolik indexů, kolik klauzulí OCCURS je uvedeno u všech nadřízených položek včetně naší položky samé. Seznam indexů se uvádí v kulatých závorkách, a to za jménem položky (není-li uvedena kvalifikace) resp. až za posledním kvalifikátorem (je-li uvedena též kvalifikace, viz 1.5.). Je-li uvedeno více indexů, pak první z nich se vztahuje ke klauzuli OCCURS u nejdříve popsané položky ("nejnadřízenější", "vnější", "hierarchicky nejvyšší") atd., až poslední z indexů se vztahuje ke klauzuli OCCURS u nejpozději popsané položky ("nejpodřízenější", "vnitřní", "hierarchicky nejnižší"). Má-li sama indexovaná položka ve svém popisu klauzuli OCCURS, vztahuje se k její klauzuli OCCURS tedy vždy poslední uvedený index. Obecný formát pro kterýkoliv z indexů je - - - - - - | I | | | I | | < k > | {ń} < k > | ... | c * I | | | c * I | | - - - - - - Zde c a k značí celá čísla bez znaménka. I značí buďto speciální index (viz 4.5.9.3.) anebo celočíselnou numerickou položku (viz 4.5.3.) resp. položku s USAGE INDEX (viz 4.5.5.F). Je-li I položka, nesmí mít indexy (tj. nesmí být podřízena položce s klauzulí OCCURS ani mít sama klauzuli OCCURS) a nesmí být popsána v rámci 01 za položkou s klauzulí OCCURS DEPENDING; smí však mít uvedenu kvalifikaci. Před operátory +, - a * ani za nimi nemusí být mezery, lze tedy psát I + 1 i I+1, 2 * K + 3 i 2*K+3, I - 1 i I- 1 i I -1; nelze však psát bez mezer I-1, A-B, 20-I apod., protože by překladač předpokládal jediné jméno s pomlčkou (viz 1.10.). Jednotlivé indexy lze oddělovat mezerami, čárkami nebo středníky, přičemž všechny tyto způsoby jsou rovnocenné. Příklad: Správně: (typ k) 2, 1000000, 0 (typ I) I, J, POCET, TALLY, K OF VSTUP, ALFA OF T5 IN SW (typ c*I) 3*K, 17 * POCET OF MATERIAL OF FAKTURA (typ Ińk) I+4, I - 4, UKAZ - 1000, J OF B IN A + 57 (typ kńI) 4+I, 20 - J, 0 - HODNOTA OF V10 (typ IńI) I+J, I - J, ALFA + BETA, A OF B - C IN D (typ kńk) 5+3, 5 - 3, 3 - 5, 0 - 5, 5 + 0 (může mít smysl při nahrazování původního slova celým číslem při použití pseudopříkazu COPY s klauzulí REPLACING nebo pseudopříkazu REPLACE, dále též při potřebě záporného číselného indexu) (typ c*Ińk) 3*I+20, 3*I - 20 (typ kńc*I) 20+3*I, 20 - 3*I, 0 - 3*I, 20 - 3 * I OF POLE (typy Ińc*I, c*IńI, c*Ińc*I) I+3*J, I - 3*J, 3*J+I, 3*J - I, 3*I+4*J, 3 * I + 4 * J, 3*I - 4*J (složitější typy) I+J+K+L+M+N, I+J+K - 5, 0 - 3*I - 20, 3*I+4*J - K - 5 - 7*M+N+12 Chybně: -5, - 5, -3*I, - 3*I, -20 - 3*I, - 20 - 3*I (jsou však správné zápisy 0 - 5, 0 - 3*I, 0 - 20 - 3*I, viz výše), +5, + 5, 3.0, 3.E0, K*3 (nutno psát 3*K), I*J, K/2, K**2, I(1), I(J), I+1.5. Význam (názorně): Index určuje pořadí položky v příslušném poli, určeném klauzulí OCCURS. První položce celého pole odpovídá pořadí 1. U celého čísla a u celočíselné numerické položky je pořadí rovno hodnotě, u speciálního indexu je pořadí definováno v 4.5.9.3., položka s USAGE INDEX se zpracovává jako speciální index s touž hodnotou. Uvedením "c *" se pořadí vynásobí celým číslem c. Má-li index tvar součtu nebo rozdílu prvků typu I, k a c*I, je pořadí rovno součtu resp. rozdílu jednotlivých pořadí odpovídajících těmto prvkům. (Takže "+ k" zvětší pořadí o číslo k, "- k" zmenší pořadí o číslo k apod.) Význam (přesně): Uvedeme zde algoritmus pro určení adresy položky opatřené jedním nebo několika indexy, a to i pro situace, na něž nelze uplatnit výše uvedenou názornou definici (při nekladném nebo příliš velkém indexu, při speciálním indexu s hodnotou nedělitelnou příslušnou délkou atd.): Nejprve určíme adresu prvního prvku celé tabulky, tj. adresu položky se všemi indexy rovnými 1. Pak postupně pro všechny uvedené indexy provedeme následující výpočty: a) Určíme délku d té položky, která se vzhledem k tomuto indexu opakuje (tzn. v jejímž popisu je uvedena klauzule OCCURS odpovídající tomuto indexu), a tuto délku d odečteme od adresy. Pak pro každou ze složek indexu (rozlišujeme 6typů složek: k resp. +k, I resp. +I, c*I resp. +c*I, -k, -I, -c*I) provedeme patřičný z následujících výpočtů b, c, d: b) Je-li index resp. složka indexu typu k (+k) nebo -k, přičteme k adrese číslo k*d resp. -k*d. c) Nechť I je celočíselná numerická položka s hodnotou t. Je-li index resp. složka indexu typu I (+I) nebo -I nebo c*I (+c*I) nebo -c*I, přičteme k adrese číslo t*d nebo -t*d nebo c*t*d nebo -c*t*d. d) Nechť I je speciální index nebo položka s USAGE INDEX s hodnotou t. Je-li index resp. složka indexu typu I (+I) nebo -I nebo c*I (+c*I) nebo -c*I, přičteme k adrese číslo t+d nebo -t-d nebo c*(t+d) nebo -c*(t+d). (Takto se postupuje i tehdy, když je speciální index I definován v jiné klauzuli OCCURS třeba i u položky s délkou různou od d, nebo není-li jeho hodnota dělitelná číslem d anebo je-li záporná atd. Je-li speciální index I definován u položky s délkou rovnou d a je-li jeho hodnota dělitelná číslem d - a tak je tomu prakticky vždy - odpovídá dle 4.5.9.3. této hodnotě t pořadí t/d+1. Pak uvedená čísla jsou rovna číslům uvedeným v bodě c pro celočíselnou položku, dosadíme-li místo hodnoty položky t pořadí odpovídající speciálnímu indexu t/d+1.) Poznámka: Není požadováno ani kontrolováno, aby pořadí určené indexem (ať je vyjádřen jakýmkoliv způsobem) bylo kladné a aby nepřesáhlo celé číslo uvedené v klauzuli OCCURS (případně hodnotu položky uvedené v podklauzuli DEPENDING). Pokud se tak stane, pracuje se s polem tak, jako kdyby bylo prodlouženo na obě strany do nekonečna. Tato situace vzniká sice zpravidla v důsledku chyby, ale může být též záměrně využita. (Např. lze pomocí indexu 0 ukázat na položku stojící bezprostředně před první položkou pole anebo pomocí velkých indexů ukázat na položky a pole umístěné za naším polem apod.) Příklad: 01 KNIHA. 02 KAPITOLA OCCURS 10. 03 ODSTAVEC OCCURS 5. 04 VETA PIC X(10) OCCURS 4. Chceme-li pracovat s druhou větou ve třetím odstavci páté kapitoly, zapíšeme: VETA (5 3 2) nebo VETA(5,3,2) apod. Chceme-li pracovat s I-tým odstavcem třetí kapitoly, zapíšeme: ODSTAVEC (3 I). Při současném použití kvalifikace i indexů zapíšeme např.: VETA IN KAPITOLA OF KNIHA (J, 2, K OF Y). Následující zápisy by byly chybné: ODSTAVEC (3 I) OF KAPITOLA IN KNIHA ... chybné!!! VETA (2) OF ODSTAVEC (L) IN KAPITOLA (6) ... chybné!!!