07.03.2014 Aufrufe

Datenbank-Programmierung 1. COBOL

Datenbank-Programmierung 1. COBOL

Datenbank-Programmierung 1. COBOL

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

Prof. Dr. rer.nat.habil. Bernhard Thalheim<br />

Information Systems Engineering<br />

Institute of Computer Science<br />

Christian-Albrechts-University Kiel<br />

Olshausenstr. 40<br />

D - 24098 Kiel<br />

<br />

Vorlesung <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> SS 2013<br />

WInf-DBProg: <strong>Datenbank</strong>-<strong>Programmierung</strong> (080014)<br />

1 <strong>COBOL</strong> COmmon Business Oriented Language<br />

etwa 50 % der mainframe-Anwendungen<br />

heute noch 25 - 30 % aller Software-Produkte erstellt<br />

etwa 55 - 60 % aller Altsysteme<br />

1959: <strong>1.</strong> Version; 1960: CODASYL-Standard; COnference on DAta SYstems Languages<br />

Cobol 68, Cobol 74, Cobol 85<br />

Gliederung dieser Vorlesung<br />

<strong>1.</strong> allgemeine Struktur<br />

2. Verarbeitung<br />

3. sequentielle Files<br />

4. indexsequentielle Files<br />

Literatur:<br />

J. Wendt, <strong>COBOL</strong>: Einführung in PC-Spracherweiterungen und Übungen. Wiesbaden, Gabler, 1991<br />

H.-J. Höcker, Einführung in die strukturierte <strong>COBOL</strong>-<strong>Programmierung</strong> mit Mikrocomputeranwendungen. Berlin, De Gryuter,<br />

1989.<br />

H.-R. Göpfrich, Wirtschaftsinformatik II: Strukturierte <strong>Programmierung</strong> in <strong>COBOL</strong>. 4. Auflage, Stuttgart, Gustav Fischer,<br />

199<strong>1.</strong><br />

K. Jamin, H. Urban, Programmiersprache <strong>COBOL</strong>, eine strukturierte Einführung. Rowohlt, 1989.<br />

Strukturierte <strong>Programmierung</strong> auch mit <strong>COBOL</strong> möglich<br />

• Abstraktion, Strukturierung, Modularisierung, Trennung von Essenz und Inkarnation (Unabhängigkeit),<br />

konstruktive Voraussicht (Änderbarkeit, Wartbarkeit)<br />

• Black box versus white box versus glas box<br />

• Strukturierte Entwicklung, schrittweise Verfeinerung, Spezifikation durch Nassi-Shneiderman-Struktogramme


CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 2<br />

Gliederung von Programmen<br />

• Erkennungsteil (Identification Division)<br />

i.a. Name = Programmnamen<br />

• Maschinenteil (Environment Division)<br />

Programmumgebung, Umdefinitionen<br />

• Datenteil (Data Division)<br />

File-Section, Arbeitsvariable, Verbindungsteil (für<br />

Unterprogramme)<br />

• Prozedurteil (Procedure Division)<br />

Definition sequentiell, Abarbeitung sequentiell, in<br />

Sections etc. gliederbar<br />

Gliederung der einzelnen Teile<br />

• Division besteht aus Sections<br />

• Section besteht aus Paragraphen<br />

• Paragraph besteht aus mehreren Sätzen<br />

• Satz besteht aus mehreren Anweisungen<br />

• Anweisung besteht aus mehreren Wörtern<br />

IDENTIFICATION DIVISION.<br />

*************************<br />

program-id. HAUPT.<br />

author. Alfons Zitterbacke.<br />

DATA DIVISION.<br />

*************************<br />

File Section<br />

*------------------------<br />

Working-Storage Section<br />

*------------------------<br />

01 datum-aus.<br />

05 tag pic 99.<br />

05 filler pic x value ".".<br />

05 monat pic 99.<br />

05 filler pic xxx value ".19"<br />

05 jahr pic 99.<br />

01 datum-ein.<br />

05 jahr pic 99.<br />

05 monat pic 99.<br />

05 tag pic 99.<br />

PROCEDURE DIVISION.<br />

************************<br />

haupt.<br />

accept datum-ein from date.<br />

move corr datum-ein to datum-aus<br />

display "Heute ist der " datum-a<br />

stop run.<br />

ENIVIRONMENT DIVISION.<br />

