8.9. Zpracování indexového souboru 8.9.1. Vytvoření indexového souboru Pod vytvořením indexového souboru rozumíme jednak prvotní vytváření a jednak sekvenční prodlužování již existujícího souboru dat (viz 3.4.4.). Jak již bylo řečeno, tyto dva způsoby zpracování se liší typem otevření (OPEN OUTPUT pro prvotní vytváření, OPEN EXTEND pro sekvenční prodlužování). Klauzule SELECT má tvar SELECT jméno-souboru ASSIGN systémové-jméno [ ORGANIZATION IS INDEXED ] [ RECORD KEY položka ]. Je-li v systémovém jméně uvedena organizace, musí to být organizace I. Pak není nutné uvádět klauzuli ORGANIZATION. Jestliže je ovšem na místě systémového jména uvedeno pouze fyzické jméno souboru, musí být klauzule ORGANIZATION uvedena. Jméno indexové části indexového souboru je odvozeno ze jména datové části tak, že se jako postfix vezmou znaky IN0 pro primární index, IN1, IN2 atd. pro případné sekundární indexy. Klauzule FD má tvar: FD jméno-souboru [RECORDING {F|V}] [RECORD [celé-číslo-1 TO] celé-číslo-2]. Na začátku zpracování musí být soubor otevřen příkazem OPEN OUTPUT jméno-souboru Před zápisem logické věty musí uživatel umístit do 01 v paměti tu logickou větu, kterou chce zapsat. Uživatel musí zapisovat logické věty v takovém pořadí, aby jejich primární logické klíče (viz 3.4.8.) tvořily rostoucí posloupnost. Při uvedení klauzule APPLY DUPLICATE-KEY je přípustné, aby dvě nebo více logických vět mělo týž primární logický klíč; v tomto případě tedy stačí, aby primární logické klíče tvořily neklesající posloupnost. Takové setřídění logických vět je zaručeno např. tehdy, čteme-li logické věty sekvenčně z jiného indexového souboru anebo odebíráme-li je na výstupu příkazu SORT, MERGE nebo MATCH. Zápis logické věty se provede příkazem - - - - | | položka | | WRITE logická-věta | FROM < literál > | | | figurativní-konstanta | | | | ALL-klauzule | | - - - - [ INVALID KEY příkaz ... ] Následující výjimečné stavy znemožňují správný zápis logické věty anebo vyžadují zvláštní ošetření (podrobněji viz 5.5.2.): 3) Je naplněna oblast dat, zapisovaná logická věty se však ještě zapsala; soubor musí být uzavřen. 4) Je zaplněna oblast indexů, zapisovaná logická věta se však ještě zapsala; soubor musí být uzavřen. 7) Zapisovaná logická věta má stejný primární logický klíč jako předchozí logická věta, přičemž pro soubor není uvedena klauzule APPLY DUPLICATE-KEY. 8) Zapisovaná logická věta má menší primární klíč než předcházející logická věta. Příčiny 3 a 4 způsobují přednostně vyvolání deklarativní sekce pro ošetření chyb vstupu/výstupu (viz 5.5.2.); teprve při neuvedení deklarativní sekce způsobují uplatnění klauzule INVALID KEY. Příčiny 7 a 8 způsobují přednostně uplatnění klauzule INVALID KEY; teprve při neuvedení klauzule INVALID KEY způsobují vyvolání deklarativní sekce. Uplatňuje-li se klauzule INVALID KEY z více příčin, může je uživatel rozlišit tak, že po uplatnění klauzule INVALID KEY vyvolá příkazem CALL uživatelský podprogram ICISAMC (viz Příručka programátora 11.16), jenž zjistí příčinu výjimečného stavu a v závislosti na ní odskočí na jednu ze zadaných procedur. Logická věta, jejíž primární logický klíč porušuje vzestupné setřídění (příčiny 7 a 8), se do souboru dat nezapisuje; ve vytváření souboru dat je ovšem možno pokračovat. Je tedy zaručeno, že logické věty skutečně zapsané do souboru dat mají vzrůstající (resp. při APPLY DUPLICATE-KEY neklesající) primární logické klíče. Po zápisu poslední logické věty je nutno soubor uzavřít příkazem CLOSE jméno-souboru Poznámka: Při vyváření indexového souboru dat se vytváří pouze primární index v souboru, jehož jméno je od jména datové oblasti odvozeno offsetem .IN0 a v němž jsou indexové položky příslušející zapisovaným větám setříděny podle hodnoty primárního klíče. Indexové soubory pro případné sekundární klíče jsou vytvářeny služebním programem BLDIND, který musí být vyvolán po vlastním vytvoření (jakož i po každém sekvenčním prodloužení) souboru dat. Aby mohly být tyto sekundární klíče použity v rámci MX Cobolu, je nutné, aby soubor, ve kterém bude první sekundární index měl stejné jméno jako datový soubor ale offset IN1, druhý sekundární index offset IN2 atd. 8.9.2. Sekvenční čtení indexového souboru Klauzule SELECT má tvar SELECT jméno-souboru ASSIGN systémové-jméno [ ORGANIZATION IS INDEXED ] [ {NOMINAL | SYMBOLIC} KEY položka ] [RECORD KEY položka]. Klauzule NOMINAL KEY resp. SYMBOLIC KEY má význam jen tehdy, je-li pro soubor požíván příkaz START; jinak se ignoruje. Není-li klauzule NOMINAL KEY resp. SYMBOLIC KEY uvedena a uživatel chce přesto používat příkazy START, musí pro ně zadávat logické klíče do položky z klauzule RECORD KEY (podrobněji viz 3.4.7. a 8.4.). Je-li v systémovém jméně uvedena organizace, musí to být organizace I; pak není nutné uvádět klauzuli ORGANIZATION. Jestliže je jako systémové jméno uvedeno pouze fyzické jméno souboru, musí být klauzule ORGANIZATION uvedena. Klauzule FD má stejný tvar jako při vytváření souboru (viz 8.9.1.). Klauzuli RECORDING i délku logických vět je nutno zadat v souladu se skutečnými hodnotami v souboru dat. Na začátku zpracování musí být soubor otevřen příkazem OPEN {INPUT | I-O} jméno-souboru Volby INPUT a I-O jsou rovnocenné; při obou způsobech otevření je přípustné logické věty číst, opravovat i vyřazovat. Při otevření souboru se automaticky otevře primární indexový soubor a rovněž všechny existující sekundární indexové soubory. Jméno primárního indexového souboru se odvodí ze jména datového souboru tak že se opatří offsetem IN0. Dále se zkoumá, zda v aktuálním adresáři neexistuje soubor téhož jména, ale s offsetem IN1; jestliže ano, otevře se jako první sekundární index, tady jako index s pořadovým číslem 1. Existují-li další sekundární indexy, tj. soubory téhož jména, ale s offsety IN2, IN3, atd. rovněž se automaticky otevřou a připraví k použití v příkazech START a READ jako 2., 3., atd. sekundární index. Otevírání dalších sekundárních indexů končí v případě, kdy se již otevřelo osm sekundárních indexů nebo když se po otevření sekundárního indexu s offsetem INn nenašel soubor s offsetem IN(n+1). Sekvenční čtení s případným opravováním se může provádět buďto podle primárního logického klíče anebo podle některého ze sekundárních logických klíčů. Po otevření bude jakožto aktuální určen vždy primární logický klíč. Určit jakožto aktuální jiný logický klíč je možno pouze pomocí příkazu START (viz 8.4.), pomocí něhož lze též měnit pozici do libovolného místa v sekvenční posloupnosti logických vět. Logická věta (následující v sekvenčním pořadí dle vzrůstajícího resp. neklesajícího aktuálního logického klíče) se přečte z vnějšího média do 01 příkazem READ jméno-souboru [INTO položka] [AT END příkaz ... ] Opravit lze pouze tu logickou větu, která byla přečtena posledním příkazem READ, přičemž ovšem při tomto příkazu READ nesměla nastat podmínka "konec souboru" (uplatnění klauzule AT END). Každou přečtenou větu lze opravit nejen jednou, ale případně i vícekrát bezprostředně po sobě. Uživatel tedy přečte logickou větu do 01 příkazem READ a opraví ji v paměti (tj. v 01_), přičemž může změnit její primární anebo sekundární logický klíč bez ohledu na to, jedná-li se o aktuální klíč. Došlo-li ke změně některého z klíčů, budou příslušné indexové záznamy automaticky opraveny tak, aby pozice opravené věty v těchto indexech odpovídala novým hodnotám klíčů. Opravu logické věty v souboru dat pak provede příkazem - - - - | |položka | | REWRITE logická-věta | FROM | | |figurativní-konstanta| | | |ALL-konstanta | | - - - - [INVALID KEY příkaz ... ] Změnil-li uživatel v opravované větě některý klíč tak, že indexový záznam příslušný této nové hodnotě nelze z důvodu duplicity zařadit, dojde k uplatnění klauzule INVALID KEY; pří neuvedení klauzule INVALID KEY dojde k vyvolání deklarativní sekce pro ošetření chyb vstupu/výstupu (viz 5.5.2.). Ve zpracování souboru se však smí pokračovat. Zrušit (logicky vyřadit ze souboru dat) lze pouze tu logickou větu, která byla přečtena posledním příkazem READ, přičemž ovšem toto čtení muselo být úspěšné. Zrušení věty proběhne pouze tzv. logicky, tj. budou zrušeny indexové záznamy o této větě, stane se nedostupnou, ale její data budou v oblasti dat existovat i nadále. Fyzické zrušení nastane až při reorganizaci souboru. Uživatel tedy přečte logickou větu do 01 příkazem READ a zruší ji (tj. logicky vyřadí ze souboru dat) příkazem DELETE jméno-souboru [INVALID KEY příkaz ... ] Klauzule INVALID KEY se nikdy neuplatní (je-li uvedena, vždy se odskočí na první příkaz za tečkou) a rovněž případná deklarativní sekce pro ošetření chyb vstupu/výstupu nebude nikdy vyvolána. Po ukončení zpracování je nutno soubor uzavřít příkazem CLOSE jméno-souboru Příklad: Máme provést reorganizaci indexového souboru dat tím, že jej přepíšeme do nového souboru, přičemž vyřadíme všechny logické věty s klíčem menším než 20000. Délka logické věty je 50 bytů, délka logického klíče je 5 bytů. IDENTIFICATION DIVISION. PROGRAM-ID. REORG. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT STARY ASSIGN I-STARY NOMINAL NOM. SELECT NOVY ASSIGN I-NOVY. I-O-CONTROL. APPLY DUPLICATE-KEY NOVY. DATA DIVISION. FILE SECTION. FD STARY. 01 VSTARY. 02 INDIKATOR PIC X. 02 FILLER PIC X(49). FD NOVY FILE STATUS S. 01 VNOVY PIC X(50). WORKING-STORAGE SECTION. 77 NOM PIC X(5). 77 CHYBNIK PIC X(8). 77 S PIC XX. PROCEDURE DIVISION. DECLARATIVES. ERR SECTION. USE AFTER ERROR PROCEDURE NOVY. IF S = '10' DISPLAY 'PLNA OBLAST DAT' ELSE DISPLAY 'PLNA OBLAST INDEXU'. DISPLAY 'POSLEDNI ZAPSANA LOGICKA VETA = ' VNOVY. GO TO Q2. END DECLARATIVES. OPEN INPUT STARY OUTPUT NOVY. START STARY KEY = '20000' INVALID KEY DISPLAY 'VSECHNO JE MENSI NEZ 20000' GO TO Q2. Q1. READ STARY AT END GO TO Q2. IF INDIKATOR = '1' GO TO Q1. WRITE VNOVY FROM VSTARY INVALID KEY DISPLAY 'VADNY LOGICKY KLIC U VETY' VNOVY. GO TO Q1. Q2. CLOSE STARY NOVY. STOP RUN. 8.9.3. Přímé zpracování indexového souboru Klauzule SELECT má tvar SELECT jméno-souboru ASSIGN systémové-jméno ACCESS RANDOM [ ORGANIZATION IS INDEXED ] [ {NOMINAL | SYMBOLIC} KEY položka [RECORD KEY položka] Není-li uvedena klauzule NOMINAL resp. SYMBOLIC KEY, rozumí se v dalším textu NOMINAL-položkou položka uvedená v klauzuli RECORD KEY (a není-li ani ta uvedena, pak ta část 01, která odpovídá primárnímu logickému klíči. Je-li v systémovém jméně uvedena organizace, musí to být organizace I; pak není nutné uvádět klauzuli ORGANIZATION. Jestliže je jako systémové jméno uvedeno pouze fyzické jméno souboru, musí být klauzule ORGANIZATION uvedena. Klauzule FD má stejný tvar jako při vytváření souboru (viz 8.9.1.). Klauzuli RECORDING i délku logických vět je nutno zadat v souladu se skutečnými hodnotami v souboru dat. Na začátku zpracování musí být soubor otevřen příkazem OPEN {INPUT | I-O | OUTPUT} jméno-souboru Volby INPUT, I-O a OUTPUT jsou rovnocenné; po kterémkoliv způsobu otevření lze provádět příkazy READ, WRITE, REWRITE a DELETE. Při otevření souboru se automaticky otevře primární indexový soubor a rovněž všechny existující sekundární indexové soubory. Jméno primárního indexového souboru se odvodí ze jména datového souboru tak že se opatří offsetem IN0. Dále se zkoumá, zda v aktuálním adresáři neexistuje soubor téhož jména, ale s offsetem IN1; jestliže ano, otevře se jako první sekundární index, tady jako index s pořadovým číslem 1. Existují-li další sekundární indexy, tj. soubory téhož jména, ale s offsety IN2, IN3, atd. rovněž se automaticky otevřou a připraví k použití v příkazech START a READ jako 2., 3., atd. sekundární index. Otevírání dalších sekundárních indexů končí v případě, kdy se již otevřelo osm sekundárních indexů nebo když se po otevření sekundárního indexu s offsetem INn nenašel soubor s offsetem IN(n+1). Přímé čtení se může provádět buďto pomocí primárního logického klíče anebo podle některého ze sekundárních klíčů. Po otevření souboru bude jako aktuální určen primární logický klíč. Určit jakožto aktuální jiný logický klíč je během výpočtu možné pouze pomocí příkazu READ s klauzulí SECONDARY KEY. Opravovat (REWRITE) a vyřazovat (DELETE) lze pouze naposledy přečtenou logickou větu, přičemž při tomto čtení (READ) mohl být aktuálním kterýkoliv logický klíč. Vkládání logických vět (WRITE) je akce nezávislá na tom, který z logických klíčů je aktuální. Před přímým čtením logické věty musí uživatel naplnit NOMINAL-položku hodnotou aktuálního logického klíče té logické věty, kterou chce přečíst. Logickou větu pak přečte do 01 příkazem READ jméno-souboru [INTO položka] [SECONDARY KEY celé-číslo] [INVALID KEY příkaz ... ] Klauzule "SECONDARY KEY celé-číslo" má stejný význam jako u příkazu START (viz 8.4.): a) Je-li v příkazu READ uvedena klauzule "SECONDARY KEY celé-číslo", bude nadále aktuálním logický klíč s pořadovým číslem uvedeným v této klauzuli. (Chceme-li tedy, aby se aktuálním stal primární logický klíč, musíme v příkazu READ uvést klauzuli "SECONDARY KEY 0".) Této volbě aktuálního logického klíče musí též odpovídat hodnota logického klíče uložená před provedením příkazu READ do NOMINAL-položky. Zvolený logický klíč bude aktuálním pro tento příkaz READ a pro všechny následující příkazy READ bez klauzule SECONDARY KEY až do prvního následujícího příkazu READ s klauzulí SECONDARY KEY. b) Není-li v příkazu READ uvedena klauzule "SECONDARY KEY celé-číslo", nebo je-li uvedena a sekundární index daného pořadového čísla neexistuje, zůstává i nadále aktuálním logickým klíčem ten logický klíč, který byl aktuálním klíčem před provedením tohoto příkazu READ. Může to být primární logický klíč nebo některý ze sekundárních logických klíčů. I v tomto případě musí zadaná hodnota logického klíče odpovídat okamžité volbě aktuálního logického klíče. Pokud v souboru dat neexistuje logická věta s aktuálním logickým klíčem rovným NOMINAL-položce, nic se nepřečte a uplatní se klauzule INVALID KEY; při neuvedení klauzule INVALID KEY dojde k vyvolání deklarativní sekce pro ošetření chyb vstup/výstupu (viz 5.5.2.). Ve zpracování souboru se však smí pokračovat. Opravit lze pouze tu logickou větu, která byla přečtena posledním předcházejícím příkazem READ, přičemž ovšem při tomto příkazu READ nesmělo dojít k výjimečnému stavu (uplatnění klauzule INVALID KEY resp. vyvolání deklarativní sekce). Každou přečtenou logickou větu lze opravit i vícekrát bezprostředně po sobě. Uživatel tedy přečte logickou větu do 01 příkazem READ a opraví ji v paměti (tj. v 01), přičemž může změnit její primární anebo sekundární logický klíč bez ohledu na to, jedná-li se o aktuální klíč. Došlo-li ke změně některého z klíčů, budou příslušné indexové záznamy automaticky opraveny tak, aby pozice opravené věty v těchto indexech odpovídala novým hodnotám klíčů. Opravu logické věty v souboru dat pak provede příkazem - - - - | |položka | | REWRITE logická-věta | FROM | | |figurativní-konstanta| | | |ALL-konstanta | | - - - - [INVALID KEY příkaz ... ] Změnil-li uživatel v opravované větě některý klíč tak, že indexový záznam příslušný této nové hodnotě nelze z důvodu duplicity zařadit, dojde k uplatnění klauzule INVALID KEY; pří neuvedení klauzule INVALID KEY dojde k vyvolání deklarativní sekce pro ošetření chyb vstupu/výstupu (viz 5.5.2.). Ve zpracování souboru se však smí pokračovat. Zrušit (logicky vyřadit ze souboru dat) lze pouze tu logickou větu, která byla přečtena posledním příkazem READ, přičemž ovšem toto čtení muselo být úspěšné. Zrušení věty proběhne pouze tzv. logicky, tj. budou zrušeny indexové záznamy o této větě, stane se nedostupnou, ale její data budou v oblasti dat existovat i nadále. Fyzické zrušení nastane až při reorganizaci souboru. Uživatel tedy přečte logickou větu do 01 příkazem READ a zruší ji (tj. logicky vyřadí ze souboru dat) příkazem DELETE jméno-souboru [INVALID KEY příkaz ... ] NOMINAL-položka se při rušení nepoužívá. Klauzule INVALID KEY se nikdy neuplatní (je-li uvedena, vždy se odskočí na první příkaz za tečkou) a rovněž případná deklarativní sekce pro ošetření chyb vstupu/výstupu nebude nikdy vyvolána. Před zápisem (tj. vložením) nové logické věty do souboru dat musí uživatel umístit do 01 tu logickou větu, která má být zapsána. Příkazem - - - - | |položka | | WRITE logická-věta | FROM | | |figurativní-konstanta| | | |ALL-konstanta | | - - - - [INVALID KEY příkaz ... ] se pak logická věta vloží jako poslední v souboru dat, a indexová položka náležející této větě se zařadí na místo odpovídající její hodnotě, takže vzestupné setřídění logických vět dle primárního klíče zůstane zachováno. Budou však opraveny tabulky indexů nejen vzhledem k primárnímu logickému klíči ale i ke všem definovaným sekundárním logickým klíčům. NOMINAL-položka se při vkládání logické věty nepoužívá. Následující výjimečné stavy znemožňují správný zápis logické věty anebo vyžadují zvláštní ošetření (podrobněji viz 5.5.2.): 6) Právě se zaplnilo médium se souborem, zapisovaná věta se nezapsala. Ve zpracování souboru lze pokračovat; čtení, opravování a vyřazování proběhnou vždy správně, nelze pochopitelně přidávat. 7) V soubor dat se již nalézá logická věta, která má týž primární logický klíč anebo některý ze sekundárních logických klíčů jako vkládaná věta, přičemž pro tento klíč nejsou přípustné duplikované hodnoty. Věta je přístupná, pokud se ji podařilo zapsat alespoň přes jeden index. Příčina 6) způsobuje přednostně vyvolání deklarativní sekce pro ošetření chyb vstupu/výstupu (viz 5.5.2.); teprve při neuvedení deklarativní sekce způsobuje uplatnění klauzule INVALID KEY. Příčina 7 způsobuje přednostně uplatnění klauzule INVALID KEY; teprve při neuvedení klauzule INVALID KEY způsobuje vyvolání deklarativní sekce. Uplatňuje-li se klauzule INVALID KEY z obou příčin, může je uživatel rozlišit tak, že po uplatnění klauzule INVALID KEY vyvolá příkazem CALL dodávaný uživatelský podprogram ICISAME (viz příručka programátora, 11.17.), jenž zjistí příčinu výjimečného stavu a v závislosti na ní odskočí na jednu ze zadaných procedur. Po ukončení zpracování je nutno soubor uzavřít příkazem CLOSE jméno-souboru Příklad: Je vytvořen indexový soubor dat; logické věty mají délku 60 bytů, (primární) logický klíč leží na začátku logické věty a má 6 bytů. Program má ze standardního vstupu číst logické věty (vždy všech 60 bytů včetně logického klíče). Pokud v souboru dat již existuje logická věta s týmž klíčem, má se opravit obsahem přečteným ze standardního vstupu a vypsat na standardním výstupu v původním i opraveném tvaru. Pokud v souboru dat dosud není logická věta s týmž logickým klíčem, má se do něj doplnit. IDENTIFICATION DIVISION. PROGRAM-ID. MIKULAS. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT MARTIN ASSIGN I-STARY ACCESS RANDOM NOMINAL NOM. DATA DIVISION. FILE SECTION. FD MARTIN. 01 DOMINIK PIC X(60). WORKING-STORAGE SECTION. 77 NOM PIC X(5). 77 STDIN PIC X(60). PROCEDURE DIVISION. DECLARATIVES. KAREL SECTION. USE AFTER ERROR PROCEDURE MARTIN. DISPLAY 'PLNE MEDIUM PRI ' STDIN. END DECLARATIVES. OPEN I-O MARTIN. Q1. ACCEPT STDIN AT END CLOSE MARTIN STOP RUN. MOVE STDIN TO NOM. READ MARTIN INVALID WRITE DOMINIK FROM STDIN GO TO Q1. DISPLAY DOMINIK DISPLAY STDIN DISPLAY SPACE. REWRITE DOMINIK FROM STDIN. GO TO Q10. 8.9.4. Zpracování indexového souboru s ACCESS DYNAMIC Je-li v klauzuli SELECT uvedena podklauzule ACCESS DYNAMIC, bude v rámci jednoho otevření souboru možno provádět střídavě sekvenční i přímé zpracování, přičemž typ zpracování určuje uživatel tím, jaké příkazy pro soubor provede. Platí zde následující pravidla: 1) Klauzule SELECT má stejný tvar jako při přímém zpracování (viz 8.9.3.), pouze místo ACCESS RANDOM píšeme ACCESS DYNAMIC. 2) Pro paragraf I-O-CONTROL, klauzuli FD a příkazy OPEN a CLOSE platí stejná pravidla jako při přímém zpracování. 3) Během zpracování je soubor vždy buďto ve stavu "sekvenční přístup" (po úspěšných příkazech OPEN a START a po úspěšném příkazu READ s NEXT nebo a AT END) anebo ve stavu "přímý přístup" (po příkazu READ bez NEXT i bez AT END, po příkazu WRITE a po neúspěšných příkazech START a READ). 4) Příkaz START má přesně stejný formát i funkci jako u sekvenčního přístupu (viz 8.9.2. a 8.4.). Může být proveden při kterémkoliv stavu. Nevznikne-li při jeho provádění výjimečný stav (INVALID KEY), bude soubor převeden do stavu "sekvenční přístup"; při vzniku výjimečného stavu bude soubor převeden do stavu "přímý přístup". 5) Příkaz READ má při ACCESS DYNAMIC dva možné formáty: a) Při formátu bez volby NEXT nebo PREVIOUS i bez klauzule AT END READ jméno-souboru [INTO položka] [SECONDARY KEY celé-číslo] [INVALID KEY příkaz ... ] se bude provádět přímé čtení. Příkaz má přesně stejnou funkci jako při přímém přístupu (viz 8.9.3.). Může být proveden při kterémkoliv stavu a vždy převádí soubor do stavu "přímý přístup". b) Při formátu s volbou NEXT nebo PREVIOUS nebo s klauzulí AT END READ jméno-souboru [NEXT | PREVIOUS ] [INTO položka] [AT END příkaz ...] kde je uvedena alespoň jedna z klauzulí NEXT, PREVIOUS a AT END, se bude provádět sekvenční čtení: - Je-li příkaz READ s NEXT nebo PREVIOUS nebo s AT END prováděn ve stavu "sekvenční čtení" (tzn. po úspěšném příkazu OPEN, START nebo READ s NEXT nebo s AT END), má přesně stejnou funkci jako příkaz READ u sekvenčního přístupu. Po OPEN tedy čte první logickou větu souboru dat, po START čte tu logickou větu, na niž příkaz START nastavil ukazovátko, po READ s NEXT nebo s AT END čte následující logickou větu (viz 8.9.2.). - Je-li příkaz READ s NEXT (PREVIOUS) nebo s AT END prováděn ve stavu "přímý přístup", přečte tu logickou větu soubor dat, jejíž logický klíč je roven obsahu NOMINAL-položky anebo (není-li v souboru dat taková logická věta) logickou větu s klíčem nejblíže vyšším (nižším), než je obsah NOMINAL-položky. Je-li obsah NOMINAL-položky větší než největší (menší než nejmenší) logický klíč v souboru dat, dojde k uplatnění klauzule AT END nebo (při neuvedení klauzule AT END) k vyvolání deklarativní sekce. Nezávisle na tom, ve kterém stavu byl příkaz READ s volbou NEXT nebo PREVIOUS nebo s klauzulí AT END proveden, převádí v případě úspěšného provedení soubor do stavu "sekvenční přístup". Dojde-li však k uplatnění klauzule AT END (resp. k odpovídajícímu vyvolání deklarativní sekce), bude soubor převeden do stavu "přímý přístup". 6) Příkazy REWRITE a DELETE mají přesně stejný formát i funkci jako při sekvenčním (viz 8.9.2.) nebo přímém (viz 8.9.3.) zpracování. Mohou být provedeny při kterémkoliv stavu, přičemž tento stav se při jejich provádění nezmění. 7) Příkaz WRITE má přesně stejný formát i funkci jako u přímého přístupu (viz 8.9.3.). Může být proveden při kterémkoliv stavu a vždy převádí soubor do stavu "přímý přístup". 8) Příkaz CLOSE může být proveden při kterémkoliv stavu. 9) Zpracování probíhá podle primárního logického klíče nebo podle některého ze sekundárních logických klíčů. Určit jakožto aktuální jiný logický klíč, než byl do té doby, lze během výpočtu pouze příkazem START s klauzulí SECONDARY KEY anebo pomocí příkazu READ s klauzulí SECONDARY KEY (jež je přípustná jen při přímém čtení).