4.4. FILE SECTION Pro každý soubor (jenž může leč nemusí být předem deklarován v paragrafu FILE-CONTROL klauzulí SELECT) musí být v sekci FILE SECTION uvedena klauzule FD zvaná popis souboru, která udává některé další vlastnosti souboru. Za ní pak musí následovat popisy logických vět 01 tohoto souboru (při uvedení podklauzule REPORT nebo REPORTS lze popisy 01 vynechat). Pro každý třídicí soubor (jenž může leč nemusí být předem deklarován v paragrafu FILE-CONTROL klauzulí SELECT) musí být v sekci FILE SECTION uvedena klauzule SD zvaná popis třídicího souboru, která udává některé další vlastnosti třídicího souboru. Za ní pak povinně následují popisy logických vět 01 tohoto třídicího souboru. Kromě popisů souborů, třídicích souborů a jim příslušných logických vět 01 nesmí sekce FILE SECTION obsahovat žádné jiné popisy ani jiné klauzule. Popisem logické věty pro soubor resp. třídicí soubor se rozumí popis struktury (tj. popis položky s číslem úrovně 01 a jejích případných podřízených položek), jenž musí následovat za příslušnou klauzulí FD resp. SD ve FILE SECTION. Takováto položka s číslem úrovně 01 určuje úsek paměti, do něhož se načítají a z něhož se zapisují logické věty souboru dat; určuje tedy vlastně délku a strukturu logických vět souboru dat. Proto se také (nehrozí-li nebezpečí omylu) těmto položkám s čísly úrovně 01 někdy říká "logické věty souboru"; je-li však třeba hovořit přesně a rozlišovat položku (tj. popis s číslem úrovně 01 resp. úsek paměti tomuto popisu odpovídající) a logickou větu souboru dat (tj. část souboru dat na vnějším médiu), nazýváme tyto položky stručně "01". Pravidla: 1) Za každou klauzuli FD resp. SD musí následovat alespoň jeden popis logické věty (01). Výjimku tvoří pouze klauzule FD s podklauzulí REPORT resp. REPORTS, za níž nemusí následovat žádný popis logické věty (01). 2) K určitému souboru resp. třídicímu souboru patří všechny logické věty (01), jejichž popisy jsou uvedeny mezi jeho popisem FD resp. SD a první následující klauzulí FD/SD (u posledního FD/SD až do konce FILE SECTION). Popis první logické věty (01) patřící k určité klauzuli FD/SD musí být tedy uveden bezprostředně za touto klauzulí FD/SD. 3) Logická věta souboru (01) bývá sice většinou skupinovou položkou, smí však být i elementární položkou, tj. nemusí mít žádné podřízené položky. 4) V praxi většinou každá 01 odpovídá jednomu typu logických vět souboru dat. Je-li za klauzulí FD/SD uvedeno více popisů logických vět (01), znamená to obvykle, že tento soubor resp. třídicí soubor má logické věty různých typů (různých délek nebo různých struktur). 5) Úseky paměti odpovídající jednotlivým 01 patřícím k téže klauzuli FD/SD začínají vždy na stejné adrese a tedy se ve své společné části překrývají (vlastně se u nich implicitně předpokládá klauzule REDEFINES; právě proto se explicitně uvedená klauzule REDEFINES ignoruje). Do tohoto společného úseku paměti umístí systém vstupu/výstupu při provádění příkazu READ přečtenou logickou větu souboru dat. Obráceně před zápisem nebo opravou logické věty musí uživatel do tohoto společného úseku paměti umístit novou resp. opravenou logickou větu a pak ji předat systému vstupu/výstupu příkazem WRITE nebo REWRITE. 6) Pořadí, v němž jsou pro jednotlivé soubory a třídicí soubory uvedeny klauzule FD/SD následované popisy logických vět (01), nemusí být shodné s pořadím odpovídajících klauzulí SELECT v paragrafu FILE-CONTROL; doporučujeme však bez vážných důvodů toto pořadí neměnit. 7) S logickými větami (01) popsanými za FD a s jejich podřízenými položkami je přípustné pracovat až po otevření souboru příkazem OPEN (u vstupních sekvenčních souborů doporučujeme kvůli kompatibilitě dokonce až po provedení prvního příkazu READ, viz 4.4.7.) a nejvýše do uzavření souboru příkazem CLOSE (u vstupních sekvenčních souborů doporučujeme kvůli kompatibilitě nejvýše do uplatnění klauzule AT END). Před OPENem (resp. před prvním READem) a rovněž tak po CLOSE nemají 01 popsané za FD přidělenou adresu (přesněji: mají přidělenu adresu 0) a proto jakýkoliv pokus do nich nebo do jejich podřízených položek něco poslat může způsobit havárii výpočtu. Totéž platí i pro 01 popsané za SD, s nimiž lze pracovat výhradně během činnosti příkazu SORT nebo MERGE, a to nejvýše do uplatnění klauzule AT END v příkazu RETURN (v praxi ovšem prakticky vždy i mezi uplatněním klauzule AT END a koncem činnosti příkazu SORT resp. MERGE). 8) Položky z FILE SECTION mohou být považovány za speciální případ položek z LINKAGE SECTION; vše, co je v 4.9. uvedeno o vlastnostech položek z LINKAGE SECTION a o způsobech práce s nimi, platí i pro položky z FILE SECTION. Navíc ovšem oproti položkám z LINKAGE SECTION je položkám z FILE SECTION přidělován skutečný úsek paměti (tj. je dosazována adresa tohoto úseku do přiděleného ukazatele) při provádění příkazů OPEN, READ, WRITE, CLOSE, MATCH, SORT, MERGE atd. Budiž výslovně zdůrazněno, že ve všech příkazech a klauzulích, kde je povoleno uvést položku z LINKAGE SECTION s číslem úrovně 01 nebo 77 (argument příkazu ENTRY resp. záhlaví PROCEDURE DIVISION USING, argument "/ položka" v příkazu CALL, druhá položka za GIVING v klauzuli USE AFTER ERROR PROCEDURE, druhý argument v příkazu LOAD, první argument při volání podprogramů ICUGETV, ICUFREE, ICVIRG, ICVIRF a ICIDENT; viz 4.9., bod 5) lze uvést též položku z FILE SECTION s číslem úrovně 01 v témže významu: do ukazatele přiděleného 01 z FILE SECTION se tedy dosadí adresa příslušného úseku paměti, čímž se tato 01 s tímto úsekem paměti ztotožní. (Položka z FILE SECTION však nemůže mít klauzuli EXTRN.) V COBOLu MX platí, že příkaz OPEN dynamicky zřídí pracovní oblast o příslušné délce a její adresu (při RECORDING U nebo V zvětšenou o 2 byty) uloží do přiděleného ukazatele. Příkazy READ, WRITE a REWRITE využívají vždy okamžitou hodnotu ukazatele. Příkaz CLOSE uvolní paměťovou oblast dle okamžité hodnoty ukazatele a tento ukazatel vynuluje, čímž zruší dosavadní ztotožnění. Provede-li uživatel ztotožnění 01 i všechny akce využívající tohoto ztotožnění před otevřením souboru nebo po uzavření souboru, nedochází k žádným komplikacím. Uživatel smí provést ztotožnění 01 kdykoliv (i vícekrát) i u otevřeného souboru a od okamžiku ztotožnění budou až do případné nové změny všechny následující příkazy READ, WRITE, REWRITE a CLOSE pro tento soubor pracovat s úsekem paměti začínajícím na zadané adrese (při RECORDING V nebo U musí tedy uživatel reservovat 2 byty před začátkem tohoto úseku pro délku logické věty). Příkaz READ tedy bude ukládat přečtenou logickou větu počínaje uživatelem zadanou adresou a příkazy WRITE a REWRITE budou počínaje touto adresou vybírat logickou větu, kterou budou zapisovat. Příkaz CLOSE se ovšem bude pokoušet (po odečtení 2 bytů při RECORDING V nebo U) tento úsek uvolnit, což by v případě nevhodného úseku mohlo způsobit havárii. Uživatel, jenž hodlá hodnotu ukazatele přiděleného 01 z FILE SECTION měnit v době, kdy je příslušný soubor otevřen, by tedy měl posoudit, zda není potřebné původní obsah tohoto ukazatele uschovat a před provedením příkazu CLOSE zase obnovit. (Jednotlivé implementace COBOLu se zde ovšem značně odlišují, proto doporučujeme používat takovéto obraty jen s maximální opatrností.) Příklad: FILE-CONTROL. SELECT ALFA ... SELECT BETA ... SELECT ALZBETA ... : FILE SECTION. FD ALFA ... 01 A1. 02 A11 PIC X(20). 02 A12 PIC 9(5). 01 A2 PIC X(80). SD BETA ... 01 B1. 02 B11 PIC 9(5). 02 PIC X(95). FD ALZBETA ... 01 C1 PIC X(200). 01 C2. 02 C21 PIC 9(5) OCCURS 40. 01 C# PIC X(80). 4.4.1. Formát klauzule FD Formát: FD jméno-souboru [ RECORDING MODE IS { F | V | U } ] [ RECORD CONTAINS [celé-č-1 TO] celé-č-2 CHARACTERS ] [ VALUE OF FILE-ID IS { alf.literál | položka } ] [ { REPORT IS | REPORTS ARE } jméno-sestavy ... ] [ LINAGE IS { celé-číslo | celočíselná-položka } LINES [ WITH FOOTING AT { celé-číslo | celočís.položka } ] [ LINES AT TOP { celé-číslo | celočís.položka } ] [ LINES AT BOTTOM { celé-číslo | celoč.položka } ] ] [ BLOCK slovo ... ] [ LABEL slovo ... ] [ DATA slovo ... ]. Pravidla: 1) Klauzule FD musí být ukončena tečkou, její jednotlivé podklauzule však tečkami odděleny být nesmí. 2) Klauzule RECORDING, RECORD, VALUE, REPORT resp. REPORTS, LINAGE, BLOCK, LABEL a DATA mohou být uvedeny v libovolném vzájemném pořadí. 3) Klauzule BLOCK, LABEL a DATA jsou přijímány pouze kvůli kompatibilitě a považují se jen za poznámky. Jejich tvar smí být libovolný, jejich správnost není kontrolována. 4) Jméno-souboru uvedené za slovem FD smí být výhradně některé ze jmen souborů deklarovaných klauzulemi SELECT v paragrafu FILE-CONTROL. 5) Součet délek všech jmen a literálů uvedených v klauzuli FD (jedná se o jméno-souboru a jména a literály uvedené v klauzulích VALUE, REPORT/REPORTS a LINAGE) zvětšený o trojnásobek jejich počtu nesmí přesáhnout 236 bytů. 4.4.2. Klauzule RECORDING Formát: RECORDING MODE IS { F | V | U } Funkce: Klauzule RECORDING určuje formát logických vět souboru. Existují dva různé formáty logických vět, přičemž v jednom souboru dat musí mít všechny logické věty týž formát: a) RECORDING F (fixed = pevný formát) znamená, že všechny logické věty souboru dat mají touž délku, přičemž logickým větám nepředcházejí žádná řídicí pole s délkami. b) RECORDING V (variable = proměnný formát) a RECORDING U (undefined = nedefinovaný formát) jsou zcela ekvivalentní (RECORDING U se přijímá pouze z historických důvodů) a znamenají, že logické věty mají obecně různé délky, přičemž před každou logickou větou předchází dvoubytové řídicí pole obsahující binárně délku logické věty včetně tohoto řídicího pole (tzn. délku textu zvětšenou o 2). Toto řídicí pole délky není součástí 01 tohoto souboru (je umístěno bezprostředně před prvním bytem 01, na nějž ukazuje ukazatel přidělený souboru pro úschovu adresy jeho 01), uživatel je nepopisuje, nenaplňuje ani nedostává k dispozici; veškerou práci s tímto řídicím polem za něj provádí operační systém. Pravidla: 1) Není-li v FD klauzule RECORDING vůbec uvedena, je to vždy ekvivalentní s uvedením RECORDING F (a to i v případě, že pro soubor je uvedeno několik 01 s různými délkami, kdy se sice hlásí chyba, přesto se však přijímá RECORDING F). 2) Volby RECORDING F (resp. vynechání klauzule RECORDING) i RECORDING V (resp. U) jsou přípustné u všech typů souborů (sekvenčního, indexového i relativního). Při zpracování již existujícího souboru dat je ovšem prakticky nezbytné uvádět stejnou volbu RECORDING, jaká byla zadána při vytváření tohoto souboru a podle níž byl tedy tento soubor dat na médiu vytvořen. 4) Je-li uvedeno RECORDING F (resp. je vynechána klauzule RECORDING) a přitom není uvedena klauzule RECORD (viz 4.4.3.), musí mít všechny popsané 01 souboru stejné délky. Přitom u 01 s proměnnou délkou (tj. mající podřízené položky s OCCURS DEPENDING) se při tomto srovnávání délek uvažuje její maximální délka odpovídající horním hranicím v klauzulích OCCURS DEPENDING. 5) Je-li uvedeno RECORDING F (resp. je vynechána klauzule RECORDING) a přitom je uvedena klauzule RECORD, vyžaduje se stejná délka pouze u všech 01, které mají pevnou délku. Maximální délky 01 s proměnnou délkou mohou být i jiné (viz 4.4.3.). 4.4.3. Klauzule RECORD Formát: RECORD CONTAINS [celé-číslo-1 TO] celé-číslo-2 CHARACTERS Funkce: Klauzule RECORD zadává délku logických vět souboru pro kontrolu a pro dokumentaci, ve výjimečných případech i pro zpracování (viz dále). Celé-číslo-2 musí být kladné a nesmí přesáhnout 32767 (při RECORDING V resp. U 32765). Je-li uvedena i volba "celé-číslo-1 TO", musí být celé-číslo-1 <= celé-číslo-2. Není-li volba "celé-číslo-1 TO" uvedena, předpokládá se pro další výpočty a kontroly celé-číslo-1 = celé-číslo-2 (tedy např. "RECORD 100" je ekvivalentní s "RECORD 100 TO 100"). Pravidla: 1) Při uvedení RECORDING F (a též při neuvedení klauzule RECORDING) buďto nesmí být volba "celé-číslo-1 TO" vůbec uvedena anebo musí být celé-číslo-1 = celé-číslo-2. 2) Je-li uvedena klauzule RECORD, využívá se jí pro kontrolu délek 01 souboru: a) Při RECORDING F musí všechny popsané 01 s pevnou délkou (tzn. které nemají podřízené s OCCURS DEPENDING) mít touž délku rovnou celé-číslo-2 bytů. Pro 01 s proměnnou délkou se žádná kontrola neprovádí, jejich délky smí být jakékoliv. b) Při RECORDING V resp. U musí být délka každé popsané 01 s pevnou délkou větší nebo rovna celému-číslu-1 a menší nebo rovna celému-číslu-2. Pro 01 s proměnnou délkou se žádná kontrola neprovádí. Při nesplnění těchto požadavků se hlásí chyba závažnosti 1, nicméně výpočet parametru RECSIZE pro tabulku souboru (viz dále) se tím nijak neovlivní; délky popsaných 01 mají při výpočtu tohoto parametru přednost před klauzulí RECORD. 3) Překladač dle dále uvedených pravidel vypočítává a dosazuje do tabulky souboru tzv. parametr RECSIZE, jímž oznamuje systému vstupu/výstupu délku logických vět souboru. Při RECORDING V resp. U přitom ještě přičte k takto vypočítanému číslu ještě 2 byty pro řídicí pole délky logické věty: a) Není-li uvedena klauzule RECORD, bude RECSIZE rovno maximu z délek všech 01 souboru; přitom u 01 s proměnnou délkou se uvažuje její maximální délka odpovídající horním hranicím v klauzulích OCCURS DEPENDING. b) Je-li uvedena klauzule RECORD a všechny 01 souboru mají pevné délky, bude RECSIZE rovno maximu délek všech 01 souboru stejně jako v případě a); klauzule RECORD se zde nijak neuplatní. c) Je-li uvedena klauzule RECORD a alespoň jedna 01 souboru má proměnnou délku, bude RECSIZE rovno maximu z délek všech 01 s pevnou délkou (jsou-li nějaké) a z celého-čísla-2. (Celé-číslo-2 zde vlastně zastupuje všechny 01 souboru s proměnnou délkou. Mají-li všechny 01 souboru proměnné délky, bude RECSIZE rovno právě celému-číslu-2.) 5) Parametr RECSIZE má tento význam: a) Při RECORDING F znamená RECSIZE skutečnou pevnou délku všech logických vět, které se budou zpracovávat. Při výstupu budou mít všechny zapisované logické věty přesně RECSIZE bytů. Při vstupu se ze vstupního souboru dat "ukrojí" pro každý READ logická věta o délce přesně RECSIZE bytů. (I v případě, že při vytváření souboru bylo RECSIZE jiné nebo bylo dokonce RECORDING V resp. U. Takovouto možnost by měl uživatel využívat jen výjimečně a s maximální opatrností, přičemž se nesmí jednat o indexový soubor.) b) Při zpracování již existujícího indexového souboru s RECORDING F musí být parametr RECSIZE stejný jako při vytváření tohoto souboru dat. c) Při RECORDING V resp. U určuje RECSIZE jen délku úseku paměti, jenž bude vyhrazen pro zpracování logických vět tohoto souboru. Žádná zpracovávaná logická věta nesmí mít větší délku, neboť jinak by došlo k přemazání následujících bytů paměti. (Obzvláště pozor u 01 s proměnnou délkou: 01 nesmí získat větší délku než RECSIZE ani při zpracovávání pomocí jiných příkazů než WRITE, jako např. při MOVE apod.) 6) Do celého-čísla-1 i do celého-čísla-2 musí uživatel samozřejmě započítat i případné výplňkové byty patřící k 01 (viz 4.10.). Nesmí však započítat délku dvoubytového řídicího pole délky logické věty při RECORDING V resp. U, neboť tyto dva byty místo něj připočítává překladač. 7) Maximální hodnota parametru RECSIZE vypočítaná dle bodu 3 (při RECORDING V resp. U zvětšená o 2 byty pro řídicí pole délky) smí být nejvýše 32767 bytů. V případě, že soubor dat je umístěn na médiu s menší maximální přípustnou délkou logické věty, je ovšem třeba respektovat přísnější omezení odpovídající tomuto médiu. Poznámka: Uvedení klauzule RECORD má praktický význam v těchto případech: a) Přeje-li si uživatel, aby překladač provedl kontrolu, zda je délka popsané 01 rovna určitému číslu (resp. leží v určitém rozmezí), a tedy zda v popisu 01 omylem něco nepřidal nebo nevynechal (resp. neuvedl jiné USAGE apod.). Tato kontrola má ovšem význam především tehdy, když všechny popsané 01 s pevnou délkou mají mít touž délku, jak je tomu vždy při RECORDING F. b) Přeje-li si uživatel, aby se mu do RECSIZE nezapočítávaly maximální délky 01 s proměnnou délkou - například když ví, že při výpočtu bude skutečná délka těchto 01 vždy menší než maximální možná délka (viz příklad). c) U souboru, který má v FD klauzuli REPORT resp. REPORTS, lze klauzulí RECORD zadat délku umělé 01, která bude používána Generátorem sestav, tj. délku vytvářeného řádku (viz 4.4.6.). V ostatních případech je uvádění klauzule RECORD zbytečné (leda snad kvůli dokumentaci), neboť parametr RECSIZE bude překladačem vypočítán na základě popisů 01 dle bodu 3a nebo 3b bez využití klauzule RECORD. Příklad: Škola má nejvýše 500 žáků. Denně se zapisuje logická věta s tímto popisem: 01 SKOLA. 02 POCET-PRITOMNYCH PIC S999 COMP. 02 POCET-NEPRITOMNYCH PIC S999 COMP. 02 JMENA-PRITOMNYCH PIC X(10) OCCURS 0 TO 500 DEPENDING ON POCET-PRITOMNYCH. 02 JMENA-NEPRITOMNYCH PIC X(10) OCCURS 0 TO 500 DEPENDING ON POCET-NEPRITOMNYCH. Maximální možná délka položky SKOLA dle popisu je 10004 bytů. Uživatel však ví, že součet položek POCET-PRITOMNYCH a POCET-NEPRITOMNYCH je nejvýše 500 a že tedy skutečná délka položky SKOLA je nejvýše 5004 bytů. Při neuvedení klauzule RECORD by překladač vypočítal dle bodu 3a RECSIZE=10004, takže by systém vyhradil pro 01 souboru zbytečně velký úsek paměti a navíc by v případě RECORDING F zapisoval logické věty o zbytečně velké délce 10004 bytů. Uvede-li však uživatel v FD klauzuli "RECORD CONTAINS 5004 CHARACTERS" resp. "RECORD 5004", vypočítá překladač dle bodu 3c RECSIZE=5004, takže systém pak vyhradí pro 01 souboru pouze 5004 bytů a v případě RECORDING F zapisuje logické věty o délce pouze 5004 bytů. 4.4.4. Klauzule VALUE OF FILE-ID Formát: VALUE OF FILE-ID IS { alf.literál | položka } Funkce: Klauzule VALUE OF určuje za určitých okolností fyzické jméno souboru. Poznámky: a) Je-li uvedena klauzule VALUE OF a klauzule SELECT určuje fyzické jméno tak, že se má použít jméno za SELECT, uplatní se přednost klauzule VALUE OF a jako fyzické jméno se použije to, které je v ni ve formě alfanumerického literálu uvedeno. b) Je-li v klauzuli SELECT určeno fyzické jméno souboru jiným způsobem, než je uvedeno v bodě a), platí jako fyzické jméno souboru to, určené klauzulí SELECT a klauzule VALUE OF se ignoruje. Příklad: SELECT A ASSIGN TO DISK. . . FD A VALUE OF FILE-ID "/usr/data/f1.dat". Klauzule SELECT určuje jako fyzické jméno A, což je slovo za SELECT, uplatní se tedy přednostně klauzule VALUE OF a jako fyzické jméno souboru se použije /usr/data/f1.dat. SELECT A ASSIGN TO "kmen" ORGANIZATION INDEXED. . . FD A VALUE OF FILE-ID "cosi". Klauzule SELECT určuje jako fyzické jméno kmen, což ale není slovo za SELECT, klauzule VALUE OF se v tomto případě neuplatní a jako fyzické jméno souboru se použije kmen. 4.4.5. Klauzule LINAGE Formát: LINAGE IS { celé-číslo-1 | celočíselná-položka-1 } LINES [ WITH FOOTING AT { celé-číslo-2 | cel.položka-2 } ] [ LINES AT TOP { celé-číslo-3 | celočís.položka-3 } ] [ LINES AT BOTTOM { celé-číslo-4 | cel.položka-4 } ] Funkce: Klauzule LINAGE se používá ke stanovení formátu logické stránky a k vertikálnímu umístění řádků na stránce při výstupu do sekvenčního souboru. Sekvenční soubor, pro která je uvedena klauzule LINAGE se tím pádem stává textovým sekvenčním souborem (viz 3.4.4.A). Logické stránky, definované pomocí klauzulí LINAGE jsou pochopitelně většinou určeny pro přímý výstup na tiskárnu, lze je však zrovna tak dobře zapsat do souboru na disku nebo disketě. Třebaže formát a velikost logické stránky je většinou stanovována tak, že odpovídá formátu a velikosti fyzické stránky na tiskárně, není tento vztah nutné dodržet a lze logickou stránku definovat i tak, že formátu a velikosti fyzické stránky neodpovídá. Často se logická stránka definuje jako dvoj-, trojnásobek nebo naopak jako polovina, třetina fyzické stránky, pochopitelně lze logickou stránku definovat i jakkoliv jinak, vyžaduje-li to daná aplikace. Formát logické stránky lze navíc v průběhu vytváření textového souboru dynamicky měnit, např. lze program sestavit tak, že sudé stránky budou mít 50 řádků, liché stránky 120 řádků. Pravidla: 1) Položka-1 až položka-4 musí být celočíselné numerické položky popsané ve WORKING-STORAGE SECTION, u kterých je klauzule USAGE buď neuvedena nebo je v ní uvedeno DISPLAY, COMP nebo COMP-3. Celé-číslo-1 až celé-číslo-4 musí být kladné a nejvýše rovné 32767. 2) Pro logickou stránku definujeme velikosti jejích jednotlivých částí v počtu řádků, které ta či ona část zaujímá. Celkem lze pro logickou stránku definovat až čtyři části, kterými jsou - horní okraj (TOP, jen mezerové řádky), - text stránky, (LINAGE), - pata stránky (FOOTING), - dolní okraj (BOTTOM, jen mezerové řádky). Celková délka logické stránky je dána součtem délky textu stránky (LINAGE) a délek obou okrajů (TOP, BOTTOM). Není-li některý z okrajů použit, přičítá se za něj nula. Pata stránky (FOOTING) stanovuje hranici uvnitř textu stránky a proto se do součtu nezahrnuje. Není-li pata FOOTING uvedeno, je pata stránky shodná s koncem textu stránky. Přehled o jednotlivých částech logické stránky podává následující obrázek. ------------------------------------------------- | | | horní okraj (TOP) | | | |-----------------------------------------------| | | | | | | | | | text stránky (LINAGE) | | | | | | | | | | | | | | | | - - - - - - - - - - - - - - - - - - - - - - - | | pata stránky (FOOTING) | | | |-----------------------------------------------| | | | dolní okraj (BOTTOM) | | | ------------------------------------------------- 3) Velikost (počet řádků) vlastního textu stránky udává celé-číslo-1 nebo položka-1. Hodnota celého čísla nebo položky musí být kladná, protože text stránky musí obsahovat alespoň jeden řádek. 4) Velikost horního okraje udává celé-číslo-3 nebo položka-3, velikost dolního okraje udává celé-číslo-4 nebo položka-4. Celé číslo nebo položka musí mít nezápornou hodnotu, hodnota nula znamená, že horní resp. dolní okraj resp. oba okraje nebudou existovat a do délky logické stránky se za chybějící okraj připočítává nula. 5) Polohu začátku paty stránky uvnitř textu stránky udává celé-číslo-2 nebo položka-2. Musí se jednat o hodnotu kladnou a nejvýše rovnou celému-číslu-1 nebo položce-1. Patu stránky pak v textu stránky tvoří řádky počínaje řádkem celé-číslo-2 nebo položka-2 a konče řádkem celé-číslo-1 nebo položka-1. Není-li FOOTING uvedeno, bude celé-číslo-2 implicitně nastaveno na hodnotu celé-číslo-1 nebo položka-1. 6) Pro každý soubor, pro který je uvedena klauzule LINAGE generuje překladač položku LINAGE-COUNTER, jejíž popis odpovídá celému-číslu-1 nebo položce-1. Pro celé číslo je použita klauzule USAGE DISPLAY. Při běhu programu obsahuje položka LINAGE-COUNTER pořadové číslo toho řádku v textu stránky, na který je nastavena pozice. Tuto položku lze používat v rámci PROCEDURE DIVISION, není však povoleno ji měnit. Jestliže je v rámci jednoho zdrojového programu klauzule LINAGE uvedena pro více souborů, musí být položka LINAGE-COUNTER při použití vždy kvalifikována jménem souboru. 7) Klauzule LINAGE je účinná pro soubor, pro který je uvedena jedině v případě, je-li soubor otevřen pomocí OPEN OUTPUT a příkazem WRITE se zapisuje logická věta. Přitom platí následující skutečnosti: - Není-li u příkazu WRITE uvedena volba ADVANCING, bude příkaz WRITE proveden tak, jakoby u něho byla volba AFTER ADVANCING 1 a hodnota položky LINAGE-COUNTER se zvětší o 1. - Je-li u příkazu WRITE volba ADVANCING (celé číslo nebo položka) uvedena pak bude hodnota položky LINAGE-COUNTER zvětšena o hodnotu celého čísla nebo položky z klauzule ADVANCING plus 1. - Jestliže při provádění příkazu WRITE dosáhne hodnota položky LINAGE-COUNTER hodnoty celé-číslo-1 nebo položka-1 z klau- zule LINAGE, provede se v rámci tohoto příkazu přechod na začátek nové logické stránky a do položky LINAGE-COUNTER se dosadí 1. - Jestliže je v příkazu WRITE uvedena volba ADVANCING BEFORE/AFTER PAGE, provedou se v rámci příkazu WRITE tyto akce: - je-li uvedeno BEFORE, vytiskne se obsah 01, - je-li hodnota položky LINAGE-COUNTER menší než celé-číslo-1 nebo položka-1 z LINAGE, vytiskne se příslušný počet mezerových řádků tak aby se celá stránka zaplnila, - je-li uvedena klauzule BOTTOM, vytiskne se celé-číslo-4 nebo položka-4 mezerových řádků (dolní okraj), - je-li uvedena klauzule TOP, vytiskne se celé-číslo-3 nebo položka-3 mezerových řádků (horní okraj), - je-li uvedeno AFTER, vytiskne se obsah 01, - do položky LINAGE-COUNTER se dosadí hodnota 1. - Jestliže je uvedena volba AFTER ADVANCING (celé číslo nebo položka) taková, že při provádění tohoto příkazu WRITE přesáhne hodnota položky LINAGE-COUNTER hodnotu celé-číslo-1 nebo položka-1 z LINAGE, provede se příkaz WRITE tak, že způsobí přímo přechod na novou stránku a obsah 01 vytiskne na první pozici v textu této následující stránky. Příkaz WRITE se tedy vlastně provede tak ,jako by u něj byla v ten okamžik uvedena volba AFTER ADVANCING PAGE, v položce LINAGE-COUNTER bude nakonec hodnota 1. - Jestliže je uvedena volba BEFORE ADVANCING (celé číslo nebo položka) taková, že při provádění tohoto příkazu WRITE přesáhne hodnota položky LINAGE-COUNTER hodnotu celé-číslo-1 nebo položka-1 z LINAGE, provede se příkaz WRITE tak, že po vytisknutí obsahu 01 způsobí přímo přechod na novou stránku. Příkaz WRITE se tedy vlastně provede tak, jako by u něj v ten okamžik byla uvedena volba AFTER ADVANCING PAGE, v položce LINAGE-COUNTER bude tedy nakonec hodnota 1. - Jestliže je v příkazu WRITE uvedena volba AT EOP a hodnota položky LINAGE-COUNTER dosáhne po provedení příkazu WRITE hodnoty alespoň celé-číslo-2 resp. položka-2 z FOOTING nebo při neuvedení FOOTING hodnoty alespoň celé-číslo-1 resp. položka-1 z LINAGE, uplatní se příkazy uvedené za AT EOP. Přitom musí uživatel rozlišovat zda při provádění tohoto příkazu WRITE došlo k automatickému přechodu na novou stránku nebo k němu nedošlo. Pozná se to lehce podle hodnoty položky LINAGE-COUNTER. Je-li rovna 1, došlo k přechodu na novou stránku, při hodnotě vyšší jak 1 je pozice ještě ve staré stránce. Velikost paty stránky a velikost posuvů používaných v klauzulích ADVANCING příkazů WRITE jest zřejmě nutno rozvrhnout tak, aby při dosažení paty stránky nedošlo k automatickému přechodu na stránku následující. Pak totiž lze vytisknout závěrečné informace na končící stránce a úvodní informace na nové stránce, čehož jest ovšem žádoucí dosáhnout. 8) Jestliže dojde při provádění příkazu WRITE jakýmkoliv způsobem k přechodu na novou stránku a v klauzuli LINAGE je uvedena položka-1 nebo položka-2 nebo položka-3 nebo položka-4, bude momentální hodnota této položky platit pro právě zahajovanou stránku. Změna položky uprostřed rozpracované stránky chování klauzule LINAGE neovlivní, rozhodující jsou hodnoty, které položky měly v okamžiku přechodu na novou stránku. Případný dolní okraj (BOTTOM) se udělá ještě se starou hodnotou, případný horní okraj (TOP) však již s novou hodnotou. Celá-čísla zadaná v klauzuli LINAGE pochopitelně zůstávají neustále v témže stavu pro všechny vytvářené stránky. Položky uvedené v klauzuli LINAGE tedy dovolují dynamicky měnit velikost a formát stránky během vytváření souboru.