3.7 Groepsvelden

We weten dat het in COBOL verplicht is om elk veld dat je in de procedure division wilt gebruiken, eerst in de data division te benoemen. Alle velden tot nu toe waren enkelvoudige velden. Ze hadden geen indeling.

COBOL kent de mogelijkheid om velden onder te verdelen. Hulpmiddel daartoe vormen de niveaunummers.

01  datum.
    02  dag       picture 99.
    02  maand     picture 99.
    02  jaar      picture 99.
  

Het veld datum is onderverdeeld in de drie velden dag, maand en jaar. Deze drie velden zijn elementaire velden.

Figuur 3.2 Groepsveld en elementaire velden

indeling datum

definitie

Een veld dat niet is onderverdeeld, heet een elementair veld. Een veld dat wel is onderverdeeld heet een groepsveld. Een groepsveld is dus een samengesteld veld.

Bij een groepsveld schrijven we nooit de picture-clausule. De lengte van een groepsveld is af te leiden uit zijn onderverdeling. In het voorbeeld is de lengte van datum gelijk aan 2 + 2 + 2 = 6 bytes.

Het definiëren van groepsvelden heeft een groot voordeel. We kunnen naar keuze gebruik maken van de elementaire velden of van hun overkoepelende groepsveld. Bekijk het volgende voorbeeld:

display "Geef de datum als 6 cijfers in de vorm DDMMJJ"
accept datum
display "In genormaliseerde vorm is dat " 
        jaar "/"  maand "/"  dag
  

Bij de accept-opdracht noemen we datum als veld. Dat betekent dat de persoon aan het toetsenbord in één keer zes tekens in kan voeren. Maar in andere opdrachten zijn we niet gebonden aan de zes tekens als een geheel. Door de onderverdeling kunnen we in de display-opdracht met de afzonderlijke stukken werken. Op het scherm zien we bij voorbeeld:

Geef de datum als 6 cijfers in de vorm DDMMJJ
290292
In genormaliseerde vorm is dat 92/02/29
  

Bij het werken met groepsvelden is er een belangrijke regel:

onthoud

Een groepsveld is altijd alfanumeriek.

Het veld datum in het voorbeeld is dus alfanumeriek, ondanks het feit dat zijn elementaire velden allemaal numeriek zijn.

Bij de move-opdracht geldt met betrekking tot groepsvelden eveneens een aparte regel:

onthoud

Als een van de velden bij een move-opdracht een groepsveld is, dan vindt de move plaats alsof alle velden alfanumeriek zijn.

Deze regels kunnen onverwachte gevolgen hebben als we niet uitkijken. Wat gebeurt er bijvoorbeeld als we de volgende opdracht geven:

    move "91189" to datum
  

Omdat het veld datum een groepsveld is, gelden de regels voor de alfanumerieke move. Dus: links aansluiten en opvullen met spaties. Als we vervolgens naar de elementaire velden kijken, zien we dat dag 91 bevat, maand 18 en jaar een 9 en een spatie. Omdat het veld jaar een alfanumeriek teken (de spatie) bevat, kunnen we er niet mee rekenen. De computer kan immers met geen mogelijkheid een berekening verrichten met een veld waarin zich een spatie bevindt.

illustratie: Geert Nijmolen

cartoon

Om alle velden van datum correct te vullen, zijn zes cijfers nodig. Het gaat goed met:

    move "091189" to datum
  

We weten nu wat een groepsveld is. Daarom is dit de plaats om een beperking te melden met betrekking tot opgemaakte velden (zie de paragrafen 3.4 en 3.5). Opmaaktekens (Z, - en .) werken alleen als een elementair veld of een constante naar het opgemaakte veld wordt ge'move'd. De opmaaktekens werken niet bij een move waarbij een groepsveld is betrokken.

Stel dat het groepsveld datum als volgt is beschreven:

01  datum.
    02  dag       picture Z9.
    02  maand     picture Z9.
    02  jaar      picture 99.
  

Na de opdracht

    move "010193" to datum
  

bevat zowel het veld dag als het veld maand een nul en een één. De inhoud is dus niet een spatie en een één. In de move-opdracht werd het veld datum genoemd. De computer kijkt dan niet naar de indeling van het genoemde veld.

omslag leerboek

Serie: leerboeken informatica

Titel: Tijd voor COBOL 1

Auteur: Andree Hollander

naamlogo