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.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
| ORGANIZATION | Bedeutung |
|---|---|
LINE SEQUENTIAL | Textdatei, ein Satz pro Zeile |
SEQUENTIAL | Sätze fester Länge, nacheinander |
INDEXED | Index über einen Schlüssel (wie eine einfache Datenbank, VSAM auf dem Mainframe) |
RELATIVE | Zugriff ü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.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.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 SEQUENTIALfür Textdateien,INDEXEDfür schlüsselbasierte Dateien (VSAM)- Unterprogramme:
CALL "NAME" USING ...undLINKAGE SECTION - Dezimalarithmetik: exakte Cent-Rechnung,
ROUNDED,ON SIZE ERROR
Aufgabe
Schreibe ein Programm, das drei Artikel mit Preis in eine Datei schreibt, wieder einliest und die Summe bildet.