*************************<br />

Configuration Section<br />

*------------------------<br />

source-computer. vax.<br />

object-computer. vax.<br />

special-names. decimal point is comma.<br />

Input-Output Section<br />

*------------------------<br />

File-Control. ....


CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 3<br />

Programme<br />

• Quellcode<br />

• Objekt-Datei<br />

Übersetzung mit <strong>COBOL</strong>-Compiler<br />

<strong>COBOL</strong> name.cob<br />

fehlerhafter Quellcode in<br />

• Binärcode<br />

Erzeugung mit Linker<br />

LINK name.obj<br />

Ablaub mit üblicher Umgebung<br />

RUN name.exe<br />

name.cob<br />

name.obj<br />

name.lis<br />

name.exe<br />

<strong>COBOL</strong>-Worte<br />

• alphanumerischer Zeichensatz<br />

+ - * / = $ , ; : . ( ) < > ¨<br />

i.a. weniger als 30 Zeichen<br />

beginnend mit Buchstaben ohne Leerzeichen<br />

• reservierte Schlüsselwörter<br />

ADD 100 TO ergebnis ON SIZE ERROR display ¨Overflow ¨.<br />

• Literale als Zeichenketten, die Wert selbst definieren<br />

numerische Literale (+34.45 bzw. +34,45),<br />

alphanumerische Literale ( ¨Guten Tag ¨),<br />

figurative Konstanten (Zero, Zeroes, Zeros (Wert Null);<br />

Space, Spaces (Wert: Blank);<br />

All (Wiederholung eines Literals);<br />

Quote (Anführungszeichen) )


CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 4<br />

Datenvereinbahrung<br />

Stufennummer Feldname | FILLER PICTURE IS Maske<br />

[ Zusatzklausel ] ...<br />

Stufennummern als (exklusive) Baumstruktur<br />

FILLER als Fülsel zur Ausgabe<br />

Datenname OF Datengruppen-Name<br />

PIC bzw. PICTURE als alphanumerische oder numerische Daten:<br />

pic xx. pic x(20). pic 9. pic 9(5).<br />

ACCEPT name [ FROM OS-Grundtyp ]<br />

MOVE [ CORRESPONDING ] name1 TO name2<br />

DISPLAY name<br />

mit Zeilenumbruch<br />

PROCEDURE DIVISION.<br />

*********************<br />

Anfang.<br />

display "Ihr Vorname ?"<br />

accept Vorname.<br />

display "Ihr Nachname ?"<br />

accept Nachname.<br />

display Vorname.<br />

display Nachname.<br />

move Nachname to Einbuchstabe.<br />

Klaus<br />

display Einbuchstabe.<br />

Z<br />

move 1234 to Zahl5. 01234<br />

display Zahl5.<br />

move Zahl5 to Zahl3. 234<br />

display Zahl3. 234<br />

stop run.<br />

Zitterbacke<br />

Klaus_________<br />

Zitterbacke___<br />

Vorzeichen mit S Dezimalpunkt mit V<br />

pic 9V9999. 12345 wird zu <strong>1.</strong>2345<br />

pic S9V9(4). 12345 wird zu +<strong>1.</strong>2345


CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 5<br />

Sendemasken und Empfangsmasken<br />

Punkt mit .<br />

Symbole + und - für Vorzeichen<br />

Unterdrückung führender Nullen mit Z<br />

01 Sender pic 9(5). 01 Empfang pic 9(3).999.<br />

01 Sender1 pic S9V9(4). 01 Empfang1 pic +9.9(4).<br />

Sendemaske Sendeinhalt Empfangsmaske Empfangsinhalt<br />

9(5) 12345 9.999 5.000<br />

9(5) 12345 9(3).999 345.000<br />

9(2)V9(3) 12.345 9(3).9(2) 012.34<br />

9(5) 00012 ZZZZ9 12<br />

9(3)V99 012.34 Z(3).99 12.34<br />

99V9(3) 0<strong>1.</strong>234 Z.9(3) <strong>1.</strong>234<br />

S9V9(4) <strong>1.</strong>2345 +9.9(4) +<strong>1.</strong>2345<br />

S9V9(4) <strong>1.</strong>2345 9.9(4)- <strong>1.</strong>2345<br />

S9(3)V9(3) -12.345 Z(2)9(3).9(3)- 012.345-<br />

