Programmeren in COBOL/Velden/Printversie

Uit Wikibooks
Deel II: Velden





In dit deel van het boek gaan we dieper in op het gebruik van velden(variabelen). Je leert onder andere hoe je groepsvelden en tabellen maakt en hoe je je velden kunt opmaken.

De inhoud van dit deel[bewerken]

  1. Groepsvelden en conditie met voorwaardenaam Zeer goed ontwikkeld. Revisiedatum: 21 oktober 2007 (Oef Nog vrijwel niets. Revisiedatum: 20 november 2007 )
  2. Tabellen Goed ontwikkeld. Revisiedatum: 21 oktober 2007 (Oef Nog vrijwel niets. Revisiedatum: 20 november 2007 )
  3. Editing Zeer goed ontwikkeld. Revisiedatum: 16 november 2007 (Oef Nog vrijwel niets. Revisiedatum: 20 november 2007 )
  4. Embedded SQL Redelijk ontwikkeld. Revisiedatum: 21 oktober 2007


 


1. Groepsvelden en conditie met voorwaardenaam



In dit hoofdstuk leer je over groepsvelden en condities met voorwaardenaam. Dit gaat een beetje dieper in op velden.

Groepsvelden[bewerken]

Een groepsveld of copybook kan gebruikt worden om via één ACCEPT data te geven aan meerdere variabelen.

COBOL-code: Groepsvelden

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 getal.
         02 a PIC 9.
         02 b PIC 99.

       PROCEDURE DIVISION.
       HOOFD.
           DISPLAY “geef een getal: “
           ACCEPT getal NO BEEP
           DISPLAY “-----”
           DISPLAY a
           DISPLAY b
           STOP RUN.

In dit programma wordt een getal gelezen en dat getal zal worden opgesplitst in 2 getallen. In tegenstelling tot een gewone variabele, waar level "77" wordt gebruikt bij het declareren, moet je voor een groepsveld "01" gebruiken: "01 getal.". Getal zal dan de naam zijn van het groepsveld. Bij de naam van een groepsveld wordt geen PIC gebruikt. Het groepsveld wordt onderverdeeld in andere variabelen. In dit geval is dat a en b. Bij deze variabelen moet wel een PIC worden gebruikt en dit is hetzelfde als bij andere variabelen. De lengte van het groepsveld getal hangt af van de som van de lengtes van variabelen die bij het groepsveld horen. Hier is dit dus 3 tekens lang (a heeft er 1 en b heeft er 2). Als je dus een getal leest met het groepsveld getal zal die worden opgesplitst.

geef een getal:
193
-----
1
93

Om de variabelen van een groepsveld apart op het scherm te tonen, hoef je dus alleen maar DISPLAY te gebruiken, gevolgd door de naam van de variabele. Het omgekeerde is ook waar. Stel, je vraagt eerst de voornaam van de gebruiker en daarna de achternaam en je wilt die heel makkelijk opnieuw op het scherm weergeven.

COBOL-code: Groepsvelden

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 naam.
         02 voornaam PIC X(10).
         02 achternaam PIC X(10).

       PROCEDURE DIVISION.
       HOOFD.
           DISPLAY "geef uw voornaam:"
           ACCEPT voornaam NO BEEP
           DISPLAY "geef uw achternaam:"
           ACCEPT achternaam NO BEEP

           DISPLAY "-----"
           DISPLAY naam
           STOP RUN.

Heel simpel dus: je leest apart de variabelen voornaam en achternaam. Omdat die bij groepsveld naam horen kun je ze via DISPLAY beide in één keer tonen op het scherm. Maar wat al je voornaam exact 10 letters lang is? Dan wordt de voornaam en achternaam aan elkaar geschreven. Hiervoor bestaat de FILLER.

FILLER[bewerken]

Een FILLER kan voor twee zaken worden gebruikt. De eerste werd hierboven al aangehaald: Als je 2 variabelen in een groepsveld hebt en die gebruiken de totale voorziene lengte (bepaald door PIC). Met een extra variabele, de FILLER, kan je een spatie tussen die 2 variabelen zetten.

