Bestanden in soorten en maten
Arnout van Kempen over rommelen in een digitale wereld.
De eerste sectie in de DATA DIVISION is de FILE SECTION.
De complexiteit van deze sectie zit met name in de samenwerking met de INPUT-OUTPUT SECTION van de ENVIRONMENT DIVISION.
Om de werking van deze sectie en de samenwerking tussen de verschillende secties te laten zien, ga ik uit van een programma dat adresgegevens van een klant opzoekt. Daartoe gebruikt het twee bestanden. In het ene bestand staan klantnamen en postcodes achter elkaar. Het programma zal deze uitlezen en dan uit het andere bestand, op basis van de postcode, het bijbehorende adres halen. Om dat laatste proces snel mogelijk te maken, is dit bestand geïndexeerd op postcode. Ik gebruik overigens engelse namen voor records en variabelen. Dat is een kwestie van smaak.
Het eerste deel dat van belang is, kan er dan zo uitzien:
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT CUSTOMER-FILE
ASSIGN TO “customer-data.txt”
ORGANIZATION IS SEQUENTIAL.
SELECT ADDRESS-FILE
ASSIGN TO “address-data.idx”
ORGANIZATION IS INDEXED
ACCESS MODE IS DYNAMIC
RECORD KEY IS POSTCODE.
Hiermee zijn de bestanden gekoppeld aan ‘fysieke’ bestanden. Vervolgens hebben we een recordindeling nodig:
DATA DIVISION.
FILE SECTION.
FD CUSTOMER-FILE.
01 CUSTOMER-RECORD.
05 CUSTOMER-NAME PIC X(30).
05 CUSTOMER-POSTCODE PIC X(6).
FD ADDRESS-FILE.
01 ADDRESS-RECORD.
05 POSTCODE PIC X(6).
05 STREET PIC X(30).
05 CITY PIC X(20).
Hiermee is de hele bestandsstructuur gedefinieerd. Om er nu iets mee te doen, hebben we nog wat extra zaken nodig:
WORKING-STORAGE SECTION.
01 WS-FILE-STATUS. PIC X VALUE ’N’.
88 WS-END-OF-CUSTOMER-FILE VALUE ’Y’.
Met deze variabele leggen we vast of het einde van een bestand bereikt is. Omdat de lengte één karakter is, hoeven we dat niet tussen haakjes aan te geven. We geven wel een startwaarde mee: N. De regel daarna is een bijzondere. De nummering van variabelen geeft hun onderlinge niveau aan, meestal in stappen van 5, zoals we zien bij de record-definities. Maar 88 heeft een bijzondere betekenis. De 88-variabele wordt TRUE zodra de waarde van de bovenliggende variabele de waarde krijgt zoals genoemd in de 88-regel. In de procedure zal duidelijk worden hoe dit uitpakt.
Een programma zou nu kunnen zijn:
PROCEDURE DIVISION.
OPEN INPUT CUSTOMER-FILE
INPUT ADRESS FILE.
Let op, na de eerste OPEN volgt geen punt. De reden is dat dit commando meerdere bestanden kan openen. In dit geval loopt de sentence dus over meerdere regels en sluit uiteindelijk af met een punt. Beide bestanden worden geopend om te lezen, dus met INPUT. Had je ook willen schrijven, dan had je een bestand moeten openen met I-O.
We gaan verder, met aanzienlijk minder punten, omdat hier statements gegroepeerd zijn binnen een loop:
PERFORM UNTIL WS-END-OF-CUSTOMER-FILE
READ CUSTOMER-FILE INTO CUSTOMER-RECORD
AT END
SET WS-END-OF-CUSTOMER-FILE TO TRUE
NOT AT END
MOVE CUSTOMER-POSTCODE TO POSTCODE
READ ADDRESS-FILE
INVALID KEY
DISPLAY “Geen adres bij postcode: “ POSTCODE
NOT INVALID KEY
DISPLAY “Klant: “ CUSTOMER-NAME
DISPLAY “Adres: “ STREET “, “ CITY
END-READ
END-READ
END-PERFORM.
CLOSE CUSTOMER-FILE
ADDRESS-FILE.
STOP RUN.
Om helemaal te snappen wat hier gebeurt, is van belang te snappen hoe COBOL werkt met geïndexeerde bestanden. Het adressenbestand is geïndexeerd op sleutelveld POSTCODE. Als dit gevuld wordt met een specifieke waarde, zal een READ het record lezen met deze sleutelwaarde, of aangeven dat de sleutelwaarde niet bestaat. We hoeven dus niet zelf de logica te beschrijven die het bestand doorzoekt, dat doet COBOL voor ons.
De variabele WS-END-OF-CUSTOMER-FILE is een 88-variabele en heeft dus de waarde TRUE of FALSE en dat betekent dat we de procedure iets leesbaarder kunnen maken. We hadden ook de bovenliggende variabele kunnen gebruiken en testen op een inhoud van Y of N, maar die test is overgenomen door gebruik van 88.
Wie mee wil doen met #klooienmetcomputers kan dat doen via GitHub. Maak een account op github.com en zoek naar Abmvk/kmc. Het account Abmvk volgen kan ook. Lezers zijn vrij te gebruiken wat ze willen en om zelf zaken toe te voegen of aan te passen, vragen te stellen of commentaar te leveren.
Gerelateerd
Typecasting in COBOL
Arnout van Kempen over rommelen in een digitale wereld.
Gewone variabelen
Arnout van Kempen over rommelen in een digitale wereld.
Alles draait om data
Arnout van Kempen over rommelen in een digitale wereld.
Omgeving: input-output
Arnout van Kempen over rommelen in een digitale wereld.
Omgeving: de configuratie
Arnout van Kempen over rommelen in een digitale wereld.