EMZETT.
Login

Kurz: COBOL wurde für die Stapelverarbeitung großer Datenbestände gebaut. Dateien werden in der ENVIRONMENT DIVISION zugeordnet (SELECT) und in der DATA DIVISION beschrieben (FD):

Teil des Kurses COBOL

Kapitel 7 von 8 im Kurs COBOL (Abschnitt „Praxis“). Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

Sequentielle Dateien

COBOL wurde für die Stapelverarbeitung großer Datenbestände gebaut. Dateien werden in der ENVIRONMENT DIVISION zugeordnet (SELECT) und in der DATA DIVISION beschrieben (FD):

IDENTIFICATION DIVISION.
PROGRAM-ID. DATEIEN.
 
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT KUNDEN-DATEI ASSIGN TO "kunden.dat"
        ORGANIZATION IS LINE SEQUENTIAL.
 
DATA DIVISION.
FILE SECTION.
FD KUNDEN-DATEI.
01 KUNDEN-SATZ.
   05 K-NR     PIC 9(4).
   05 FILLER   PIC X.
   05 K-NAME   PIC X(10).
   05 K-UMSATZ PIC 9(5).
 
WORKING-STORAGE SECTION.
01 EOF-FLAG   PIC X VALUE "N".
   88 DATEI-ENDE VALUE "J".
01 GESAMT     PIC 9(7) VALUE 0.
01 ANZAHL     PIC 99   VALUE 0.
01 MITTEL     PIC 9(5)V99.
 
PROCEDURE DIVISION.
HAUPT.
    PERFORM SCHREIBEN.
    PERFORM LESEN.
    STOP RUN.
 
SCHREIBEN.
    OPEN OUTPUT KUNDEN-DATEI.
    MOVE 1001 TO K-NR.  MOVE "Mia"   TO K-NAME.  MOVE 12000 TO K-UMSATZ.
    WRITE KUNDEN-SATZ.
    MOVE 1002 TO K-NR.  MOVE "Tom"   TO K-NAME.  MOVE 8500  TO K-UMSATZ.
    WRITE KUNDEN-SATZ.
    MOVE 1003 TO K-NR.  MOVE "Zoe"   TO K-NAME.  MOVE 20300 TO K-UMSATZ.
    WRITE KUNDEN-SATZ.
    CLOSE KUNDEN-DATEI.
 
LESEN.
    OPEN INPUT KUNDEN-DATEI.
    PERFORM UNTIL DATEI-ENDE
        READ KUNDEN-DATEI
            AT END SET DATEI-ENDE TO TRUE
            NOT AT END
                DISPLAY K-NR " " K-NAME " " K-UMSATZ
                ADD K-UMSATZ TO GESAMT
                ADD 1 TO ANZAHL
        END-READ
    END-PERFORM.
    CLOSE KUNDEN-DATEI.
    DIVIDE GESAMT BY ANZAHL GIVING MITTEL.
    DISPLAY "Anzahl: " ANZAHL "  Gesamt: " GESAMT "  Mittel: " MITTEL.

Ausgabe:

1001 Mia        12000
1002 Tom        08500
1003 Zoe        20300
Anzahl: 03  Gesamt: 0040800  Mittel: 13600.00

Wichtige Dateimodi: OPEN INPUT (lesen), OPEN OUTPUT (neu schreiben), OPEN EXTEND (anhängen), OPEN I-O (lesen und ändern). Mit FILE STATUS IS feld prüfst du nach jeder Operation den Fehlercode (00 = ok, 10 = Dateiende, 35 = Datei fehlt).

Weitere Dateiarten

ORGANIZATIONBedeutung
LINE SEQUENTIALTextdatei, ein Satz pro Zeile
SEQUENTIALSätze fester Länge, nacheinander
INDEXEDIndex über einen Schlüssel (wie eine einfache Datenbank, VSAM auf dem Mainframe)
RELATIVEZugriff über Satznummer
SELECT KONTEN ASSIGN TO "konten.idx"
    ORGANIZATION IS INDEXED
    ACCESS MODE IS DYNAMIC
    RECORD KEY IS K-KONTO-NR
    FILE STATUS IS DATEI-STATUS.
 
READ KONTEN KEY IS K-KONTO-NR
    INVALID KEY DISPLAY "Konto nicht gefunden"
END-READ.
REWRITE KONTEN-SATZ.       *> Satz ändern
DELETE KONTEN RECORD.

