4.15 Herdefiniëren

In COBOL bestaat de mogelijkheid om een veld op verschillende manieren in te delen. Na de eerste beschrijving volgt dan een volgende beschrijving. Het veld krijgt een herdefinitie.

Een veld invoerdatum bevat een datum op een van de volgende twee manieren:
- 6 cijfers, in de vorm JJMMDD (jaar, maand, dag elk twee cijfers);
- 5 cijfers en een spatie, in de vorm JJDDD (jaar twee cijfers, dagnummer 3 cijfers).

onthoud

Bij het herdefiniëren van een veld gebruiken we de redefines-clausule. We geven een veld een nieuwe naam en eventueel een nieuwe indeling met nieuwe picture-strings.

01 invoerdatum   pic 999999.
01 alternatief redefines invoerdatum.
   03 juliaans   pic 99999.
   03 spatie     pic x.
  

Allereerst is hier het veld invoerdatum beschreven. Dat is een numeriek veld van 6 posities. Daarna volgt de beschrijving van een veld alternatief. Dit is geen nieuw veld, maar een herdefinitie van het veld invoerdatum. Alternatief is een groepsveld. Het bestaat uit de velden juliaans en een veld spatie. Op deze manier weet de compiler dat het veld spatie het laatste teken is van de zes tekens die samen invoerdatum of alternatief heten. Voorbeeld:

    if spatie = spaces then
       perform datum-omrekenen
    end-if
  

Redefines moet de eerste clausule zijn bij de beschrijving van een veld. De overige clausules mogen in elke willekeurige volgorde staan. Een herdefinitie moet het eerste veld zijn met hezelfde niveaunummer als het veld dat het herdefinieert. In het voorbeeld hiervoor mag er geen ander veld met nummer 01 tussen invoerdatum en alternatief staan. Herdefiniëren van groepsvelden is toegestaan. Het volgende voorbeeld is een uitbreiding van het vorige voorbeeld.

01 invoerdatum.
   03 jaar       pic 99.
   03 maand      pic 99.
   03 dag        pic 99.
01 alternatief redefines invoerdatum.
   03 juliaans.
      05 filler  pic 99.
      05 juldag  pic 999.
   03 spatie     pic x.
  

Bij redefines komt er geen nieuw veld. Het gaat om hetzelfde geheugengebied. Daarom kunnen we bij de herdefinitie filler schrijven voor de eerste twee posities. Die zelfde eerste twee posities heten immers al jaar! Een tweede naam is wel toegestaan, maar niet nodig. Bekijk het volgende voorbeeld zeer nauwkeurig.

    move "?" to spatie
    move 12 to jaar
    move 12 to juldag
    display invoerdatum
  

Als resultaat van de display-opdracht verschijnt er 12012? op het standaarduitvoerapparaat.

Met redefines komt er geen nieuw veld. Het gaat om hetzelfde geheugengebied. Daarom is het niet zo erg dat het verboden is om de redefines-clausule samen te gebruiken met de value-clausule voor het geven van een beginwaarde. Een beginwaarde kunnen we plaatsen bij het oorspronkelijke veld.

01 invoerdatum   pic 999999, value spaces.
01 alternatief redefines invoerdatum.
   03 juliaans   pic 99999.
   03 spatie     pic x.
  

De value-clausule voor het geven van een beginwaarde mag niet worden gebruikt bij de velden alternatief, juliaans of spatie. De value-clausule is correct bij het veld invoerdatum.

Meestal zal een redefines-veld dezelfde lengte hebben als het oorspronkelijke veld. Dat hoeft echter niet.

onthoud

Een herbeschrijving mag kleiner zijn dan het eerder beschreven veld. Dat betekent gewoon dat alleen het eerste deel van het oorspronkelijke veld een nieuwe definitie heeft gekregen. Velden op 01-niveau mogen behalve kleiner ook groter zijn. De computer reserveert ruimte voor het grootste 01-veld.

omslag leerboek

Serie: leerboeken informatica

Titel: Tijd voor COBOL 1

Auteur: Andree Hollander

naamlogo