COBOL-code: FILLER

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 naam.
         02 voornaam PIC X(10).
         02 PIC X VALUE " ".
         02 achternaam PIC X(10).

       PROCEDURE DIVISION.
       HOOFD.
           DISPLAY "geef uw voornaam:"
           ACCEPT voornaam
           ACCEPT achternaam
           DISPLAY "-----"
           DISPLAY naam
           STOP RUN.

Hier is tussen die variabelen voornaam en achternaam nog een derde geplaatst: 02 PIC X VALUE " " Omdat je de FILLER toch niet gebruikt, moet je hem niet benoemen. Sommige compilers geven wel een warning als je hem niet FILLER noemt (02 FILLER PIC X VALUE " "). Tussen achternaam en voornaam zal nu een spatie komen wanneer je het groepsveld naam toont. Je kunt natuurlijk naast een spatie ook alle andere tekens gebruiken -, +, *, /,... Maar let op als je een FILLER gebruikt: Lees dan nooit het hele groepsveld in, in dit geval naam, anders overschrijf je de FILLER. Dus nooit "ACCEPT naam".

De FILLER kun je ook op een andere manier gebruiken. Wanneer je gegevens inleest kan het zijn dat je uiteindelijk bepaalde informatie niet nodig hebt. Je leest bijvoorbeeld namen in en je weet dat de eerste 10 tekens de voornaam is, maar die wil je niet. Dan kun je ook een FILLER gebruiken.

COBOL-code: FILLER

       01 naam.
         02 PIC X(10).
         02 achternaam PIC X(10).

Als je dan naam inleest, zal de voornaam worden opgeslagen in de FILLER. Maar omdat je die toch niet nodig hebt, geef je de FILLER geen naam. De gegevens gaan toch niet verloren: Als je het groepsveld naam toont, krijg je nog steeds de voornaam te zien. Het is gewoon een simple truuk om minder (overbodige) variabelen te hebben bij grote programma's.

Conditie met voorwaardenaam[bewerken]

Conditie met voorwaardenaam is een manier om een bepaalde variabele te activeren als er voldaan is aan een bepaalde voorwaarde.

De simpele manier[bewerken]

COBOL-code: Conditie met voorwaardenaam

       IDENTIFICATION DIVISION.
       PROGRAM-ID. conditiemetvoorwaarden.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       77 getal PIC 9.
         88 even VALUE 0, 2, 4, 6, 8.
         88 oneven VALUE 1, 3, 5, 7, 9.

       PROCEDURE DIVISION.
       HOOFD.
           DISPLAY "geef een getal:"
           ACCEPT getal NO BEEP

           IF even 
             THEN DISPLAY "getal is even."
           END-IF
           IF oneven
             THEN DISPLAY "getal is oneven."
           END-IF
           STOP RUN.

De variabele getal is onderverdeeld in 2 andere variabelen: even en oneven. Als het getal dat wordt opgeslagen in de variabele getal, even is, dan wordt de variabele even geactiveerd. En met oneven wordt de variabele oneven geactiveerd.

Gebruik van THRU of THROUGH[bewerken]

Als veel opvolgende cijfers als voorwaarde gelden, kun je THRU gebruiken.

COBOL-code: Conditie met voorwaardenaam

       IDENTIFICATION DIVISION.
       PROGRAM-ID. conditiemetvoorwaarden.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       77 getal PIC 99.
         88 nietgeslaagd VALUE 0 THRU 49.
         88 geslaagd VALUE 50 THRU 99.

       PROCEDURE DIVISION.
       HOOFD.
           DISPLAY "Geef het resultaat:"
           ACCEPT getal NO BEEP

           IF nietgeslaagd
             THEN DISPLAY "U bent niet geslaagd."
           END-IF

           IF geslaagd
             THEN DISPLAY "U bent geslaagd."
           END-IF
           STOP RUN.

Dit programma kijkt of een leerling al of niet geslaagd is. Wanneer het getal lager dan 50 is, zal de variabele niet geslaagd geactiveerd worden. Als het 50 of hoger is, zal de variabele geslaagd geactiveerd worden. Naast de Amerikaanse spelling THRU kan, je ook het Engelse THROUGH gebruiken.

