8.7 Niet vooraan beginnen

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

cartoon

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.

omslag leerboek

Serie: leerboeken informatica

Titel: Tijd voor COBOL 1

Auteur: Andree Hollander

naamlogo