Programmeren in COBOL/Relatieve bestanden zonder hash: verschil tussen versies

Verwijderde inhoud Toegevoegde inhoud
Sephiroth (overleg | bijdragen)
Pagina aangemaakt: "{{Programmeren in COBOL}} Bij sequentiële bestanden is het moeilijk om een bepaald record terug te vinden. De enige optie is om dan record per record te lezen tot je het vind. ..."
 
Sephiroth (overleg | bijdragen)
Geen bewerkingssamenvatting
Regel 1:
{{Programmeren in COBOL}}
Bij sequentiële bestanden is het moeilijk om een bepaald record terug te vinden. De enige optie is om dan record per record te lezen tot je het vind. Dat is natuurlijk niet echt handig en efficiënt. Daarom bestaan er '''relatieve bestanden'''. Een record in een relatief bestand zal een nummer krijgen de zogenaamde relatieve sleutel van 1 tot n. Via een bepaalde berekening kan COBOL bepalen waar deze record zich in het bestand bevind. Een relatief bestand kan op 3 manieren worden gelezen. ''Sequential'' zoals een sequentieel bestand. ''Random'' wat betekent dat je een nummer ingeeft en de record wordt opgehaald met dat nummer. En ''dynamic'' dit is een combinatie van de twee vorige.
===Relatief bestand aanmaken===
Een relatief bestand kun je niet in een tekstverwerker aanmaken. Je moet het via een programma aanmaken die je zelf hebt geschreven.
{{code
Regel 93:
01 persoonnummer pic 99.
</pre>}}
Er valt niet echt veel te zeggen over de ''data division''. We gaan toch de gegevens niet verwerken dus is het indelen in groepsvelden niet nodig, je zou het wel kunnen doen. Waar je moet opletttenopletten is de lengte van de records. Die is hier 50 tekens lang als je dit relatief bestand wilt lezen zal je ook 50 tekens moeten gebruiken anders krijg je foutmeldingen. Waar je ook moet opletten is ''persoonnummer'' dat is de relatieve sleutel. Het aantal records dat je kunt opslaan hangt af van deze sleutel de ''pic'' is hier 99 dus kun je maximaal 99 records hebben.
{{code
|Taal= COBOL
Regel 108:
</pre>}}
Hier valt ook niet veel te vertellen. Het is grotendeels zoals bij sequentiële bestanden. Het sequentieel bestand wordt gelezen. De gegevens worden overgebracht en de record wordt geschreven in het relatief bestand.
===Relatief bestand lezen===
====Relatief bestand sequentieel lezen====
{{code
|Taal= COBOL
|Titel= Relatief bestand aanmakenlezen
|Code=<pre>
IDENTIFICATION DIVISION.
Regel 119 ⟶ 120:
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT persoon ASSIGN TO "persoonr.dat"
ORGANIZATION RELATIVE
ACCESS SEQUENTIAL
FILE STATUS bestandstatus.
 
DATA DIVISION.
SELECT persoonrel ASSIGN TO "persoonrel.dat"
FILE SECTION.
FD persoon.
01 gegevens pic x(50).
 
WORKING-STORAGE SECTION.
77 bestandstatus pic xx.
88 eof value 10.
 
PROCEDURE DIVISION.
HOOFD.
OPEN INPUT persoon
READ persoon AT END CONTINUE END-READ
 
PERFORM UNTIL eof
DISPLAY gegevens
READ persoon AT END CONTINUE END-READ
END-PERFORM
CLOSE persoon
STOP RUN.
</pre>}}
We gaan eerst aantonen dat je een relatief bestand ook gewoon sequentieel kunt lezen. Hoewel we een zogenaamde relatieve sleutel hebben zullen we die nog niet gebruiken.
{{code
|Taal= COBOL
|Titel= Relatief bestand lezen
|Code=<pre>
SELECT persoon ASSIGN TO "persoonr.dat"
ORGANIZATION RELATIVE
ACCESS SEQUENTIAL
FILE STATUS bestandstatus.
</pre>}}
Het enige interessante hier is ''file status'' die geeft aan wat de status is van het bestand. Bijvoorbeeld of het open of gesloten is, of je iets uit het bestand wil lezen terwijl je het hebt geopend om er alleen in te schrijven of zoals we nu gaan zien of het aan het einde is van het bestand en zoverder.
{{code
|Taal= COBOL
|Titel= Relatief bestand lezen
|Code=<pre>
77 bestandstatus pic xx.
88 eof value 10.
</pre>}}
''File status'' is gekoppeld aan de variabele ''bestandstatus''. De variabele ''bestandstatus'' zal een nummer krijgen naar gelang de status van het bestand. Als het op het einde van het bestand is krijgt het nummer 10. Hierdoor wordt eof(end of file) geactiveerd. Dat is nodig voor de volgende lus
{{code
|Taal= COBOL
|Titel= Relatief bestand lezen
|Code=<pre>
PERFORM UNTIL eof
DISPLAY gegevens
READ persoon AT END CONTINUE END-READ
END-PERFORM
</pre>}}
Hier is niet speciaals te zien behalve de ''read''. Als het op het einde van het bestand komt gaat het gewoon verder met de programmacode.
====Relatief bestand random lezen====
{{code
|Taal= COBOL
|Titel= Relatief bestand lezen
|Code=<pre>
IDENTIFICATION DIVISION.
PROGRAM-ID. relatief.
 
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
 
SELECT persoon ASSIGN TO "persoonr.dat"
ORGANIZATION RELATIVE
ACCESS RANDOM
Regel 127 ⟶ 194:
DATA DIVISION.
FILE SECTION.
FD persoonrelpersoon.
01 gegevensrelgegevens pic x(50).
 
WORKING-STORAGE SECTION.
Regel 136 ⟶ 203:
PROCEDURE DIVISION.
HOOFD.
OPEN INPUT persoonrelpersoon
DISPLAY "Geef nummer van de persoon(0 om te stoppen):"
ACCEPT persoonnummer NO BEEP
 
PERFORM UNTIL stoppen
READ persoonrelpersoon
DISPLAY "persoonnummer | gegevens"
DISPLAY persoonnummer " " gegevensrelgegevens
DISPLAY " "
DISPLAY "Geef nummer van de persoon(0 om te stoppen):"
Regel 150 ⟶ 217:
STOP RUN.
</pre>}}
Een relatief bestand ''random'' lezen is vrij makkelijk. Je vraagt aan de gebruiker om de persoonnummer in te geven en dan zoek je de gegevens van die persoon op.
{{code
|Taal= COBOL
|Titel= Relatief bestand aanmakenlezen
|Code=<pre>
SELECT persoonrelpersoon ASSIGN TO "persoonrelpersoonr.dat"
ORGANIZATION RELATIVE
ACCESS RANDOM
RELATIVE KEY persoonnummer.
</pre>}}
Dit keer isgebruiken hetwe dus''access random'' we kunnen dus om het evenwelke record lezen. Opnieuw is de relatieve sleutel ''persoonnummer''.
{{code
|Taal= COBOL
|Titel= Relatief bestand aanmakenlezen
|Code=<pre>
DATA DIVISION.
FILE SECTION.
FD persoonrelpersoon.
01 gegevensrelgegevens pic x(50).
 
WORKING-STORAGE SECTION.
Regel 177 ⟶ 244:
{{code
|Taal= COBOL
|Titel= Relatief bestand aanmakenlezen
|Code=<pre>
DISPLAY "Geef nummer van de persoon(0 om te stoppen):"
Regel 183 ⟶ 250:
 
PERFORM UNTIL stoppen
READ persoonrelpersoon
DISPLAY "persoonnummer | gegevens"
DISPLAY persoonnummer " " gegevensrelgegevens
DISPLAY " "
DISPLAY "Geef nummer van de persoon(0 om te stoppen):"
Regel 192 ⟶ 259:
</pre>}}
Om een record op te halen is het enige wat je moet doen een nummer zetten in ''persoonnummer'' er moet wel een record zijn met dat nummer. Vervolgens doe je gewoon ''read'' en de gegevens worden opgehaald. Is ''persoonnummer'' 0 dan stopt de lus.
=====Fouten=====
De kans is natuurlijk heel groot dat er fouten zullen gebeuren wanneer je een nummer vraagt. De gebruiker kan het fout in typen of het record bestaat gewoonweg niet. Om te vermijden dat je aan raar fout bericht krijgt of het programma plotseling beïndigd kun je in COBOl een klein beveiliging inbouwen. Dit kost weinig moeite en het is best dat je het erbij zet.
{{code
|Taal= COBOL
|Titel= Foute sleutel
|Code=<pre>
PERFORM UNTIL stoppen
READ persoonrel
INVALID KEY DISPLAY "U heeft een fout nummer gegeven."
DISPLAY " "
 
NOT INVALID KEY
DISPLAY "persoonnummer | gegevens"
DISPLAY persoonnummer " " gegevensrel
DISPLAY " "
END-READ
DISPLAY "Geef nummer van de persoon(0 om te stoppen):"
ACCEPT persoonnummer NO BEEP
END-PERFORM
</pre>}}
Dit gaat dus via ''invalid key'' en ''not invalid key''. Achter ''invalid key'' kun je dus een stukje programmacode schrijven voor het geval dat het nummer fout is. Achter ''not invalid key'' kun je dus een stukje code schrijven voor als het wel juist is. Vergeet niet te eindigen met een ''end-read''.
===Record toevoegen===
Hier zullen we zien hoe je makkelijk een record kunt toevoegen aan een relatief bestand.
{{code
|Taal= COBOL
|Titel= Record toevoegen
|Code=<pre>
IDENTIFICATION DIVISION.
PROGRAM-ID. relatief.
 
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT persoon ASSIGN TO "persoonr.dat"
ORGANIZATION RELATIVE
ACCESS SEQUENTIAL
RELATIVE KEY persoonnummer.
 
DATA DIVISION.
FILE SECTION.
FD persoon.
01 gegevens pic x(50).
 
WORKING-STORAGE SECTION.
77 persoonnummer pic 99.
 
PROCEDURE DIVISION.
HOOFD.
OPEN EXTEND persoon
DISPLAY "Geef de gegevens van de persoon van de persoon:"
ACCEPT gegevens NO BEEP
 
WRITE gegevens
DISPLAY "De nummer van de persoon is: " persoonnummer
CLOSE persoon
STOP RUN.
</pre>}}
Een record toevoegen vraagt weinig programmeerwerk. ''Open extend'' wilt zeggen dat je het bestand opent met de bedoeling om achteraan in het bestand iets toe te voegen. Dus je kunt alleen maar een record vanachter toevoegen niet meer niet minder. Je laat de gegevens inlezen en schrijft die in het bestand d.m.v. ''write''. Dan kun je nog als extra de relatieve sleutel laten zien. Dan kan de gebruiker later de gegevens nog terugvinden d.m.v. die sleutel.
===Record herschrijven===
Nu gaan we zien hoe je een record moet herschrijven.
{{code
|Taal= COBOL
|Titel= Record toevoegen
|Code=<pre>
IDENTIFICATION DIVISION.
PROGRAM-ID. relatief.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT persoon ASSIGN TO "persoonr.dat"
ORGANIZATION RELATIVE
ACCESS RANDOM
RELATIVE KEY persoonnummer.
 
DATA DIVISION.
FILE SECTION.
FD persoon.
01 gegevens pic x(50).
 
WORKING-STORAGE SECTION.
77 persoonnummer pic 99.
77 aanpassen pic x.
88 ja value "J", "j".
 
PROCEDURE DIVISION.
HOOFD.
OPEN I-O persoon
DISPLAY "Geef nummer van de persoon die je wil aanpassen:"
ACCEPT persoonnummer NO BEEP
 
READ persoon
DISPLAY "persoonnummer | gegevens"
DISPLAY persoonnummer " " gegevens
DISPLAY " "
DISPLAY "Wilt u de gegevens aanpassen(j/n)"
ACCEPT aanpassen NO BEEP
IF ja
THEN DISPLAY "geef de nieuwe gegevens"
ACCEPT gegevens
REWRITE gegevens
END-IF
CLOSE persoon
STOP RUN.
</pre>}}
''Open i-o'' is nieuw, ''i-o'' is afgekort van ''input-outpu'' en betekent dus dat je het bestand zowel kunt lezen als schrijven. In dit programma vragen we eerst de nummer van de persoon op. Vervolgens tonen we die gegevens op het scherm en vragen we of deze gegevens moet worden aangepast. Je plaatst de nieuwe gegevens in de variabel ''gegevens'' en gebruikt ''rewrite'' om ze weg te schrijven. Bij ''rewrite'' kun je ook gebruik maken van ''invalid key'' en ''not invalid key''.
===Record verwijderen===
Het laatste dat we nog moeten zien is een record verwijderen.
{{code
|Taal= COBOL
|Titel= Record toevoegen
|Code=<pre>
IDENTIFICATION DIVISION.
PROGRAM-ID. relatief.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT persoon ASSIGN TO "persoonr.dat"
ORGANIZATION RELATIVE
ACCESS RANDOM
RELATIVE KEY persoonnummer.
DATA DIVISION.
FILE SECTION.
FD persoon.
01 gegevens pic x(50).
WORKING-STORAGE SECTION.
77 persoonnummer pic 99.
 
PROCEDURE DIVISION.
HOOFD.
OPEN I-O persoon
DISPLAY "Geef nummer van de persoon die je wil verwijderen:"
ACCEPT persoonnummer NO BEEP
DELETE persoon
STOP RUN.
</pre>}}
Als je iets uit een relatief bestand wilt verwijderen moet je die open via ''i-o'' anders werkt het niet. Dit programma vraagt het de nummer en verwijderd dan de record met dat nummer via ''delete''. Bij ''delete'' kun je ook ''invalid key'' en ''not invalid key'' gebruiken.
[[Categorie:Programmeren in COBOL|Relatieve bestanden zonder hash]]
Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.