Programmeren in COBOL/Relatieve bestanden zonder hash

Uit Wikibooks
Naar navigatie springen Naar zoeken springen

Programmeren in COBOL

Inhoudsopgave

  1. Sequentiële bestanden Zeer goed ontwikkeld. Revisiedatum: 21 oktober 2007 (Oef Redelijk ontwikkeld. Revisiedatum: 21 oktober 2007 )
  2. Relatieve bestanden zonder hash Zeer goed ontwikkeld. Revisiedatum: 20 november 2007 (Oef Nog vrijwel niets. Revisiedatum: 20 november 2007 )
  3. Relatieve bestanden met hash Goed ontwikkeld. Revisiedatum: 21 oktober 2007 (Oef Nog vrijwel niets. Revisiedatum: 23 november 2007 )
  4. Index-sequentiële bestanden Nog vrijwel niets. Revisiedatum: 21 oktober 2007 (Oef Nog vrijwel niets. Revisiedatum: 20 november 2007 )





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 vindt. 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 bevindt. 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[bewerken]

Een relatief bestand kun je niet in een tekstverwerker aanmaken. Je moet het via een programma aanmaken dat je zelf hebt geschreven.

COBOL-code: Relatief bestand aanmaken

       IDENTIFICATION DIVISION.
       PROGRAM-ID. relatief.

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT persoon ASSIGN TO "persoon.dat"
               ORGANIZATION LINE SEQUENTIAL
               ACCESS SEQUENTIAL.

           SELECT persoonrel ASSIGN TO "persoonrel.dat"
               ORGANIZATION RELATIVE
               ACCESS SEQUENTIAL
               RELATIVE KEY persoonnummer.

       DATA DIVISION.
       FILE SECTION.
       FD persoon.
       01 gegevens PIC X(50).

       FD persoonrel.
       01 gegevensrel PIC X(50).

       WORKING-STORAGE SECTION.
       77               PIC X.
        88 eof          VALUE "j", "J".
       01 persoonnummer PIC 99.

       PROCEDURE DIVISION.
       HOOFD.
           OPEN INPUT persoon
           OPEN OUTPUT persoonrel

           DISPLAY "persoonnummer    persoonnaam"
           READ persoon AT END SET eof TO TRUE END-READ

           PERFORM UNTIL eof
               MOVE gegevens TO gegevensrel
               WRITE gegevensrel END-WRITE
               DISPLAY persoonnummer "               " gegevensrel
               READ persoon AT END SET eof TO TRUE END-READ
           END-PERFORM
           STOP RUN.

Dit is dus een voorbeeld van een programma dat relatieve bestanden aanmaakt. We lezen hier een sequentieel bestand om vervolgens het relatief bestand aan te maken.

COBOL-code: Relatief bestand aanmaken

Jan       Peeters
Peter     Pieters
Piet      Jansen

Dit is het sequentieel bestand. Je kunt natuurlijk ook de gegevens inlezen via ACCEPT maar als uw programma onverwacht fouten bevat moet je de gegevens opnieuw ingeven. Via een sequentieel bestand te lezen vermijd je onnodig werk. Nu gaan we een beetje de code uitleggen.

COBOL-code: Relatief bestand aanmaken

       FILE-CONTROL.
           SELECT persoon ASSIGN TO "persoon.dat"
               ORGANIZATION LINE SEQUENTIAL
               ACCESS SEQUENTIAL.

           SELECT persoonrel ASSIGN TO "persoonrel.dat"
               ORGANIZATION RELATIVE
               ACCESS SEQUENTIAL
               RELATIVE KEY persoonnummer.

Bij FILE-CONTROL zijn veel dingen toegevoegd. ORGANIZATION geeft aan wat voor een bestand het is, LINE SEQUENTIAL voor sequentiële bestanden en RELATIVE voor relatieve bestanden. Het is niet verplicht om ORGANIZATION te schrijven maar aangezien we met twee verschillende soorten bestanden werken kan het duidelijker zijn. ACCES geeft aan hoe er met het bestand zal worden gewerkt. Sequentieel is dus record per record. Je zult je waarschijnlijk wel afvragen waarom we het relatieve bestand sequentieel gaan gebruiken en niet RANDOM. Dit is omdat het bestand alleen maar zal worden aangemaakt en zullen we dus record per record aanmaken en achter elkaar plaatsen. RELATIVE KEY zal de sleutel bepalen bij elke record, hier koppelen we deze sleutel met de variabele persoonnummer.

COBOL-code: Relatief bestand aanmaken

       DATA DIVISION.
       FILE SECTION.
       FD persoon.
       01 gegevens    PIC X(50).

       FD persoonrel.
       01 gegevensrel PIC X(50).

       WORKING-STORAGE SECTION.
       77               PIC X.
        88 eof          VALUE "j", "J".
       01 persoonnummer PIC 99.

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 opletten 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.