Zusätze in PICTURE-Klauseln:<br />

01 Anrede pic x(10) value "Herr/Frau".<br />

01 Filler pic x(9) value all "=".<br />

01 Zahl1 pic 99 value zeroes.<br />

01 Leer pic x(79) value spaces.<br />

01 Feld1 pic S9(4) sign is leading.<br />

01 Feld2 pic x(20) just.<br />

01 Zahl2 pic 9(3) blank when zero.<br />

02 Anschrift pic x(59).<br />

02 Adresse1 redefines Anschrift.<br />

03 Ort pic x(35).<br />

03 Land pic x(24).<br />

VALUE: mit Wertezuweisung<br />

SIGN IS LEADING: Vorzeichen wird dazugezählt<br />

SIGN IS TRAILING: Vorzeichen dazugezählt, am Ende<br />

JUSTIFIED: rechtsbündig<br />

BLANK (WHEN) ZERO: führende Nullen als Leerzeichen<br />

REDEFINES: weitere Strukturdefinitionen hinzufügbar


CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 6<br />

Arithmetische Anweisungen<br />

ADD Name1 | Literal1 ... TO Name2 [ Rounded ] ...<br />

[ GIVING Name3 [ ROUNDED ] ]<br />

[ ON SIZE ERROR unbedAnweisung ]<br />

add 1 to Feld2 Feld2 := Feld2 + 1<br />

add 1,2 to Feld1 giving Erg1, Erg2 Erg1,Erg2 := Feld1 +1+<br />

SUBTRACT ... FROM ... [ GIVING ... ] [ ON ... ]<br />

MULTIPLY ... BY ... [ GIVING ... ] [ ON ... ]<br />

DIVIDE ... INTO | BY ... [ GIVING ... ] [ ON ... ]<br />

divide 2 into Erg1 Erg1 := Erg1 / 2<br />

divide X1 by X2 giving X3 X3 := X1/X2<br />

remainder X4 on size error "undef" X4 := rest (X1/X2)<br />

COMPUTE Name [ ROUNDED ] ... = arithmAusdr [ ON ... ]<br />

Steueranweisungen<br />

STOP RUN<br />

IF Beding THEN Anweis1 ... | NEXT SENTENCE λ<br />

ELSE Anweis2 ... | NEXT SENTENCE<br />

Bedingungen: Vergleichsbedingungen (Name, Literal, arithm. Ausdr.)<br />

Vorzeichenbedingung<br />

if a+b *2 is [not] positive negative zero<br />

Klassenbedingungen<br />

if a is [not] numeric alphabetic<br />

zus.-ges. komplexe Beding.<br />

GO TO label(section, paragraph)<br />

GO TO ... DEPENDING ON auswahlwert<br />

PERFORM label1 [THROUGH label2] [ x TIMES]<br />

wie GO TO mit Rückkehr, evt. nur bis label2<br />

PERFORM ... UNTIL beding<br />

dürfen sich nicht überlappen<br />

X. perform A thru E. stop run.<br />

A. ... B. perform C thru G. ?????<br />

Y. ... perform K thru P.<br />

K. ... T. perform M thru S. ok.


CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 7<br />

IDENTIFICATION DIVISION.<br />

****************************<br />

program-id. MENU2.<br />

author. Zitterbacke.<br />

ENVIRONMENT DIVISION.<br />

****************************<br />

Configation Section<br />

*---------------------------<br />

source-computer. vax.<br />

object-computer. vax.<br />

DATA DIVISION.<br />

****************************<br />

Working-Storage Section<br />

*---------------------------<br />

01 ein-name pic x(30).<br />

01 sterne pic x(80) value all "*"<br />

01 bestaet pic x.<br />

01 anzeigezeile-<strong>1.</strong><br />

02 filler pic x(30) value spaces.<br />

02 name pic x(19).<br />

02 filler pic x(19) value spaces.<br />

...<br />

01 datum-ein.<br />

02 jahr pic x(2).<br />

02 monat pic x(2).<br />

02 tag pic x(2).<br />

01 datum-aus.<br />

02 tag pic x(2).<br />

02 filler pic x value".".<br />

02 monat pic x(2).<br />

02 filler pic x(3) value ".19".<br />

02 jahr pic x(2).<br />

01 flag pic x.<br />