Een boolean[bewerken]

Je kan dankzij conditie met voorwaardenaam dus ook een boolean maken. Hier is een simpel voorbeeld hoe het moet.

COBOL-code: Boolean

       IDENTIFICATION DIVISION.
       PROGRAM-ID. conditiemetvoorwaarden.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       77 boolean PIC X.
         88 ok VALUE "j", "J".

       PROCEDURE DIVISION.
       HOOFD.
           DISPLAY "Is het OK?(j/n)"
           ACCEPT boolean NO BEEP

           IF ok
             THEN DISPLAY "Het is ok"
             ELSE DISPLAY "Het is niet ok"
           END-IF
           STOP RUN.

De gebruiker wordt gevraagd of het ok is. Antwoordt hij met een "j" of "J", dan wordt de variabele ok geactiveerd; wanneer hij met iets anders antwoordt gebeurt er niets.

Switch[bewerken]

Een switch of vlag is ook een boolean. Zo kan bijgehouden worden of het einde van een bestand (EOF = end-of-file) of tabel bereikt werd.

COBOL-code: Switch

       01 SW-EOF PIC X VALUE 'N'.
          88 EOF PIC X VALUE 'Y'.




2. Tabellen



1-dimensionale tabel[bewerken]

Simpel voorbeeld[bewerken]

Tabellen, ook wel arrays genoemd, worden gebruikt om gelijkaardige gegevens bij elkaar te houden: In een tabel staan bijvoorbeeld een aantal temperatuurmetingen of namen van personen. Met een tabel kun je bovendien vermijden dat je veel verschillende variabelen moet maken: Naam1, naam2, naam3, ...

Een tabel kan ook gebruikt worden om maar eenmaal een bestand te hoeven lezen, want dat is trager dan het raadplegen van werkgeheugen.

In onderstaand stukje programmacode zullen we 10 verschillende getallen lezen, om ze vervolgens allemaal terug op het scherm te tonen.

COBOL-code: Tabel

       IDENTIFICATION DIVISION.
       PROGRAM-ID. tabel.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 tabel.
        02 getal PIC 9 OCCURS 10 TIMES.

       77 i PIC 99.

       PROCEDURE DIVISION.
       HOOFD.
           PERFORM lees
           PERFORM toon
           STOP RUN.

       LEES.
           PERFORM VARYING i FROM 1 BY 1 UNTIL i > 10
             DISPLAY "Geef " i "de getal:"
             ACCEPT getal(i) NO BEEP
           END-PERFORM
           .
      
       TOON.
           PERFORM VARYING i FROM 1 BY 1 UNTIL i > 10
             DISPLAY i "de getal is " getal(i)
           END-PERFORM
           .

Nu zullen we de belangrijke delen van het programma uitleggen.

COBOL-code: Tabel

       01 tabel.
        02 getal PIC 9 OCCURS 10 TIMES.

       77 i PIC 99.

Een tabel lijkt ongeveer op een groepsveld. Het grote verschil is OCCURS: Dat geeft aan hoeveel getallen er moeten worden opgeslagen; in dit geval 10 keer. i zal worden gebruikt als teller:

COBOL-code: Tabel

           PERFORM VARYING i FROM 1 BY 1 UNTIL i > 10
             DISPLAY "Geef " i "de getal:"
             ACCEPT getal(i) NO BEEP
           END-PERFORM

De verschillende getallen die in de tabel worden opgeslagen, worden niet aangeduid door een unieke naam, maar wel door een nummer. Dit nummer wordt index (of subscript) genoemd. Om de 10 verschillende getallen te lezen, wordt er best gebruik gemaakt van een lus. De variabele i wordt gebruikt als teller, die teller kun je gebruiken als index. In de lus wordt eerst 1 in i gezet en wordt met 1 verhoogd, telkens de lus opnieuw wordt uitgevoerd. Om een getal op te slaan, typ je "ACCEPT getal(i)"; dan wordt het getal op de ide plaats opgeslagen. Om dat getal te kunnen tonen, moet je gewoon "DISPLAY getal(i)" gebruiken. Een teller is natuurlijk niet verplicht om de getallen te kunnen lezen en uitschrijven. Je kan gewoon een nummer vragen van de gebruiker zelf. Het is ook mogelijk om in een subscript een kleine berekening te doen. Hier zijn een aantal andere mogelijkheden.