COBOL-code: Relatief bestand aanmaken

           READ persoon AT END SET eof TO TRUE END-READ

           PERFORM UNTIL eof
               MOVE gegevens TO gegevensrel
               WRITE gegevensrel END-WRITE
               DISPLAY persoonnummer "               " gegevensrel
               READ persoon AT END SET eof TO TRUE END-READ
           END-PERFORM

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[bewerken]

Next.svg  Zie ook READ voor meer informatie.

Relatief bestand sequentieel lezen[bewerken]

COBOL-code: Relatief bestand lezen

       IDENTIFICATION DIVISION.
       PROGRAM-ID. relatief.

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT persoon ASSIGN TO "persoonr.dat"
               ORGANIZATION RELATIVE
               ACCESS SEQUENTIAL
               FILE STATUS bestandstatus.

       DATA DIVISION.
       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.

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.

COBOL-code: Relatief bestand lezen

           SELECT persoon ASSIGN TO "persoonr.dat"
               ORGANIZATION RELATIVE
               ACCESS SEQUENTIAL
               FILE STATUS bestandstatus.

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.

COBOL-code: Relatief bestand lezen

       77 bestandstatus PIC xx.
        88 eof          VALUE 10.

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

COBOL-code: Relatief bestand lezen

           PERFORM UNTIL eof
               DISPLAY gegevens
               READ persoon AT END CONTINUE END-READ
           END-PERFORM

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[bewerken]

COBOL-code: Relatief bestand lezen

       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.
        88 stoppen      VALUE 0.

       PROCEDURE DIVISION.
       HOOFD.
           OPEN INPUT persoon
           DISPLAY "Geef nummer van de persoon(0 om te stoppen):"
           ACCEPT persoonnummer NO BEEP

           PERFORM UNTIL stoppen
               READ persoon
               DISPLAY "persoonnummer | gegevens"
               DISPLAY persoonnummer "              " gegevens
               DISPLAY " "
               DISPLAY "Geef nummer van de persoon(0 om te stoppen):"
               ACCEPT persoonnummer NO BEEP
           END-PERFORM
           STOP RUN.

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.

COBOL-code: Relatief bestand lezen

           SELECT persoon ASSIGN TO "persoonr.dat"
               ORGANIZATION RELATIVE
               ACCESS RANDOM
               RELATIVE KEY persoonnummer.

Dit keer gebruiken we dus access random we kunnen om het evenwelke record lezen. Opnieuw is de relatieve sleutel persoonnummer.

COBOL-code: Relatief bestand lezen

       DATA DIVISION.
       FILE SECTION.
       FD persoon.
       01 gegevens PIC X(50).

       WORKING-STORAGE SECTION.
       77 persoonnummer PIC 99.
        88 stoppen      VALUE 0.

Zoals er in het vorige stukje werd gezegd moet je opletten met de lengte van de record. Als je de record hebt weggeschreven met een lengte van 50 tekens moet je die ook met die lengte weer lezen. Met de variabele persoonnummer gaan we de records lezen. Als persoonnummer 0 is wordt stoppen actief die komt van pas bij de lus dat we gaan gebruiken.

COBOL-code: Relatief bestand lezen

           DISPLAY "Geef nummer van de persoon(0 om te stoppen):"
           ACCEPT persoonnummer NO BEEP

           PERFORM UNTIL stoppen
               READ persoon
               DISPLAY "persoonnummer | gegevens"
               DISPLAY persoonnummer "              " gegevens
               DISPLAY " "
               DISPLAY "Geef nummer van de persoon(0 om te stoppen):"
               ACCEPT persoonnummer NO BEEP
           END-PERFORM

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[bewerken]

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 foutbericht krijgt of het programma plotseling beëindigt kun je in COBOL een klein beveiliging inbouwen. Dit kost weinig moeite en het is best dat je het erbij zet.

COBOL-code: Foute sleutel

           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

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.

Record toevoegen[bewerken]

Next.svg  Zie ook WRITE voor meer informatie.

Hier zullen we zien hoe je makkelijk een record kunt toevoegen aan een relatief bestand.

COBOL-code: Record toevoegen

       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.

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[bewerken]

Next.svg  Zie ook REWRITE voor meer informatie.

Nu gaan we zien hoe je een record moet herschrijven.

COBOL-code: Record toevoegen

       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.

OPEN I-O is nieuw, I-O is afgekort van INPUT-OUTPUT en betekent dus dat je het bestand zowel kunt lezen als schrijven. In dit programma vragen we eerst het 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[bewerken]

Next.svg  Zie ook DELETE voor meer informatie.

Het laatste dat we nog moeten zien is een record verwijderen.

COBOL-code: Record toevoegen

       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.

Als je iets uit een relatief bestand wilt verwijderen moet je dit openen via INPUT-OUTPUT anders werkt het niet. Dit programma vraagt het nummer en verwijdert dan het record met dat nummer via DELETE. Bij DELETE kun je ook INVALID KEY en NOT INVALID KEY gebruiken.

Informatie afkomstig van http://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.