6.4 Tabel met variabel aantal elementen

Het komt regelmatig voor dat we gegevens in een tabel opslaan, maar dat we het aantal gegevens niet van te voren weten.

Stel dat een bedrijf in een programma een tabel maakt van alle artikelnummers. De gegevens voor de tabel komen uit het artikelbestand. Het aantal artikelen zal niet altijd constant zijn. Er komen artikelen bij en er gaan artikelen af. We moeten ervoor zorgen dat de tabel groot genoeg is en zeker niet te klein. We maken de tabel dan liever wat groter dan we verwachten om het zekere voor het onzekere te nemen. Bij het werken met de tabel moeten we dan wel rekening houden met de niet-gebruikte elementen aan het eind. Bovendien is er nog een tweede nadeel: als we de tabel zouden wegschrijven naar een extern geheugen, dan nemen al die niet-gebruikte elementen toch ruimte in beslag.

COBOL heeft een oplossing in de vorm van een tabel met een variabel aantal elementen. In het geheugen is de maximale ruimte gereserveerd, maar bij elke bewerking met de tabel geldt alleen het deel dat in nuttig in gebruik is.

onthoud

We beschrijven een tabel waarvan het aantal elementen variabel is, als we de occurs-clausule uitbreiden met de depending-on-optie. We geven daarbij het minimum aantal en het maximum aantal elementen op.

Hier volgt een voorbeeld van een veldbeschrijving. Onderdeel daarvan is een tabel met depending on.

01 boekgegevens.
   03 ISBN           pic X(10).
   03 titel          pic X(30).
   03 auteur         pic X(20).
   03 aantal-blz     pic 9(04).
   03 aantal-drukken pic 9(02).
   03 drukgegevens   occurs 1 to 12 times 
                     depending on aantal-drukken.
      05 jaar-maand     pic 9(04).
      05 oplage         pic 9(04).
  

Het veld drukgegevens komt minimaal eenmaal voor en maximaal twaalf keer. Het veld aantal-drukken geeft aan hoeveel keer drukgegevens voorkomt. Een veld met occurs depending on mag binnen het betrokken 01-veld alleen worden gevolgd door velden die een indeling van de tabel zijn. Met andere woorden:

onthoud

De clausule occurs depending on moet aan het eind van de 01-beschrijving staan.

Dat komt doordat het aantal elementen weliswaar variabel is, maar niet het aantal geheugenplaatsen. De computer reserveert in zijn interne geheugen altijd de maximale ruimte. Als er dan nog andere velden op de tabel zouden mogen volgen, dan bevindt zich in het geheugen een 'gat' dat ongebruikt is. Dat levert te veel problemen op. Vandaar de regel dat alleen 'de staart' mag krimpen en groeien. Bovendien mag depending-on per 01-veld slechts één keer voorkomen.

onthoud

Bij gebruik van depending on gelden enkele regels:
- het minimumaantal mag nul zijn;
- het maximum moet groter zijn dan het minimum;
- het veld dat het aantal bepaalt, moet een veld zijn dat alleen gehele getallen kan bevatten en het mag niet in het variabele gedeelte zitten.

Het veld dat aangeeft hoeveel elementen in gebruik zijn, moet aan het variabele gedeelte vooraf gaan (zoals in het gegeven voorbeeld) of het moet buiten het 01-veld zijn beschreven (zoals in het volgende voorbeeld).

01 kindertal           pic 99.
   ...
01 gezin.
   03 achternaam       pic x(30).
   03 voornaam         occurs 0 to 9 times 
                       depending on kindertal
                       pic x(15).
  

Het veld gezin is minimaal 30 tekens lang, namelijk wanneer het aantal voornamen nul is. De computer reserveert in het geheugen de maximale lengte: 30 + 9 * 15 = 165 tekens.

Als kindertal de waarde 2 heeft, dan zijn er twee voornamen aanwezig. Om een derde te kunnen toevoegen, passen we eerst het veld kindertal aan.

    add 1 to kindertal
    move "Marinka" to voornaam(3)
  

De tabel bestaat nu uit drie elementen. De overige ruimte is ongedefinieerd.

onthoud

Ongedefinieerd betekent dat niet bekend is of hoeft te zijn wat er staat.

De belangrijkste toepassing van de mogelijkheid tot variabele lengte bij occurs is ruimtebesparing op een opslagmedium. Bij het uitvoeren van de write-opdracht bepaalt de inhoud van het veld achter depending on hoeveel tekens de computer wegschrijft.

omslag leerboek

Serie: leerboeken informatica

Titel: Tijd voor COBOL 1

Auteur: Andree Hollander

naamlogo