Unterprogramme (CALL)

Ein Programm kann andere Programme aufrufen und Daten übergeben (LINKAGE SECTION):

IDENTIFICATION DIVISION.
PROGRAM-ID. HAUPT.
 
DATA DIVISION.
WORKING-STORAGE SECTION.
01 BETRAG   PIC 9(5)V99 VALUE 200.00.
01 STEUER   PIC 9(5)V99.
01 BRUTTO   PIC 9(5)V99.
 
PROCEDURE DIVISION.
    CALL "MWST" USING BETRAG STEUER BRUTTO.
    DISPLAY "Netto  : " BETRAG.
    DISPLAY "Steuer : " STEUER.
    DISPLAY "Brutto : " BRUTTO.
    STOP RUN.
 
IDENTIFICATION DIVISION.
PROGRAM-ID. MWST.
 
DATA DIVISION.
LINKAGE SECTION.
01 L-NETTO   PIC 9(5)V99.
01 L-STEUER  PIC 9(5)V99.
01 L-BRUTTO  PIC 9(5)V99.
 
PROCEDURE DIVISION USING L-NETTO L-STEUER L-BRUTTO.
    COMPUTE L-STEUER ROUNDED = L-NETTO * 0.19.
    COMPUTE L-BRUTTO = L-NETTO + L-STEUER.
    EXIT PROGRAM.
END PROGRAM MWST.
END PROGRAM HAUPT.

Ausgabe:

Netto  : 00200.00
Steuer : 00038.00
Brutto : 00238.00

Geldrechnung und Rundung

Dank Dezimalarithmetik rechnet COBOL mit Cent-Beträgen exakt. Rundung steuerst du mit ROUNDED, Überlauf mit ON SIZE ERROR:

IDENTIFICATION DIVISION.
PROGRAM-ID. GELD.
 
DATA DIVISION.
WORKING-STORAGE SECTION.
01 PREIS    PIC 9(4)V99 VALUE 19.99.
01 MENGE    PIC 99      VALUE 3.
01 SUMME    PIC 9(4)V99.
01 KLEIN    PIC 99.
01 RUND     PIC 9(4).
01 A        PIC 9V9 VALUE 0.1.
01 B        PIC 9V9 VALUE 0.2.
01 C        PIC 9V9.
01 ZINS     PIC 9V9999 VALUE 0.0275.
01 KAPITAL  PIC 9(6)V99 VALUE 10000.00.
01 ENDE     PIC 9(6)V99.
01 JAHR     PIC 99.
 
PROCEDURE DIVISION.
    MULTIPLY PREIS BY MENGE GIVING SUMME.
    DISPLAY "3 x 19.99 = " SUMME.
    COMPUTE RUND ROUNDED = 12.5.
    DISPLAY "gerundet: " RUND.
    COMPUTE KLEIN = 150 + 100
        ON SIZE ERROR DISPLAY "Überlauf erkannt"
    END-COMPUTE.
    ADD A TO B GIVING C.
    IF C = 0.3
        DISPLAY "0,1 + 0,2 = 0,3 exakt"
    END-IF.
    MOVE KAPITAL TO ENDE.
    PERFORM VARYING JAHR FROM 1 BY 1 UNTIL JAHR > 5
        COMPUTE ENDE ROUNDED = ENDE * (1 + ZINS)
    END-PERFORM.
    DISPLAY "Kapital nach 5 Jahren: " ENDE.
    STOP RUN.

Ausgabe:

3 x 19.99 = 0059.97
gerundet: 0013
Überlauf erkannt
0,1 + 0,2 = 0,3 exakt
Kapital nach 5 Jahren: 011452.73

Merke

  • Dateien: SELECT ... ASSIGN, FD, OPEN/READ/WRITE/CLOSE, AT END, FILE STATUS
  • LINE SEQUENTIAL für Textdateien, INDEXED für schlüsselbasierte Dateien (VSAM)
  • Unterprogramme: CALL "NAME" USING ... und LINKAGE SECTION
  • Dezimalarithmetik: exakte Cent-Rechnung, ROUNDED, ON SIZE ERROR

Übungsaufgabe

Schreibe ein Programm, das drei Artikel mit Preis in eine Datei schreibt, wieder einliest und die Summe bildet.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Eingabe, Berichte und Formatierung

Weiter: Mainframe, Praxis und Spickzettel

Alle Kapitel: COBOL im Überblick