01 text3 pic x(70) value<br />

"Modul z.Z. nicht verfuegbar"<br />

...<br />

PROCEDURE DIVISION.<br />

****************************<br />

BS Section<br />

*---------------------------<br />

Namenseingabe.<br />

display spaces.<br />

display "Name?:".<br />

display spaces.<br />

accept ein-name.<br />

move ein-name to name.<br />

*--Aufnahme Systemdaten--<br />

accept datum-ein from date.<br />

move corr datum-ein to datum-aus.<br />

....<br />

Ausgabe.<br />

*--Ausgabe Begruessung--<br />

display sterne. display spaces.<br />

display anzeigezeile-<strong>1.</strong><br />

diaplay "Datum -->" datum-aus.<br />

......<br />

display "Mit bestaetigen".<br />

accept bestaet.<br />

Haupt Section<br />

*---------------------------<br />

Steuerung.<br />

move 0 to flag.<br />

perform Eingabe until flag=<strong>1.</strong><br />

Ende.<br />

display "Programmende".<br />

stop run.<br />

Module Section<br />

*---------------------------<br />

Eingabe.<br />

*--Aufbau Auswahlbildschirm--<br />

display spaces. display spaces.<br />

display"*** Hauptmenue ***".<br />

display "1 Kundenstamm".<br />

display "2 Kundenauftrag".<br />

display "3 Programmende".<br />

display "Ihre Auswahl ?:".<br />

accept auswahl.<br />

*--Abfangen Falscheingaben--<br />

if auswahl not numeric<br />

then display "Fehler"<br />

if auswahl numeric and auswahl>3<br />

then display "Fehler"<br />

*--Menu-Punkt-Auswahl--<br />

if auswahl=1 then perform Blind.<br />

if auswahl=2 then perfom Blind.<br />

if asuwahl=3 then move 1 to flag.<br />

Blind.<br />

display ....<br />

display "Mit bestaetigen".<br />

accept bestaet.


CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 8<br />

Erweiterung um CALL<br />

Verlinken mit LINK ProgListe<br />

CALL UProg USING Parameter<br />

Parameterübergabe als Liste<br />

ohne Typenkontrolle<br />

Hauptprogramm<br />

IDENTIFICATION DIVISION.<br />

****************************<br />

program-id. HAUPT.<br />

ENVIRONMENT DIVISION.<br />

****************************<br />

Configuation Section<br />

*---------------------------<br />

source-computer. vax.<br />

object-computer. vax.<br />

DATA DIVISION.<br />

****************************<br />

Working-Storage Section<br />

*---------------------------<br />

01 alpha pic x(5).<br />

01 beta pic x(5).<br />

PROCEDURE DIVISION.<br />

****************************<br />

Steuerung.<br />

move "11111" to alpha.<br />

move "22222" to beta.<br />

call "UNTER"<br />

using alpha, beta.<br />

display "Testende".<br />

Ende.<br />

stop run.<br />

Unterprogramm<br />

Aufruf mit der üblichen Stack-Architektur<br />

Steuerung wie bei PERFORM<br />

EXIT PROGRAM als letzte<br />

Anweisung<br />

IDENTIFICATION DIVISION.<br />

****************************<br />

program-id. UNTER.<br />

ENVIRONMENT DIVISION.<br />

****************************<br />

Configuation Section<br />

*---------------------------<br />

source-computer. vax.<br />

object-computer. vax.<br />

DATA DIVISION.<br />

****************************<br />

Working-Storage Section<br />

*---------------------------<br />

01 text pic x(13)<br />

value "Unterprogramm".<br />

Linkage Section<br />

*---------------------------<br />

01 gamma pic x(5).<br />

01 delta pic x(5).<br />

PROCEDURE DIVISION using delta, gam<br />

****************************<br />

Anzeige.<br />

display text. display gamma.<br />

display delta.<br />

Zurueck.<br />

exit program.


CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 9<br />

Dateien<br />

• mit Strukturdefinition<br />

nach Data Division Definition<br />

wesentlich ist jedoch nur die Länge und Datengrundtyp<br />

• READ immer mit vollständigen Datensatz<br />

• analog WRITE nur auf Gruppe 01<br />

Organisationsformen<br />

• sequentielle Dateien<br />

Abarbeitung in der Reihenfolge der Sätze<br />

Anhängen von neuen Sätzen<br />

