#Klooienmetcomputers

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.

Arnout van Kempen di CCO CISA is Senior manager Risk & Compliance bij Baker Tilly. Hij schrijft op persoonlijke titel. Hij is lid van de Commissie Financiƫle verslaggeving & Accountancy van de AFM en lid van de signaleringsraad van de NBA. Daarnaast is hij diaken van het bisdom 's-Hertogenbosch.

Gerelateerd

reacties

Reageer op dit artikel

Spelregels debat

    Aanmelden nieuwsbrief

    Ontvang elke werkdag (maandag t/m vrijdag) de laatste nieuwsberichten, opinies en artikelen in uw mailbox.

    Bent u NBA-lid? Dan kunt u zich ook aanmelden via uw ledenprofiel op MijnNBA.nl.