COBOL-code: Tabel

           COMPUTE fibonacci(3) = fibonacci(2) + fibonacci(1)
          * Je kunt een vast getal in de code opgeven
           COMPUTE fibonacci(nummer) = fibonacci(nummer - 1) + fibonacci(nummer - 2) 
          * Je kunt een variabele gebruiken, of een berekening maken

VALUE bij tabellen[bewerken]

Je kunt op voorhand al een waarde geven aan de verschillende elementen van een tabel. Hiervoor zijn meerdere mogelijkheden beschikbaar.

COBOL-code: VALUE bij tabellen

       01 tabel.
        02 getal PIC 9 OCCURS 10 TIMES VALUE 9.

Door dit te doen, geef je aan ieder element in de tabel de waarde 9. Er is ook een andere manier d.m.v. de naam van de tabel.

COBOL-code: VALUE bij tabellen

       01 tabel VALUE "abcdefghijklmnopqrstuvwxyz".
        02 letter PIC X OCCURS 26 TIMES.

Hier wordt via de naam van de tabel de gegevens in de verschillende elementen gezet. "a" komt in het eerste element, "b" in het tweede en zoverder. Dit kan handig zijn als je kleine gegevens in een tabel wilt zetten. Maar als je 10 namen in een tabel wilt zetten, kan je ook per element een waarde geven op een andere manier:

COBOL-code: VALUE bij tabellen

       01 tabel.
        02 PIC X(10) VALUE "Dimitri".
        02 PIC X(10) VALUE "Kenny".
        02 PIC X(10) VALUE "Kristof".
        02 PIC X(10) VALUE "Jeroen".
        02 PIC X(10) VALUE "Steven".
        02 PIC X(10) VALUE "Jan".
        02 PIC X(10) VALUE "Nathalie".
        02 PIC X(10) VALUE "Liesbeth".
        02 PIC X(10) VALUE "Katrien".
        02 PIC X(10) VALUE "Joke".

       01 REDEFINES tabel.
        02 naam PIC X(10) OCCURS 10 TIMES.

Je maakt een groepsveld, en aan iedere veld geef je een waarde. Let wel op dat je dezelfde PIC geeft aan alle velden, anders krijg je heel vreemde resultaten. Dan gebruik je "REDEFINES", deze zal van het groepsveld een tabel maken.

Complexer voorbeeld[bewerken]

COBOL-code: Complexer voorbeeld

       IDENTIFICATION DIVISION.
       PROGRAM-ID. tabel.

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT invoer ASSIGN TO "invoer.dat"
           LINE SEQUENTIAL.

           SELECT uitvoer ASSIGN to "uitvoert.dat"
           LINE SEQUENTIAL.


       DATA DIVISION.
       FILE SECTION.
       FD invoer.
       01 persoon.
        02 achternaam PIC X(20).
        02 voornaam PIC X(15).
        02 PIC X(39).
        02 geslacht PIC X.

       FD uitvoer.
       01 regel.
        02 uitvn PIC X(15).
        02 PIC X.
        02 uitan PIC X(20).
        02 PIC X.
        02 uitge PIC X.

       WORKING-STORAGE SECTION.
       01 tabel.
        02 tpersoon OCCURS 2 TIMES.
         03 tvn PIC X(15).
         03 tan PIC X(20).
         03 tge PIC X.

       77 i PIC 99.

       PROCEDURE DIVISION.
       HOOFD.
           PERFORM lees
           PERFORM toon
           PERFORM schrijf
           STOP RUN.

       LEES.
           OPEN INPUT invoer
           PERFORM VARYING i FROM 1 BY 1 UNTIL i > 2
             READ invoer END-READ
             MOVE achternaam TO tan(i)
             MOVE voornaam TO tvn(i)
             MOVE geslacht TO tge(i)
           END-PERFORM
           CLOSE invoer
           .
      
       TOON.
           PERFORM VARYING i FROM 1 BY 1 UNTIL i > 2
             DISPLAY tvn(i) " " tan(i) " " tge(i)
           END-PERFORM
           .

       SCHRIJF.
           OPEN OUTPUT uitvoer
           PERFORM VARYING i FROM 1 BY 1 UNTIL i > 10
             MOVE tan(i) TO uitan
             MOVE tvn(i) TO uitvn
             MOVE tge(i) TO uitge
             WRITE regel END-WRITE
           END-PERFORM
           CLOSE uitvoer
           .