• Random-Dateien<br />

direkte Ablage an physischer Adresse<br />

Sätze über Schlüssel angesprochen<br />

• relative Dateien<br />

Schlüssel - automatisch vergebene Positionsnummer<br />

Nummern in automatisch generierter Zeigertabelle<br />

• indexsequentielle Dateien<br />

Zugriff über Schlüsselwerte<br />

Benutzung eines (oder mehrere) Index<br />

Charakterisierung von Dateien<br />

• Datenträger (Platte ... Diskette)<br />

• Dateiorganisation<br />

• Zugriffsarten (ACCESS MODE: sequentiell, random, dynamic)


CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 10<br />

Sequentielle Dateien<br />

SELECT datei-variable ASSIGN TO datei-name<br />

[ ORGANIZATION IS SEQUENTIAL ]<br />

ENVIRONMENT DIVISION.<br />

********************************<br />

...<br />

Input-Output Section.<br />

*-------------------------------<br />

File-Control.<br />

select Kunden assign to "sys$disk: KUNDEN"<br />

organization is sequential.<br />

select Auftrag assign to "sys$disk:AUFTRAG"<br />

organization is sequential.<br />

DATA DIVISION.<br />

********************************<br />

File Section.<br />

*-------------------------------<br />

FD Kunden label record standard.<br />

01 Kunden-Satz.<br />

02 Kundennummer pic x(4).<br />

02 Name.<br />

03 Nachname pic x(30).<br />

03 Vorname pic x(20).<br />

02 Adresse.<br />

03 Strasse pic x(30).<br />

....<br />

FD Auftrag label record standard.<br />

01 Auftrag-Satz.<br />

...<br />

FD - File Description<br />

LABEL RECORD STANDARD - historisch


CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 11<br />

Verarbeitung sequentieller Dateien<br />

• OPEN, CLOSE Datei-Variable<br />

• INPUT bzw. OUTPUT als read-only bzw. write-only<br />

Umkehroperation führt zu Programmabsturz<br />

existierende Datei (read) bzw. nicht-existierende (write)<br />

OPEN OUTPUT auf existierende Datei führt zum Löschen dieser<br />

OPEN INPUT auf nicht-existierende Datei: erfolglose Anweisung<br />

• I-O analog mit read und rewrite<br />

• OPEN EXTEND Öffnen einer existierenden Datei<br />

write als neuen letzten Satz<br />

read führt zu Programmabsturz<br />

bei OPEN nicht gelöscht, sondern erweitert<br />

• READ datei-variable RECORD [ INTO datei-struktur-variable ]<br />

[ AT END unbedingteAnweis ]<br />

datei-variable ist zeigt auf INPUT bzw. I-O Datei<br />

INTO nicht nur in den Puffer sondern Zuweisung<br />

AT END (of file) können Fehleranweisungen ausgeführt werden<br />

PROCEDURE DIVISION.<br />

*****************************<br />

Anfang. .... move "n" to flag. ....<br />

open input Kunden.<br />

accept FamName.<br />

perform Lesen until flag = "j".<br />

close Kunden. stop run.<br />

Lesen.<br />

read Kunden record at end display "Dateiende"<br />

move "j" to flag.<br />

if flag not = "j" and FamName = Nachname then<br />

display Kundennummer " " Name.<br />

display "Korrekte Person ? (j/n)".<br />

accept flag.<br />

bzw. Lesen mit Datei-Struktur-Variable<br />

01 Kunde. ...<br />

read Kunden record into Kunde at end display ...


CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 12<br />

• WRITE datei-variable [ FROM datei-struktur-variable ]<br />

OUTPUT-Datei: neu erzeugt; Extend-Datei: angefügt falls Datei existierte<br />

dati-variable aus dem FD-Puffer beschrieben<br />

write Kunden from Kunde.<br />

• REWRITE datei-variable [ FROM datei-struktur-variable ]<br />

Zurückschreiben eines existierenden Datensatzes<br />

im I-O-Modus<br />

nach vorherigem READ<br />

FD Kunden label record standard.<br />

01 Kunden-Satz.<br />

02 Kundennummer pic x(4).<br />

02 Nachname pic x(30).<br />

....<br />

PROCEDURE DIVISION.<br />

****************************<br />

Anfang.<br />

open I-O Kunden. ...<br />

