Bij access mode is dynamic mogen we directe leesopdrachten en sequentiële leesopdrachten afwisselen. Een sequentiële leesopdracht leest na een directe leesopdracht verder vanaf de plaats waar het laatstgelezen record zich bevond.
illustratie: Geert Nijmolen
Een voorbeeld om dit duidelijk te maken. Een indexed bestand bestaat uit 20 records. De sleutel is een veld van 1 positie groot. De records hebben de volgende sleutelwaarden: B C D E F G H K L M O Q R S T U V W X Y. Stel dat we met een directe leesopdracht het record met sleutel H hebben gelezen. Als we daarna drie sequentiële leesopdrachten geven dan krijgen we de records met de sleutels K, L en M.
Bij access mode is sequential zijn geen directe leesopdrachten mogelijk. Toch bestaat er een middel om niet vooraan, bij het eerste record, te beginnen met sequentieel lezen. Dat middel is een aparte opdracht: de start-opdracht.
onthoud
Met de start-opdracht bepalen we een plaats in een indexed bestand, met de bedoeling om vanaf daar sequentieel records te lezen.
Start kan gebruikt worden bij een bestand dat is geopend voor input of voor i-o. De access mode mag dynamic zijn of sequential. Bij access mode random is het start-statement niet toegestaan. Dat is logisch, want de start-opdracht is bedoeld om een startpunt te kiezen voor sequentieel lezen. Bij access mode is random is sequentieel lezen niet mogelijk en het start-statement heeft daar geen zin.
Voor een voorbeeld van de start-opdracht grijpen we weer terug naar het voorbeeld van het autobestand dat in de vorige paragrafen voorkomt. Stel dat we sequentieel willen gaan lezen vanaf het kenteken BT-06-AX.
move "BT-06-AX" to kenteken start autobestand key = kenteken invalid key set bestaat-niet to true end-start
De sleutelwaarde vanwaar we willen starten, brengen we naar het sleutelveld. Daarna geven we een start-opdracht: zet het startpunt bij de waarde in het veld kenteken. Invalid key treedt op als er geen record bestaat met de opgegeven sleutel. De invalid-key-optie is verplicht. De start-opdracht leest geen records, maar bij de eerstvolgende sequentiële leesopdracht leest de computer het aangewezen record.
Soms weten we niet zeker of de beginwaarde in het bestand aanwezig is. We willen dan starten bij de eerstvolgende sleutelwaarde die wel aanwezig is. Daarvoor wijzigen we het is-gelijk-teken in de start-opdracht in groter-of-gelijk:
move "BT-06-AX" to kenteken start autobestand key >= kenteken invalid key set einde-verwerking to true end-start
Het startpunt ligt nu bij het kenteken BT-06-AX of bij de eerstvolgende, alfabetisch gezien, bij voorbeeld BT-06-AZ.
onthoud
De veldnaam in het key-gedeelte van de start-opdracht mag niet zomaar een veldnaam zijn. Het moet de naam zijn van het sleutelveld of de naam van het eerste stuk van dat sleutelveld.
De voorbeelden tot nu toe gebruikten het gehele sleutelveld. Daarom nu een voorbeeld waarbij alleen het eerste deel van de sleutel wordt gebruikt. Stel dat de recordbeschrijving als volgt luidt:
01 autorecord. 02 kenteken. 03 eerste-letters pic x(02). 03 filler pic x(06). 02 rest pic x(86).
Uitgaande van deze definitie, mogen we in de start-opdracht de namen noemen van de velden kenteken en eerste-letters. Kenteken omdat het het sleutelveld is. Eerste-letters omdat het het eerste stuk van het sleutelveld is.
Stel dat we records willen lezen en verwerken waarvan het kenteken begint met BT. We kunnen dan coderen:
move "BT" to eerste-letters start autobestand key = eerste-letters invalid key display "Geen records aanwezig" stop run end-start perform with test after until eerste-letters not = "BT" read autobestand next record at end move "XX" to eerste-letters not at end perform verwerk-record end-read end-perform
We vullen het eerste deel van het sleutelveld met de letters BT. Daarna laten we computer naar een startpunt zoeken via de start-opdracht. Het startpunt moet het eerste record zijn dat met BT begint. Via een perform-opdracht lezen we vervolgens net zolang door totdat er geen BT meer aan het begin staat. Als de at-end-situatie zich voordoet, dan plaatsen we de letters XX in het eerste deel van de sleutel. Daardoor houdt de herhaling op.
Het is toegestaan om in de start-opdracht geen sleutel te vermelden. De computer neemt dan aan dat hij een startpunt moet bepalen dat gelijk is aan de huidige waarde van de sleutel. De opdracht:
start autobestand
Wordt door de computer gelezen als
start autobestand key = kenteken.
Het is verstandig om dit voor de duidelijkheid dan ook maar te schrijven.