# Programmeren in COBOL/Bestandsorganisatie/Sequentiële bestanden

Dit is een hoofdstuk van Programmeren in COBOL. Hier zul je leren hoe je sequentiële bestanden kunt lezen.

## Voorbeeld van een sequentieel bestand

Een sequentieel bestand is een bestand waar iedere lijn een record vormt. Een record zal gegevens opslaan voor bijvoorbeeld één persoon. Een sequentieel bestand kan verschillende datatypes (of extensies) hebben. Wij zullen .txt gebruiken. Maar dat kan natuurlijk ook .dat of .in of iets anders zijn.
COBOL-code: Sequentieel bestand
In dit sequentieel bestand worden de naam, adres en geslacht van een persoon opgeslagen.

## Sequentiële bestanden lezen

    Zie ook READ voor meer informatie.
We gaan een klein programma schrijven dat de gegevens inleest en alleen de achternaam, voornaam en geslacht op het scherm toont.
COBOL-code: Sequentieel bestand lezen
Nu gaan we dat een beetje uitleggen.
COBOL-code: Sequentieel bestand lezen
Als er gewerkt wordt met bestanden wordt dit stukje toegevoegd. Het bestand invoer.txt wordt gekoppeld met invoer wat belangrijk is in de DATA DIVISION. LINE SEQUENTIAL geeft aan dat het een sequentieel bestand is.
COBOL-code: Sequentieel bestand lezen
In de DATA DIVISION komt er de FILE SECTION bij. Er wordt gebruik gemaakt van groepsvelden om de gegevens in op te slaan. In dit geval is dat persoon.
COBOL-code: Sequentieel bestand lezen
In de programmacode moet het bestand eerst worden geopend. Dit doe je met OPEN INPUT, gevolgd door de naam van het bestand. Daarna doe je een READ. De boolean eof is nodig voor een lus. Als je op het einde van een bestand zit, wordt deze op TRUE gezet. Daardoor kan een lus weten wanneer je op het einde zit. Een READ leest slechts één record in één keer. Alle gegevens worden dan in het groepsveld persoon gezet. Wanneer je daarna nog een READ doet, gaat hij naar het volgende record en gaan de gegevens van het vorige verloren.
COBOL-code: Sequentieel bestand lezen
Dit is een verwijzing naar een deelprogramma maar ook een lus. Dit zal het deelprogramma blijven uitvoeren tot het aan het einde is van het bestand. Hiervoor wordt de variabele eof gebruikt, als die op true gezet wordt, eindigt de lus.
COBOL-code: Sequentieel bestand lezen
Dit is het deelprogramma. Eerst toont het op het scherm wat het de vorige keer uit het bestand heeft gelezen. Daarna leest het een nieuwe record.
COBOL-code: Sequentieel bestand lezen
Nadat je gedaan hebt met het lezen van het bestand, moet je het bestand terug sluiten met CLOSE.

## Sequentiële bestanden schrijven

    Zie ook WRITE voor meer informatie.
Een bestand schrijven volgt natuurlijk het omgekeerde principe van een bestand lezen. Je verwerkt eerst de gegevens je plaatst die in het groepsveld van de uitvoer en vervolgens schrijf je het bestand. We zullen in dit voorbeeld een bestand openen en daarna lezen wat er in zit om dat te verwerken en uit te schrijven. Je moet natuurlijk niet een bestand lezen; je kan gewoon de gegevens inlezen via een ACCEPT, maar dat neemt tijd in beslag. We gebruiken in dit voorbeeld hetzelfde sequentieel bestand om te lezen als in het vorige.
COBOL-code: Sequentieel bestand schrijven
Een uitvoer-bestand wordt op dezelfde manier gekoppeld met een groepsveld en ook op dezelfde manier gesloten. Het bestand openen gebeurt op een andere manier "OPEN OUTPUT uitvoer". In COBOL wordt namelijk een bestand gelezen, terwijl een record geschreven wordt.
COBOL-code: Sequentieel bestand schrijven
Het enige waar er moet op gelet worden, is het overzetten van de variabelen van het éne groepsveld naar het andere en ook de WRITE-commando gevolgd door de groepsveld van de uitvoer en de END-WRITE. Hieronder bevindt zicht het resultaat van dit programma.

## Record achteraan toevoegen

Telkens we OPEN OUTPUT doen en we schrijven daar iets in wordt er eigenlijk een nieuw bestand opgeslagen m.a.w. als er al een bestand bestond met dezelfde naam gaan de gegevens in dat bestand verloren en wordt het vervangen door andere gegevens. Daardoor kun je geen record toevoegen met OPEN OUTPUT hievoor moet je OPEN EXTEND gebruiken. OPEN EXTEND betekent dat je automatisch vanachter gegevens kunt toevoegen. In dit volgende programma gaat de gebruiker gegevens van een persoon opgeven en die worden achteraan toegevoegd.
COBOL-code: Record achteraan toevoegen.
Niet zo moeilijk, dus gewoon in de plaats van OPEN OUTPUT moet je OPEN EXTEND gebruiken.

## Record herschrijven

    Zie ook REWRITE voor meer informatie.
Het is mogelijk bij een sequentieel bestand een record te herschrijven. Dit is echter onpraktisch. Als je één bepaald record wilt aanpassen heb je twee keuzes: ofwel ga je alle records een voor een af tot je de juiste record hebt gevonden, ofwel schrijf je een programma dat zelf alle records afgaat en vind wat je zoekt. Daardoor zijn sequentiële bestanden geen goede oplossing als je weet dat je de records vaak zult moeten aanpassen. Hiervoor zijn betere bestandsorganisaties die later nog aan bod komen. In het volgende programma krijgt de gebruiker ieder record te zien en wordt hem gevraagd of hij ze wil herschrijven.
COBOL-code: Record herschrijven.
Een record herschrijven op zich is niet zo moeilijk. Er zijn twee dingen waar je wel voor moet opletten. I-O of INPUT-OUTPUT dit betekent dat een bestand zal worden gezien als invoer en als uitvoer. Dit komt doordat je eerst de records moet lezen voor je ze kan herschrijven. Je moet dus altijd I-O of INPUT-OUTPUT gebruiken als je iets wilt herschrijven. Voor je iets kunt herschrijven moet je eerst iets lezen met de READ en vervolgens herschrijf je het met de REWRITE. REWRITE werkt hetzelfde als WRITE.

## Record verwijderen

Je kunt bij sequentiële bestanden geen records verwijderen. Wat je echter wel kunt doen, is de record herschrijven en opvullen met spaties. Je kunt dan een beveiliging inbouwen zodat wanneer de record wordt gelezen die bijvoorbeeld wordt overgeslagen. Je hoeft natuurlijk je record niet opvullen met spaties, dit mag natuurlijk ook iets anders zijn of in ieder geval een of ander kenmerk zodat je programma weet dat deze record moet worden overgeslagen.