Aendern.<br />

read Kunden record<br />

at end display "Fehlt"<br />

accept Nachname.<br />

rewrite Kunden-Satz.<br />

move 1 to flag.


CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 13<br />

• Drucklistenerstellung<br />

Listenkopf mit Kopfzeilen, Listenrumpf mit Seiten (Kopf-, Rumpf-, Fußzeilen), Listenfuß<br />

mit Fußzeilen<br />

FD Liste label record standard<br />

linage is 56 lines<br />

with footing at 51<br />

lines at top 5<br />

limes at bottom 5.<br />

01 Ausgabe-Satz pic x(80).<br />

* Seitenlaenge<br />

* Gesamtlaenge 66 Zeilen<br />

Working-Storage Section.<br />

*-----------------------------<br />

01 Titelzeile.<br />

02 filler pic x(60) value "Gehalt".<br />

02 datum pic 99.99.99.<br />

01 Kopfzeile. ...<br />

01 Fusszeile. ...<br />

01 Rumpfzeile.<br />

02 Name pic x(27).<br />

02 filler pic x(3).<br />

03 Gehalt pic 9(5).<br />

01 Endezeile. ...<br />

WRITE datei-variable [ FROM datei-struktur-variable ]<br />

[ BEFORE | AFTER ADVANCING<br />

{ PAGE | { variable | zahl } [LINES] } ]<br />

• Sortieren in sequentiellen Dateien<br />

SORT Sort-Datei-Name ON<br />

{ ASCENDING | DESCENDING } KEY Schluessel<br />

USING Input-Datei-Name GIVING Output-Datei-Name


CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 14<br />

Indexsequentielle Dateien<br />

auf Grundlage automatisch generierter Index-Datei<br />

Zugriffsarten<br />

• sequentieller Zugriff<br />

Verarbeitung in der Reihenfolge der Index-Datei (ACCESS SEQUENTIAL)<br />

• wahlfreier Zugriff<br />

Verarbeitung in beliebiger Reihenfolge (ACCESS RANDOM)<br />

• dynamischer Zugriff<br />

Verarbeitung sequentiell und wahlfei (ACCESS DYNAMIC)<br />

SELECT datei-variable ASSIGN TO datei-name<br />

[ ORGANIZATION IS INDEXED ]<br />

[ RECORD KEY IS Feldname ]<br />

[ ACCESS MODE IS<br />

SEQUENTIAL | RANDOM | DYNAMIC ]<br />

ENVIRONMENT DIVISION<br />

*****************************<br />

....<br />

Input-Output-Section.<br />

*----------------------------<br />

File-Control.<br />

select Kunden assign to<br />

"sys$disk:KUNDEN"<br />

organisation is sequential.<br />

select Auftrag1 assign to<br />

"sys$disk: AUFTRAG1"<br />

organization is indexed<br />

record key is Auftragnr<br />

access mode is dynamic.<br />

....<br />

DATA DIVISION.<br />

*****************************<br />

....


CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 15<br />

FD Auftrag1 label record standard.<br />

01 Auftrag1-Satz.<br />

02 Kundennr pic x(4).<br />

02 Auftragnr pic x(4).<br />

02 Artikelnr pic x(4).<br />

02 Menge pic x(4).<br />

02 Preis pic x(4).<br />

Anweisungen zur Verarbeitung:<br />

• OPEN-Anweisung<br />

OPEN INPUT | OUTPUT | EXTEND | I-O Datei-Name<br />

• OPEN OUTPUT öffnet Ausgabedatei, evt. mit Neuanlegen,<br />

bei Existenz Löschung<br />

bei WRITE auch Bearbeitung der Index-Datei<br />

• OPEN INPUT öffnet Eingabedatei<br />

• OPEN EXTEND öffnet Eingabedatei im ACCESS SEQUENTIAL Modus<br />

• OPEN I-O öffnet existierende Datei zum Schreiben und Lesen<br />

open input Kunden.<br />

open output Auftrag.<br />

open I-O Bearbeiter.<br />

open extend Personal.<br />

• CLOSE-Anweisung zum Schließen<br />

CLOSE<br />

Datei-Name<br />

close Kunden, Auftrag, Personal.<br />

• READ-Anweisung liest Satz in den Puffer, der durch FD-Anweisung definiert wurde<br />

