8.3. Příkazy WRITE, REWRITE a DELETE Formáty: - - položka - - | | literál | | WRITE logická-věta | FROM | - | ALL-klauzule | - - - [ LENGTH { celé-číslo | celočíselná položka } ] - - celé-číslo - - | - - | položka | - - | | | AFTER ADVANCING | | CSP | |LINE | | | < > < Cnn > < > | | | BEFORE ADVANCING | |speciální-jméno| |LINES| | - - - - PAGE - - - - - AT {END-OF-PAGE | EOP} příkaz ... - | | | INVALID KEY příkaz ... | - - - - - - | | položka | | REWRITE logická-věta | FROM < literál > | | |figurativní-konstanta| | - - ALL-klauzule - - [ INVALID KEY příkaz ... ] DELETE jméno-souboru RECORD [ INVALID KEY příkaz ... ] Funkce: Příkaz WRITE provádí buďto zápis nové logické věty anebo opravu (aktualizaci) již existující logické věty. Příkaz REWRITE vždy provádí opravu (aktualizaci) již existující věty. Rozlišení funkce příkazů WRITE a REWRITE dle typu organizace souboru je uvedeno v odstavcích 8.7., 8.8. a 8.9. Příkaz DELETE provádí vyřazení logické věty z relativního nebo indexového souboru dat. Pravidla pro příkazy WRITE a REWRITE: 1) Za slovem WRITE resp. REWRITE musí být uvedeno jméno některé 01 (případně kvalifikované jménem souboru) od toho souboru, pro který chceme provádět zápis resp. opravu. 2) Je-li pro soubor popsáno více 01, lze v příkazu WRITE resp. REWRITE uvést kteroukoliv z nich. Protože však všechny tyto 01 mají společnou adresu, může volba určité 01 zadávat pouze délku, s níž se má pracovat. (Pokud několik 01 má touž délku, je tedy zcela lhostejné, kterou z nich uvedeme v příkazu.) Platí tato pravidla: a) Při RECORDING F se vždy pracuje s pevnou délkou logických vět a proto volba 01 nemá žádný význam. b) Provádí-li příkaz WRITE bez klauzule LENGTH zápis nové logické věty u souboru s RECORDING V nebo U, pak zapisuje logickou větu o právě té délce, jakou má 01 uvedená v příkazu (u 01 s proměnnou délkou se vypočítává okamžitá hodnota délky 01 s použitím okamžitých hodnot položek uvedených v klauzulích OCCURS DEPENDING). c) Má-li soubor RECORDING V nebo U, smí být v příkazu WRITE uvedena klauzule LENGTH. Hodnota argumentu uvedeného za slovem LENGTH musí být nezáporná a nejvýše rovná maximální přípustné délce logické věty. Pak se délka 01 uvedené v příkazu WRITE (ať už je pevná nebo proměnná) ignoruje a bude zapsána logická věta o délce rovné hodnotě tohoto argumentu. Odpovídající počet bytů počínaje prvním bytem 01 se tedy odešle na výstup a případný zbytek 01 se nevyužije. (Např. příkaz "WRITE A LENGTH 100" zapíše logickou větu o délce 100 bytů nezávisle na tom, jakou délku má položka A.) Při RECORDING V nesmí uživatel do hodnoty argumentu uvedeného za slovem LENGTH zahrnout délku dvoubytového pole délky logického věty; musí zadat čistou délku zapisovaného textu. Je-li za slovem LENGTH uvedena celočíselná numerická položka, nesmí mít indexy a nesmí ležet ve struktuře za položkou s OCCURS DEPENDING. d) Při opravě logické věty diskového nebo disketového souboru dat se změní pouze její obsah na médiu - její délku změnit nelze (při RECORDING V by změna řídícího pole délky logické věty znamenala prakticky zničení souboru dat). Proto při RECORDING V nebo U je vhodné v příkazu REWRITE nebo v příkazu WRITE provádějícím opravu uvést 01 o přesně téže délce, jakou měla původní logická věta. Toto pravidlo musí být bezpodmínečně zachováno při RECORDING V (s výjimkou opravy sekvenčního souboru příkazem REWRITE, kdy se délka 01 ignoruje). Jinak se při větší délce 01 její konec nevyužije zatímco při menší délce 01 se konec logické věty souboru dat nezmění. 3) Před provedením příkazu WRITE nebo REWRITE musí uživatel umístit do společné paměťové oblasti 01 souboru tu logickou větu, která má být zapsána nebo jejímž obsahem má být původní logická věta na médiu opravena. To může učinit např. příkazem MOVE nebo STRING anebo pomocí klauzule FROM v příkazu WRITE resp. REWRITE případně pomocí klauzule INTO v předchozím příkazu READ nebo RETURN atd. Při opravě se většinou mění (příkazem MOVE nebo STRING) jen část logické věty, zatímco zbytek zůstává takový, jaký se přečetl předcházejícím příkazem READ. 4) Je-li v příkazu WRITE resp. REWRITE uvedena klauzule "FROM argument", provede se ještě před vlastním zápisem resp. opravou přesun MOVE argument TO logická-věta kde příjmovou položkou je právě ta 01, která je uvedena za slovem WRITE resp. REWRITE. Za FROM smí být uvedena buďto položka libovolného typu i délky (s výjimkou USAGE INDEX), anebo libovolný literál, figurativní konstanta nebo ALL-klauzule, jejichž přesun do 01 je přípustný. Přesun smí být jakéhokoliv typu, např. i numerický. Obsah položky uvedené za FROM se při provádění příkazu WRITE resp. REWRITE nezmění (nepřekrývá-li se ovšem s 01). 5) Klauzule AFTER/BEFORE ADVANCING a AT EOP smí být uvedeny pouze u sekvenčního souboru. Jejich syntax a funkce jsou popsány v 8.7. 6) Klauzule INVALID KEY v příkazu WRITE smí být uvedena při kterémkoliv typu souboru. U sekvenčního souboru pracujícího s nemagnetickým médiem však k uplatnění této klauzule nemůže nikdy dojít (vždy se tedy odskočí na první příkaz za tečkou). U diskových nebo disketových souborů se klauzule INVALID KEY uplatní tehdy, když připravovaná logická věta nemohla být zapsána (viz 8.7., 8.8. a 8.9.). 7) Klauzule INVALID KEY v příkazu REWRITE smí být uvedena při kterémkoliv typu souboru. U sekvenčního souboru však k uplatnění této klauzule nemůže nikdy dojít (vždy se tedy odskočí na první příkaz za tečkou). U relativních a u indexových souborů se klauzule INVALID KEY uplatní tehdy, když logická věta nemohla být opravena (viz 8.8. a 8.9.). 8) U diskových nebo disketových souborů je přípustné provést bezprostředně za sebou i několik příkazů REWRITE opravujících touž logickou větu. 9) Po zápisu logické věty příkazem WRITE obecně nemusí 01 souboru nadále obsahovat právě zapsanou logickou větu. Naproti tomu po opravě logické věty příkazem REWRITE nebo WRITE bude 01 i nadále obsahovat právě opravenou logickou větu (samozřejmě v opraveném tvaru). Příklady: WRITE NOSOROZEC WRITE KOHOUT FROM SLEPICE INVALID KEY GO TO VEJCE WRITE KROCAN LENGTH POCET WRITE RADEK BEFORE 2 WRITE VETA FROM HLAVICKA LENGTH 80 AFTER C01 WRITE ZAMESTNANEC FROM POMOCNA AFTER N LINES AT EOP PERFORM NOVA-STRANKA. WRITE ZAHL AFTER PAGE WRITE FAKTURA LENGTH DELKA REWRITE ZIRAFA FROM ZEBRA REWRITE PRIMKA INVALID GO TO KRIVKA. Pravidla pro příkaz DELETE: 1) Za slovem DELETE musí být uvedeno jméno relativního nebo indexového souboru. 2) Bezprostředně před provedením příkazu DELETE musí být pro týž soubor proveden příkaz READ (provádějící sekvenční nebo přímé čtení), který úspěšně přečte logickou větu souboru dat; lze přitom pracovat podle primárního logického klíče nebo podle některého sekundárního klíče. Příkaz DELETE pak tuto naposled přečtenou logickou větu zruší, tzn. vyřadí ji z indexového souboru dat, takže nikdy v budoucnu již nebude možno tuto logickou větu ani sekvenčně ani přímo přečíst. Je tedy možné zrušit výhradně takovou logickou větu, která byla bezprostředně předtím úspěšně přečtena. 3) K uplatnění klauzule INVALID KEY nemůže nikdy dojít; vždy se odskočí na první příkaz za tečkou. Příklad: MOVE KLIC TO ZAMEK-NOMINAL READ SOUBOR INVALID KEY GO TO NENALEZENO. IF ALFA = BETA DELETE SOUBOR GO TO DALSI.