Als je het hoofdstuk over Sequentiële bestanden hebt gelezen, zul je wel al door hebben dat dit programma een bestand leest en schrijft. Hier wordt een tabel gebruikt om de informatie van het gelezen bestand in op te slaan. Hierdoor gaat de informatie niet verloren telkens je een nieuwe regel leest.

COBOL-code: Complexer voorbeeld

       01 tabel.
        02 tpersoon OCCURS 2 TIMES.
         03 tvn PIC X(15).
         03 tan PIC X(20).
         03 tge PIC X.

Je kunt dus ook een tabel onderverdelen in groepsvelden. Dit zorgt ervoor dat je een tabel onderverdelen in verschillende variabelen, wat het duidelijk en makkelijker maakt om er mee te werken.

COBOL-code: Complexer voorbeeld

             MOVE achternaam TO tan(i)
             MOVE voornaam TO tvn(i)
             MOVE geslacht TO tge(i)

2-dimensionale tabel(matrix)[bewerken]

Een 2-dimensionale tabel laat natuurlijk toe om meer informatie op te slaan. Stel dat je bijvoorbeeld de dagtemperatuur van 7 dagen wilt opslaan. Dan kun je een gewoon 1-dimensionaal tabel gebruiken. Maar wat als je dat van 5 verschillende straten wilt opslaan. Dan kun je ofwel 5 verschillende 1-dimensionale tabelen maken. Of je kunt het volgende doen:

COBOL-code: 2-dimensionale tabel

       IDENTIFICATION DIVISION.
       PROGRAM-ID. 2demtabel.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 temperatuur.
        02 straat OCCURS 5 TIMES.
         03 dag PIC 99 OCCURS 7 TIMES.

       77 i PIC 9.
       77 j PIC 9.

       PROCEDURE DIVISION.
       HOOFD.
           PERFORM lees
           PERFORM toon
           STOP RUN.

       LEES.
           PERFORM VARYING i FROM 1 BY 1 UNTIL i > 5
             PERFORM VARYING j FROM 1 BY 1 UNTIL j > 7
               DISPLAY "Geef de " j "de dagtemperatuur van de " i "de straat:"
               ACCEPT dag(i, j) NO BEEP
             END-PERFORM
           END-PERFORM
           .
      
       TOON.
           DISPLAY "gebied\dag 1  2  3  4  5  6  7"
           PERFORM VARYING i FROM 1 BY 1 UNTIL i > 5
             DISPLAY i "          " dag(i, 1) " " dag(i, 2) " "
             dag(i, 3) " " dag(i, 4) " " dag(i, 5) " " dag(i, 6) " "
             dag(i, 7)
           END-PERFORM
           .

Hier wordt dus voor iedere straat 7 dagtemperaturen in gelezen.

COBOL-code: 2-dimensionale tabel

       01 temperatuur.
        02 straat OCCURS 5 TIMES.
         03 dag PIC 99 OCCURS 7 TIMES.

Het zal u dus niet verbazen dat je 2 keer OCCURS moet gebruiken. Eén keer om de 5 straten te declareren en één keer om voor elk gebied 7 dagen te declaren.

COBOL-code: 2-dimensionale tabel

           PERFORM VARYING i FROM 1 BY 1 UNTIL i > 5
             PERFORM VARYING j FROM 1 BY 1 UNTIL j > 7
               DISPLAY "Geef de " j "de dagtemperatuur van de " i "de straat:"
               ACCEPT dag(i, j) NO BEEP
             END-PERFORM
           END-PERFORM