• sequentielle Datei mit ACCESS SEQUENTIAL


CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 16<br />

READ Datei-Name RECORD [ INTO Daten-Name ]<br />

[ AT END unbedingteAnweisung ]<br />

File-Control.<br />

select Kunden1 assign to "sys$disk: KUNDEN1"<br />

organization is indexed<br />

record key is Kundennr access mode is sequential.<br />

FD Kunden1 label record standard.<br />

01 Kunden1-Satz.<br />

02 Kundennr pic x(4).<br />

02 Nachname pic x(30).<br />

Working-Storage Section.<br />

01 flag pic x.<br />

PROCEDURE DIVISION.<br />

*****************************<br />

Anfang.<br />

move spaces to flag.<br />

open input Kunden<strong>1.</strong><br />

perform Lesen until flag="n".<br />

close Kunden1 . stop run.<br />

Lesen.<br />

read Kunden1 record<br />

at end display "Dateiende" move "n" to flag.<br />

if flag not = "n" then<br />

display "Kd.Nr.: " Kundennr<br />

display "Name: " Nachname.<br />

Lesen in der Reihenfolge der Indexdatei!<br />

• sequentielle Datei mit ACCESS DYNAMIC<br />

READ Datei-Name NEXT RECORD [ INTO Daten-Name ]<br />

[ AT END unbedingteAnweis ]<br />

mit NEXT: sequentieller Zugriff<br />

• wahlfreies READ bei ACCESS RANDOM mit aktuellem Inhalt des Schlüsselfeldes<br />

READ Datei-Name RECORD [ INTO Daten-Name ]<br />

[ INVALID KEY unbedingteAnweis ]<br />

Index-Datei wird durchmustert; bei matching wird Datensatz, auf den Indexeintrag<br />

zeigt, in FD Puffer eingelesen<br />

bei INTO-Lesen wird außerdem noch in die Variable eingelesen


CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 17<br />

File-Control.<br />

select Kunde1 ... access is random.<br />

PROCEDURE DIVISION.<br />

*****************************<br />

Eingabe.<br />

display "Geben Sie eine ". display "Kundennummer ein:".<br />

accept Kundennr.<br />

Anfang.<br />

open input Kunden<strong>1.</strong> move 0 to flag.<br />

perform Lesen.<br />

close Kunden<strong>1.</strong><br />

if flag = 0 then display "Positiv" else display "Negativ"<br />

display "Programmende". stop run.<br />

Lesen.<br />

read Kunden1 record invalid key move 1 to flag.<br />

• wahlfreies READ mit Sekundärschlüsseln<br />

müssen nicht identifizieren<br />

SELECT Datei-Name ASSIGN TO Speicher-Literal<br />

[ ORGANIZATION IS INDEXED ]<br />

[ RECORD KEY IS TeilFeld1 [ OF Feld1 ]]<br />

[ ALTERNATE RECORD KEY IS TeilFeld2 [ OF Feld2]<br />

[ WITH DUPLICATES ]] ...<br />

[ ACCESS MODE IS SEQUENTIAK | RANDOM | DYNAMIC ]<br />

READ Datei-Name RECORD [ INTO Daten-Name ]<br />

[ KEY IS Name2 ]<br />

[ INVALID KEY unbedingte Anweis ]<br />

• WRITE-Anweisung für Ausgabe eines Satzes in indexsequentielle Datei (OUTPUToder<br />

I-O-Datei) bzw. in sequentielle Datei (EXTEND-Datei)<br />

WRITE Datensatz [ FROM Variable ]<br />

[ INVALID KEY unbedingteAnweis ]<br />

Einsortierung in Index nach Primärschlüssel, in Datei meist durch Anhängen (Schlüsselwert<br />

existent!)<br />

• START-Anweisung zur Behandlung von nicht-eindeutigen Sekundärschlüssel-Einträgen


CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 18<br />

START Datei-Name [ KEY IS = Daten-Name ]<br />

[ INVALID KEY unbedingteAnweis ]<br />

select Kunden1 assign to "sys$disk:KUNDEN1"<br />

organization is indexed record key is Kundennr<br />

alternate record key is Nachname with duplicates<br />

access mode is dynamic.<br />

FD Kunden1 label record standard.<br />

01 Kunden1-Satz. ...<br />

...<br />

accept suchinput.<br />

Anfang.<br />

