3.3. INPUT-OUTPUT SECTION Sekce INPUT-OUTPUT SECTION se dělí do dvou paragrafů FILE-CONTROL a I-O-CONTROL, které jsou oba nepovinné. Jsou-li oba uvedeny, musí být uveden nejprve paragraf FILE-CONTROL a za ním teprve paragraf I-O-CONTROL. 3.4. Paragraf FILE-CONTROL V paragrafu FILE-CONTROL musí být pro každý soubor, s nímž se bude v programu pracovat, uvedena právě jedna klauzule SELECT; dále zde může být uvedena jedna klauzule SELECT pro každý třídící soubor; žádné jiné klauzule ani zápisy v paragrafu FILE-CONTROL být nesmí. Pomocí klauzule SELECT se soubor resp. třídící soubor deklaruje, což znamená, že se určuje jeho jméno, jeho typ a některé jeho vlastnosti. Počet klauzulí SELECT ve zdrojovém programu není omezen. 3.4.1. Formát klauzule SELECT Formát: SELECT OPTIONAL jméno-souboru ASSIGN TO [celé-číslo] systémové-jméno ... [ACCESS MODE IS {SEQUENTIAL | RANDOM | DYNAMIC}] - - - - | | BINARY SEQUENTIAL | | |ORGANIZATION IS < LINE SEQUENTIAL > | | | RELATIVE | | | | INDEXED | | - - - - [RELATIVE KEY IS položka] [{NOMINAL | SYMBOLIC} KEY IS položka] [RECORD KEY IS položka] [FILE STATUS IS položka] Pravidla: 1) Klauzule SELECT musí být ukončena tečkou; její jednotlivé podklauzule však tečkami odděleny být nesmí. 2) Mimo podklauzule uvedené ve formátu připouští překladač ještě podklauzule RESERVE, MULTIPLE resp. FOR MULTIPLE, FILE-LIMIT resp. FILE-LIMITS, PROCESSING a TRACK-AREA, významné v některých jiných implementacích jazyka Cobol. Přijímá je však pouze kvůli kompatibilitě a považuje je za poznámky, jejichž správnost nekontroluje (mohou mít tedy zcela libovolný tvar). 3) Klauzule ASSIGN musí následovat bezprostředně za jménem souboru. Ostatní klauzule (ACCESS, ORGANIZATION, RESERVE, NOMINAL resp. SYMBOLIC, RECORD a poznámkové klauzule uvedené v bodě 2) mohou být uvedeny v libovolném pořadí. 4) Každý soubor (resp. třídící soubor), který je deklarován v paragrafu FILE-CONTROL klauzulí SELECT, musí být v sekci FILE SECTION popsán právě jednou klauzulí FD (resp. SD). Klauzule SELECT pro třídící soubor (tj. patřící k SD) je celá považována za poznámku. Je-li však uvedena, pak musí mít tvar přípustný pro soubory. Proto v tomto odstavci 3.4. mluvíme pouze o "souborech", čímž je vždy třeba rozumět i "třídící soubory". 5) Volba OPTIONAL je pouze poznámková, její uvedení je rovnocenné jejímu neuvedení, obě možnosti nemají vliv na přeložený program. 6) Jméno-souboru je třeba vytvořit podle stejných pravidel jako jména položek (viz 1.4.). Je zakázáno uvést ve dvou klauzulích SELECT totéž jméno-souboru. Pomocí tohoto jména-souboru se pak provádějí všechny odvolávky na soubor zevnitř zdrojového programu (v I-O-CONTROL, v FD/SD, v klauzulích USE a v příkazech pro vstup/výstup). Jméno-souboru však může též sloužit jako jméno fyzického souboru dat, který má být zpracován a jehož jméno se ukládá do příslušných systémových záznamů. 7) Překladač povoluje, aby se jméno-souboru resp. třídícího souboru shodovalo se jménem některé položky, speciálního indexu nebo s podmínkovým jménem. Takové jméno však nesmí být použito jako nejvyšší kvalifikátor (viz 4.2.) a nesmí být uvedeno jako argument v příkazech CALL, UFO, MATCH a GENERATE. Dále se jméno souboru, třídícího souboru nebo sestavy smí shodovat se jménem některé procedury nebo s některým speciálním jménem; nesmí se tedy shodovat pouze se jménem jiného souboru, třídícího souboru nebo sestavy. 3.4.2. Klauzule ASSIGN Formát: ASSIGN TO [celé-číslo] systémové-jméno ... Klauzule ASSIGN určuje zejména fyzické jméno zpracovávaného souboru, určit lze i organizaci souboru. Tyto údaje lze uvést v prvním systémovém jméně. Je-li uvedeno několik systémových jmen, pak platí údaje obsažené pouze v prvním z nich, zatímco ostatní systémová jména se považují za poznámky. "Celé-číslo" uvedené za slovem ASSIGN se neuplatňuje a považuje se pouze za poznámku. 3.4.3. Systémové jméno, organizace souboru Formát systémového jména: - [SYSnnn-][třída-][zařízení-]organizace[-dtfname] - | fyzické-jméno | < položka > | DISK | - PRINTER - Tvar systémového jména z prvního řádku formátu se skládá ze dvou až pěti částí, oddělených pomlčkami bez mezer. Část "organizace" je povinná, z částí "SYSnnn" a "dtfname" musí být uvedena alespoň jedna. Části "třída" a "zařízení" jsou vždy nepovinné a bezvýznamné. Systémové jméno dovoluje určit organizaci souboru a fyzické jméno souboru. Organizaci lze ovšem určit i pomocí klauzule ORGANIZATION. Pravidla: 1) Část "SYSnnn" určovala v Cobolu DOS-4/JS a jemu podobných tzv. symbolickou jednotku, pomocí níž se pracovalo. Nyní se používá pouze v případě, když není uvedena část "dtfname". Pak se část "SYSnnn" pokládá za fyzické jméno souboru. Je-li část "dtfname" uvedena, není část "SYSnnn" využívána. 2) Část "třída" (též "třída zařízení") se už dávno pokládá za poznámku a její uvedení je k ničemu. 3) Totéž platí o části "zařízení" (též "číslo zařízení"), které je zbytečné uvádět. 4) Část "organizace" je vždy povinná a musí být tvořena jedním z písmen S, R, I. Vyjadřuje typ organizace souboru, to jest způsob zobrazení dat na médiu. Je vidět, že jsou povoleny tři organizace souboru s následujícím významem: S ... sekvenční organizace R ... relativní organizace I ... indexová (též "indexsekvenční") organizace Sekvenční organizace znamená, že logické věty jsou na médiu umístěny jedna za druhou v tom pořadí, v jakém byly zapisovány. K souboru nepatří žádné tabulky ani jiné ukazatele, které by umožňovaly přímé zpracování. Sekvenční organizace je přípustná na všech typech zařízení, na tiskárně je jedinou možnou organizací. Používá se tehdy, když se nevyžaduje přímé zpracování (tj. když při práci se souborem vždy potřebujeme zpracovat všechny anebo značnou část logických vět souboru dat v tom pořadí, v jakém leží na médiu) a když logické věty nebudou vkládány doprostřed již vytvořeného souboru dat. Relativní organizace je přípustná pouze na disku nebo disketě a umožňuje jak sekvenční ukládání a zpracování vět tak jejich zpracování přímé. S každou větou je spojen tzv. relativní klíč. Při sekvenčním vytváření relativního souboru dostávají věty souboru postupně relativní klíče 0 (první věta), 1 (druhá věta), 2, 3 atd. Při sekvenčním čtení se věty čtou podle pořadí jejich relativních klíčů. Při přímém čtení předloží uživatel relativní klíč (celé-číslo nezáporné) a existuje-li v souboru věta s daným pořadovým číslem bude přečtena. Rušení vět v relativním souboru spočívá v tom, že se prvních 512 bytů věty (má-li věta méně než 512 bytů, tak všechny byty) přepíše binárními nulami. Místo po takto zrušené větě zůstává na médiu rezervováno a lze je později využít pro zápis nové věty. Opravu (aktualizaci) věty lze provést tak, že nejprve je nutné opravovanou větu sekvenčně nebo přímo přečíst do paměti příkazem READ, v paměti opravit a příkazem REWRITE zapsat zpět na původní místo. Přidávání věty je možné opět buď sekvenční (přidávaná věta má relativní klíč o 1 větší než předchozí přidaná věta) nebo přímé (věta má relativní klíč zadán v položce RELATIVE KEY). Indexová organizace je přípustná pouze na disketě nebo na disku. Každá logická věta musí obsahovat tzv. logický klíč, přičemž všechny tyto logické klíče musí mít touž délku a musí začínat na téže pozici v logické větě (viz 3.4.8.). Dvě logické věty smí mít stejný logický klíč pouze tehdy, je-li pro soubor uvedena klauzule APPLY DUPLICATE-KEY (viz 3.5.11.); jinak je to zakázáno. Při vytváření indexového souboru musí uživatel zapisovat logické věty v takovém pořadí, aby jejich logické klíče tvořily rostoucí (při uvedení APPLY DUPLICATE-KEY neklesající) posloupnost. Automaticky jsou vytvářeny příslušné indexové údaje, které jsou pak využívány při pozdějším zpracování indexového souboru. V indexech jsou kromě jiných údajů uschovávány logické klíče logických vět. Veškeré řídící údaje jsou uloženy v indexových položkách mimo data logických vět, takže k logickým větám indexového souboru lze přistupovat i prostředky sekvenční nebo relativní organizace. Mimo hlavního (tzv. primárního) logického klíče lze pracovat ještě i s dalšími (tzv. sekundárními) logickými klíči, zcela nezávislými na primárním logickém klíči. Primární i sekundární indexy lze vytvořit pomocným programem BLDIND, který je dodáván spolu s překladačem. Indexová organizace pak umožňuje jak sekvenční, tak i přímé zpracování podle primárního logického klíče, tak i podle sekundárních logických klíčů. Jako indexsekvenční metoda byla do MX Cobolu začleněna podmnožina přístupové metody Y_ISAM, která je v kompletním rozsahu na softwareovém trhu samostatně nabízena pro universální použití. Indexové soubory, vytvořené pomocí MX Cobolu lze tedy zpracovávat pomocí programů napsaných v jazycích C (Turbo C, Turbo C++, MSC aj.) v jazyku Fortran 77 (MS Fortran 77) a samozřejmě v assembleru, máte-li k dispozici příslušné knihovny metody Y_ISAM. A samozřejmě naopak, indexové soubory pořízené metodou Y_ISAM v jazyce C nebo F77 nebo v assembleru lze zpracovávat v jazyce MX Cobol. Poznámka: Místo "soubor se sekvenční organizací" říkáme též stručněji "sekvenční soubor", místo "soubor s relativní organizací" říkáme podobně "relativní soubor" a místo "soubor s indexovou organizací" analogicky "indexový soubor". Poznámka: Organizace souboru je jeho nejdůležitější vlastností. Při pozdějším zpracovávání souboru dat je nutno uvést stejnou organizaci, která byla zadána při vytvoření souboru dat a která odpovídá organizaci souboru dat na médiu. Nicméně je na druhé straně pravda, že i přes právě vyslovená přísná zaklínadla lze relativní soubor a datovou část indexového souboru opatrně zpracovávat jako soubory se sekvenční organizací. 5) Část "dtfname" musí být nejvýše osmiznaková posloupnost písmen a číslic začínající písmenem. Toto jméno slouží jako fyzické jméno souboru na médiu (ovšem má-li tam jméno smysl). Část "dtfname" může být vynechána, pak se jako fyzické jméno souboru použije část "SYSnnn", chybí-li i ona, vezme překladač k tomuto účelu zavděk jménem-souboru uvedeným za SELECT. 6) Alternativa "fyzické-jméno" dovoluje zadat jednoduchou formou fyzické jméno souboru, Jméno je potřeba uzavřít do apostrofů. Protože v tomto případě není určena organizace souboru, je nutné v případě relativní nebo indexové organizace uvést klauzuli ORGANIZATION, jinak se mlčky předpokládá organizace sekvenční. 7) Je-li uvedena položka, musí se jednat o položku alfanumerickou, která musí v okamžiku otevírání souboru obsahovat fyzické jméno souboru (případně zprava doplněné mezerami do délky položky). Položka musí mít pevnou adresu, smí mít index a její obsah není přípustné po dobu, kdy je soubor otevřen měnit. 8) Volba DISK stručně sděluje, že soubor bude na disku nebo disketě. Jako fyzické jméno se použije jméno uvedené za SELECT, pochopitelně musí být pro případ relativní nebo indexové organizace uvedena klauzule ORGANIZATION. Jinak se mlčky předpokládá sekvenční organizace. 9) Volba PRINTER stručně sděluje, že data souboru jsou určena k vytištění. Fyzické jméno není v tomto případě potřeba, soubor je povoleno otevřít pouze jako výstupní. Organizace je sekvenční. Příklad: SELECT JAVOR ASSIGN SYS012-S-TOPOL ... SELECT LIPA ASSIGN SYS014-S ... SELECT HABR ASSIGN DISK ... SELECT BRIZA ASSIGN "betula.dat" ... Mezi přípustná systémová jména patří např.: R-RELDA I-INDIAN SYS008-UT-5052-S S-Q "c:\mzdy300\kmenp.dat" 3.4.4. Klauzule ACCESS, přístupové metody Formát: ACCESS MODE IS {SEQUENTIAL | RANDOM | DYNAMIC} Klauzule ACCESS určuje přístupovou metodu, tj. způsob zpracování souboru dat. Existují dvě základní přístupové metody, a to sekvenční přístup a přímý přístup: 1) Sekvenční přístup (sekvenční zpracování) se provádí při uvedení ACCESS SEQUENTIAL anebo při vynechání klauzule ACCESS, což jsou dvě rovnocenné možnosti. S logickými větami souboru dat se pracuje postupně dle jejich pořadí, jak je definováno příslušnou organizací, aniž by uživatel vybíral logické věty anebo určoval jejich polohu pomocí nějakých klíčů nebo jiných pomůcek. Až na jisté výjimky (při předčasném ukončení zpracování anebo při použití příkazu START u indexového souboru) se s každou logickou větou pracuje právě jednou. U sekvenčního přístupu dále rozlišujeme: a) Sekvenční vytváření souboru dat, které se provádí po otevření OPEN OUTPUT a OPEN EXTEND a je přípustné jak u sekvenčního, tak i relativního a indexového souboru. Jedná se buď o prvotní vytváření souboru dat (OUTPUT) anebo o sekvenční prodlužování (EXTEND). Logické věty je přípustné pouze zapisovat, nikoliv však číst nebo opravovat. b) Sekvenční čtení a opravování souboru dat, které se provádí po otevření OPEN INPUT nebo OPEN I-O a je přípustné při všech třech typech organizace souboru. Je přípustné logické věty číst a u diskových nebo disketových souborů též opravovat, u relativního a indexového souboru též vyřazovat, není však přípustné logické věty zapisovat (ani na konec ani doprostřed souboru dat). Pokud po provedení toho příkazu READ, jímž se přečetla poslední logická věta souboru dat, provede uživatel ještě další příkaz READ, vznikne při něm výjimečný stav zvaný "konec souboru". 2) Přímý přístup (přímé zpracování) se provádí při uvedení ACCESS RANDOM. S logickými větami se nepracuje postupně dle jejich pořadí na médiu, nýbrž v pořadí libovolném, přičemž uživatel musí před každým příkazem vstupu/výstupu naplnit příslušný klíč (do položky uvedené v klauzuli RELATIVE KEY nebo NOMINAL KEY), čímž určí požadovanou logickou větu a její polohu v souboru. Přímý přístup je přípustný jen u relativního nebo u indexového souboru. Nezávisle na způsobu otevření lze logické věty zapisovat, číst i opravovat (u relativního a indexového souboru též vyřazovat). Při přímém přístupu se většinou pracuje jen s některými logickými větami souboru dat, přičemž však s některými z nich se může pracovat i vícekrát. Vzhledem k tomu, že se nepracuje postupně, nenastává při čtení nikdy stav "konec souboru". Následující tabulka ukazuje, které přístupové metody jsou přípustné pro jednotlivé typy organizace souboru: Tabulka 2: Přípustné přístupové metody. ------------------------------------------------------------ | organizace | sekvenční přístup (ACCESS | | | souboru | SEQUENTIAL nebo vynecháno) |přímý přístup | | |-----------------------------|(ACCESS RANDOM)| | |sekv.vytváření|sekv. čtení | | | |OPEN OUTPUT |OPEN INPUT/I-O| | |------------|--------------|--------------|---------------| | sekvenční | povoleno | povoleno | zakázáno | | (S) | | | | |------------|--------------|--------------|---------------| | relativní | povoleno | povoleno | povoleno | | (R) | | | | |------------|--------------|--------------|---------------| | indexová | povoleno | povoleno | povoleno | | (I) | | | | ------------------------------------------------------------ Klauzule ACCESS DYNAMIC, která je přípustná pouze u indexového souboru, neznamená zvláštní přístupovou metodu, nýbrž kombinaci sekvenčního a přímého přístupu (viz 8.9.4.) Sekvenčně organizovaný soubor dat lze jak vytvářet, tak i číst (s případným opravováním) pouze sekvenčně. Přímý přístup není realizován a proto jsou klauzule ACCESS RANDOM a ACCESS DYNAMIC nepřístupné. a) Při vytváření sekvenčního souboru dat se logické věty zapisují na médium v tom pořadí, v jakém pořadí, v jakém se pro ně provádějí příkazy WRITE. b) Při čtení a opravování sekvenčního souboru dat se logické věty čtou pomocí příkazů READ v tom pořadí, v jakém po sobě následují na médiu. První příkaz READ vždy čte první logickou větu souboru dat. Další příkazy READ pak čtou postupně následující logické věty souboru dat až do konce souboru dat anebo do předčasného ukončení zpracování. Relativně organizovaný soubor dat lze vytvářet sekvenčně nebo přímo, číst a opravovat jej lze rovněž přímo nebo sekvenčně. a) Při sekvenčním vytváření (OPEN OUTPUT) se logické věty zapisují postupně v tom pořadí, v jakém se pro ně provádějí příkazy WRITE. První věta dostane pořadové číslo 0, druhá věta číslo 1, třetí věta číslo 2, ... atd. až n-tá věta dostane pořadové číslo n-1. Je-li pro daný soubor uvedena klauzule RELATIVE KEY, bude do položky v ní uvedené po otevření souboru uložena hodnota 0, po zápisu první věty hodnota 1, druhé věty hodnota 2, ... atd. až po zápisu n-té věty hodnota n. b) Při sekvenčním rozšiřování (OPEN EXTEND) se logické věty zapisují opět postupně v tom pořadí, v jakém se provádějí příkazy WRITE. První věta zapsaná po otevření souboru dostane pořadové číslo rovnající se počtu vět, které byly v souboru v okamžiku otevření zapsány. Každá další věta dostane pořadové číslo vždy o 1 větší než věta předchozí. Je-li pro daný soubor uvedena klauzule RELATIVE KEY, bude do položky v ní uvedené po otevření souboru uloženo číslo, rovnající se počtu vět, doposud zapsaných do souboru. Po zápisu každé další věty se do této položky zapíše hodnota vždy o 1 větší. c) Při sekvenčním čtení a opravování se pracuje podobně jako při práci se sekvenčním souborem. Uživatelský program pomocí příkazů READ čte jednu větu za druhou až příkaz READ vydaný po přečtení poslední věty způsobí uplatnění klauzule INVALID KEY resp. vyvolání příslušné deklarativní sekce. Právě přečtenou větu lze opravit příkazem REWRITE. Je-li v klauzuli SELECT uvedena klauzule RELATIVE KEY, bude po přečtení každé věty uloženo její pořadové číslo do relativního klíče. d) Při přímém zpracování lze logické věty zapisovat, číst, rušit opravovat v libovolném pořadí. Musí být uvedena klauzule RELATIVE KEY, protože položka v ní uvedená hraje ve zpracování rozhodující roli. Před zápisem, přečtením, zrušením nějaké věty musí být předem do položky RELATIVE KEY uloženo pořadové číslo této věty. Pokud věta zadaného pořadového čísla neexistuje, uplatní se klauzule INVALID KEY (je-li uvedena) nebo dojde k vyvolání příslušné deklarativní sekce. Úspěšně přečtenou větu lze v paměti aktualizovat a příkazem REWRITE ji opravenou zapsat zpět do souboru. Libovolnou větu lze ovšem v souboru kdykoliv přímo přepsat příkazem WRITE, když předtím do položky RELATIVE KEY uložíme její číslo. Podobně lze příkazem WRITE zapsat úplně novou větu, když předtím do položky RELATIVE KEY uložíme pořadové číslo větší než dosavadní největší pořadové číslo. Indexově organizovaný soubor dat lze vytvářet pouze sekvenčně, zatímco později jej lze buďto sekvenčně prodlužovat nebo sekvenčně číst s případným opravováním a vyřazováním logických vět anebo zpracovávat přímo, přičemž můžeme logické věty číst, opravovat, vyřazovat (rušit) a vkládat (doplňovat). Tato univerzálnost (spolu s jednoduchostí zpracování, jakož i s možností pracovat sekvenčně i přímo pomocí několika různých logických klíčů) je závažnou předností indexové organizace před sekvenční i před relativní organizací. a) Při sekvenčním vytváření se logické věty zapisují do souboru dat v tom pořadí, v jakém se pro ně provádějí příkazy WRITE. Zároveň se vytvářejí příslušné primární indexové záznamy. Uživatel musí zapisovat logické věty v takovém pořadí, aby jejich logické klíče tvořily rostoucí posloupnost (při neuvedení klauzule APPLY DUPLICATE-KEY) resp. neklesající posloupnost (při uvedení klauzule APPLY DUPLICATE-KEY). Jedná se buďto o prvotní vytvoření (při OPEN OUTPUT) anebo o sekvenční prodloužení již existujícího souboru dat (při OPEN EXTEND) - v tomto případě musí být logický klíč první logické věty zapisované po OPEN EXTEND větší (resp. nikoliv menší) než logický klíč poslední logické věty z původního souboru dat. Sekundární indexy je nutno vytvořit dodatečně po vytvoření nebo rozšíření souboru pomocným programem BLDIND. b) Při sekvenčním čtení s případným opravováním a vyřazováním příkazy READ poskytují logické věty v pořadí dle rostoucího (resp. neklesajícího) logického klíče. Standardně začíná sekvenční čtení na první logické větě souboru dat, lze však začít na logické větě s předem zadaným logickým klíčem a pozici v souboru při sekvenčním zpracování měnit pomocí příkazu START. Úspěšně přečtenou logickou větu lze opravit nebo logicky vyřadit (zrušit). c) Při přímém zpracování (tj. je-li zadáno ACCESS RANDOM) lze logické věty jednak číst a opravovat, jednak přidávat (tj. vkládat na příslušné místo souboru dat dle hodnoty logického klíče), a jednak logicky vyřazovat ze souboru dat (rušit). Zpracování je řízeno uživatelem, který před každým příkazem READ musí do položky uvedené v klauzuli NOMINAL KEY uložit logický klíč té věty, kterou chce přímo přečíst nebo přidat. d) Při uvedení klauzule ACCESS DYNAMIC lze jak sekvenčně číst a opravovat nebo vyřazovat, přičemž lze používat i příkaz START (viz bod b), tak i přímo číst, opravovat, vyřazovat a přidávat (viz bod c). Přístup k souboru dat je tedy během zpracování střídavě sekvenční a přímý. Poznámka: Pro indexový soubor může být definováno několik na sobě zcela nezávislých logických klíčů. Při vytváření souboru se zřizuje pouze tzv. primární index, příslušný primárnímu logickému klíči. Indexové soubory příslušné k dalším (tzv. sekundárním) logickým klíčům jsou vytvářeny pomocným programem BLDIND, který je dodáván s překladačem. Při sekvenčním i při přímém zpracování pak uživatel může pomocí klauzule "SECONDARY KEY celé-číslo" (přípustné v příkazu START a v příkazu READ pro přímé čtení) zadat, s kterým logickým klíčem chce pracovat.