Om via een lus de gegevens in te voeren, heb je bij een 2-dimensionale tabel 2 lussen nodig. De eerste lus gaat de gebieden één voor één af en de tweede lus zal de dagen afgaan. De subscript ziet er natuurlijk ook anders uit.


3. Editing



Je kan met COBOL de leesbaarheid van gegevens verbeteren via data editing. Dit betekent dat je een opmaak geeft aan een veld. Bijvoorbeeld je hebt een datum in een veld met een PICTURE 9(8) opgeslagen als 01012001. Als je dit toont op het scherm, is dit niet echt leesbaar. Daarom kun je een PICTURE maken met 99/99/9999. Als je dan dat veld toont op het scherm, dan krijg je “01/01/2001”. Er is echter een probleem: je kunt geen gevens inlezen via ACCEPT in een veld waar editing is gebruikt, en je kunt ook geen berekeningen doen met gegevens in een dergelijk veld.

Je hebt dus telkens twee velden nodig: een om een waarde in te lezen en om mee te rekenen: de zender (sender), en een om de waarde weer te geven: de ontvanger (receiver). Met het MOVE-statement wordt de inhoud overgebracht: "MOVE sender TO receiver". Uiteindelijk wordt dan de ontvanger getoond op het scherm.

Simple insertion[bewerken]

Bij simple insertion gaan we symbolen toevoegen. Dit zijn er 5, namelijk een spatie (m.b.v. de letter B (blank)), het cijfer nul (0), een schuine streep (/), de punt (.) en de komma (,). Je mag ze niet zomaar gebruiken. De punt en de komma mag je alleen gebruiken bij numerieke velden.

Zender Ontvanger
PICTURE waarde PICTURE resultaat
x(5) ABCDE XBXBXBXBX A B C D E
9(4) 1234 9B999 1 234
x(4) ACDC XX/XX AC/DC
9(8) 01012001 99/99/9999 01/01/2001
x(5) 1keer X000X(4) 1000keer
999 123 999000 123000
9(6) 123456 9(3),9(3) 123,456
9V99 123 9.99 1.23
9(4)V99 123456 9,999.99 1,234.56
9(4)V99 1234 9,999.99 1,234.00

Om gegevens van één veld naar de andere te sturen moet je simpel weg het MOVE-statement gebruiken. Je kunt natuurlijk ook verschillende symbolen in een PICTURE met elkaar combineren.

Fixed insertion[bewerken]

Bij fixed insertion worden 5 (boekhoudkundige) symbolen gebruikt, alleen bij numerieke velden. Deze symbolen zijn het plus- en minteken (+ en -), credit (CR) en debet (DB) en het dollarteken ($). Het dollarteken geeft natuurlijk aan dat het om een geldbedrag gaat. CR, DB en - worden alleen maar getoond wanneer de waarde van het veld negatief is. Bij het plusteken word zowel + als - getoond afhankelijk van de waarde van het veld.

Zender Ontvanger
PICTURE waarde PICTURE resultaat
99 12 +99 +12
999V99 -123,45 999.99+ 123,45-
99 -12 -99 -12
999V99 123,45 999.99- 123,45
9(3) 007 $999 $007
999V99 123,45 $999.99 $123.45
99 12 99DB 12
99 -12 99DB 12DB
99 12 99CR 12
99 -12 99CR 12CR

Het plus- en minteken moeten altijd uiterst link of rechts worden gezet en nooit middenin een getal. CR en DB mogen alleen uiterst rechts staan. +, -, CR en DB mogen slechts één keer worden gebruikt. Het dollarteken moet uiterst links worden geplaatst tenzij er een plus- of minteken wordt gebruikt dan komt het achter dat teken.

Zero suppression[bewerken]

Zero suppression betekent dat we nullen gaan onderdrukken als ze niet van belang zijn. Hiervoor worden twee tekens gebruikt: de letter Z en de asterisk (*). Als we die tekens gebruiken, wordt de nul vervangen door een spatie of een asterisk. Bijvoorbeeld we hebben een PICTURE 9,999.99 en die heeft als inhoud 123.45 Wanneer we dit gaan tonen krijgen we 0,123.45. Die eerste nul heeft totaal geen nut. Als we de Z gebruiken in ons PICTURE zoals Z,ZZ9.99 dan krijgen we " 123.45". De overbodige nul wordt dus vervangen door een spatie. Merk op dat de komma ook wegvalt want die heeft ook geen enkel nut.