open input Kunden<strong>1.</strong><br />

start Kunden1 key is = Nachname<br />

invalid key move "j" to antwort ...<br />

perform Lesen until antwort="j".<br />

close Kunden<strong>1.</strong> stop run.<br />

Lesen.<br />

read Kunden1 next record<br />

at end ... move "j" to antwort.<br />

if Nachname = suchinput then<br />

display Nachname " " Vorname<br />

display "Richtiger Kunde (j/n)?"<br />

accept antwort<br />

else move "j" to antwort.


CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 19<br />

ENVIRONMENT DIVISION<br />

*****************************<br />

...<br />

Input-Output Section.<br />

*----------------------------<br />

File-Control.<br />

select Kunden<br />

assign to<br />

"sys$disk:Kunden"<br />

organization<br />

is sequential.<br />

select Kunden1<br />

assign to<br />

"sys$disk:KUNDEN1"<br />

organization<br />

is indexed<br />

record key is<br />

Kundennr of Kunden1<br />

alternate record key<br />

Nachname of Kunden1<br />

with duplicates<br />

access mode dynamic.<br />

select Auftrag<br />

assign to<br />

"sys$disk:AUFTRAG"<br />

organization<br />

is sequential.<br />

select Auftrag1<br />

assign to<br />

"sys$disk:AUFTRAG1"<br />

organization<br />

is indexed<br />

record key is<br />

Auftragnr of Auftrag1<br />

alternate record key<br />

Kundennr of Auftrag1<br />

with duplicates<br />

access mode dynamic.<br />

DATA DIVISION.<br />

*****************************<br />

File Section.<br />

*----------------------------<br />

FD Kunden label<br />

record standard.<br />

01 Kunden-Satz.<br />

02 Kundennr pic x(4).<br />

02 Nachname pic x(30). ...<br />

FD Kunden1 label<br />

record standard.<br />

01 Kunden1-Satz. ....<br />

FD Auftrag label<br />

record standard. ....<br />

FD Auftrag1 label<br />

record standard. ....<br />

PROCEDURE DIVISION.<br />

*****************************<br />

Steuerung.<br />

open input Kunden, Auftrag.<br />

open output Kunden1, Auftrag1<br />

....<br />

read Kunden record<br />

at end move 1 to flag.<br />

read Auftrag record<br />

at end move 1 to flag.<br />

write Kunden1-Satz<br />

from Kunden-Satz<br />

invalid key<br />

display "Fehler".<br />

write Auftrag1-Satz<br />

from Auftrag-Satz<br />

invalid key<br />

display "Fehler".


CAU Kiel, IfI, ISE β SS 2013 <strong>Datenbank</strong>-<strong>Programmierung</strong> <strong>1.</strong> <strong>COBOL</strong> 20<br />

• REWRITE-Anweisung zum Ersetzen eines Satzes einer im I-O-Modus geöffneten<br />

indexsequentiellen Datei nach vorangegangem READ<br />

ersetzt werden können nur die Werte außerhalb des Primärschlüssels<br />

bei ACCESS SEQUENTIAL: zuletzt gelesener Satz<br />

bei ACCESS RANDOM/DYNAMIC: Satz mit Schlüsselwert ersetzt<br />

REWRITE SatZName [ FROM Variable ]<br />

[INVALID KEY unbedingteAnweis]<br />

nur auf Stufe 01<br />

File-Control.<br />

select Kunden1 assign ... organization is indexed<br />

record key is Kundennr<br />

alternate record key Nachname with duplicates<br />

access mode is dynamic.<br />

FD Kunden1 label record standard.<br />

01 Kunden1-Satz.<br />

02 Kundennr pic x(4).<br />

02 Nachname pic x(30).<br />

...<br />

Anfang.<br />

open I-O Kunden<strong>1.</strong><br />

perform Lesen. perform Aendern until ... .<br />

close Kunden<strong>1.</strong> stop run.<br />

Aendern.<br />

display "Neuer Nachname:".<br />

accept Nachname.<br />

rewrite Kunden1-Satz invalid key ...<br />

Lesen.<br />

display "Kundennummer:".<br />

accept Kundennr.<br />

read Kunden1 record invalid key ... .<br />

• DELETE-Anweisung<br />

DELETE Datei-Name RECORD [ INVALID KEY unbedingteAnweis ]

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!