3.4.5. Klauzule ORGANIZATION - - Formát: | [LINE | BINARY] SEQUENTIAL| ORGANIZATION IS < RELATIVE > | INDEXED | - - Organizaci souboru je možno zadat jednak prostřednictvím jednopísmenového údaje v systémovém jméně (viz 3.4.3. bod 4) pak pomocí klauzule ORGANIZATION a konečně je možno organizaci souboru explicitně vůbec neuvádět. Je-li organizace souboru uvedena prostřednictvím jednopísmenového údaje v systémovém jméně, je klauzule ORGANIZATION nepovinná. Je-li přesto uvedena, musí být organizace v ní uvedená v souladu se zadáním v systémovém jméně. To znamená, je-li v systémovém jméně písmeno S musí být v klauzuli ORGANIZATION uvedeno [LINE|BINARY] SEQUENTIAL, je-li R musí být RELATIVE, je-li I musí být INDEXED. Není-li organizace souboru v systémovém jméně zadána, je klauzuli ORGANIZATION nutné uvést v případě, kdy organizace souboru je jiná než sekvenční, tedy je-li relativní nebo indexová, jinak by se totiž soubor pokládal implicitně za soubor se sekvenční organizací. Je-li při sekvenční organizaci uvedena volba LINE, jedná se o textový sekvenční soubor. Tento zvláštní typ sekvenčního souboru má následující vlastnosti: - Textový sekvenční soubor smí obsahovat pouze tisknutelné znaky (mezera je chápána jako tisknutelný znak) a formátovací znaky "zpět o znak" (BS, hex.08), "horizontální tabulátor" (HT, hex.09), "nový řádek" (LF, hex.0A), "vertikální tabulátor" (VT, hex.0B), "nová stránka" (FF, hex.0C) a "návrat vozu" (CR, hex.0D). - Za každou zapsanou logickou větu zapíše přeložený program automaticky formátovací znaky CR LF (v systému MS-DOS) nebo formátovací znak LF (v systémech Unix). Dále jen znaky ukončující větu. - Logické věty souboru jsou zapisovány tak, že případné pravostranné mezery jsou před zápisem odříznuty a věta je na médium zapsána v této zkrácené podobě. Obsahuje-li logická věta samé mezery, nebude tak do souboru zapsán z jejího obsahu ani jeden byte, o její existenci budou svědčit pouze automaticky zapsané znaky ukončující větu. - Přechod na novou stránku v textovém souboru musí explicitně zadat uživatel a sice uvedením příkazu WRITE s klauzulí BEFORE PAGE nebo AFTER PAGE. Na tento povel zapíše příkaz WRITE do souboru formátovací znak "nová stránka" (FF, hex.0C). A to buď po zápisu věty (při BEFORE) nebo před zápisem věty (při AFTER). - Při čtení textového souboru příkazem READ se postupuje tak, že paměťová oblast určená pro přečtení věty (tzv. 01, viz 4.4) se nejprve vymezeruje a pak se do ní postupně odleva přenáší jeden znak logické věty po druhém, a to tak dlouho, dokud se nenarazí na znaky ukončující větu nebo na znak "nová stránka" (FF, hex.0C) nebo dokud se nepřenese tolik znaků, kolik činí délka logické věty. - Narazí-li se na znaky ukončující větu, tak se tyto znaky do paměťové oblasti 01 již nepřenáší. - Narazí-li se na znak "nová stránka" (FF, hex.0C), tak se dál postupuje v závislosti na tom, zda již v rámci tohoto příkazu READ byly nějaké znaky přečteny nebo zda je znak "nová stránka" (FF, hex.0C) prvním přenášeným znakem. Byly-li již nějaké znaky přečteny, působí znak "nová stránka" (FF, hex.0C) jako znak ukončující logickou větu; příkaz READ končí, znak "nová stránka" (FF, hex.0C) se do paměťové oblasti 01 neukládá, bude do ní přenesen až následujícím příkazem READ. Je-li znak "nová stránka" (FF, hex.0C) prvním přenášeným znakem, přenese se tento znak jako první do paměťové oblasti 01, čímž se logická věta pokládá za přečtenou. - Přenese-li se již tolik znaků, kolik činí délka paměťové oblasti 01, pokládá se logická věta za přečtenou a další znaky se z média budou číst až v případě požadavku na přečtení další logické věty. Toto pravidlo používané při čtení logických vět znamená, že logické věty, které jsou delší než paměťová oblast 01 jsou čteny (a musí být tedy také zpracovány!) po n částech dlouhých tak jako paměťová oblast 01, poslední část této dlouhé věty již bude zakončena znaky ukončujícími větu a bude obecně kratší než je délka 01. Je-li při sekvenční organizaci uvedena volba BINARY, smí být do souboru zapisovány jakékoliv znaky, přeložený program nepřidává implicitně žádné ukončující nebo jiné znaky, logické věty jsou vždy zapisovány a čteny v plné délce tak, jak ji zadal uživatel; nejsou žádným způsobem zkracovány nebo prodlužovány. Říkáme, že se jedná o binární sekvenční soubor. Není-li při sekvenční organizaci uvedeno ani LINE ani BINARY, rozhodne překladač sám, zda se jedná o textový nebo o binární sekvenční soubor. O textový sekvenční soubor jde v případě, jestliže je - buď v klauzuli FD uvedena klauzule LINAGE, - nebo je v klauzuli FD uvedena klauzule REPORT/REPORTS, - nebo je pro soubor uveden alespoň jeden příkaz WRITE, u kterého je použita volba AFTER nebo BEFORE. Nejde-li o textový sekvenční soubor, je uvedený soubor automaticky pokládán za binární sekvenční soubor. Není-li organizace souboru uvedena v systémovém jméně a není-li ani uvedena klauzule ORGANIZATION, bude překladač postupovat tak, jako by byla uvedena klauzule ORGANIZATION SEQUENTIAL (tedy bez LINE nebo BINARY). Zda se jedná o textový nebo binární sekvenční soubor určí překladač sám podle pravidel v předchozích dvou odstavcích. 3.4.6. Klauzule RELATIVE KEY Formát: RELATIVE KEY IS položka Klauzule RELATIVE KEY je povinná při přímém zpracování relativního souboru, při sekvenčním zpracování je povolena. Položka uvedená v klauzuli RELATIVE KEY (dále ji nazýváme RELATIVE-položka) musí být definována ve WORKING-STORAGE a musí splňovat následující požadavky: - musí to být celočíselná binární položka, - nesmí být podřízena položce, která má klauzuli OCCURS s volbou DEPENDING ON, jinými slovy nesmí jít o položku s proměnnou adresou, - nesmí mít indexy. Při přímém zpracování musí uživatel před provedením příkazu READ, WRITE, REWRITE nebo DELETE uložit pořadové číslo věty právě do RELATIVE-položky. Při sekvenčním zpracování lze v RELATIVE-položce před provedením příkazu READ resp. WRITE nalézt pořadové číslo věty, která bude přečtena resp. zapsána, které tam automaticky přeložený program ukládá. 3.4.7. Klauzule NOMINAL KEY Formát: {NOMINAL | SYMBOLIC} KEY IS položka Slova NOMINAL a SYMBOLIC jsou ekvivalentní; z důvodů kompatibility je však vhodnější používat rozšířenější slovo NOMINAL. Klauzule NOMINAL KEY je přípustná pouze u indexových souborů, zatímco u sekvenčních a relativních souborů je zakázána. Položka uvedená v klauzuli NOMINAL KEY (dále ji nazýváme NOMINAL-položka) musí ležet ve WORKING-STORAGE SECTION nebo v COMMUNICATION SECTION, musí mít pevnou délku nepřesahující 255 bytů, pevnou adresu (tj. nesmí ležet ve struktuře za položkou s OCCURS DEPENDING) a nesmí mít indexy. Kvalifikaci mít smí. Pomocí NOMINAL-položky řídí uživatel přímé zpracování indexového souboru; před každým příkazem READ při přímém zpracování a dále též před každým příkazem START bez KEY při sekvenčním zpracování musí dát do NOMINAL-položky logický klíč odpovídající té logické větě, s níž chce pracovat (viz 8.4., 8.9.2., 8.9.3.). Pokud je definováno více logických klíčů (primární a jeden nebo více sekundárních), je NOMINAL-položka pro všechny tyto logické klíče společná; uživatel tedy umísťuje do NOMINAL-položky vždy ten logický klíč, podle kterého se právě pracuje. Je-li definováno více logických klíčů, musí být NOMINAL-položka alespoň tak dlouhá, aby se do ní vešel nejdelší z těchto logických klíčů. Kratší logické klíče se pak do položky umisťují odleva; indexsekvenční metoda si vždy vezme z NOMINAL-položky odleva vždy tolik bytů, jaká je délka právě aktuálního logického klíče, a zbytek NOMINAL-položky ignoruje. Pracuje-li se pouze s jedním logickým klíčem (primárním, přičemž sekundární logické klíče nejsou vůbec definovány anebo se s nimi nyní nepracuje), měla by být délka NOMINAL-položky alespoň rovna délce tohoto logického klíče (není však chybou, je-li větší). Klauzule NOMINAL KEY není u indexového souboru povinná ani tehdy, hodlá-li uživatel používat příkaz READ pro přímé čtení anebo příkaz START bez klauzule KEY. Není-li totiž klauzule NOMINAL KEY uvedena, musí uživatel u těchto příkazů dávat příslušný logický klíč do RECORD-položky (je-li uvedena alespoň klauzule RECORD KEY) resp. do toho místa v logické větě 01, která odpovídá primárnímu logickému klíči. Odpovídá to tedy situaci, že by byla uvedena klauzule NOMINAL KEY s touž položkou, která je uvedena v klauzuli RECORD KEY - takový zápis je však nepřípustný, neboť RECORD-položka leží ve FILE SECTION. Při práci se sekundárními logickými klíči by zřejmě položka NOMINAL KEY neměla být vynechána, neboť naplňování sekundárních logických klíčů na místo primárního logického klíče by činilo program nepřehledným. 3.4.8. Klauzule RECORD KEY Formát: RECORD KEY IS položka Klauzule RECORD KEY je přípustná pouze u indexových souborů, zatímco u sekvenčních a u relativních souborů je zakázána. Položka uvedená v klauzuli RECORD KEY (dále ji nazýváme RECORD-položka) musí být součástí některé logické věty 01 toho souboru, v jehož klauzuli SELECT je uvedena. Musí v této 01 ležet na pevné pozici (tj. nesmí mít indexy a nesmí ji předcházet položka s klauzulí OCCURS DEPENDING) nejvýše 32767 bytů od začátku 01 a musí mít pevnou délku nejvýše 255 bytů. Kvalifikaci mít smí. RECORD-položka svou pozicí v 01 a svou délkou určuje, která část logických vět souboru bude používána jako primární logický klíč, podle něhož musí být logické věty souboru dat při vytváření setříděny vzestupně (při uvedení klauzule APPLY DUPLICATE-KEY neklesajícně) a podle něhož mohou být vyhledávány při přímém zpracování a při provádění příkazu START. Klauzule RECORD KEY není u indexového souboru povinná. Má význam vlastně jen při prvotním vytváření indexového souboru dat. Při pozdějším zpracování indexového souboru dat (včetně sekvenčního prodlužování) se poloha a délka primárního logického klíče získává z údajů uložených v primárním indexu, takže klauzule RECORD KEY slouží pouze pro kontrolu (při neshodě se hlásí chyba) a pro dokumentaci. Poloha a délka sekundárních logických klíčů se nezadává v klauzuli SELECT, nýbrž v parametrech pro pomocný program BLDIND, který musí být vyvolán po vytvoření souboru dat. SELECT PAVEL ASSIGN S-SAUL. SELECT BARNABAS ASSIGN JMSOUB. SELECT TITUS ASSIGN R-RITUS. SELECT PETR ASSIGN "RITUS" ACCESS RANDOM RELATIVE RELKA. SELECT MATOUS ASSIGN MAREK ORGANIZATION INDEXED. SELECT LUKAS ASSIGN I-IVAN ACCESS DYNAMIC NOMINAL KLICEK RECORD PANTOFLICEK. SELECT JAN ASSIGN "TISKY" ORGANIZATION LINE SEQUENTIAL. 3.4.9. Klauzule FILE STATUS Formát: FILE STATUS IS položka Pravidla: Položka musí být definována ve WORKING-STORAGE SECTION. Musí se jednat o alfanumerickou položku délky 2. Význam: a) Je-li klauzule FILE STATUS uvedena v některé klauzuli SELECT, pak položka v ní uvedená bude během činnosti programu obsahovat informace o úspěšnosti příkazů pracujících se souborem. Po provedení příkazů READ, WRITE, REWRITE, START a DELETE avšak před případným provedením deklarativní sekce bude do této položky uložena hodnota, která vyjadřuje, jak proběhlo provedení těchto příkazů. b) První byte položky se nazývá "stavový byte 1", analogicky druhý byte je "stavový byte 2". c) Stavový byte 1 může v závislosti na tom, jak příkaz vstupu/výstupu proběhl nabývat některé z následujících hodnot: 0 Příkaz proběhl úspěšně, nedošlo k žádné chybě ani výjimečnému stavu. 1 Nastala podmínka "konec souboru". Příkaz READ nepřečetl logickou větu, neboť všechny logické věty již byly pří tomto sekvenčním zpracování přečteny. 2 Nastala podmínka "chybný klíč" u relativního nebo indexového souboru. Příkaz vstupu/výstupu nebyl úspěšně dokončen, neboť nastale jedna z následujících situací: - věta se zadaným klíčem (NOMINAL nebo RELATIVE) v souboru neexistuje, - věta se zadaným klíčem naopak existuje, což vadí v případě, kdy vkládáme novu větu do indexového souboru se stejným klíčem, který už nějaká jiná, starší věta má a přitom není povolena duplicita klíčů, - při prvotním zakládání nebo prodlužování indexového souboru chtěl program příkazem WRITE zapsat novou větu, jejíž klíč je menší než největší klíč v souboru nebo jejíž klíč je roven největšímu klíči v soubor ale současně není povolena duplicita klíčů. 3 Neopravitelná chyba. Příkaz vstupu/výstupu nebyl řádně dokončen, protože došlo k nějaké vážné chybě. Je-li ve stavovém bytu 2 hodnota 1, jedná se o zaplněné médium. 9 Hlášení zvláštního stavu, který nastal při provádění příkazu vstupu/výstupu. Bližší rozlišení lze nalézt ve stavovém bytu 2. d) Stavový byte 2 se používá pro přesnější určení stavu indikovaného v hrubých obrysech stavovým bytem 1. V úvahu připadají tyto případy: - pokud nejsou po ukončení příkazu vstupu/výstupu žádné podrobnější informace k dispozici, bude do stavového bytu 2 dosazena 0, - pokud stavový byte 1 obsahuje hodnotu 2, bude ve stavovém bytu 2 pro relativní nebo indexový soubor zapsána některá z následujících hodnot, 1 při prvotním vytváření se program pokusil zapsat do souboru logickou větu s týmž klíčem jako je maximální klíč v souboru, přičemž pro soubor nebyla uvedena klauzule APPLY DUPLICATE-KEY (viz 3.5.11.) a tudíž nejsou duplicitní klíče povoleny, nebo se pokusil zapsat logickou větu s klíčem menším než je maximální klíč, 2 program se pokusil do souboru zapsat logickou větu s klíčem, který již v souboru některá jiná logická věta má a pro soubor přitom nebyla uvedena klauzule APPLY DUPLICATE-KEY (viz 3.5.11.), nebo se pokusil logickou větu opravit tak, že změnil klíč na hodnotu, která v souboru již existuje, 3 pokus o přímé přečtení logické věty podle klíče nedopadl úspěšně, protože logická věta se zadaným klíčem v souboru neexistuje. - pokud stavový byte 1 obsahuje hodnotu 9, jsou ve stavovém bytu 2 uvedeny bližší informace o vzniklé situaci, 0 při pokusu o opravu věty bylo zjištěno, že nebyla načtena věta, 1 při opravě věty se změnila její délka 3 při otevírání souboru nebylo k dispozici dostatek paměti, 4 použitý příkaz vstupu/výstupu je pro daný typ otevření nepřípustný. 3.5. Paragraf I-O-CONTROL Paragraf I-O-CONTROL obsahuje klauzule RERUN, SAME, MULTIPLE a APPLY, přičemž existuje několik typů klauzule APPLY. Tyto klauzule vyjadřují požadavky na určité speciální techniky při zpracování souborů deklarovaných ve FILE-CONTROL, které nemohou být vyjádřeny pomocí klauzulí SELECT, FD a USE ani pomocí výkonných příkazů. Jednotlivé typy klauzulí mohou být uvedeny v libovolném počtu a v libovolném vzájemném pořadí. Za kteroukoliv z nich může být mezera, čárka, středník nebo tečka. Paragraf I-O-CONTROL smí být i prázdný (tj. nemusí obsahovat žádnou klauzuli). 3.5.1. Klauzule RERUN Není implementována. 3.5.2. Klauzule SAME Není implementována. 3.5.3. Klauzule MULTIPLE Není implementována. 3.5.4. Klauzule APPLY WRITE-VERIFY Není implementována. 3.5.5. Klauzule APPLY EXTENDED-SEARCH Není implementována. 3.5.6. Klauzule APPLY CYL-OVERFLOW Není implementována. 3.5.7. Klauzule APPLY BLOCK-DENSITY Není implementována. 3.5.8. Klauzule APPLY CORE-INDEX Není implementována. 3.5.9. Klauzule APPLY CYL-INDEX A APPLY MASTER-INDEX Nejsou implementovány. 3.5.10. Klauzule APPLY WRITE-ONLY Není implementována. 3.5.11. Klauzule APPLY DUPLICATE-KEY Formát: APPLY DUPLICATE-KEY ON jméno-souboru ... Všechny uvedené soubory musí být indexové; klauzule u nich ovlivní jen zápis nových logických vět příkazem WRITE (při prvotním vytváření, při sekvenčním prodlužování a při přímém zpracování). Přitom tato klauzule se uplatní pouze při prvotním vytváření souboru, kdy se využije a zaznačí do indexového souboru. Při jakémkoliv pozdějším zpracování tohoto souboru dat se případná klauzule APPLY DUPLICATE-KEY ignoruje. Není-li při vytváření určitého indexového souboru tento indexový soubor uveden v žádné klauzuli APPLY DUPLICATE-KEY, není ani při tomto prvotním vytváření ani kdykoliv později při vkládání logických vět do tohoto souboru dat přípustné zapsat dvě nebo více logických vět s týmž primárním logickým klíčem. Při vytváření je nutné zapisovat logické věty v takovém pořadí, aby primární logické klíče vzrůstaly. Při přímém zpracování není přípustné vkládání logických vět s týmž primárním logickým klíčem, jaký má některá již existující logická věta tohoto souboru dat. Je-li při prvotním vytváření určitého indexového souboru dat indexový soubor uveden v některé klauzuli APPLY DUPLICATE-KEY, je jak při tomto prvotním vytváření tohoto souboru dat, tak i kdykoliv později při vkládání nových logických vět do tohoto souboru dat, přípustné zapsat dvě nebo více logických vět s týmž primárním logickým klíčem. Při vytváření je nutno zapisovat logické věty v takovém pořadí, aby jejich primární logické klíče neklesaly. Při přímém zpracování je přípustné vkládání logických vět se stejným primárním logickým klíčem, jaký má některá již existující logická věta tohoto souboru dat. Pracuje-li se se sekundárními logickými klíči, lze pro kterýkoliv z nich zvlášť zadat, zda dvě nebo více logických vět smí mít sekundární logický klíč stejný. Tato indikace se však zadává nikoliv ve zdrojovém cobolském programu, nýbrž jako volba při vyvolání pomocného programu BLDIND. V paragrafu I-O-CONTROL smí být uvedeno i několik klauzulí APPLY DUPLICATE-KEY, každý indexový soubor však smí být uveden nejvýše v jedné z nich a to nejvýše jedenkrát. Poznámka: Klauzule APPLY DUPLICATE-KEY umožňuje, aby primárním logickým klíčem byla položka, jejíž jednoznačnost nemůže být zajištěna (např. u zaměstnanců: jméno nebo datum narození nebo bydliště atd.), čímž se velmi výrazně rozšiřují možnosti využití indexových souborů. Poznámka: Je-li v indexovém souboru dat několik logických vět s týmž logickým klíčem (primárním nebo sekundárním), přečte přímý příkaz READ resp. první sekvenční příkaz READ následující po příkazu START první z těchto vět. Další logické věty s týmž logickým klíčem mohou být pak přečteny výhradně sekvenčně; doporučuje se tedy používat sekvenční přístup nebo ACCESS DYNAMIC a první logickou větu se zadanou hodnotou logického klíče vyhledávat pomocí příkazu START. 3.5.12. Klauzule APPLY FIXED-ADDRESS Není implementována. 3.5.13. Klauzule APPLY FILE-ID Není implementována.