De asterisk doet hetzelfde, maar de nul wordt dan vervangen door een *. Bijvoorbeeld een PICTURE *,**9.99 met als inhoud 12.04 wordt dan getoond op het scherm als "**12.04". De asterisk wordt vooral in de bankwereld gebruikt om fraude te voorkomen. Bijvoorbeeld bij cheques en overschrijvingen om te voorkomen dat er getallen voor een bedrag worden bijgezet. Zoals een cheque voor 500.00 kan makkelijk worden veranderd door 1500.00 terwijl als we asterisken zouden gebruiken eerder ***500.00 zouden te zien krijgen en is het daardoor moeilijk te veranderen.

Zender Ontvanger
PICTURE waarde PICTURE resultaat
9(4) 0007 ZZZ9 " 7"
9(4) 007 Z999 " 007"
s999 -007 -ZZ9 "- 7"
999V99 000.07 ZZZ.ZZ " .07"
9999 123 Z,ZZZ " 123"
9(4)V99 0000.00 Z,ZZZ.ZZ " "
9(4) 0007 ***9 ***7
9(4) 007 *999 *007
s999 -007 -**9 -**7
9(4)V99 0 *,****.** *,****.**

Regionale instellingen[bewerken]

COBOL werd gemaakt voor en door de Amerikanen. Europeanen gebruiken geen punt als decimaalteken en niet het dollarteken als valutateken. We gebruiken de komma en de euro (€). COBOL laat wel toe dat je die tekens makkelijk kunt vervangen. Hiervoor gebruiken we de ENVIRONMENT DIVISION, die ons toelaat bepaalde instellingen te veranderen.

Decimaalteken[bewerken]

We moeten dus het punt en de komma met elkaar verwissellen. Hier is een klein programma dat dit doet.

COBOL-code:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. Toon.

       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SPECIAL-NAMES.
           DECIMAL-POINT IS COMMA.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       77 lees PIC S9999V99.
       77 toon PIC -Z.ZZ9,99.

       PROCEDURE DIVISION.
       HOOFD.
           DISPLAY "Geef een getal:"
           ACCEPT lees NO BEEP
           MOVE lees TO toon
           DISPLAY "Hier is uw getal:"
           DISPLAY toon
           STOP RUN.
Geef een getal:
-1234,56
Hier is uw getal:
-1.234,56

Zoals eerder werd gezegd, moet ENVIRONMENT DIVISION worden gebruikt. Hier wordt de sectie CONFIGURATION SECTION gebruikt die toelaat om instellingen te veranderen. SPECIAL-NAMESs laat toe om speciale functies op te roepen. Het uiteindelijke statement dat ervoor zorgt dat de punt een komma wordt, is DECIMAL-POINT IS COMMA. Hierdoor worden de komma en het punt met elkaar verwisseld. Let hier wel goed mee op. Als je dit gebruikt moet je ook de PICTURE van je velden aanpassen. Een veld dat normaal als PICTURE -Z,ZZ9.99 had, moet nu -Z.ZZ9,99 zijn, anders geraak je in de problemen.

Valuta[bewerken]

Het veranderen van het dollarteken gebeurt gelijkaardig:

COBOL-code:

       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SPECIAL-NAMES.
           CURRENCY SIGN IS "E"
           DECIMAL-POINT IS COMMA.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       77 lees PIC S9999V99.
       77 toon PIC -EE.EE9,99.

CURRENCY SIGN IS "E" dit laat dus toe om het dollarteken makkelijk te veranderen. De E staat dus voor euro. Net zoals het punt en de komma moet je dit ook aanpassen bij de PICTURE van je velden. -$$.$$9,99 wordt dus -EE.EE9,99. In bepaalde versies van COBOL kan je extra dingen doen met valuta, bijvoorbeeld het dollarteken veranderen door het euroteken.


4. Embedded SQL


Programmeren in COBOL/Velden/Embedded SQL


Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.