3. ENVIRONMENT DIVISION Formát: ENVIRONMENT DIVISION. - CONFIGURATION SECTION. - | | | [SOURCE-COMPUTER. [libovolný-řetězec. ]...] | | | | [OBJECT-COMPUTER. [libovolný-řetězec. ]...] | | | | - SPECIAL-NAMES. - | | | | | | | [DECIMAL-POINT IS COMMA] | | | | | | | | [CURRENCY SIGN IS 'znak'] | | | | | | | | [CURSOR IS položka] | | | | | | | | [CRT STATUS IS položka] | | | | | | | | [funkční-jméno IS speciální-jméno]... | | | | | | | | - UPSI-n [IS speciální-jméno] - | | | | | | | | | | | {{ON } } |... | | | | | {{OFF} STATUS IS speciální-jméno }... | | | - - - - - - - - | INPUT-OUTPUT SECTION. | | | | [FILE-CONTROL. [SELECT-klauzule.]...]| | | | [I-O-CONTROL. [APPLY-klauzule]...] | - - Oddíl ENVIRONMENT DIVISION se skládá ze dvou sekcí, CONFIGURATION SECTION a INPUT-OUTPUT SECTION, které jsou obě nepovinné. Jsou-li obě uvedeny, musí být nejprve CONFIGURATION SECTION a za ní teprve INPUT-OUTPUT SECTION. Sekce CONFIGURATION SECTION je rozdělena do tří paragrafů, které jsou všechny nepovinné a mohou být uvedeny v libovolném vzájemném pořadí. V každém z paragrafů SOURCE-COMPUTER a OBJECT-COMPUTER je třeba za záhlavím zapsat žádný, jeden nebo několik libovolných řetězců (překladač vždy čte až do nalezení prvního znaku v poli A). Tyto paragrafy slouží pouze k dokumentačním účelům pro uživatele; překladač jejich obsah nijak nevyužívá. 3.1. SPECIAL-NAMES V paragrafu SPECIAL-NAMES lze zapsat klauzule DECIMAL-POINT, CURRENCY SIGN, CURSOR a CRT STATUS, dále klauzule přiřazující speciální jména k funkčním jménům a konečně klauzule přiřazující speciální jména k oběma stavům jednotlivých bitů UPSI-bytu. Klauzule DECIMAL-POINT a CURRENCY SIGN smí být uvedeny nejvýše jednou. Všechny klauzule paragrafu SPECIAL-NAMES lze zapisovat v libovolném pořadí, přičemž paragraf smí být i prázdný. Každou klauzuli (včetně poslední) lze zakončit mezerou, čárkou, středníkem nebo tečkou. 3.1.1. Klauzule DECIMAL-POINT Formát: DECIMAL-POINT IS COMMA Význam: Je-li uvedena klauzule DECIMAL-POINT, pak se v celém tomto zdrojovém programu vymění význam tečky a čárky v numerických literálech a ve vzorech klauzule PICTURE: a) V numerických literálech se místo desetinné tečky musí psát desetinná čárka, zatímco tečka nesmí být v numerickém literálu uvedena. b) Ve vzorech klauzule PICTURE čárka znamená "výpočtovou desetinnou čárku" (a tedy smí být uvedena nejvýše jednou), zatímco tečka se stává výplňkovým znakem (a tedy smí být uvedena i vícekrát). Tato výměna významu tečky a čárky se pochopitelně projeví i v tom, který znak se do příslušného bytu položky při edici dosazuje. Poznámka: Klauzule DECIMAL-POINT nemá žádný vliv na funkci tečky a čárky jakožto interpunkčních znaků (tzn. oddělovačů); zde k žádné výměně významu nedochází! Příklad: CONFIGURATION SECTION. SPECIAL-NAMES. DECIMAL-POINT IS COMMA. . . . 77 A PIC S99V9 VALUE -12,5. 77 B PIC 99.999.999,99. . . . ADD ,2, -,4, 1,5, +24,8 TO A. MOVE 1234567,8 TO B. Položka A získá hodnotu 13,6. Položka B získá obsah 01.234.567,80. 3.1.2. Klauzule CURRENCY SIGN Formát: CURRENCY SIGN IS 'znak' Pravidla: Za slovem IS musí být uveden jediný znak v apostrofech. Smí to být libovolný znak s výjimkou těch znaků, které již mají svůj význam ve vzorech klauzule PICTURE. Tyto nepřípustné znaky jsou: mezera, tečka, (, +, *, -, /, čárka, A, B, C, D, E, P, R, S, V, X, Y, Z, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 a hexadecimální 00. Význam: Uvedený znak bude mít ve vzorech numerických editovaných položek význam měnového symbolu, zatímco standardní měnový symbol, kterým je opět díky Bohu známý $ bude ve vzorech zakázán. Na příslušný byte položky bude ve vzorech dosazován tento znak a nikoliv $. Příklad: CONFIGURATION SECTION. SPECIAL-NAMES. CURRENCY SIGN IS 'K'. . . . 77 A PIC KZZ99.99. 77 B PIC KKKBK9. Příkaz "MOVE 527 TO A B" dosadí do položky A obsah Kb527.00 a do položky B obsah bK5b27. 3.1.2.A Klauzule CURSOR Formát: CURSOR IS položka Pravidla: Položka musí být celočíselná s klauzulí PICTURE 9(4). Význam: V klauzuli je uvedena položka, jejíž obsah určuje pozici kurzoru při vyvolání příkazu ACCEPT v obrazovkovém režimu. Poznámky: 1) Obrazovka je tvořena řádky a sloupci (obvykle 80 sloupců, 25 řádků), souřadnice x jde zleva doprava, souřadnice y shora dolů, počátek souřadnic (1,1) je v levém horním rohu obrazovky. 1,1 ... x 80,1 --------------------------- | | | | | | . | | . | _ (x,y) | . | | y | | | | | | | | 1,25 --------------------------- 80,25 2) Pozice kurzoru na obrazovce je zadána dvojicí x, y, kde x je pořadové číslo sloupce (horizontální souřadnice) a y je pořadové číslo řádku (vertikální souřadnice). Jak x tak y se počítají od jedné do maxima povoleného pro použitý typ obrazovky. Pozice je v položce zakódována následujícím způsobem: souřadnice y je vynásobena 100 a k tomuto součinu je připočtena hodnota souřadnice x. Např. pozice (55,14) je v CURSOR-položce zakódována číslem 1455, protože 14 x 100 + 55 = 1455. Jinými slovy, pořadové číslo řádku se vynásobí stem a přičte se pořadové číslo pozice na řádku. 3.1.2.B Klauzule CRT STATUS Formát: CRT STATUS IS položka Pravidla: Položka musí být deklarována jako alfanumerická o délce 3. Smí být skupinová nebo elementární. Význam: V klauzuli je uvedena položka, jejíž obsah oznamuje, jakým způsobem skončil naposled prováděný příkaz ACCEPT pracující v obrazovkovém režimu. Podrobnosti o obsahu viz 9.4. 3.1.3. Definice speciálních jmen Speciální jména jsou jména, která programátor přiřadí v paragrafu SPECIAL-NAMES k tzv. funkčním jménům, jak nazýváme několik rezervovaných slov, pro něž je takovéto přiřazení přípustné. Pak lze takto definovaná speciální jména použít v programu na těch místech, kde to připouští formát a popis. Jak je vidět z formátů, lze však na všech těchto místech vždy v témže významu použít i odpovídající funkční jména. Speciální jména mají sloužit k tomu účelu, aby při přenosu programu do jiné implementace jazyka COBOL nebylo nutno opravovat mnoho míst ve zdrojovém programu, nýbrž aby stačilo v případě potřeby opravit jedinou přiřazovací klauzuli v paragrafu SPECIAL-NAMES. Speciální jména je třeba vytvářet podle stejných pravidel jako jména položek (viz 1.4.). Totéž speciální jméno nesmí být v paragrafu SPECIAL-NAMES použito vícekrát. Naproti tomu však je přípustné témuž funkčnímu jménu přiřadit i několik speciálních jmen. Formát 1: funkční-jméno IS speciální-jméno Funkční-jméno smí být výhradně některé z těchto slov: a) SYSLST, SYSPUNCH, SYSPCH, SYSLOG, PRINTER; pak smí být speciální-jméno použito v příkazu DISPLAY nebo EXHIBIT za slovem UPON. b) SYSIPT; pak smí být speciální-jméno použito pouze v příkazu ACCEPT za slovem FROM. c) CONSOLE; pak smí být speciální-jméno použito buďto v příkazu DISPLAY nebo EXHIBIT za slovem UPON anebo v příkazu ACCEPT za slovem FROM. d) C01, C02, C03, C04, C05, C06, C07, C08, C09, C10, C11, C12, CSP; pak smí být speciální-jméno použito pouze v příkazu WRITE za slovem AFTER nebo BEFORE. e) 'znak' (libovolný jediný znak v apostrofech); pak smí být speciální-jméno použito pouze v klauzuli CODE v popisu RD. Příklad: SPECIAL-NAMES. SYSPCH IS DEROVAC CONSOLE IS BEDNA SYSIPT IS VSTUP C03 IS TRETI-KANAL. . . . ACCEPT VETA FROM VSTUP. DISPLAY 'ZADEJ NNN' UPON BEDNA. ACCEPT CISLO-ZAVODU FROM BEDNA. DISPLAY A B C UPON DEROVAC. WRITE TISK AFTER TRETI-KANAL. Formát 2: UPSI-n [IS speciální-jméno] { {ON|OFF} STATUS IS speciální-jméno} ... Pravidla: a) "n" musí být jedna z číslic 0,1,2,3,4,5,6,7. b) Klauzule "IS speciální-jméno", kterou je možno zapsat bezprostředně za "UPSI-n", je nepovinná a zcela bezvýznamná; je povolena pouze kvůli kompatibilitě. c) Je nutno zapsat buďto klauzuli ON STATUS anebo klauzuli OFF STATUS anebo obě (případně i vícekrát) v libovolném pořadí. Význam: Těmito klauzulemi se přidělují speciální jména k oběma stavům jednotlivých bitů přepínače zvaného UPSI-byte. Číslo "n" označuje, o který bit UPSI-bytu se jedná; bity číslujeme zleva doprava od 0 do 7 (tedy UPSI-0 odpovídá bitu 0x80 UPSI-1 odpovídá bitu 0x40 atd. až UPSI-7 odpovídá bitu 0x01). Každému z osmi bitů lze tedy pomocí klauzulí ON STATUS a OFF STATUS přidělit jedno anebo i více speciálních jmen. Takto definovaná speciální jména lze použít pouze v podmíněném výrazu, a to jakožto tzv. "test UPSI-bytu" (viz 5.4.6.). 3.2. Soubory dat v MX COBOLu 3.2.1. Logická věta, blok, soubor Základním množstvím dat, s nímž se při vstupech a výstupech v Cobolu pracuje, je tzv. logická věta (též záznam nebo logický record). Pomocí příkazů READ, WRITE a REWRITE se vždy čte, zapisuje a přepisuje právě jedna logická věta. Logická věta bývá souhrnem informací, které spolu z hlediska obsahu a použití logicky souvisí. Obsahuje např. údaje o jednom zaměstnanci, zákazníku, zakázce, výrobku, materiálu atp. Uživatel pracuje pouze s jednotlivými logickými větami, zatímco ostatní práci (zpracování návěští, fyzické přenosy, testování chyb atd.) za něj provádí příslušný operační systém. Blok (též fyzický blok) je pojem, který na určitých typech periferních zařízení dříve znamenal množství dat, které se při přenosu dat mezi vnitřní pamětí počítače a médiem přenášelo najednou. V MX Cobolu tento pojem ztratil svůj význam, protože problémy spojené s přenosem dat mezi pamětí a médiem (např. blokování) jsou v moderních operačních systémech natolik skryty očím uživatele, že s nimi nelze operovat v hranicích dříve obvyklých ani průběh přenosů ovládat tak, jak bývalo dříve zvykem. Operační systém nezná pojem logická věta a na data uložená na médiu pohlíží jako na lineární posloupnost jednotlivých bytů, které říkáme soubor dat. Z hlediska pohledu Cobolu je tato posloupnost myšleně dělena na jednotlivé logické věty, tedy na části, po kterých je soubor dat zpracováván. 3.2.2. Tabulka souboru Má-li být v programu zpracováván nějaký soubor dat, zřizuje překladač pro každý soubor řídící strukturu, které se říká tabulka souboru. Tato tabulka obsahuje statické a dynamické údaje o zpracovávaném souboru dat a o metodě, kterou je tento soubor dat zpracováván. Tabulka se aktivuje v okamžiku otevření souboru příkazem OPEN. V jazyce MX COBOL existují příkazy DISPLAY, EXHIBIT, ACCEPT, READY a STOP, které umožňují vstup a výstup, aniž by uživatel musel pro tyto příkazy zadávat nějaké předběžné informace; tabulka souboru se zde nevytváří a nepoužívá. Tyto příkazy ovšem poskytují jen omezené možnosti a proto se používají jen pro vedlejší účely (pomocný vstup a výstup, ladění atp.). V této kapitole se jimi zabývat nebudeme a popíšeme způsob, který dává programátorovi bohatší možnosti, vyžaduje však zadání předběžných informací. Tabulku souboru vytváří překladač jako součást přeloženého programu, k čemuž používá ze zdrojového programu tyto informace: 1) Deklaraci souboru klauzulí SELECT v paragrafu FILE-CONTROL (viz 3.4.). 2) Požadavky na speciální techniky při práci se souborem dat, které se zadávají pomocí klauzulí paragrafu I-O-CONTROL (viz 3.5.). 3) Popis souboru klauzulí FD a popisy logických vět souboru ve FILE SECTION (viz 4.4.). 4) Deklarativní sekce pro ošetření chyb vstupu/výstupu. Tyto deklarativní sekce se uvádějí v deklarativní části PROCEDURE DIVISION (viz 5.5.). 5) Příkazy v PROCEDURE DIVISION, pomocí nichž provádí uživatel vlastni zpracování souboru (kapitoly 8 a 14). Tabulka souboru má tvar definovaný překladačem, není v žádném případě shodná s žádnými systémovými strukturami pro řízení vstupu/výstupu. Pomocí jedné tabulky souboru lze zpracovávat pouze jediný soubor dat. Naproti tomu určitý soubor dat lze postupně anebo i současně zpracovávat pomocí několika tabulek souboru. Pojmem soubor rozumíme v této příručce vždy tabulku souboru (máme pak tedy vzájemně jednoznačnou korespondenci mezi soubory a klauzulemi FD). Neměli bychom tedy říkat, že "zpracováváme soubor", nýbrž že "prostřednictvím souboru zpracováváme soubor dat". Protože však ve většině případů je tabulka souboru reprezentantem toho souboru dat, s nímž je právě spojena, používáme ve shodě s ustáleným názvoslovím (pokud nehrozí nebezpečí omylu) termín "soubor" jak místo "tabulka souboru", tak i místo termínu "soubor dat právě spojený s touto tabulkou souboru". 3.2.3. Fyzické zařízení V MX Cobolu lze pracovat s diskovými zařízeními (pevný disk, disketa), s tiskárnou, klávesnicí a obrazovkou.