243 30 16MB
German Pages 247 [252] Year 1989
de Gruyter Lehrbuch Höcker • Strukturierte COBOL-Programmierung
Hanns-Jürgen Höcker
Einführung in die Strukturierte COBOL-Programmierung mit Mikrocomputeranwendungen Norm: ANSI X 3.23-1985
W G DE
Walter de Gruyter • Berlin • New York 1989
Dr. Hanns-Jürgen Höcker Professor im Fachbereich Wirtschaft der Hochschule Bremen
ClP-Titelaufnahme
der Deutschen Bibliothek
Höcker, Hanns-Jürgen: Einführung in die strukturierte COBOL-Programmierung mit Microcomputeranwendungen: Norm: ANSI X 3.23-1985 / Hanns-Jürgen Höcker. - Berlin; New York: de Gruyter, 1989 (De-Gruyter-Lehrbuch) ISBN 3-11-011418-6
© Copyright 1989 by Walter de Gruyter & Co., D-1000 Berlin 30. Dieses Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Jede Verwertung außerhalb der engen Grenzen des Urheberrechtsgesetzes ist ohne Zustimmung des Verlages unzulässig und strafbar. Das gilt insbesondere für Vervielfältigungen, Übersetzungen, Mikroverfilmungen und die Einspeicherung und Verarbeitung in elektronischen Systemen. Der Verlag hat für die Wiedergabe aller in diesem Buch enthaltenen Informationen (Programme, Verfahren, Mengen, Dosierungen, Applikationen etc.) mit Autoren bzw. Herausgebern große Mühe darauf verwandt, diese Angaben genau entsprechend dem Wissensstand bei Fertigstellung des Werkes abzudrucken. Trotz sorgfaltiger Manuskripterstellung und Korrektur des Satzes können Fehler nicht ganz ausgeschlossen werden. Autoren bzw. Herausgeber und Verlag übernehmen infolgedessen keine Verantwortung und keine daraus folgende oder sonstige Haftung, die auf irgendeine Art aus der Benutzung der in dem Werk enthaltenen Informationen oder Teilen davon entsteht. Printed in Germany. Satz: Dörlemann-Satz, Lemförde / Druck: Karl Gerike, Berlin Buchbinderische Verarbeitung: Dieter Mikolai, Berlin
Vorwort Das vorliegende Lehrbuch richtet sich in erster Linie an Leser ohne besondere Vorkenntnisse in der Programmierung und Datenverarbeitung. Das für die Programmierung erforderliche allgemeine DV-Basiswissen ist in Kapitel 1 kurz zusammengefaßt. Für die Erstellung von COBOI^Programmen werden beim Leser lediglich Grundkenntnisse des von ihm benutzten Betriebssystems und Compilers/Editors vorausgesetzt. Das Buch ist insofern sowohl als Begleittext für einführende Programmierveranstaltungen als auch zum Selbststudium für Anfänger geeignet. Dargestellt werden die Grundlagen der Programmiersprache COBOL unter Einbeziehung der wesentlichen mit der letzten Norm ANSI COBOL X 3.23 1985 eingeführten Neuerungen. Bei der - durch die Beschränkung auf eine einführende Darstellung - notwendig gewordenen Eingrenzung des Stoffes wurden insbesondere die COBOL^Sprachbestandteile und -Anwendungen ausgewählt, die im kaufmännisch-administrativen Bereich, dem Schwerpunkt des COBOL-Einsatzes, eine wichtige Rolle spielen. Dies gilt auch für die Wahl der Demonstrationsbeispiele und Übungsaufgaben. Besonderer Wert wurde ferner auf die Einhaltung der Regeln der Strukturierten Programmierung gelegt. Dank der seit einigen Jahren zur Verfügung stehenden leistungsfähigen COBOL-Compiler für Mikrocomputer, die es gestatten, auch für den späteren Einsatz auf größeren EDV-Anlagen bestimmte COBOL-Programme zunächst auf Mikrocomputern zu entwickeln, konnten alle in dem Buch enthaltenen Programme auf einem Mikrocomputer geschrieben werden. Dabei wurde die Workbench Professional COBOL/Version 2 der Firma Micro Focus, die zu den derzeit am weitesten entwickelten Systemen ihrer Art zu rechnen ist, eingesetzt. Eine kurze Anmerkung soll noch zu den immer wiederkehrenden Behauptungen, COBOL sei eine Programmiersprache ohne Zukunft, angefügt werden. Derartige Einschätzungen gibt es seit ca. zwei Jahrzehnten, ohne daß sie sich bisher auch nur ansatzweise bestätigt hätten. All diesen Stellungnahmen ist gemeinsam, daß sie einerseits die Fortschritte in der COBOLProgrammierung kaum zur Kenntnis genommen haben und andererseits die Leistungsfähigkeit neuerer Programmiersprachen überschätzen. Der Verfasser ist davon überzeugt, daß auch im Jahre 2000 COBOL noch eine beachtenswerte Stellung unter den in der Wirtschaft eingesetzten Programmiersprachen einnehmen wird.
VI
Vorwort
Abschließend sei Herrn Karl B. Hartmann für die Durchsicht des Manuskriptes und für viele wertvolle Hinweise und Anregungen während der Erstellung des Buches ausdrücklich gedankt. Bremen, April 1989
Hanns-J. Höcker
Inhalt
1 Einführung in die elektronische Datenverarbeitung 1.1 Aufbau eines EDV-Systems 1.1.1 Komponenten der Hardware 1.1.1.1 Zentraleinheit 1.1.1.2 Ein-Ausgabeeinheiten und externe Speichereinheiten 1.1.2 Komponenten der Software 1.1.2.1 Systemsoftware 1.1.2.2 Anwendungssoftware 1.2 Interne Darstellung von Daten 1.2.1 Zahlensysteme 1.2.2 Codierung 1.2.3 Darstellungsformen 1.3 Datenorganisation 1.3.1 Grundbegriffe 1.3.2 Speicherungs-und Zugriffsformen 1.4 Softwareentwicklung 1.4.1 Phasen der Softwareentwicklung 1.4.2 Darstellungsmittel des Softwareentwurfs 1.4.3 Programmiersprachen 1.4.4 Quellenprogramm und Maschinenprogramm 1.4.5 Programmtest 1.5 Betriebsarten 1.5.1 Stapelverarbeitung 1.5.2 Dialogverarbeitung
1 2 3 5 6 6 8 8 8 10 12 14 14 15 18 18 20 23 26 27 28 28 29
2 Allgemeine Grundlagen der COBOL-Sprache 2.1 Überblick zur geschichtlichen Entwicklung 2.2 Module der Sprache 2.3 Zeichenvorrat und Wortarten 2.3.1 COBOl^Zeichenvorrat 2.3.2 COBOL-Wörter 2.3.2.1 Reservierte COBOl^Wörter 2.3.2.2 Nicht-reservierte COBOI^Wörter
29 30 31 31 32 32 33
VIII
Inhalt
2.3.3 Literale 2.3.3.1 Numerische Literale 2.3.3.2 Nicht-numerische Literale 2.3.3.3 Figurative Konstanten 2.4 Beschreibung der COBOLSyntax 2.5 COBOL-Programmschema
34 34 34 35 35 37
3 Aufbau eines COBOL-Programms 3.1 3.2 3.3 3.4
IDENTIFICATION DIVISION ENVIRONMENT DIVISION DATA DIVISION PROCEDURE DIVISION
41 42 43 44
4 Datenbeschreibung 4.1 Dateierklärung (FD-Eintragung) 4.2 Datensatz- und Datenfelderklärung 4.2.1 Stufennummernkonzept 4.2.2 Datennamen 4.2.3 PICTURE-Klausel 4.2.3.1 Alphabetische Datenfelder 4.2.3.2 Alphanumerische Datenfelder 4.2.3.3 Numerische Datenfelder 4.2.3.4 Druckaufbereitete alphanumerische Datenfelder 4.2.3.5 Druckaufbereitete numerische Datenfelder 4.2.4 VALUE-Klausel 4.3 Übungsaufgaben
47 50 50 51 53 53 54 54 56 59 65 66
5 Grundlegende COBOL-Anweisungen 5.1 5.2 5.3 5.4
ACCEPT-Anweisung DISPLAY-Anweisung MOVE-Anweisung GO TO-Anweisung
68 72 75 79
IX
Inhalt
5.5 STOP-Anweisung 5.6 Übungsaufgaben
81 81
6 Anweisungen zur Verarbeitung von sequentiellen Dateien
6.1 6.2 6.3 6.4 6.5 6.6
OPEN-Anweisung CLOSE-Anweisung READ-Anweisung WRITE-Anweisung REWRITE-Anweisung Programmbeispiele: Aufbau und Drucken einer sequentiellen Datei 6.7 Übungsaufgabe
82 83 84 86 90 91 97
7 Steueranweisungen
7.1 7.2 7.3 7.4 7.5 7.6 7.7
Programmschleifen PERFORM-Anweisung EXIT-Anweisung IF-Anweisung CONTINUE-Anweisung EVALUATE-Anweisung Übungsaufgaben
98 99 107 108 121 122 124
8 Arithmetische Anweisungen
8.1 8.2 8.3 8.4 8.5 8.6 8.7
ADD-Anweisung SUBTRACT-Anweisung MULTIPLY-Anweisung DIVIDE-Anweisung COMPUTE-Anweisung Prögrammbeispiel: einstufiger Gruppenwechsel Übungsaufgaben
125 128 130 132 135 137 141
9 Weitere COBOL-Klauseln und -Angaben
9.1 USAGE-Klausel 9.2 SIGN-Klausel
143 145
X
Inhalt
9.3 9.4 9.5 9.6 9.7
RENAMES-Klausel REDEFINES-Klausel CORRESPONDING-Angabe FILE STATUS-Klausel Übungsaufgaben
147 148 150 154 157
10 Tabellenverarbeitung 10.1 10.2 10.3 10.4
Grundlagen OCCURS-Klausel Subskript-Methode Index-Methode 10.4.1 SET-Anweisung 10.4.2 SEARCH-Anweisung 10.5 PERFORM . . . VARYING-Anweisung 10.6 Mehrdimensionale Tabellen 10.7 Übungsaufgaben
159 162 163 169 170 172 176 178 185
11 Externe Unterprogramme 11.1 11.2 11.3 11.4 11.5
Grundlagen der Unterprogrammtechnik C A L L Anweisung LINKAGE SECTION EXIT PROGRAM-Anweisung Übungsaufgabe
187 189 191 191 193
12 Verarbeitung indexsequentieller Dateien 12.1 Grundlagen der indexsequentiellen Speicherung 12.2 Anweisungen und Klauseln bei indexsequentiellen Dateien 12.2.1 SELECT . . . ASSIGN-Klausel 12.2.2 READ-Anweisung 12.2.3 WRITE-Anweisung 12.2.4 REWRITE-Anweisung 12.2.5 START-Anweisung 12.2.6 DELETE-Anweisung 12.2.7 FILE STATUS-Klausel
194 195 195 196 198 199 200 202 203
Inhalt
12.3 Programmbeispiel: Dialogverarbeitung mit indexsequentieller Datei 12.4 Übungsaufgabe
XI
203 209
13 Verarbeitung von Relativdateien 13.1 Grundlagen der relativen Speicherung 13.2 Anweisungen und Klauseln bei Relativdateien 13.2.1 SELECT . . . ASSIGN-Klausel 13.2.2 Anweisungen 13.2.3 FILE STATUS-Klausel 13.3 Programmbeispiel: Dialogverarbeitung mit Relativdatei . . .
210 210 210 212 212 212
Anhang A Lösungen zu den Übungsaufgaben Anhang B Reservierte COBOI/Worter
215 229
Literaturverzeichnis Stichwortregister
232 233
1 Einführung in die elektronische Datenverarbeitung
Die Programmierung einer EDV-Anlage, sei es Mikrocomputer, Minicomputer oder eine Großanlage, setzt zunächst Grundkenntnisse über ihren Aufbau und ihre Arbeitsweise voraus. Darüber hinaus bedarf es weiterer ergänzender Kenntnisse über das organisatorische Umfeld, in dem Softwareentwicklung und -einsatz ablaufen. Dieses für den Anfanger unentbehrliche Rüstzeug wird in Kapitel 1 in stark komprimierter Form dargestellt. Der fortgeschrittene Leser sollte sich anhand der Gliederung davon überzeugen, ob ihm die behandelten T h e m e n vertraut sind. Trifft das zu, so kann er die Lektüre des Buches mit Kapitel 2 (Grundlagen der COBOL-Sprache) beginnen.
1.1 Aufbau eines EDV-Systems Ein EDV-System umfaßt - zusätzlich zur eigentlichen EDV-Anlage, der Hardware - grundsätzlich auch die Software. Erst das Zusammenwirken beider Komponenten ermöglicht eine elektronische Datenverarbeitung. Unter Daten werden nachfolgend Informationen über Sachverhalte und Vorgänge, die in einer maschinell verarbeitbaren Form vorliegen, verstanden. In der Mehrzahl der Fälle werden Daten durch Zeichen (Buchstaben, Ziffern und Sonderzeichen) dargestellt. Datenträger sind Medien zur Aufbewahrung von Daten. Die Datenverarbeitung beinhaltet alle Vorgänge, die sich auf die Erfassung, Speicherung, Übertragung, Transformation und Ausgabe von Daten beziehen. Kern der Hardware ist die Zentraleinheit. Zur Hardware gehören ferner alle zur Ein- und Ausgabe von Daten eingesetzten Geräte, die externen Speichereinheiten und die zur Datenübertragung genutzten Einrichtungen (Busse, Ein-Ausgabeprozessoren usw.). Die neben der Hardware als zweiter Bestandteil eines DV-Systems erwähnte Software ist der Oberbegriff für die Gesamtheit der an einer EDV-Anlage einsetzbaren Programme, die ihrerseits im wesentlichen aus Anweisungen an
2
Einführung in die elektronische Datenverarbeitung
die EDV-Anlage zur Ausführung bestimmter Arbeitsschritte bestehen. Entsprechend den sehr unterschiedlichen Aufgabenstellungen, die von der Software zu lösen sind, werden im allgemeinen zwei Softwarekategorien unterschieden: - Systemsoftware (Betriebssystem) und - Anwendungssoftware. Die Hauptbestandteile eines EDV-Systems und ihre weitergehende Unterteilung zeigt Abb. 1. EDV-System
Hardware
Zentraleinheit
E/A-Einheiten, externe Speicher
Software
Systemsoftware
Anwendungssoftware
E/A-Prozessoren Busse usw. Abb. 1: Aufbau eines EDV-Systems
1.1.1 Komponenten der Hardware Die nachfolgenden Ausfuhrungen gelten grundsätzlich nur für sog. Digitalrechner. Wesentliches Merkmal des Digitalcomputers ist die Speicherung und Verarbeitung von digitalen, d. h. mit Hilfe von Ziffern dargestellten, Daten. Derartige Daten werden durch eine Folge von zweiwertigen Signalen, deren zwei mögliche Zustände als Ziffern 0 und 1 interpretiert werden, verschlüsselt. Ein einfaches Beispiel für die Realisierung eines solchen zweiwertigen Signals stellt ein Schalter dar, dessen Stellung „ein" und „aus" dann als „1" bzw. „0" zu deuten wären. Bei Verwendung mehrerer Schalter ergibt sich somit die Möglichkeit, unterschiedliche Kombinationen von Einsen und Nullen darzustellen, die zur Verschlüsselung von Zeichen (Buchstaben, Ziffern und Sonderzeichen) genutzt werden (vgl. dazu Punkt 1.2). Zweiwertige Signale, die bei EDV-Anlagen üblicherweise nicht mit Hilfe von Schaltern, sondern über Transistoren realisiert werden, bezeichnet man auch als „Bits" (von „binary digit" = Binärziffer).
Aufbau eines EDV-Systems
3
Neben den digitalen Rechenanlagen gibt es den - nach andern technischen Prinzipien arbeitenden - sog. Analogrechner. Im Gegensatz zum Digitalrechner, der den eindeutig vorherrschenden Rechnertyp verkörpert, spielt der Analogcomputer nur noch eine relativ unbedeutende Rolle bei speziellen Anwendungen. 1.1.1.1 Zentraleinheit Die Zentraleinheit besteht aus dem Hauptspeicher und dem Zentralprozessor (bei Mikrocomputern: Mikroprozessor). Der Hauptspeicher (auch Arbeitsspeicher oder interner Speicher genannt) hat primär die Aufgabe, die zur Verarbeitung vorgesehenen Programme aufzunehmen. Daneben dient er zur vorübergehenden Speicherung von kleineren Datenmengen, die als Ein- oder Ausgabedaten oder als Zwischenergebnisse unmittelbar von den Programmen benötigt bzw. erstellt werden. Die längere Speicherung großer Datenbestände ist nicht Aufgabe des Hauptspeichers, sondern der externen Speicher. Grundsätzlich ist bei Hauptspeichern zwischen ROM- und RAM-Speichern zu unterscheiden. Der RAM-Speicher (RAM = random access memory; deutsch: Direktzugriffsspeicher), der eigentliche Arbeitsspeicher, ist ein Schreib-Lesespeicher, bei dem jede Speicherstelle direkt (wahlfrei) und beliebig oft gelesen bzw. beschrieben werden kann. Das Schreiben in eine Speicherstelle löscht dabei einen eventuell vorher dort gespeicherten Begriff; ist also immer ein zerstörender Vorgang. Im Unterschied dazu ist der ROM-Speicher (ROM = read only memory; deutsch: Nur-Lesespeicher oder Festwertspeicher) ein Teil des Hauptspeichers, der nur gelesen werden kann. ROM-Speicher enthalten spezielle, für den Betrieb einer EDV-Anlage notwendige Programme (sog. Mikroprogramme). Bei Mikrocomputern steht im ROM-Speicher ein Teil der Systemsoftware (vgl. dazu Punkt 1.1.2.1). Zur Verschlüsselung von Zeichen werden die Bits eines Hauptspeichers, die jeweils die Dualziffern 0 oder 1 darstellen können und die kleinste Informationseinheit eines Computers verkörpern, zu größeren Einheiten, den sog. Bytes, zusammengefaßt. Ein Byte besteht aus 8 Bits und kann mindestens ein Zeichen (Buchstabe, Ziffer oder Sonderzeichen) speichern. 1 1
Neben den auf Bytebasis arbeitenden Rechnern, den sog. Bytemaschinen, gibt es auch Wortmaschinen, bei denen die Bits nicht zu Bytes, sondern zu Worten (mit einer Kapazität von 16, 32 oder auch 64 Bits) zusammengefaßt werden.
4
Einführung in die elektronische Datenverarbeitung
Die Kapazität von Speichern (gilt für Arbeitsspeicher und externe Speicher) wird in Bytes ausgedrückt. Dabei haben sich in der EDV folgende Maßeinheiten durchgesetzt: 1024 Bytes = 1 Kilobyte (abgekürzt: 1 KB) 1024 KB = 1 Megabyte (abgekürzt: 1 MB) 1024 MB = 1 Gigabyte (abgekürzt: 1 GB). Der Zentralprozessor (engl.: central processing unit, abgekürzt: CPU) verkörpert mit seinen beiden Bestandteilen Steuerwerk (bzw. Leitwerk) und Rechenwerk die eigentliche Verarbeitungseinheit einer EDV-Anlage. Aufgabe des Steuerwerks ist zunächst die Interpretation (Decodierung) der im Arbeitsspeicher der Anlage enthaltenen Programmbefehle. Nach der Entschlüsselung eines Befehls veranlaßt das Steuerwerk in einem weiteren Schritt durch Signale an die zuständigen Einheiten die Ausführung der Anweisung. Handelt es sich bei diesen Anweisungen u m Rechenbefehle oder logische Befehle (Anweisungen, die Daten miteinander vergleichen), so übernimmt das Rechenwerk die weitere Verarbeitung. Bei Ein-Ausgabe-Befehlen würde dagegen die Ausfuhrung den jeweiligen Ein-Ausgabe-Einheiten übertragen werden. Der Zentralprozessor eines Mikrocomputers wird als Mikroprozessor bezeichnet. Seine Besonderheit besteht darin, daß er alle zur Realisierung der oben beschriebenen Funktionen benötigten Schaltungen auf einem einzigen Chip, einem Siliziumplättchen von ca. 1 cm 2 Grundfläche, enthält. Gegenwärtig werden 4 Generationen von Mikroprozessoren unterschieden: 1. 2. 3. 4.
Generation: Generation: Generation: Generation:
4-Bit-Prozessoren (z.B. Intel 4004) 8-Bit-Prozessoren (z.B. Intel 8080, Motorola 6800) 16-Bit-Prozessoren (z.B. Intel 8088, 8086, 80286) 32-Bit-Prozessoren (z.B. Intel 80386, Motorola 68000).
Die derzeit eingesetzten Mikrocomputer enthalten Prozessoren der 2.-4. Generation. Die im Zusammenhang mit dem Prozessor genannte Bitanzahl beinhaltet eine Aussage über die Leistungsfähigkeit des Prozessors. Eine höhere Bitanzahl weist auf einen größeren nutzbaren (adressierbaren) Arbeitsspeicher und eine höhere Verarbeitungsgeschwindigkeit hin. Die Elemente der Zentraleinheit sowie die zwischen ihnen, den Ein-Ausgabeeinheiten und externen Speichern bei der Ausfuhrung eines Programmes verlaufenden Datenströme werden in Abb. 2 dargestellt.
Aufbau eines EDV-Systems
5
Abb. 2: Elemente der Zentraleinheit und Datenfluß
1.1.1.2 Ein-Ausgabeeinheiten und externe Speichereinheiten
Aufgabe der Eingabeeinheiten ist die Übertragung von Daten in den Hauptspeicher. Aufgabe der Ausgabeeinheiten ist die Ausgabe der von den Programmen erzeugten Verarbeitungsergebnisse. Externe Speicher (Diskette, Magnetplatte, Magnetband) sind Datenträger, dienen also der Aufbewahrung von Daten. Die entsprechenden externen Speichereinheiten beschreiben und lesen diese Datenträger und sind daher im weiteren Sinne ebenfalls Ein- und Ausgabeeinheiten. Ein-Ausgabeeinheiten und Speichereinheiten werden auch unter dem Oberbegriff periphere Einheiten zusammengefaßt. Zur Realisierung der Datenübertragungen zwischen den peripheren Einheiten und dem Prozessor und Hauptspeicher der Zentraleinheit werden Busse eingesetzt. Die wichtigsten peripheren Einheiten, bezogen auf das Beispiel Mikrocomputer, zeigt Abb. 3.
6
Einführung in die elektronische Datenverarbeitung
Abb. 3: Periphere Einheiten eines Mikrocomputers
1.1.2 Komponenten der Software 1.1.2.1 Systemsoftware
Die Systemsoftware umfaßt die nicht direkt anwendungsbezogenen Programme, deren Aufgabe die Steuerung und Überwachung des EDV-Systems darstellt. Die Gesamtheit der Systemprogramme wird auch als das Betriebssystem einer EDV-Anlage bezeichnet. Zu einem Betriebssystem gehören im wesentlichen drei Gruppen von Programmen: - Steuerprogramme, denen die eigentliche Steuerung des gesamten EDVSystems obliegt. Diese Steuerprogramme stellen erst die Betriebsbereitschaft der Anlage her und schaffen somit die Grundlagen und den Rahmen für den Einsatz der Anwendungssoftware. Neben den genannten zentralen Aufgaben übernehmen die Steuerprogramme auch die Verwaltung extern gespeicherter Datenbestände (Dateien), die Kommunikation mit den Bedienern der EDV-Anlage u.a.m.. Steuerprogramme werden (wie auch die übrigen Bestandteile der Systemsoftware) den EDV-Anwendern auf externen Speichern (Magnetplatten, Disketten) zur Verfügung gestellt. Während einer laufenden Verarbeitung werden die jeweils benötigten Teile der Steuerprogramme von den externen Speichern in den Arbeitsspeicher übertragen. Nach der Erfüllung ihrer Funktionen werden diese Programmteile durch andere Programmabschnitte überla-
Aufbau eines EDV-Systems
7
gert und gelöscht. Ein bestimmter Bereich des Hauptspeichers ist jedoch permanent durch einen zentralen Teil eines Steuerprogramms (sog. speicherresidenter Teil des Betriebssystems) belegt. - Dienstprogramme, die weitere Hilfsfunktionen im Zusammenhang mit dem Einsatz der Anwendungsprogramme wahrnehmen. Zu den Dienstprogrammen gehören Programme für das Sortieren und Mischen von Datenbeständen, für die Übertragung von Datenbeständen auf andere Datenträger, für die Verwaltung von Programmbibliotheken usw.. - Übersetzerprogramme, deren Aufgabe die Übersetzung der in den verschiedenen Programmiersprachen geschriebenen Programme in eine dem Rechner verständliche Form (die sog. Maschinensprache) ist (vgl. dazu Punkt 1.4.3). Betriebssysteme, die von den EDV-Herstellern in großer Vielzahl und mit stark differierenden Leistungsmerkmalen für die verschiedenen EDV-Anlagen angeboten werden, unterliegen einer ständigen Weiterentwicklung. Die Kennzeichnung der unterschiedlichen Versionen eines Betriebssystems erfolgt meist durch den Zusatz Release, verbunden mit einer angehängten Zahl (z. B. MS-DOS Release 3.2). Unter den vielen für Mikrocomputer derzeit angebotenen Betriebssystemen ragen die nachfolgend beschriebenen besonders hervor: CP/M (= Control Program for Microcomputer). In der Version CP/M 80 galt CP/M als das Standardbetriebssystem für 8-Bit-Computer. Neuere Versionen (CP/M 86) arbeiten auch mit 16-Bit-Rechnern und ermöglichen sogar (CCP/M 86) das Multitasking, bei dem mehrere Programme zeitlich parallel ablaufen können. 2 MS-DOS (= Microsoft-Disk Operating System). Dieses seit 1981 von der Firma Microsoft vertriebene, ursprünglich von Seattle Computer entwickelte Betriebssystem gilt als „Industriestandard" für 16-Bit-Computer. MS-DOS ist im wesentlichen identisch mit dem von der IBM angebotenen Betriebssystem PC-DOS. UNIX. Anders als die obengenannten Betriebssysteme ist das von der Firma AT & T entwickelte UNIX ein Betriebssystem für Mehrplatzkonfigurationen und gilt als künftiger Marktstandard für diesen Bereich. Bekannte Varianten
2
Ein einfaches Beispiel für eine solche Parallelverarbeitung beim Mikrocomputer ist eine Texteingabe bei gleichzeitigem Drucken einer Liste und ebenfalls simultan ablaufender Übersetzung eines Programmes in den Maschinencode.
8
Einfuhrung in die elektronische Datenverarbeitung
von UNIX sind das von Microsoft angebotene XENIX und SINIX von der Firma Siemens. 1.1.2.2 Anwendungssoftware Unter Anwendungssoftware wird die Gesamtheit der unmittelbar anwendungsbezogenen Programme, d.h. der Programme, die der Anwender zur Lösung seiner individuellen Aufgaben einsetzt, verstanden. Beispiele aus dem betriebswirtschaftlichen Sektor sind u.a. Programme für die Fakturierung, die Auftragsbearbeitung, die Lagerhaltung usw.. Anwendungsprogramm e werden von den Anwendern selbst geschrieben oder als Standardsoftware von Softwarehäusern bzw. EDV-Herstellern gekauft. Merkmal der Standardsoftware ist, daß sie unverändert oder nach nur geringen Anpassungen von einer größeren Anzahl von Anwendern eingesetzt werden kann. Derartige Standardlösungen, deren Hauptvorteil der günstigere Preis ist, finden sich besonders in den Bereichen Lohn- und Gehaltsabrechnung und Finanzbuchhaltung.
1.2 Interne Darstellung von Daten 1.2.1 Zahlensysteme Für die moderne elektronische Datenverarbeitung sind drei Zahlensysteme von besonderer Wichtigkeit: Zunächst ist das allgemein angewandte Dezimalsystem, das seine Bedeutung im täglichen Leben aus der Tatsache herleitet, daß der Mensch über zehn Finger verfügt, zu erwähnen. Wie bekannt, stehen im Dezimalsystem zehn Ziffern (0-9) zur Verfügung. Geht der darzustellende Wert über die Ziffer 9 hinaus, so sind die höheren Werte aus jeweils mehreren Ziffern zusammengesetzt zu bilden. Zur Speicherung von Werten im Arbeitsspeicher eines Computers kann das Dezimalsystem nicht eingesetzt werden. Wie bereits früher erläutert wurde, werden Daten in einer DV-Anlage unter Benutzung zweiwertiger Informationselemente, der Bits, verschlüsselt. Die zwei in einem Bit darstellbaren Zustände werden dabei grundsätzlich als Ziffern 0 und 1 interpretiert. Diese technisch begründete Beschränkung ist die Ursache dafür, daß Zahlen und andere Daten im Computer ausschließlich mit Hilfe von zwei Ziffern wiedergegeben werden können. Sie ist gleichzeitig die Erklärung für die Anwendung des Dualsystems, des zweiten für die Datenverarbeitung relevanten Zahlensystems.
Interne Darstellung von Daten
9
Wesensmerkmal des Dualsystems ist die Wiedergabe aller Zahlen mit Hilfe von nur zwei Ziffern (0 und 1 bzw. seltener 0 und L). Jegliche Datenspeicherung bei Digitalrechnern basiert letztlich auf der Anwendung dieses Zahlensystems, als dessen besonderer Vorteil allgemein die technisch einfache Darstellbarkeit von Daten im Computer angesehen werden kann. Ein Nachteil des Dualsystems gegenüber anderen Zahlensystemen ist dagegen die wesentlich höhere Stellenanzahl bei der Angabe von Zahlen (vgl. Abb. 4). Die Bedeutung des an dritter Stelle zu nennenden Hexadezimalsystems für die Datenverarbeitung hängt unmittelbar mit dem zuletzt genannten Nachteil Dezimale Darstellung 0 1 2 3 4 5 6 7
Duale Darstellung
Hexadezimale Darstellung
0 1
0 1
10 11
2
3 4 5 6 7
9
100 101 110 111 1000 1001
10
1010
11
17
1011 1100 1101 1110 1111 10000 10001
31 32
100000
IF 20
255 256
11111111 100000000
FF 100
8
12
13 14 15 16
Abb. 4: Wichtige Zahlensysteme
11111
8
9 A B C D E F 10 11
10
Einfuhrung in die elektronische Datenverarbeitung
des Dualsystems zusammen. Das Hexadezimalsystem verfugt über 16 Ziffern. Zur Darstellung der ersten 10 Ziffern werden dabei die bereits aus dem Dezimalsystem bekannten Ziffern von 0-9 eingesetzt. Die letzten 6 Ziffern werden dagegen durch die Buchstaben A-F ausgedrückt (vgl. Abb. 4). Bedingt durch die höhere Anzahl von Ziffern in diesem Zahlensystem, können Werte mit einer geringeren Stellenanzahl als im Dezimalsystem oder im Dualsystem dargestellt werden. Erfolgt die Speicherung von Zeichen, wie bei den meisten EDV-Anlagen üblich, in 8 Bits (d. h. 8 Dualziffern) umfassenden Bytes, so bietet das Hexadezimalsystem grundsätzlich die Möglichkeit, jeweils den Inhalt eines halben Bytes (also von 4 Dualziffern) durch eine einzige Hexadezimalziffer verkürzt wiederzugeben. Der Inhalt eines Bytes kann mithin abgekürzt durch zwei Hexadezimalziffern beschrieben werden (vgl. dazu die Beispiele unter Punkt 1.2.2 und 1.2.3). 1.2.2 Codierung Wie oben beschrieben, bildet das Dualsystem die eigentliche Basis der Datenspeicherung im Computer. Zur Verschlüsselung aller Arten von Daten (Buchstaben, Ziffern und Sonderzeichen) werden dabei Codes eingesetzt. Vergleichbar dem Morsecode, bei dem man Zeichen durch verschiedene Folgen von langen und kurzen Signalen verschlüsselt, werden bei den in der elektronischen Datenverarbeitung eingesetzten Codes Daten u. a. durch bestimmte Kombinationen der Dualziffern 0 und 1 dargestellt. Unter den verschiedenen in der EDV gebräuchlichen Codes sind zwei wegen ihrer starken Verbreitung besonders hervorzuheben: - Der EBCDI-Code (= Extended Binary Coded Decimal Interchange-Code), der ein reiner Byte-Code ist und überwiegend in größeren Anlagen Verwendung findet sowie - der ASCII-Code (= American Standard Code for Information Interchange), der ursprünglich ein 7-Bit-Code war, dann auf 8 Bits erweitert wurde und heute vorzugsweise für Mikrocomputer genutzt wird. Abb. 5 zeigt die Verschlüsselung der wichtigsten Zeichen im EBCDI- und ASCII-Code.
11
Interne Darstellung von Daten ichen
Darstellung im EBCDI-Code
Darstellung im ASCII-Code
0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N 0 P Q R S T U V w X Y z
1111 0000 1111 0001 1111 0010 1111 0011 1111 0100 1111 0101 1111 0110 1111 O l l i 1111 1000 1111 1001 1100 0001 1100 0010 1100 0011 1100 0100 1100 0101 1100 0110 1100 0111 1100 1000 1100 1001 1101 0001 1101 0010 1101 0011 1101 0100 1101 0101 1101 0110 1101 O l l i 1101 1000 1101 1001 1110 0010 1110 0011 1110 0100 1110 0101 1110 0110 11100111 1110 1000 I l i o 1001 0110 0001 0100 I l i o 0110 0000 0110 1100 0101 0000
0011 0000 0011 0001 0011 0010 0011 0011 0011 0100 0011 0101 00110110 0011 O l i i 0011 1000 0011 1001 0100 0001 0100 0010 0100 0011 0100 0100 0100 0101 0100 0110 0100 0111 0100 1000 0100 1001 0100 1010 0100 1011 0100 1100 0100 1101 0100 I l i o 0100 1111 0101 0000 0101 0001 0101 0010 0101 0011 0101 0100 0101 0101 0101 0110 0101 O l i i 0101 1000 0101 1001 0101 1010 0010 1111 0010 1011 0010 1101 0010 0101 0010 0110
/ + -
% &
Abb. 5: Zeichenverschlüsselung im EBCDI- und ASCII-Code
12
Einfuhrung in die elektronische Datenverarbeitung
Zwei Beispiele sollen die Zeichendarstellung im EBCDI-Code weiter verdeutlichen. (1) Verschlüsselung des Wortes „BIT". Zur Speicherung werden 3 Bytes benötigt. 1100
0010
1100
1001
1110
0011
Unter Verwendung des hexadezimalen Zahlensystems kann dieser duale Ausdruck auch wie folgt verkürzt wiedergegeben werden: C
2
C
9
E
3
(Jeweils 4 Dualziffern, also 1 Halbbyte, können bekanntlich durch eine Hexadezimalziffer dargestellt werden. Abb. 4 ermöglicht ein völlig problemloses Nachvollziehen dieser Umsetzung. Ggf. sollte man die duale Darstellung der Dezimalziffern 0-7 durch vorangestellte Nullen auf 4 Dualziffern ergänzen.) (2) Verschlüsselung des Ausdruckes „14°/o". Wiederum werden zur Speicherung drei Bytes benötigt. Zonenteile 1111
0001
1111
0100
0110
1100
6
C
Ziffernteile Die hexadezimale Kurzfassung lautet: F
1
F
4
Wird ein Zeichen in einem Byte dargestellt, so bezeichnet man das linke Halbbyte als Zonenteil, das rechte Halbbyte dagegen als Ziffernteil eines Bytes.
1.2.3 Darstellungsformen Die obigen Beispiele zur Datenverschlüsselung, die der sog. alphanumerischen Speicherungsform zuzurechnen sind, verkörpern nur eine von mehreren Möglichkeiten, Daten in einem Computer darzustellen. Ziffern und Zahlen (das gilt nicht für Buchstaben und Sonderzeichen) werden sehr häufig auch in anderer Form verschlüsselt. Ausgehend von einem weiteren Beispiel der Darstellung einer Zahl nach dem EBCDI-Code, soll zunächst eine für die Praxis besonders wichtige Speicherungsform erläutert werden:
13
Interne Darstellung von Daten
Die Verschlüsselung der Dezimalzahl 256 ergibt folgende Dualziffernkombination: 1111
0010
1111
0101
i m vz
0110
Bei dieser auch als ungepackte Darstellungsform bezeichnete Verschlüsselung der Zahl 256 steht als besonderes Kennzeichen das Vorzeichen im linken Halbbyte des rechten Bytes des Gesamtausdruckes. „1111" oder hexadezimal „F" hat also (in der gekennzeichneten Position) eine doppelte Bedeutung. Z u m einen verkörpert es den Zonenteil der Ziffer 6, zum andern ein Vorzeichen (und zwar „+"). Verzichtet man nun auf die Anwendung des EBCDICodes (oder ASCII-Codes), so kann die Zahl 256 auch anders gespeichert werden. Werden die 3 Ziffern jede für sich durch eine vierstellige Dualzahl codiert, so kommt man (unter Beibehaltung des Vorzeichens) zu folgender Verschlüsselung: 0010
0101
0110
1111 VZ
Wie man sieht, hat diese als gepackt bezeichnete Darstellungsform zunächst den offensichtlichen Vorzug, daß gegenüber der ungepackten Codierung Speicherplatz eingespart wird. Ihr besonderes Merkmal ist darin zu sehen, daß (abgesehen vom rechten Byte, das das Vorzeichen enthält) in jedem Byte zwei Ziffern gespeichert werden. 3 Neben den oben beschriebenen Möglichkeiten einer Codierung von Daten spielen noch zwei weitere Darstellungsformen, die zur Verschlüsselung von Ziffern und Zahlen genutzt werden können, eine Rolle. Nachfolgend soll die eine dieser Möglichkeiten, die sog. Festkommadarstellung, kurz erläutert werden. Bezüglich der zweiten Möglichkeit, der Gleitkommadarstellung, sei auf die einschlägige Literatur verwiesen. Wesentliches Merkmal der Festkommadarstellung ist die Codierung einer Dezimalzahl als „echte" Dualzahl. Die Dezimalzahl wird als Ganzes, und nicht wie bei gepackter Darstellung ziffernweise, in eine Dualzahl umgewandelt. So würde die Dezimalzahl 256, als echte Dualzahl dargestellt, wie folgt aussehen: 1
0000
0000
Der Ausdruck „gepackt" weist darauf hin, daß hier, durch Fortfall der Zonenteile (Ausnahme: rechtes Byte) des „ungepackten" Ausdruckes, eine Verdichtung vorgenommen wurde.
14
Einführung in die elektronische Datenverarbeitung
(vgl. dazu Abb. 4). Zur Speicherung von echten Dualzahlen wird ein Byte häufig nicht ausreichen. Üblich ist deshalb die Darstellung von Festkommawerten in Wörtern (die je nach Rechner eine unterschiedliche Kapazität von 16,32 oder mehr Bits haben können) und Halbwörtern (mit jeweils der halben Kapazität eines Wortes). Wählt man als Speicherungsformat z.B. ein 16 Bit umfassendes Wort, so ergibt sich bei der Speicherung der Dezimalzahl 256 als Festkommawert folgendes Bild: 0 vz
000
0001
0000
0000
Wie man sieht, erfolgt die Einordnung der Dualzahl 1 0000 0000 in das 16 Bits umfassende Speicherfeld rechtsbündig, d. h. der Wert schließt mit dem rechten Rand des Speicherfeldes ab. Das Vorzeichen wird im linken Bit des Wortes verschlüsselt. Eine 0 in dieser Position verkörpert dabei das Vorzeichen „+", eine 1 das Vorzeichen „-". Nicht genutzte Stellen zwischen dem Vorzeichenbit und dem Beginn der Dualzahl werden grundsätzlich auf Null gesetzt.
1.3 Datenorganisation 1.3.1 Grundbegriffe Unter Datenorganisation werden alle Verfahren zur Strukturierung, Speicherung und Suche von Daten auf den externen Massenspeichern einer EDVAnlage verstanden. Im Rahmen der Speicherung werden Daten zu Gruppen, den sog. Dateneinheiten, zusammengefaßt. Die wichtigsten dieser eine mehrstufige Hierarchie bildenden Einheiten werden nachfolgend kurz erklärt. Die unterste Stufe der Dateneinheiten stellt (abgesehen von dem einzelnen Bit) das Zeichen (engl.: character) dar, das als Buchstabe, Ziffer oder Sonderzeichen auftreten kann. Eine Zusammenfassung verschiedener Zeichen zu einer sinngebenden Einheit bezeichnet man als Datenfeld oder Feld (engl.: field). Beispiele für derartige Datenfelder sind Auftragsnummern, Kundennummern, Namen, Preise, Mengenangaben usw.. Mehrere in einem logischen Zusammenhang stehende Datenfelder können wiederum zu einem Segment (engl.: segment) integriert werden. So können z.B. die Datenfelder Name, Straße, Postleitzahl und Ort gemeinsam das Segment „Anschrift" bilden. Eine Vereinigung logisch zusammengehörender Datenfelder und/oder Segmente ergibt einen Datensatz (engl.: record). Die
Datenorganisation
15
aus einem Auftrag stammenden Datenfelder bzw. Segmente werden z. B. zu einem Auftragssatz zusammengefaßt; die einen Kunden betreffenden Daten bilden einen Kundensatz. Die logische Gemeinsamkeit der Daten besteht hier in dem jeweiligen Bezugspunkt „bestimmter Auftrag" bzw. „bestimmter Kunde". Speichert man gleichartige Sätze auf einem externen Datenträger, so entsteht eine Datei (engl.: file). Die Gesamtheit der gespeicherten Auftragssätze bildet also die Auftragsdatei, die Zusammenfassung der Kundensätze ergibt die Kundendatei. Von der Datei zu unterscheiden ist schließlich die die höchste Stufe der BegrifFshierarchie verkörpernde Datenbank (engl.: data base). Eine Datenbank umfaßt im Normalfall mehrere Dateien, zwischen denen bestimmte Verknüpfungsmöglichkeiten bestehen müssen. Ein weiteres Kennzeichen einer Datenbank ist eine spezielle für ihren Aufbau und den Betrieb notwendige Software (das sog. Datenbankverwaltungssystem). 1.3.2 Speicherungs- und Zugriffsformen Die Speicherung und Verarbeitung von Dateien kann nach verschiedenen Verfahren erfolgen. Die Wahl des Speicherungsverfahrens ist dabei u. a. abhängig von dem eingesetzten Datenträger und dem angestrebten Verwendungszweck. Werden z.B. Magnetbänder zur Speicherung von Daten eingesetzt, so kommt als Speicherungsform nur die sog. sequentielle Speicherang in Frage. Die Sätze einer Datei werden dann, im Regelfall nach bestimmten Kriterien (den sog. Ordnungsbegriffen oder Schlüsseln wie z.B. Auftragsnummern, Kundennummern usw.) sortiert, abgespeichert und können auch nur in der gespeicherten Reihenfolge verarbeitet werden. Ein „direkter Zugriff', d.h. unmittelbarer Zugriff auf bestimmte, einzelne Sätze der Datei, scheidet von vornherein aus. Das Aufsuchen und Lesen eines Satzes erfordert immer auch das Lesen aller vor diesem Satz auf dem Magnetband enthaltenen Datensätze. Voraussetzung für eine Verarbeitung mit direktem Zugriff ist zunächst ein Direktzugriffsspeicher (Hauptspeicher bzw. bei den externen Speichern Magnetplatte und Diskette). Darüberhinaus muß der Speicherplatz (die sog. Adresse) des gesuchten Satzes bekannt sein, damit eine unmittelbare Verarbeitung dieses Satzes erfolgen kann. Die zuletzt genannte Voraussetzung, also die Kenntnis der Adresse, wird durch einen Einsatz bestimmter Speicherungsverfahren erfüllt. Zwei Hauptgruppen von Verfahren sind in diesem Zusammenhang vor allem zu nennen:
16
Einführung in die elektronische Datenverarbeitung
- die indexsequentielle (indizierte) Speicherung und - die relative Speicherung. Die indexsequentielle Speicherung basiert auf dem Einsatz von Indextabellen. Indextabellen oder Indextafeln sind Zusammenfassungen von Indizes bzw. Zeigern (engl.: pointer), die ihrerseits ein aus einem Ordnungsbegriff (= Schlüssel) und einer Satzadresse bestehendes Begriffspaar bilden. Beispiel für Indextabelle: Ordnungsbegriff (OB) (z.B.Art. Nr.)
Satzadresse (SA)
321 324
4032 4033
987
4420
Der Ordnungsbegriff kennzeichnet einen bestimmten in einer Datei gespeicherten Datensatz. Die zugehörige Satzadresse verweist auf die Position, an der dieser Satz zu finden ist. Forts. Beispiel: Zugehörige Datei (z.B. Artikelstammdatei): SA:4032
SA:4033
SA:4420
Datensatz 1 OB Daten 321 xxxxx
Datensatz 2 OB Daten 324 xxxxx
Datensatz n OB Daten 987 xxxxx
Unter der Voraussetzung, daß die Datei auf einem Direktzugriffsspeicher gespeichert wurde, kann jetzt jeder Datensatz aufgesucht und verarbeitet werden. Der Suchvorgang beginnt dabei in der Indextabelle, die sequentiell gelesen wird. 4 Ist der gewünschte Ordnungsbegriff gefunden, so ist auch die zugehörige Adresse bekannt. Mit Hilfe dieser Adresse erfolgt dann der direkte Zugriff auf den entsprechenden Satz in der Datei.
4
Um diesen Vorgang zu beschleunigen, werden Indextabellen im Regelfall vor Beginn einer Verarbeitung von dem Externspeicher in den Hauptspeicher geladen.
Datenorganisation
17
Die an zweiter Stelle genannte relative Speicherung arbeitet nach völlig anderen Prinzipien als die indexsequentielle Speicherung. Grundsätzlich werden hier zunächst in dem für die Datei vorgesehenen Speicherbereich eine bestimmte Anzahl von Speicherplätzen - jeweils in der Länge eines Datensatzes - reserviert. Die Zahl dieser Speicherplätze ist gleich der Zahl der möglichen Datensätze in der Datei, die wiederum der Menge der möglichen Ausprägungen des Hauptordnungsbegriffes entspricht. Beispiel: Eine Artikeldatei einer Firma soll nach der Methode der relativen Speicherung aufgebaut werden. Hauptordnungsbegriff der Artikelsätze ist die Artikelnummer, die von 1-999 reicht. Ein Teil der Artikelnummern ist - und zwar unregelmäßig, d. h. nicht in aufsteigender Folge - für vorhandene Produkte vergeben worden. Für diese Fälle sind Artikelsätze zu speichern. Obwohl nur bestimmte Artikelnummern belegt sind, weil zum Zeitpunkt des Dateiaufbaus keine 999 Artikel existieren, sind aufgrund des Nummernkreises 999 Artikelsätze grundsätzlich möglich. Damit sind auch 999 Speicherplätze, jeweils im Umfang eines Artikelsatzes, zu reservieren. Bei der Speicherung der Artikelsätze in der Datei werden nur bestimmte Speicherplätze besetzt. Andere Speicherplätze bleiben frei und stehen für die Speicherung weiterer, später neu hinzukommender Sätze zur Verfügung. Der direkte Zugriff auf die Sätze der Datei läuft dann wie folgt ab: Jedem einzelnen Speicherplatz der Datei ist eine mit 1 beginnende Positionsnummer zugeordnet worden. Entspricht nun - wie im obigen Beispiel unterstellt wird - der Ordnungsbegriff (Schlüssel) eines Satzes der Positionsnummer des Speicherplatzes, auf dem dieser Satz gespeichert ist, so ist durch eine einfache Rechnung die Adresse des Satzes zu ermitteln. Vorausgesetzt wird dabei, daß alle Sätze die gleiche (feste) Satzlänge haben. Beispiel: Gesucht wird die Adresse des Satzes mit Artikelnummer 110. Angenommene Satzlänge 100 Bytes. Satzadresse (in Bytes) = (Artikelnummer - 1) x Satzlänge 10900 =( 110 - l)x 100 Der Satz mit der Artikelnummer 110 beginnt also mit der (relativen) Byteadresse 10900. Der Satz mit Artikelnummer 1, der erste Satz in der Datei, hätte entsprechend die Adresse 0 usw..
18
Einführung in die elektronische Datenverarbeitung
Geringfügige Änderungen bei der Ermittlung der Satzadresse ergeben sich dann, wenn der Ordnungsnummernbereich (= Schlüsselbereich) nicht dem Bereich der Positionsnummern entspricht. Beispiel: Der Artikelnummernkreis reicht von 10001-10999. In einem solchen Falle kann durch Subtraktion von 10000 von der Artikelnummer wieder die Übereinstimmung von Positionsnummer und Artikelnummer hergestellt werden. Der Satz mit Artikelnummer 10001 steht dann wieder auf dem Speicherplatz mit Positionsnummer 1, d. h. hat die Adresse 0.
1.4 Softwareentwicklung 1.4.1 Phasen der Softwareentwicklung Softwareentwicklung kann als ein sequentiell ablaufender Prozeß von häufig hoher Komplexität charakterisiert werden. Um diesen Prozeß transparenter zu machen, um speziell auch die Komplexität zu reduzieren, werden in der Praxis größere Softwareentwicklungsprojekte auf der Grundlage von Phasenmodellen geplant und realisiert. Ein solches Phasenmodell der Softwareentwicklung (engl.: Software life cycle) beschreibt die einzelnen Stufen des Softwareproduktionsprozesses und grenzt sie voneinander ab. Abb. 6 zeigt ein einfaches Softwareentwicklungsmodell.
Abb. 6: Phasenmodell der Softwareentwicklung
Softwareentwicklung
19
Erläuterungen zu Abb. 6: Die am Anfang der Softwareentwicklung stehende Problemanalyse beginnt üblicherweise mit einer Bestandsaufnahme und Analyse des Istzustandes des Sachgebietes, für das die neue Software entwickelt werden soll. Nach dem Erfassen der Istsituation und dem Aufdecken der dort vorliegenden Mängel und Schwachpunkte folgt die Entwicklung einer Sollkonzeption, die den gewünschten zukünftigen Zustand des Arbeitsgebietes beschreibt. Eine Durchführbarkeitsstudie schließlich stellt sicher, ob die in der Sollkonzeption formulierten Ziele technisch und ökonomisch, d.h. mit vertretbarem Aufwand, realisierbar sind. Die Ergebnisse der Problemanalyse werden in einem Abschlußdokument, dem sog. Pflichtenheft, festgehalten. Die nachfolgende Entwurfsphase stellt den wichtigsten Abschnitt der Softwareentwicklung dar. Wie verschiedene Untersuchungen gezeigt haben, liegen die Ursachen für viele erst beim späteren Softwareeinsatz sichtbar werdende Fehler gerade in dieser Phase. Eine sorgfältige Entwurfsarbeit hilft, die Mehrzahl derartiger Fehler zu vermeiden, und trägt somit entscheidend zu einer Verbesserung der Softwarequalität bei. Der Entwurf eines größeren Softwarepaketes beginnt immer mit dem sog. Grobentwurf. Im Rahmen dieser Teilphase wird zunächst die Struktur eines Softwaresystems festgelegt. Programme und Dateien und die zwischen ihnen bestehenden Beziehungen werden in noch groben Umrissen beschrieben. Die Ausgestaltung im einzelnen, insbesondere die detaillierte Darstellung der Verarbeitungsinhalte der verschiedenen Programme und Programmteile, ist Aufgabe des nachfolgenden Feinentwurfs. In beiden Unterphasen werden vielfältige Entwurfsdarstellungsmittel eingesetzt (vgl. Punkt 1.4.2). Die Umsetzung der Resultate des Feinentwurfs in die Befehle einer Programmiersprache, die Codierung, ist Gegenstand der dritten Entwicklungsphase, der Implementierung. Mit einbezogen in die Implementierungsphase ist im allgemeinen auch die Erzeugung eines ablaufiahigen Programms, des Maschinenprogramms (vgl. Punkt 1.4.4). Die grundsätzlich - zumindest bei größeren Programmen - nach der Implementierung in den Programmen noch vorhandenen Fehler sind im Rahmen der Testphase zu lokalisieren und zu korrigieren. Ggf. sind auch Maßnahmen zur Leistungsverbesserung der Software (z. B. Verkürzung der Antwortzeiten) in dieser Phase durchzuführen. Installation und Betrieb schließlich, als letzte Stufe des Entwicklungsprozesses, beinhalten die Einführung der getesteten Programme und die sich daran anschließende laufende Nutzung.
20
Einfuhrung in die elektronische Datenverarbeitung
1.4.2 Darstellungsmittel des Softwareentwurfs Aus der Vielzahl der grundsätzlich zur Entwurfsdarstellung zur Verfügung stehenden Beschreibungsmittel sollen nachfolgend drei - in der Praxis besonders weit verbreitete - graphische Darstellungsmittel näher erläutert werden. Für den ersten Teil des Entwurfs, den Grobentwurf, ist der Datenflußplan das bekannteste Darstellungsmittel. Ein Datenflußplan stellt Verarbeitungsschritte und Daten sowie die Verbindungen zwischen beiden dar [DIN 66001]. Die Beschreibung erfolgt mit Hilfe geometrischer Sinnbilder, die zusätzlich kurze erklärende Texte enthalten können, und zusammen mit den Sinnbildern des Programmablaufplanes (s.u.) in DIN 66001 genormt sind. Einige der wichtigsten Symbole enthält Abb. 8. Nachfolgendes einfaches Beispiel illustriert die Anwendung von Datenflußplänen: Eine Auftragsbestandsdatei soll mit Hilfe einer Bewegungsdatei, die die Zugänge und Abgänge zum Auftragsbestand enthält, aktualisiert werden. Aus den beiden sequentiell organisierten und verarbeiteten Dateien wird per Programm die neue Auftragsbestandsdatei und - als Nebenprodukt - eine Liste der Zugänge und Abgänge erstellt. Den entsprechenden Datenflußplan zeigt Abb. 7.
Programm „Aktualisierung Auftragsbestand'
Liste der Zu- und Abgänge
Abb. 7: Datenflußplan
Anders als Datenflußpläne werden die bei oberflächlicher Betrachtung äußerlich sehr ähnlichen Programmablaufpläne für den Feinentwurf von Programmen eingesetzt. Ein Programmablaufplan stellt die Reihenfolge der Arbeitsschritte in einem Programm dar. Daten werden nicht dargestellt [DIN 66001].
21
Softwareentwicklung Verarbeitung, allgemein (einschließlich Ein-/Ausgabe) [PA, DF] Verzweigung [PA]
Daten, allgemein [DF]
Daten auf Schriftstück [DF]
Daten auf Speicher mit nur sequentiellem Zugriff [DF]
Daten auf Speicher mit auch direktem Zugriff [DF] Maschinell erzeugte optische oder akustische Daten [DF] Manuelle optische oder akustische Eingabedaten [DF]
CD o
Grenzstelle [PA, DF] Verbindungsstelle [PA, DF] Bemerkung [PA, DF]
Erklärung: Die in den eckigen Klammern enthaltenen Zusätze geben an, für welche Darstellungsmittel (Programmablaufplan, Datenflußplan) die Sinnbilder eingesetzt werden. Abb. 8: Sinnbilder für Datenflußpläne und Programmablaufpläne nach DIN 66 001
22
Einführung in die elektronische Datenverarbeitung
In Abb. 9 wird anhand einer kleinen Aufgabenstellung der Programmentwurf mit Hilfe eines Programmablaufplanes beschrieben und erläutert. Aufgabe: Ermittlung des Urlaubsgeldes Als Eingabedaten werden die Sätze einer Personaldatei, die u.a. die Datenfelder Personalnummer, Name, Grundgehalt enthalten, verarbeitet. Aufgrund der Angaben in diesen Sätzen ist für jeden Beschäftigten das Urlaubsgeld zu ermitteln und in einer Liste auszudrucken. Jeder Mitarbeiter erhält ein Drittel seines Grundgehaltes als Urlaubsgeld J e d o c h nicht mehr als DM 1200,-. Zu Beginn der Verarbeitung ist eine Überschriftszeile auszugeben. Erklärungen: Start des Programms. Die Verbindungslinien zeigen die Verarbeitungsfolge. Die Überschriftszeile wird einmal für die gesamte Liste gedruckt.
Es wird ein Satz aus der Personaldatei eingelesen.
nein
U G = 1/3 * GGehalt
Es handelt sich u m eine Verzweigung (Selektion) mit zwei Ausgängen. Ist die darin enthaltene Bedingung (EOF=End of File) erfüllt, d.h. ist kein Datensatz mehr zu verarbeiten, dann verzweigt das Programm über den Ja-Ausgang zum Ende. Im anderen Fall läuft die Verarbeitung über den Nein-Ausgang weiter. Berechnung des Urlaubsgeldes entsprechend der Aufgabenstellung. Verzweigung mit zwei Ausgängen (Selektion). Ist das berechnete Urlaubsgeld > 1200,-, dann gilt der Höchstbetrag von 1200,-. Anschließend führt die Verbindungsstelle B zum Drucken. Im anderen Fall wird das Urlaubsgeld sofort gedruckt.
Drucken des Urlaubsgeldes.
I
(
A
Die Verbindungsstelle A führt - entsprechend den Pfeilen - zum Anfang der Verarbeitung zurück.
Abb. 9: Programmablaufplan
Nach dem Verarbeiten des ersten Datensatzes wird - durch den über die Verbindungsstelle A beschriebenen Rücksprung zum "Lesen" der zweite
Softwareentwicklung
23
Datensatz eingelesen und verarbeitet. Dabei werden wiederum die gleichen Arbeitsschritte durchlaufen. (Eine kleine Variante des Grundmodells ergibt sich, wenn das Urlaubsgeld > 1200,- ist). Der Verarbeitung des zweiten Satzes folgt der dritte Satz usw. Diese Wiederholung gleicher Arbeitsschritte mit jeweils anderen Eingabedaten bezeichnet man als Programmschleife oder Iteration. Eine modernere Form von Ablaufplänen, die vor allem den Grundforderungen der Strukturierten Programmierung besser entspricht und die damit zu der Gestaltung übersichtlicherer Programme führt, verkörpern die sog. Struktogramme bzw. Nassi-Shneiderman-Diagramme [DIN 66261]. Die wichtigsten Kontrollstrukturen der Strukturierten Programmierung und ihre Wiedergabe im Struktogramm sowie die Lösung des in Abb. 9 bereits behandelten Beispiels in Form eines Struktogramms zeigt Abb. 10. Weitere StruktogrammSinnbilder werden in späteren Kapiteln beschrieben. 1.4.3 Programmiersprachen Die graphische Darstellung des Feinentwurfs in Form von Ablaufplänen stellt die Grundlage für den nächsten Entwicklungsschritt, die Übertragung der Aufgabenstellung auf den Rechner, dar. Die Entwurfsbeschreibung muß dazu in eine dem Computer verständliche Sprache (eine Programmiersprache) umgesetzt werden. Die z. Z. bekannteste Klassifizierung der Programmiersprachen unterscheidet 5 Generationen von Programmiersprachen. Die erste Sprachengeneration umfaßt die sog. Maschinensprachen, deren Befehle als Folgen von Dualziffern (oder in einer entsprechenden hexadezimalen Darstellung) codiert werden. Die Befehle der Maschinensprache sind für die jeweilige EDV-Anlage unmittelbar verständlich und können sofort ausgeführt werden. Wegen ihrer für den Programmierer sehr unübersichtlichen Darstellungsform und daraus resultierenden Fehleranfälligkeit spielen diese Sprachen in der Softwareentwicklung heute keine Rolle mehr. 5
Die Forderungen der Strukturierten Programmierung, die heute die allgemein anerkannte Grundlage jeder Softwareentwicklung verkörpert, lassen sich wie folgt vereinfacht zusammenfassen: - Ein Programmsystem soll „Top down" entwickelt werden und modular aufgebaut sein (Programmodule sind in sich abgeschlossene, einzelne Programmteile). - Die Ablaufsteuerung eines Programms erfolgt ausschließlich mit Hilfe der Kontrollstrukturen Sequenz, Selektion und Iteration. Die Sprunganweisung GO TO ist nach Möglichkeit zu vermeiden.
24
Einführung in die elektronische Datenverarbeitung Wiederhole, solange Bedingung gilt
Arbeitsanweisung 1 Arbeitsanweisung 2
Arbeitsanweisung
Arbeitsanweisung 3
Kontrollstruktur „Sequenz" (Folge) Die Anweisungen werden einmal von oben nach unten durchlaufen.
Kontrollstruktur „Iteration" (Programmschleife) In Abhängigkeit von der Gültigkeit der Bedingung werden die Anweisungen der Programmschleife keinmal, einmal oder mehrmals ausgeführt.
Bedingung nein
ja Arbeitsanweisung 1
Arbeitsanweisung 2
Kontrollstruktur „Selektion" (Verzweigung) Kontrollstruktur „Case" (Mehrfachverzweigung) Drucken Überschrift Lesen Satz
Erklärungen:
Verarbeite solange, wie Dateiende (EOF) nicht erreicht UG=l/3 GGehalt
ja
UG>1200,-? ^ ^ ^
UG=1200,Drucken Zeile Lesen Ende der Verarbeitung
^ nein
^
Gegenüber der Darstellung im Programmablaufplan (vgl. Abb. 9) enthält diese Struktogrammlösung eine wesentliche Änderung. Die hier benutzte F o r m der Iteration verlangt eine Abfrage der Endebedingung vor dem ersten Eintritt in die Schleife. Da jedoch erst nach d e m Lesen der Datei erkannt werden kann, ob ein zu verarbeitender Satz in der Datei vorhanden ist oder nicht, m u ß zunächst ein Datensatz vor Beginn der Schleifenverarbeitung gelesen werden. Erst danach kann die Endebedingung geprüft werden. Solange diese Endebedingung nicht erfüllt ist, werden die in der Schleife enthaltenen Arbeitsanweisungen durchlaufen. Die letzte Anweisung der Schleife ist das Einlesen eines neuen Satzes (sog. Vorauslesen). Nach dem Verlassen der Schleife wird die Verarbeitung mit diesem Schritt abgeschlossen.
Abb. 10: Kontrollstrukturen der Strukturierten Programmierung und Anwendungsbeispiel
Softwareentwicklung
25
Die nachfolgenden Generationen unterscheiden sich von den Maschinensprachen grundsätzlich in einem zentralen Punkt. Die Befehle werden nicht mehr in einer vom Rechner direkt ausführbaren, binären Form codiert, sondern bestehen aus Wörtern, Abkürzungen und Symbolen, die häufig der (englischen) Umgangssprache entnommen sind oder anderen bekannten (z. B. mathematischen) Beschreibungsformen entsprechen. Damit verbunden ist der Vorzug einer besseren Verständlichkeit, größeren Übersichtlichkeit und insgesamt leichteren Handhabung für die Anwender dieser Sprachen. Als Nachteil ergibt sich andererseits, daß diese Befehle vor ihrer Ausführbarkeit zunächst in eine dem Computer verständliche Form (d. h. die Maschinensprache) übersetzt werden müssen. Die Umformung wird mit Hilfe spezieller Übersetzerprogramme für die verschiedenen Programmiersprachen vorgenommen. Die Programmiersprachen der zweiten Generation, die sog. Assemblersprachen, werden wegen ihrer noch relativ nahen Verwandtschaft zu den Maschinensprachen und ihres engen Bezuges zur Struktur der jeweiligen EDVAnlage auch als maschinenorientierte Programmiersprachen bezeichnet. Ihre Handhabung gilt als verhältnismäßig schwierig. Andererseits zeichnen sich Assemblerprogramme durch besonders kurze Laufzeiten und - gegenüber in anderen Sprachen geschriebenen Programmen - durch ihren geringeren Bedarf an Speicherkapazität aus. Der eindeutige Anwendungsschwerpunkt liegt bei den Sprachen der dritten Generation, in denen die große Mehrzahl der weltweit existierenden Programme erstellt wurde. Die auch als höhere bzw. problemorientierte Programmiersprachen bezeichneten Sprachen erlauben eine Formulierung der Arbeitsanweisungen in einer maschinenunabhängigen, an dem zu lösenden Problem orientierten Schreibweise. Gegenüber früheren Generationen ermöglichen diese Sprachen eine schnellere und einfachere Programmierung. Als bekannteste Beispiele seien hier COBOL, FORTRAN, PL1, RPG, ALGOL, BASIC und PASCAL genannt. COBOL gilt als die verbreitetste Programmiersprache überhaupt. Mit einem Weltbestand von rund 77 Milliarden Programmierzeilen, die einen Wiederschaffungswert von 770 Milliarden bis 2,3 Billionen Dollar repräsentieren [R. Vollmer in Online 10/87], wird COBOL bis weit in das nächste Jahrtausend hinein seine Geltung behalten. Übersetzerprogramme für problemorientierte Programmiersprachen werden mit einem Sammelbegriff als Kompilierer (Compiler) bezeichnet. Erst seit wenigen Jahren werden Programmiersprachen der vierten Generation auf dem Markt angeboten, von deren Einsatz weitere Produktivitätsfortschrit-
26
Einführung in die elektronische Datenverarbeitung
te in der Softwareentwicklung zu erwarten sind. Die z. Z. verbreitetsten Sprachen sind NATURAL, SQL, FOCUS und RAMIS. Programmiersprachen der fünften Generation schließlich sind speziell für den Einsatz in dem neuen Anwendungsbereich „künstliche Intelligenz" vorgesehen. Als Basissprachen gelten PROLOG und LISP. 1.4.4 Quellenprogramm und Maschinenprogramm Die Codierung der Entwurfsdarstellung in Programmiersprachen der zweiten oder nachfolgenden Generationen ergibt ein Programm, das für einen Rechner zunächst nicht verständlich und somit auch nicht ausführbar ist. Dieses Programm wird üblicherweise als Quellenprogramm (engl.: source program) oder - seltener - als Ursprungsprogramm bzw. Primärprogramm bezeichnet. Erst durch den Einsatz eines Übersetzerprogramms werden - wie bereits oben erläutert - aus den Befehlen des Quellenprogramms Maschinenbefehle, die von einem Computer interpretiert werden können. Die Gesamtheit der aus der Übersetzung eines Quellenprogramms entstandenen Maschinenbefehle wird als Maschinenprogramm, Zielprogramm oder Objektprogramm (engl.: object program) bezeichnet. Parallel mit der Übersetzung des Quellenprogramms in das Maschinenprogramm wird von dem Übersetzerprogramm eine Prüfung der Programmanweisungen auf formale Fehler (sog. Syntaxfehler) durchgeführt. Nach Abschluß der Programmübersetzung werden die bei dieser Überprüfung ermittelten Fehler in einem Fehlerprotokoll, das als Bestandteil einer Liste mit den Befehlen des Quellenprogramms^ erscheint, ausgegeben. Die Fehler sind im Ursprungsprogramm zu korrigieren, das anschließend erneut übersetzt werden muß. Der Vorgang muß gegebenenfalls mehrfach wiederholt werden, bis alle Formalfehler beseitigt sind. Die Eingabe der Befehle des Quellenprogramms und den Aufbau einer entsprechenden Datei mit Hilfe eines Editor-Programmes 7 sowie die anschließende Übersetzung zeigt Abb. 11. Auch nach der Beseitigung aller Formalfehler kann das Maschinenprogramm noch nicht ausgeführt werden. Jeder Quellcode enthält Anweisungen, die die
® D i e s e Liste wird in der Praxis häufig auch als Umwandlungsliste bezeichnet. 7 Ein Editor-Programm dient z u m Erstellen, Lesen und Ändern von Dateien aller Art. Im Rahmen der Programmierung wird es insbesondere auch zur Eingabe und Speicherung von Programmbefehlen eingesetzt.
27
Softwareentwicklung
Bildschirmausgabe Eingabe der Anweisungen
Quellenprogramm
Quellenprogramm auf Magnetplatte Übersetzerprogramm (z. B. COBOL-Compiler)
Programmliste mit Fehlerprotokoll Abb. 11: Eingabe und Übersetzung eines Quellenprogramms
Einbeziehung weiterer externer Programme (sog. Unterprogramme) und Programmteile (z. B. zur Abwicklung von Ein-Ausgabevorgängen) erfordern. Diese Aufgaben werden von dem Binder (engl. : linkage editor), einem Programm des Betriebssystems, wahrgenommen. Erst danach ist ein wirklich ausführbarer Code entstanden, der von einem weiteren Programm des Betriebssystems, dem Lader (engl.: loader) zur Verarbeitung in von ihm bestimmte freie Speicherplätze des Hauptspeichers übertragen wird. 1.4.5 Programmtest Das vom Lader in bestimmte Hauptspeicherbereiche übertragene ausführbare Programm wird im allgemeinen noch eine Reihe von Fehlern enthalten, die erst bei einer Verarbeitung der Eingabedaten und der Überprüfung der vom Programm erstellten Ausgaberesultate sichtbar werden. Derartige Fehler (dazu gehören z.B. nicht richtig berechnete Werte, die Übertragung von Daten in falsche Ausgabefelder usw.) werden im Unterschied zu den während der Übersetzung ermittelten Formalfehlern als logische Fehler oder Semantikfehler bezeichnet. Ihre Ursachen liegen in Fehlern des Quellenprogramms (z.B. in falschen Abfragen) und müssen dort korrigiert werden. Diesen mitunter sehr schwierigen - Prüf- und Korrekturvorgang bezeichnet man als Programmtest.
28
Einführung in die elektronische Datenverarbeitung
1.5 Betriebsarten Unter Betriebsarten versteht man die unterschiedlichen Formen, in denen EDV-Anlagen genutzt werden können. Nach der zeitlichen Abwicklung der Benutzeraufträge kann dabei zwischen Stapelverarbeitung und Dialogverarbeitung unterschieden werden. 1.5.1 Stapelverarbeitung Stapelverarbeitung (engl.: batch processing) ist eine Betriebsart, bei der die Daten zunächst über einen längeren Zeitraum (z.B. eine Abrechnungsperiode) auf einem Datenträger gesammelt werden, um dann am Ende dieser Zeitspanne nacheinander verarbeitet zu werden. Ein typisches Beispiel für eine Stapelverarbeitungsanwendung ist die Lohn- und Gehaltsabrechnung. Die Daten der entsprechenden Abrechnungsbelege (Stundenzettel usw.) werden gesammelt und gespeichert und am Ende der Abrechnungsperiode zusammengefaßt ausgewertet. 1.5.2 Dialogverarbeitung Unter Dialogverarbeitung (engl.: conversational processing) versteht man eine Betriebsart, bei der das EDV-System auf Eingabewerte reagiert und den Bediener in Form eines Dialoges leitet. Notwendige Voraussetzung für den Einsatz der Dialogverarbeitung ist immer das Vorhandensein von Datensichtgeräten. Die über den Bildschirm erfolgende Benutzerführung durch Anbieten von verschiedenen Auswahlmöglichkeiten wird als Menütechnik bezeichnet. Sie verlangt eine erheblich aufwendigere Form der Programmierung als bei Stapelverarbeitungsprogrammen.
2 Allgemeine Grundlagen der COBOL-Sprache 2.1 Überblick zur geschichtlichen Entwicklung Die Anfänge der Programmiersprache COBOL (= Common Business Oriented Language) gehen zurück auf das Jahr 1959. Auf Anregung des Verteidigungsministeriums der Vereinigten Staaten trat in diesem Jahr eine aus EDV-Anwendern, Computerherstellern und Regierungsvertretern bestehende Gruppe zusammen, die sich das Ziel setzte, eine neue problemorientierte Programmiersprache für betriebswirtschaftliche Anwendungen zu schaffen. Noch in demselben Jahr wurde die Arbeitsgemeinschaft CODASYL (= Conference on Data Systems Languages) gegründet, die den eigentlichen Anstoß für die Entwicklung von COBOL gab und bis zum heutigen Tage für alle Weiterentwicklungen der Sprache zuständig ist. Nachfolgend werden die wichtigsten Stationen der COBOL-Entwicklung kurz beschrieben: 1960 Erster COBOLEntwurf. 1961 Erste in der Praxis eingesetzte COBOI^Version. 1968 USA STANDARD-COBOL 68. Eine genormte COBOl^Version wird durch das USA Standard Institute (USASI) herausgegeben. Diese Norm bildet die Grundlagen für alle weiteren Bemühungen zu einer Vereinheitlichung von COBOL. 1974 American National Standard (ANS) COBOL 74. Das American National Standard Institute (ANSI), als Nachfolgeorganisation des USASI, veröffentlicht eine neue COBOI^Norm. 1985 ANS COBOL 85. Die vorläufig letzte COBOLNorm (ANSI X3.23 1985) erscheint. Diese Norm ist unverändert in die Internationale Norm ISO 1989 übernommen worden. Sie ist ebenfalls deckungsgleich mit der deutschen COBOLNorm DIN 66 028 vom August 1986. ANSI X3.23-85 bildet die Grundlage des vorliegenden Lehrbuches. Nicht zuletzt die oben dargestellten, erfolgreichen Normierungsbemühungen sind ein Grund für den weltweiten Einsatz von COBOL. Die Einhaltung der in den Normen beschriebenen Regeln durch die Hersteller von COBOL Compilern garantiert eine weitgehende Portabilität von COBOL-Programmen, d. h. die Möglichkeit, Programme von einer EDV-Anlage auf eine andere zu übertragen.
30
Allgemeine Grundlagen der COBOL-Sprache
Als weitere Vorteile von COBOL gelten allgemein die relativ leichte Erlernbarkeit und die gute Lesbarkeit und Verständlichkeit der Dokumentation. Die in den 70er Jahren häufig erhobenen Vorwürfe, COBOL eigne sich nicht für eine moderne (sprich: strukturierte) Programmierung, müssen inzwischen als gegenstandslos betrachtet werden. Gerade die letzte COBOL^Norm hat hier völlig neue Möglichkeiten geschaffen. Für einen umfassenden Einsatz der Programmiersprache COBOL auch in den kommenden Jahren spricht u.a. die Entwicklung auf dem Mikrocomputermarkt. Boten die 8-Bit-Mikrocomputer mit ihrer begrenzten Speicherkapazität noch keine ausreichende Basis für den Einsatz leistungsfähiger COBOLCompiler, so hat sich diese Situation mit dem Aufkommen der 16-BitComputer wesentlich geändert. Entsprechend gestiegen ist auch die Zahl von COBOI^Compilern für Mikrocomputer. Damit ergibt sich u. a. die Möglichkeit, für mittelgroße und große DV-Anlagen bestimmte COBOL-Programme auf Personalcomputern zu entwickeln und zu testen.
2.2 Module der Sprache Die Elemente der Programmiersprache COBOL sind, in Abhängigkeit von ihren Funktionen, zu Moduln zusammengefaßt worden. Nach ANSI X3.23 85 umfaßt COBOL sieben Pflichtmoduln und vier Wahlmoduln, die grundsätzlich in mehreren Ausbaustufen (von Level 0 bis Level 2) vorliegen können. Module mit der Ausbaustufe 0 dürfen in Compilern auch fortgelassen werden. Als „FÜLL COBOL" wird der volle Sprachumfang bezeichnet, der aus den höchsten Ausbaustufen aller Pflicht- und Wahlmoduln besteht [DIN 66 028]. In dem am schwächsten ausgelegten Compiler fehlen alle Moduln mit dem Level 0, während die übrigen Moduln in ihrer niedrigsten Ausbaustufe implementiert werden. Dieser Minimalcompiler wäre also (vgl. Abb. 12) wie folgt zu beschreiben: 1 NUC 1 1 SEQ 1 1 IPC 1 Abb. 12 enthält die Pflicht- und Wahlmoduln mit ihren mnemonischen Abkürzungen und Ausbaustufen.
Zeichenvorrat und Wortarten
Moduln
31
Mnemonischer Name
Level
NUC SEQ REL INX
1,2 1,2 0,2 0,2
IPC SRT
1,2 0,2
STM
0,2
RPW COM DEB SEG
0,1 0,2 0,2 0,2
a) Pflichtmoduln Nucleus Sequential 1-0 Relative 1-0 Indexed 1-0 Inter-ProgramCommunication Sort-Merge Source-TextManipulation b) Wahlmoduln Report Writer Communication Debug Segmentation
Abb. 12: COBOL Pflicht- und Wahlmoduln
2.3 Zeichenvorrat und Wortarten Die Programmiersprache COBOL verfugt - wie jede normale Sprache - über einen bestimmten Fundus an Ausdrucksmöglichkeiten, die dazu benutzt werden, dem Computer Befehle zu erteilen. Neben den sog. COBOI^Wörtern, die den Kern des Wortschatzes der Programmiersprache COBOL verkörpern, gibt es auch noch andere Darstellungsmöglichkeiten (z.B. Literale). Nachfolgend werden diese verschiedenen Ausdrucksformen, für die ein ganz bestimmter Zeichenvorrat (s. u.) zur Verfügung steht, mit den für sie gültigen Regeln im einzelnen beschrieben. 2.3.1 COBOL-Zeichenvorrat Der Zeichenvorrat des COBOL-Standards ANSI 85 umfaßt die folgenden Zeichen: A-Z a-z
Großbuchstaben Kleinbuchstaben
32
Allgemeine Grundlagen der COBOLSprache
0-9 + * / = $ , " ( ) > < :
Ziffern Leerzeichen Pluszeichen Minuszeichen Stern Schrägstrich Gleichheitszeichen Dollarzeichen Komma Punkt Anführungszeichen (Anmerkung: Bei älteren, nicht auf ANSICOBOL 85 basierenden Compilern, wird anstelle der Anführungszeichen häufig noch das Hochkomma ['] verwandt.) linke Klammer rechte Klammer „größer als" Symbol „kleiner als" Symbol Doppelpunkt
Bei nichtnumerischen Literalen und Kommentaren (vgl. Punkt 2.3.3.2 und 2.5) umfaßt der mögliche Zeichenvorrat alle im Code der Zentraleinheit vorgesehenen Zeichen. Für die Ausgabe dieser Zeichen sind ggf. die vom Drucker vorgegebenen Einschränkungen zu beachten. 2.3.2 COBOL-Wörter COBOLWörter werden in zwei Hauptgruppen - reservierte und nicht-reservierte COBOI^Wörter - untergliedert. 2.3.2.1 Reservierte COBOL-Wörter Reservierte COBOl^Wörter sind in ihrer Bedeutung und Schreibweise in der COBOL^Sprache exakt festgelegt. Sie dürfen nicht zur Bezeichnung von Daten oder Programmteilen verwandt werden (vgl. Punkt 2.3.2.2). Eine Übersicht über die reservierten COBOI^Wörter findet sich im Anhang. Darüber hinaus können in den verschiedenen Compilern weitere reservierte Wörter von den Herstellern eingefügt worden sein. Zwei Arten von reservierten COBOI^Wörtern sind zu unterscheiden: Schlüsselwörter (engl.: key words) geben dem Compiler eine (unverzichtbare) Information zur Ausführung bestimmter Funktionen. Beispiele sind die Wörter ADD, MOVE, DISPLAY usw.
Zeichenvorrat und Wortarten
33
Wahlwörter (engl.: optional words) sind dagegen nicht zwingend notwendig und können auch weggelassen werden. Sie stellen Ergänzungen zu den Schlüsselwörtern dar, haben jedoch keinen Einfluß auf den Programmablauf, sondern dienen ausschließlich dem Ziel, die Lesbarkeit der Codierung zu verbessern. Als Beispiele seien die Wörter IS, THAN und LINES genannt. 2.3.2.2 Nicht reservierte COBOL-Wörter (Programmiererwörter)
Programmiererwörter (engl.: user defined words) werden vom Programmierer - nach bestimmten Regeln - frei festgelegt. Sie finden Verwendung als Datennamen und Prozedurnamen. Unter Datennamen werden die Namen von Datenfeldern, Datensätzen, Dateien usw. verstanden. Grundsätzlich bezeichnen Datennamen Speicherfelder mit variablem Inhalt. Prozedurnamen (Marken) kennzeichnen dagegen Programmabschnitte, zu denen von anderen Programmteilen aus verzweigt werden kann. Ein solcher Programmabschnitt ist z.B. ein PARAGRAPH oder eine SECTION (vgl. Kapitel 3). Für die Bildung von Datennamen gelten folgende Regeln: - Der Name darf aus maximal 30 Zeichen bestehen. - Innerhalb dieser Zeichenfolge sind die Buchstaben A-Z bzw. a-z, die Ziffern 0-9 und das Sonderzeichen „-" zulässig. - Das Sonderzeichen „-" darf nicht als erstes oder letztes Zeichen des Datennamens verwandt werden. - Der Datenname darf keine Leerstelle enthalten. - Der Datenname muß mindestens einen Buchstaben enthalten. Beispiele: Zulässig sind die Namen Eingabe-Datei / K / MWST / A10. Unzulässig sind die Bezeichnungen 14% / 4711 / Dreistufige-Gruppenwechsel-Verarbeitung. Für Prozedurnamen gelten, mit Ausnahme der letzten Bestimmung, die gleichen Festlegungen. Ein Prozedurname kann auch nur aus Ziffern bestehen. Beispiele: Zulässig sind die Namen 4711 / AZ-8-9-1988. Unzulässig sind die Bezeichnungen 23.75 / 14 Prozent.
34
Allgemeine Grundlagen der COBOL-Sprache
2.3.3 Literale Literale sind sich - durch ihren Inhalt - selbst definierende Konstanten. Inhalt und Name sind identisch. Grundsätzlich ist zwischen numerischen und nicht-numerischen (alphanumerischen) Literaten zu unterscheiden. Daneben gibt es als Sonderfall die flgurativen Konstanten. 2.3.3.1 Numerische Literale Numerische Literale sind Zahlenkonstanten, die durch eine Ziffernfolge beschrieben werden. Neben den Ziffern 0-9 darf ein numerisches Literal die Vorzeichen + und - und einen Dezimalpunkt (Ausnahme: Bei Verwendung der Klausel „DECIMAL POINT IS COMMA" kann auch ein Dezimalkomma angegeben werden, vgl. Punkt 3.2.) enthalten. Folgende Regeln sind darüber hinaus zu beachten: - Das Literal muß aus mindestens einer Ziffer bestehen. Als Obergrenze sind maximal 18 Ziffern zulässig. - Das Literal darf nur ein Vorzeichen enthalten. Das Vorzeichen muß stets als erstes Zeichen des Literais erscheinen. Wird kein Vorzeichen angegeben, so wird ein positiver Wert unterstellt. - Das Literal darf nur einen Dezimalpunkt enthalten. Der Dezimalpunkt darf nicht als letztes Zeichen eines Literais erscheinen. - Ein numerisches Literal darf nicht in Anführungszeichen gesetzt werden. Geschieht das trotzdem, so wird es als nicht-numerisches Literal (s.u.) behandelt. Beispiele: Zulässig sind die numerischen Literale 10245 / 999.99 / +31.78 / -0.001. Nicht zulässig sind die Zeichenfolgen 321- / 1,99 / + 0.98. 2.3.3.2 Nicht-numerische Literale Nicht-numerische Literale (alphanumerische Literale) sind Textkonstanten, die aus beliebigen Zeichen (eingeschlossen das Leerzeichen) bestehen. Es gelten folgende Regeln: - Ein nicht-numerisches Literal ist grundsätzlich in Anführungszeichen einzuschließen. - Die Zeichenfolge zwischen den Anführungszeichen darf maximal 160 Zeichen umfassen. - Innerhalb der Zeichenfolge dürfen auch COBOI^Wörter auftreten.
35
Beschreibung der COBOL-Syntax
Beispiele: "Lösung X=" / "Bruttoumsatzliste 1989" / "Fehlermeldung: Falsche Sortierung" /. 2.3.3.3 Figurative Konstanten
Figurative Konstanten oder Festwertkonstanten verkörpern eine besondere, durch COBOI^Schlüsselwörter beschriebene Form von Literalen. Durch Verwendung dieser Konstanten können Datenfeldern bestimmte Werte zugewiesen werden. Dabei wird stets der gesamte Speicherbereich mit dem durch die figurativen Konstanten repräsentierten Zeichen ausgefüllt. Die wichtigsten figurativen Konstanten sind: SPACE oder SPACES ZERO oder ZEROS bzw. ZEROES All" "
LOW-VALUE oder LOW-VALUES
HIGH-VALUE oder HIGH-VALUES
erzeugt ein oder mehrere Leerzeichen. erzeugt ein oder mehrere Nullen. ALL in Verbindung mit einem nachgestellten Literal erzeugt in allen Stellen eines Speicherfeldes das im Literal dargestellte Zeichen (bzw. die Zeichenfolge). Schließt das Literal ein Leerzeichen ein, so ergibt sich das gleiche Resultat wie bei Verwendung der Konstanten SPACE. ALL "*" erzeugt entsprechend ein oder mehrere Sternchen usw.. erzeugt ein- oder mehrfach den niedrigsten möglichen Wert (in Bytedarstellung hexadezimal 00). erzeugt ein- oder mehrfach den höchsten möglichen Wert (in Bytedarstellung hexadezimal FF).
2.4 Beschreibung der COBOL-Syntax Aus der Verbindung von COBOI^Wörtern und Literalen entstehen COBOLr Anweisungen, deren Aufbau bestimmten Regeln entsprechen muß, damit sie vom Compiler verstanden und übersetzt werden können. Die Gesamtheit dieser formalen Regeln wird als die Syntax der Programmiersprache COBOL bezeichnet. (Im Gegensatz dazu betrifft die Semantik die inhaltliche Bedeu-
36
Allgemeine Grundlagen der COBOL-Sprache
tung der einzelnen Anweisungen). Der syntaktische Aufbau einer bestimmten Anweisung wird als das Format dieser Anweisung bezeichnet. Häufig gibt es für eine Anweisung mehrere Formate. Zur Beschreibung der Syntax haben sich feste Darstellungsformen herausgebildet, die nachfolgend wiedergegeben werden. - Reservierte COBOI/Worter werden in den Formatangaben grundsätzlich groß geschrieben. Schlüsselwörter werden dabei zusätzlich unterstrichen, während bei Wahlwörtern die Unterstreichung entfällt. Beispiel: USAGE IS DISPLAY (USAGE und DISPLAY sind Schlüsselwörter, IS ist ein Wahlwort.) - Angaben in geschweiften Klammern kennzeichnen Wahlmöglichkeiten. (Grundsätzlich darf nur eine der untereinander geschriebenen Alternativen gewählt werden.) Angaben in eckigen Klammern stellen Zusätze dar und können nach Belieben verwandt oder weggelassen werden. Beispiel:
[USAGE IS]
BINARY COMPUTATIONAL COMP DISPLAY INDEX PACKED-DECIMAL
- Nicht-reservierte COBOI^Wörter (Programmiererwörter) und Literale, also alle vom Benutzer zu definierenden Wörter, werden klein geschrieben. - Enthalten geschweifte Klammern nur eine Möglichkeit, so muß diese angegeben werden. In einem derartigen Fall zeigen die geschweiften Klammern die Möglichkeit einer Wiederholung an. - Drei aufeinanderfolgende Punkte in einem Text weisen auf eine Auslassung hin. In einer Formatangabe zeigen sie die Position, in der ein in eckigen oder geschweiften Klammern enthaltener, vorangestellter Ausdruck beliebig oft wiederholt werden kann.
37
COBOL-Programmschema
Beispiel: Datenname-1 ADD
. . . TO {Datenname-2 [ROUNDED]} num. Literal [ON SIZE ERROR unbedingte Anweisung-1] [NOT ON SIZE ERROR unbedingte Anweisung-2]
[END-ADD]
Erklärung zur Formatbeschreibung der ADD-Anweisung: Die Anweisung beginnt mit dem Schlüsselwort ADD. Als erster Operand 8 folgt alternativ ein Datenname oder ein numerisches Literal. Die sich dann anschließenden 3 Punkte geben an, daß hier eine beliebige Anzahl von weiteren ersten Operanden aufgeführt werden kann (die wiederum aus einem Datennamen oder Literal bestehen können). Auf das Schlüsselwort TO folgt in geschweiften Klammern der zweite Operand, der immer ein Datenname sein muß, und ebenfalls mehrfach erscheinen darf. Bei der Ausfuhrung der Additionsanweisung wird der Inhalt des ersten Operanden (bzw. der ersten Operanden) zum zweiten Operanden (bzw. zu den zweiten Operanden) addiert. Die Summe der Werte steht im (in den) zweiten Operanden. Das in eckigen Klammern enthaltene COBOL-Schlüsselwort ROUNDED kann fortgelassen werden. Dasselbe gilt für die nachfolgenden Eintragungen.
2.5 COBOL-Programmschema Bei der Codierung eines COBOI^Programms sind eine Reihe formaler Vorschriften, die in einem festen Programmschema ihren Niederschlag finden, zu beachten. Dabei ist es grundsätzlich unerheblich, ob die Eingabe der Programmschritte unmittelbar am Bildschirm geschieht oder ob eine Vorformulierung mit Papier und Bleistift, für die entsprechende, standardisierte Formulare (die sog. Codierblätter) zur Verfügung stehen, erfolgt. Das COBOL-Programmschema baut sich zunächst aus 80 Schreibstellen umfassenden Zeilen auf, die dann in mehrere Bereiche weiter unterteilt werden (vgl. Abb. 13).
4
Um diesen Vorgang zu beschleunigen, werden Indextabellen im Regelfall vor Beginn einer Verarbeitung von dem Externspeicher in den Hauptspeicher geladen.
38
Allgemeine Grundlagen der COBOI^Sprache
I B M COBOL - Programmschema Seite
Programm
1
Programmierer
3
Kennung 73
Zeile
III
20
I
I
24
56
60
64
68
72
I
I II I
I
I
Abb. 13: COBOL-Programmschema
Erläuterungen zum Programmschema: Schreibstellen 1-6. In diesen Positionen kann eine Numerierung der Seiten und Zeilen erfolgen. Es handelt sich hier um ein Relikt aus den Zeiten der Lochkartenverarbeitung, das für die Programmierung am Bildschirm bedeutungslos geworden ist und allenfalls bei einer Verwendung von Codierblättern noch genutzt wird. Schreibstelle 7. Hier können folgende Sonderzeichen eingegeben werden: „*"
„r
„-"
Der Stern in Stelle 7 kennzeichnet einen rechts in der Zeile nachfolgenden beliebigen Text als Kommentar. Kommentare dienen der besseren Lesbarkeit des Programms. Sie werden in der Protokolliste des Quellenprogramms mit ausgegeben, beeinflussen jedoch in keiner Weise den Programmablauf. Der Schrägstrich bewirkt einen Vorschub auf eine neue Seite der Protokolliste. Ein zusätzlicher Text in dieser Zeile wird im allgemeinen als Kommentar gewertet. Auch mit dieser Möglichkeit soll die Übersichtlichkeit und damit die Lesbarkeit des Programms verbessert werden. Der Bindestrich kennzeichnet die entsprechende Zeile als Fortsetzungszeile der vorangegangenen Zeile. Von praktischer Bedeutung ist dieses Kennzeichen vor allem bei nicht-numerischen Literalen, die sich über mehr als eine Programmzeile erstrecken.
COBOL Programmschema
39
Schreibstellen 8-72. In diesen Stellen erfolgt die eigentliche Codierung des COBOL-Programms. Zwei Unterbereiche sind zu unterscheiden: Im Bereich A (Schreibstellen 8-11) müssen alle DIVISION-, SECTION- und PARAGRAPH-Namen sowie bestimmte Datenbeschreibungen beginnen (vgl. dazu Kapitel 3). Im Bereich B (Schreibstellen 12-72) beginnen - mit Position 12 oder weiter rechts - alle anderen Sprachelemente eines COBOL-Programms. Schreibstellen 73-80. Diese Positionen können für Dokumentationszwecke, z. B. die Eingabe einer Kurzversion der Programmbezeichnung, genutzt werden. Die Angaben in diesen Stellen haben keinen Einfluß auf den Programmablauf. Leerzeilen (d. h. Zeilen, die im Bereich der Positionen 7-72 keine Eintragungen enthalten) können in beliebiger Zahl und an beliebigen Stellen vorgesehen werden.
3 Aufbau eines COBOL-Programms
Ein COBOI^Programm besteht maximal aus folgenden 4 Programmteilen (DIVISIONS): - IDENTIFICATION DIVISION. (Erkennungsteil; enthält allgemeine Angaben zur Kennzeichnung des Programms). - ENVIRONMENT DIVISION. (Maschinenteil; enthält Angaben zur Programmumgebung, insbesondere zum eingesetzten Computer und den Dateien bzw. Datenträgern). - DATA DIVISION. (Datenteil; enthält die Detailbeschreibung der im Programm für die Darstellung der unterschiedlichen Daten benötigten Datenfelder). - PROCEDURE DIVISION. (Verfahrensteil; enthält die eigentlichen Verarbeitungsanweisungen). DIVISIONS müssen grundsätzlich immer in der obenstehenden Reihenfolge angegeben werden. Mit Ausnahme der IDENTIFICATION DIVISION werden alle DIVISIONS in SECTIONS (Kapitel) aufgeteilt. (Im Falle der PROCEDURE DIVISION ist eine Unterteilung in SECTIONS zulässig, aber nicht zwingend.) DIVISIONS bzw. SECTIONS können dann in Paragraphen, Sätze und Anweisungen weiter untergliedert werden. Diese mögliche Einteilung gilt allerdings nicht für jede DIVISION. DIVISION-Namen, SECTION-Namen und Paragraphennamen beginnen in Bereich A und werden mit einem Punkt abgeschlossen, auf den wiederum eine Leerstelle folgen muß. Ebenfalls im Bereich A einzugeben sind bestimmte Datenfelddefinitionen (FD-Eintragungen und Definitionen mit den Stufennummern Ol und 77, vgl. dazu Kapitel 4). Alle übrigen Sätze und alle Anweisungen beginnen an einer beliebigen Stelle im Bereich B. Sätze sind ebenfalls mit einem Punkt und einer nachfolgenden Leerstelle abzuschließen. Eine Anweisung kann dagegen auch durch ein Komma oder Semikolon und eine Leerstelle von einer anderen Eintragung getrennt werden. Ein Paragraph besteht immer aus einem Paragraphennamen und mindestens einem Satz.
IDENTIFICATION DIVISION
41
3.1 IDENTIFICATION DIVISION Die IDENTIFICATION DIVISION enthält - in maximal sechs Paragraphen - Angaben zur Kennzeichnung des Programms. Format:
IDENTIFICATION DIVISION. PROGRAM-ID. Programmname. [AUTHOR. [Kommentar],..] [INSTALLATION. [Kommentar],..] [DATE-WRITTEN. [Kommentar],..] [DATE-COMPILED. [Kommentar],..] [SECURITY. [Kommentar],..] Der Erkennungsteil und damit das COBOL-Programm beginnt mit der zwingend vorgeschriebenen Eintragung IDENTIFICATION DIVISION. Daran schließt sich der erste, ebenfalls obligatorische Paragraphenname PROGRAMID an, hinter dem der Programmname einzugeben ist. Für die Bildung des Programmnamens sind die Regeln für Programmiererwörter entsprechend anzuwenden; allerdings lassen bestimmte Compiler nur 6-8 Zeichen zu. Die Eingabe des Programmnamens bzw. der Kommentare erfolgt im Bereich B. In den nachfolgenden Paragraphen können der Name des Programmautors, die eingesetzte Anlage, das Datum der Fertigstellung des Programms, das Umwandlungsdatum und Angaben zur Sicherung des Programms vermerkt werden. Wird der Paragraph DATE-COMPILED codiert, so wird hier bei der Übersetzung vom Compiler das aktuelle Tagesdatum vermerkt. Die Verwendung der letzten fünf Paragraphen ist freigestellt; werden sie benutzt, so muß dies immer in der angegebenen Reihenfolge geschehen. Beispiel: IDENTIFICATION DIVISION. PROGRAM-ID. ÜBUNGSPROGRAMM. AUTHOR. MEIER. INSTALLATION. OLIVETTI M24-. DATE-WRITTEN. 1. MAI 1988. DATE-COMPILED. 2. MAI 1988. SECURITY. KEINE EINSCHRÄNKUNGEN.
42
Aufbau eines COBOL-Programms
з.2 ENVIRONMENT DIVISION Die ENVIRONMENT DIVISION enthält die Beschreibung der für die Programmübersetzung und -ausfuhrung eingesetzten Zentraleinheit. Daneben sind Angaben über die im Programm benötigten Dateien, ihre Speicherungs-und Zugriffsformen, die ihnen zugeordneten Peripheriegeräte и.a.m. möglich. Die Verwendung der ENVIRONMENT DIVISION ist wahlfrei. Format: ENVIRONMENT DIVISION. [CONFIGURATION SECTION. [SOURCE-COMPUTER. [Computername]] [OBJECT-COMPUTER. [Computername]] [SPECIAL-NAMES. [Angabe von speziellen Namen]]] [INPUT-OUTPUT SECTION. FILE-CONTROL. {Angaben zur Dateizuordnung}... [I-O-CONTROL. [Angabe zur Dateizuordnung]]] Die ENVIRONMENT DIVISION gliedert sich in zwei Kapitel, die CONFIGURATION SECTION und die INPUT-OUTPUT SECTION. In der CONFIGURATION SECTION können zunächst - hinter den Paragraphennamen SOURCE-COMPUTER und OBJECT-COMPUTER - die Namen der für die Programmumwandlung bzw. Programmausführung eingesetzten EDV-Anlagen angegeben werden. Von den verschiedenen unter SPECIAI^NAMES möglichen Eintragungen ist für den deutschen Anwender vor allem der Zusatz „DECIMAL-POINT IS COMMA" von Interesse. Diese Angabe bedeutet, daß im gesamten Programm die Funktionen des Kommas und des Dezimalpunktes ausgetauscht werden (vgl. Punkt 4.2.3.5). Weitere Eintragungen werden im Zusammenhang mit einzelnen Anweisungen behandelt. Die INPUT-OUTPUT SECTION ist grundsätzlich nur erforderlich, wenn im Programm Dateien (vgl. dazu Punkt 1.3) zu verarbeiten sind. Im Paragraphen FILE-CONTROL werden alle Dateien mit Hilfe der SELECT ASSIGNKLAUSEL den für ihre Verarbeitung zuständigen externen Geräten zugeordnet. In dem untenstehenden Beispiel 9 wird eine „Personaldatei" dem 9
Die hier verwandten Bezeichnungen für die externen Geräte und die Dateien gelten für die „VS COBOL Workbench" der Firma Micro Focus unter dem Betriebssystem MS-DOS. Für andere Compiler bzw. EDV-Systeme finden andere Gerätebezeichnungen Anwendung.
DATA DIVISION
43
Laufwerk A eines Mikrocomputers und einer dort auf einer Diskette gespeicherten Datei mit dem Namen „Persdat" zugeordnet. Vereinfacht gesagt, wird damit an dieser Stelle dem Compiler mitgeteilt, daß eine im Programm unter dem Namen „Personaldatei" beschriebene und verarbeitete Datei auf einer Diskette in Laufwerk A unter dem Namen „Persdat" zu finden ist. Der Zusatz „ORGANIZATION IS SEQUENTIAL" gibt an, daß es sich um eine sequentielle Datei handelt. Im Regelfall ist diese Klausel entbehrlich, da die meisten Compiler für eine Datei die sequentielle Verarbeitung als Standard (sog. „default"-Wert) unterstellen. Entsprechend wird in der zweiten SELECT AS SIGN-Eintragung eine Druckdatei, die Daten für eine Ausgabeliste enthält, der Ausgabeeinheit Drucker (abgekürzt: LP für Line Printer) zugewiesen. Zur Erläuterung des Paragraphen I-O-CONTROL, die den Rahmen einer COBOI^Einführung sprengen würde, sei auf die weiterführende Literatur verwiesen. Beispiel: E N V I R O N M E N T DIVISION. C O N F I G U R A T I O N SECTION. SOURCE-COMPUTER. M24. OBJECT-COMPUTER. M24. SPECIAL-NAMES. D E C I M A L - P O I N T IS COMMA. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT P E R S O N A L D A T E I A S S I G N TO "A:PERSDAT" O R G A N I Z A T I O N IS SEQUENTIAL. SELECT DRUCKDATEI A S S I G N TO ": LP :".
3.3 DATA DIVISION Die DATA DIVISION enthält die Beschreibung aller im Programm verarbeiteten oder erzeugten Daten. Die Verwendung der DATA DIVISION in einem COBOLrQuellenprogramm ist wahlfrei. Format: DATA DIVISION. [FILE SECTION. [Dateibeschreibung {Datensatzbeschreibung}...]]
44
Aufbau eines COBOLProgramms
fWORKING-STORAGE SECTION. Stufennummer-77-Beschreibungen Datensatzbeschreibungen TLINKAGE SECTION. Stufennummer-77-Beschreibungen Datensatzbeschreibungen rCOMMUNICATION SECTION.l [REPORT SECTION.l Die DATA DIVISION gliedert sich in fünf Kapitel, von denen in diesem Buch nur die FILE SECTION, die WORKING-STORAGE SECTION und die LINKAGE SECTION näher behandelt werden. Die FILE SECTION dient der Beschreibung der im Programm verwandten Ein-Ausgabedateien. Für jede Datei werden bestimmte physische Eigenschaften sowie der Aufbau der Sätze und der Datenfelder im einzelnen dargestellt. Werden von dem Programm keine Ein-Ausgabedateien verarbeitet, so kann die FILE SECTION entfallen. In der WORKING-STORAGE SECTION werden dagegen alle Datenfelder beschrieben, die nicht Bestandteil von Ein- oder Ausgabedateien sind und nur programmintern benötigt werden. Beispiele für derartige Felder sind Hilfsfelder für Rechenoperationen (z.B. Zwischensummen- und Endsummenfelder), Zähler, Programmschalter usw.. Werden diese Felder nicht benötigt, so kann auch auf die WORKING-STORAGE SECTION verzichtet werden. Die LINKAGE SECTION schließlich wird nur im Zusammenhang mit dem Einsatz von Unterprogrammen gebraucht (vgl. Kapitel 11). Sie dient zur Übermittlung von Daten zwischen dem Unterprogramm und dem aufrufenden Programm. Beispiele zur Beschreibung von Dateien und Datenfeldern in der DATA DIVISION folgen in Kapitel 4.
3.4 PROCEDURE DIVISION Die PROCEDURE DIVISION enthält die zur Lösung der Aufgabenstellung erforderlichen Verarbeitungsanweisungen und stellt somit den eigentlichen Hauptteil eines COBOL^Programms dar.
PROCEDURE DIVISION
45
Bei den nachfolgenden Formatangaben wird auf die Beschreibung der sog. DECLARATIVES verzichtet. Format 1: PROCEDURE DIVISION. {Section-Name SECTION. [Paragraphenname. [ S a t z ] . . . ] . . . } . . . Format 2: PROCEDURE DIVISION. {Paragraphenname. [ S a t z ] . . . } . . . Wie die obigen Formatangaben zeigen, kann die PROCEDURE DIVISION in SECTIONS unterteilt werden, die ihrerseits wiederum in Paragraphen gegliedert werden. Die Verwendung von SECTIONS ist freigestellt; steht jedoch ein Paragraph in einer SECTION, so müssen auch alle anderen Paragraphen Bestandteil einer SECTION sein. Die Festlegung der SECTION-Namen erfolgt entsprechend den für Programmiererwörter geltenden Regeln (vgl. Punkt 2.3.2.2). Auf den Namen folgt das Wort SECTION, das durch einen Punkt abgeschlossen wird. Paragraphennamen sind analog den Programmiererwörtern zu bilden und enden ebenfalls mit einem Punkt. Der nachfolgende Satz kann dann, nach einer weiteren Leerstelle, in derselben Zeile codiert werden, muß jedoch grundsätzlich in Bereich B beginnen. SECTIONS und Paragraphen werden auch unter dem Oberbegriff Prozeduren zusammengefaßt. Ihre Namen werden entsprechend als Prozedurnamen bezeichnet. Beispiel: PROCEDURE ANFANGS
DIVISION.
SECTION.
VORLAUF. Sätze
VERARBEITUNGS LESEN. Sätze
. . .
SECTION.
. . .
46
Aufbau eines COBOL-Programms
SATZAUSWAHL. Sätze . . .
GRUFPENVERARB. Sätze . . .
Erläuterungen: Das obenstehende Beispiel enthält zwei SECTIONS, die ANFANGS SECTION und die VERARBEITUNGS SECTION. Die erste SECTION enthält den Paragraphen VORLAUF, die zweite SECTION die Paragraphen LESEN, SATZAUSWAHL und GRUPPENVERARB. SECTION- und Paragraphennamen beginnen immer in Bereich A. Die Sätze und Anweisungen dagegen, die in derselben Zeile wie der Paragraphenname oder in der nächstfolgenden Zeile beginnen können, müssen in Bereich B codiert werden.
4 Datenbeschreibung
Die Beschreibung der in einem COBOI^Programm verwandten Daten ist, wie in Kapitel 3 erläutert wurde, Inhalt der DATA DIVISION. Nachfolgend wird im einzelnen dargestellt, welche Informationen zu den verschiedenen Dateneinheiten (Dateien, Datensätze, Datenfelder) anzugeben sind und wie diese Angaben im Programm codiert werden müssen.
4.1 Dateierklärung
(FD-Eintragung)
Jede in einem COBOI^Programm zu bearbeitende Ein-Ausgabedatei, die in der ENVIRONMENT DIVISION durch die SELECT . . . ASSIGN-Eintrai gung einen Dateinamen bekommen hat und einer externen Einheit zugeordnet wurde, muß in der FILE SECTION näher beschrieben werden. Dies geschieht durch die FD-Eintragung (FD = File Description, d. h. Dateibeschreibung). Format (verkürzt): FD Dateiname BLOCK CONTAINS Ganzzahl-1
RECORDS CHARACTERS
[ RECORD CONTAINS Ganzzahl-2 CHARACTERS ] ^ n
^ .
T
f RECORD IS 1 f STANDARD 1 " I RECORDS ARE I I OMITTED J
. i RECORD IS 1 ir. , RECORDS ARE ) < D a t e n s a t z n a m e } . . . .
Erläuterungen: FD kennzeichnet den Anfang der Dateibeschreibung und steht immer vor dem Dateinamen (der bereits in einer SELECT . . . ASSIGN-Eintragung erstmalig definiert wurde). Die FD-Eintragung beginnt in der ersten Stelle des A-Bereiches des Programmschemas. Nach mindestens einer Leerstelle folgt dann der Dateiname
48
Datenbeschreibung
(Vorsicht! Bei älteren Compilern, die noch nicht die n e u e N o r m berücksichtigen, m u ß dieser im Bereich B beginnen). Alle anderen Klauseln der F D Eintragung m ü s s e n dagegen im Bereich B codiert werden. Die Verwendung der auf F D folgenden Angaben ist wahlfrei, ihre Reihenfolge ist beliebig. Die G e s a m t h e i t dieser Eintragungen stellt einen Satz dar, der mit e i n e m Punkt u n d einem nachfolgenden Leerzeichen abgeschlossen werden muß. Die BLOCK CONTAINS-Klausel ist n u r dann erforderlich, w e n n mehrere logische Sätze (vgl. Punkt 1.3.1) zu e i n e m sogenannten Block oder physischen Satz zusammengefaßt werden. Die Anzahl der logischen Sätze pro Block wird durch den Blockungsfaktor angegeben. Wegen ihrer Vorteile - einer schnelleren Verarbeitung der Datei u n d einer besseren Kapazitätsauslastung des externen Datenträgers - stellt eine derartige Blockung von Datensätzen den Regelfall bei der Datenspeicherung dar. Die Ganzzahl-1 in der BLOCK CONTAINS-Klausel gibt entweder die Anzahl der einzelnen Zeichen (engl.: characters) oder Datensätze (engl.: records) in einem Block an. Die RECORD CONTAINS-Klausel ermöglicht die Angabe der Anzahl der in einem Datensatz enthaltenen Zeichen (als Ganzzahl-2). Sie dient ausschließlich der D o k u m e n t a t i o n . D e r Compiler ermittelt die Länge des Datensatzes aus der nachfolgenden Datensatzbeschreibung (vgl. Punkt 4.2). Die LABEL RECORD-Klausel macht eine Aussage darüber, ob in einer Datei sog. Kennsätze oder Etiketten (engl.: labels) vorhanden sind. Kennsätze dürfen nicht mit den Datensätzen einer Datei verwechselt werden. Sie werden im Regelfall zusätzlich zu den Datensätzen einer Datei gespeichert u n d enthalten Angaben, die in erster Linie den Schutz der Datensätze bezwecken (z.B. Codewörter). Bei Verwendung von Kennsätzen wird das Betriebssystem, vor einem Zugriff auf die eigentlichen Datensätze, zunächst den Inhalt der Kennsätze ü b e r p r ü f e n u n d mit vorher eingegebenen Informationen vergleichen. N u r w e n n bei dieser P r ü f u n g keine Unstimmigkeiten auftreten, k o m m t es zu einer Verarbeitung der Datei. D e r Zusatz S T A N D A R D in der LABEL RECORD-Klausel bedeutet, daß in einer Datei die von d e m jeweiligen Betriebssystem vorgesehenen Standardkennsätze enthalten sind. Der Zusatz O M I T T E D sagt dagegen aus, daß in der Datei keine Kennsätze gespeichert sind. In der n e u e n D I N - N o r m wurde die LABEL RECORD-Klausel mit dem Zusatz „veraltet" (engl.: obsolete) gekennzeichnet. Damit ist davon auszugehen,
49
Dateierklärung
daß sie in der nächsten COBOL-Norm ganz entfallen wird. Um spätere Programmänderungen zu vermeiden, sollte daher von vornherein auf die Verwendung dieser Klausel verzichtet werden. Die DATA RECORD-Klausel dient zur Angabe des Namens des in der Datei enthaltenen Satzes. Da in einer Datei mehrere unterschiedlich aufgebaute Sätze (bzw. Satzarten) vorhanden sein können, besteht auch die Möglichkeit, mehrere Satznamen anzugeben. Grundsätzlich sind alle hier erwähnten Satzarten anschließend unter der Stufennummer Ol (vgl. Punkt 4.2) näher zu beschreiben. Wichtig! Auch wenn für eine Datei mehrere Datensatznamen angegeben werden und die Sätze anschließend in der DATA DIVISION einzeln und detailliert beschrieben werden, reserviert der Compiler für alle Sätze nur einen Speicherbereich im Arbeitsspeicher. In diesem Speicherbereich kann immer nur ein Satz stehen. Es ist daher beim Programmtest ggf. sorgfältig zu prüfen, welcher Satz sich gerade im reservierten Speicherbereich befindet. Beispiele: FD F E R S O N A L D A T E I B L O C K CONTAINS 8 BECORDS RECORD CONTAINS 100 CHARACTERS L A B E L RECORD IS STANDARD DATA RECORD IS PERSONALSATZ. Erläuterungen:
Die beschriebene Datei hat den Namen Personaldatei. Die Sätze der Datei sind geblockt (Blockungsfaktor 8) und haben eine Länge von jeweils 100 Zeichen. Die Datei beinhaltet einen Standardkennsatz. Als Datensätze enthält sie ferner nur Personalsätze. FD A U F T R A G S D A T E I B L O C K CONTAINS 120 CHARACTERS RECORD CONTAINS 120 CHARACTERS L A B E L RECORDS A R E OMITTED DATA RECORDS A R E A U F T R A G S G R U N D S A T Z
AUFTRAGSPOSITIONSSATZ.
Erläuterungen:
Die beschriebene Datei hat den Namen Auftragsdatei und ist ungeblockt. Die Satzlänge beträgt 120 Zeichen. Kennsätze sind nicht gespeichert; es gibt aber zwei Arten von Datensätzen: Auftragsgrundsätze und Auftragspositionssätze.
50
Datenbeschreibung
4.2 Datensatz- und Datenfelderklärung Die Beschreibungen von Datensätzen und einzelnen Datenfeldern erfolgen in den verschiedenen SECTIONS der DATA DIVISION. In der FILE SECTION werden - im Anschluß an die FD-Eintragung - die Datensätze der Ein-Ausgabedateien beschrieben. In der WORKING-STORAGE SECTION werden vor allem Datenfelder, die primär für die interne Verarbeitung benötigt werden, codiert. Für die Beschreibung eines Datensatzes bzw. Datenfeldes gilt folgendes Formal: Stufennummer
Datenname FILLER
PICTURE PIC
IS Zeichenkette
Erläuterungen:
Jede Datenerklärung in einem COBOL-Programm beginnt zunächst grundsätzlich mit einer sog. Stufennummer (engl.: level number). Darauf folgt der eigentliche Datenfeldname (auch Datenname oder Bezeichner genannt) oder das COBOl^Wort FILLER (vgl. Punkt 4.2.2). An das COBOL-Wort PICTURE bzw. die Kurzform PIC schließt sich die aus bestimmten Zeichen gebildete Zeichenkette oder Maske an, die die Länge des Datenfeldes und die Form ihres Inhaltes festlegt. Nachfolgend werden die Bestandteile der Datenbeschreibung im einzelnen dargestellt.
4.2.1 Stufennummernkonzept Als Stufennummern können die Zahlen 01-49, 66, 77 und 88 verwandt werden. Die Stufennummern 01-49 dienen zur Beschreibung von hierarchischen Datenstrukturen. Die Stufennummer 77 kennzeichnet unabhängige Datenfelder, die nicht Bestandteil einer Datenhierarchie sind. 66 und 88 sind ausschließlich für besondere Funktionen vorgesehen (zur Anwendung der Stufennummer 66 vgl. Kapitel 9, Punkt 9.3; zur Anwendung der Stufennummer 88 vgl. Kapitel 7, Punkt 7.4). Folgende Regeln sind bei der den Aufbau einer Datenhierarchie kennzeichnenden Vergabe von Stufennummern zu beachten: - Der oberste Begriff einer Datenhierarchie (häufig handelt es sich dabei um einen Datensatz einer Datei) bekommt immer die Stufennummer 01. Dieser Begriff wird auch als Datengruppe (engl.: group item) bezeichnet. Die
Datensatz- und Datenfelderklärung
51
Stufennummer Ol wird im Bereich A, Spalten 8 und 9, codiert. Nach mindestens einer Leerstelle folgt dann der Datenname. (Vorsicht! Compiler, die nach der alten COBOL-Norm arbeiten, verlangen die Eingabe des Datennamens im Bereich B). - Datenfelder auf untergeordneten Ebenen beginnen mit einer gegenüber der jeweils darüberliegenden Ebene höheren Stufennummer zwischen 02 und 49. Die Codierung beginnt an einer beliebigen Stelle im Bereich B. Durch mehrfaches abgestuftes Einrücken im Bereich B können dabei die verschiedenen Ebenen einer Datenhierarchie deutlich hervorgehoben und die Übersichtlichkeit verbessert werden (s. Beispiel unter 4.2.2). - Datenfelder auf der untersten Ebene, die nicht weiter unterteilt werden, bezeichnet man als Datenelemente (engl.: elementary items). - Die Stufennummern 02-49, die immer untergeordnete Datenebenen kennzeichnen, können innerhalb einer Datenhierarchie mehrfach vergeben werden. Die Stufennummer 01, die immer der obersten Datengruppe zugeordnet ist, darf in einer Datenhierarchie nur einmal erscheinen. - Die Numerierung der verschiedenen Ebenen kann durchaus Lücken enthalten. Damit wird ggf. die Einfügung neuer Datenebenen erleichtert. Die Stufennummer 77 steht vor unabhängigen Datenfeldern, die nicht Bestandteil einer Datenhierarchie sind. Sie darf nur in der WORKING-STORAGE SECTION und der LINKAGE SECTION verwandt werden. Ihre Eintragung erfolgt in den Spalten 8 und 9 des Programmschemas. Nach mindestens einer Leerstelle folgt dann der Datenname. Beispiele s.u. Punkt 4.2.2.
4.2.2 Datennamen Der zweite Bestandteil einer Datenerklärung ist der Datenname. Datennamen kennzeichnen Hauptspeicherfelder mit variablem Inhalt. Zu den Vorschriften für die Bildung von Datennamen vgl. Punkt 2.3.2. An die Stelle eines Datennamens kann in einer Datenerklärung auch das reservierte COBOI/Wort FILLER treten. Der Name FILLER bezeichnet Bereiche, die in einer Datenbeschreibung ggf. aus Gründen der Vollständigkeit enthalten sein müssen, die jedoch im Programm nicht verwandt werden und daher auch keinen eigenen Datennamen zugewiesen bekommen. Anders als bei den Datennamen, die immer ein ganz bestimmtes Hauptspeicherfeld bezeichnen und die aufgrund der erforderlichen Eindeutigkeit in einer DATA
52
Datenbeschreibung
DIVISION jeweils nur einmal vergeben werden dürfen, kann die Bezeichnung FILLER mehrfach bei der Beschreibung von Datenstrukturen eingesetzt werden. FILLER darf darüber hinaus auch als Gruppenbegriff verwendet werden. Ein mit FILLER definiertes Datenfeld kann in der PROCEDURE DIVISION nicht direkt angesprochen werden. Beispiele: Ein Personalsatz (Satzlänge 100 Zeichen) aus einer Personaldatei hat folgenden Aufbau: Satzfelder
Speicherstellen
Satz- Pers. art Nr.
1-2
3-8
Vorname
Name Nachname
9-25
26-45
Anschrift Straße Wohnort
46-65
66-85
Gehalt (mit 2 Dez. stellen)
f r e i
86-92
Die dazugehörige Datenbeschreibung (ohne PICTURE-Klausel) könnte dann wie folgt aussehen: 01
PERSONALSATZ. 02 SATZART . . . 02 F E R S O N A L N U M M E R . . . 02 NAME. 03 V O R N A H E . . . 03 N A C H N A M E . . . 02 ANSCHRIFT. 03 S T R A S S E . . . 03 WOHNORT . . . 02 GEHALT . . . 02 FILLER . . .
In dieser Datenbeschreibung stellen die Bezeichnungen PERSONALSATZ, NAME und ANSCHRIFT, weil sie weiter unterteilt werden, Oberbegriffe bzw. Datengruppen dar. Alle anderen Bezeichnungen verkörpern Datenelemente. Die gleiche Datenhierarchie hätte z.B. auch so codiert werden können: 01
PERSONALSATZ. 03 SATZART . . . 03 P E R S O N A L N U M M E R . . . 03 NAME. 06 VORNAME . . . 06 N A C H N A M E . . .
Datensatz- und Datenfelderklärung 03 03 03
53
ANSCHRIFT. 05 STRASSE . . . 05 W O H N O R T . . . GEHALT . . . FILLER . . .
Wie m a n sieht, sind Lücken bei der Vergabe der S t u f e n n u m m e r n u n d weitergehende Einrückungen möglich. Bei der N u m e r i e r u n g der D a t e n e l e m e n t e m u ß ferner nicht f ü r alle D a t e n e l e m e n t e die gleiche S t u f e n n u m m e r vergeben werden. Zu beachten ist in diesem Falle nur, daß die S t u f e n n u m m e r der D a t e n e l e m e n t e über der des zugehörigen Gruppenbegriffes liegt.
4.2.3 PICTURE-Klausel Die PICTURE-Klausel beschreibt den Typ u n d die Länge eines Speicherfeldes (Datenfeldes). Sie besteht aus d e m reservierten C O B O L Wort PICTURE bzw. der entsprechenden Abkürzung PIC - u n d einer Zeichenkette (Maske). Format:
COBOL unterscheidet f ü n f Typen von Datenfeldern: -
alphabetische Datenfelder, alphanumerische Datenfelder, n u m e r i s c h e Datenfelder, druckaufbereitete alphanumerische Datenfelder, druckaufbereitete numerische Datenfelder. 1 0
4.2.3.1 Alphabetische Datenfelder Alphabetische Datenfelder k ö n n e n ausschließlich Buchstaben u n d Leerstellen speichern. Sie werden mit d e m Maskensymbol A definiert. Jeder Buchstabe A steht dabei f ü r eine Speicherstelle (im Regelfall ein Byte) des Arbeits-
10
Da die entsprechenden Felder nicht nur für die Ausgabe über den Drucker vorbereitet werden, sondern generell auch für die Ausgabe über andere Geräte, würde die Bezeichnung „ausgabeaufbereitet" den hier angesprochenen Sachverhalt genauer treffen als der Ausdruck „druckaufbereitet". Die eigentliche Aufbereitung für die Druckerausgabe dürfte allerdings immer noch den häufigsten Anwendungsfall darstellen. Aus diesem Grunde und weil in der Programmierpraxis - zumal in der COBOL-Programmierung - nach wie vor unverändert von „Druckaufbereitung" gesprochen wird, wird auch hier dieser Begriff beibehalten.
54
Datenbeschreibung
speichers. Die Zahl der zur Beschreibung eines Datenfeldes eingesetzten „A's" gibt also die Speicherfeldlänge an. Beispiel: 03 VORNAHE PIC
AAAAAAAAAAAAAAAAA.
Unter dem Datennamen VORNAME wird ein 17 Stellen umfassendes Speicherfeld definiert, das nur Buchstaben und Leerzeichen aufnehmen kann. (Ein Vorname, der z. B. einen Bindestrich enthält, kann in diesem Feld also nicht gespeichert werden.) Die Datenfeldbeschreibung ist grundsätzlich mit einem Punkt abzuschließen. Eine verkürzte Schreibweise der obigen Felddefinition wird durch die Verwendung eines sog. Wiederholungsfaktors ermöglicht. Diese Abkürzung ist bei allen mehrfach hintereinander auftretenden Maskensymbolen zulässig. Beispiel: 03 V O R N A M E PIC A(17).
Die Verwendung des Maskensymbols A geschieht recht selten. Üblicherweise wird auch für die Definition von Namensfeldern das Symbol X (s. u.) benutzt. 4.2.3.2 Alphanumerische Datenfelder
Alphanumerische Datenfelder können alle in dem jeweiligen Code (vgl. Kapitel 1, Punkt 1.2.2) verschlüsselbaren Zeichen (eingeschlossen sind dabei wiederum Leerstellen) enthalten. Sie werden im Regelfall mit dem Maskensymbol X definiert. (Grundsätzlich ist bei alphanumerischen Feldern auch eine Mischung der Symbole A, X und 9 möglich, die jedoch nur selten angewandt wird.) Mit alphanumerischen Feldern kann nicht gerechnet werden. Beispiel: 03 WOHNORT PIC XXXXXXXXXXXXXXXXXXXX. 03 WOHNORT PIC X(20) .
oder
4.2.3.3 Numerische Datenfelder
Numerische Datenfelder können nur die Ziffern von 0-9 enthalten. Leerstellen sind nicht zulässig. Die Definition numerischer Felder erfolgt mit dem Maskensymbol 9. Als Zusatzsymbole können die Zeichen V und S verwandt werden.
Datensatz- und Datenfelderklärung
55
Alle Datenfelder, die für Rechenoperationen eingesetzt werden, müssen immer numerisch definiert werden. Beispiel: 02 P E R S O N A L N U M M E R PIC 9(6).
Symbol „V" Dieses Symbol bestimmt in numerischen Feldern die Lage eines gedachten Dezimalpunktes. Es unterteilt ein Speicherfeld in einen ganzzahligen Teil und einen Teil für Dezimalstellen und darf nur einmal in einer PICTUREKLAUSEL aufgeführt werden. V belegt keine eigene Speicherstelle und wird entsprechend bei der Ermittlung der Feldlänge nicht mitgezählt. Beispiel: 02 GEHALT PIC 99999V99. oder 02 GEHALT PIC 9(5)V99. oder 02 GEHALT PIC 9(5)V9(2).
Unter dem Datennamen GEHALT wird ein insgesamt 7 Speicherstellen langes Feld im Arbeitsspeicher definiert. Die letzten 2 Speicherstellen des Feldes sind für die Aufnahme eventuell vorhandener Dezimalstellen vorgesehen. Die Abkürzung der nach V folgenden Ziffernreihe durch Verwendung des Wiederholungsfaktors im untersten Beispiel ist nicht unbedingt sinnvoll, weil die Zeichenkette dadurch verlängert wird, aber möglich. Symbol „S" Dieses Symbol zeigt an, daß in dem Speicherfeld ein Vorzeichen enthalten ist. In einem mit S definierten Feld können also auch negative Werte dargestellt werden. Fehlt S, so wird der gespeicherte Wert grundsätzlich als positiv behandelt. S muß immer als erstes Zeichen einer Zeichenkette codiert werden. Wie V belegt auch S keine eigene Speicherstelle, geht also auch nicht in die Ermittlung der Speicherfeldlänge ein. Beispiel: 77 SALDO PIC S999V99.
Es handelt sich um ein 5 Speicherstellen langes Feld, das eine max. fünfstellige Zahl (davon 2 Dezimalstellen) aufnehmen kann. Ferner wird in diesem Feld ein positives oder negatives Vorzeichen gespeichert. (Zur internen Darstellung von Vorzeichen vgl. Kapitel 1, Punkt 1.2.3).
56
Datenbeschreibung
Nach der Darstellung der PICTURE-Klausel für alphabetische, alphanumerische und numerische Felder kann nun auch die Beschreibung des Beispiels „Personalsatz" vervollständigt werden. Um die Zusammenhänge zwischen dem an verschiedenen Stellen des Programms erwähnten zugehörigen Dateinamen und dem Datensatznamen zu zeigen, werden diese Eintragungen noch einmal mit aufgeführt. ENVIRONMENT
DIVISION.
FILE CONTEOL. SELECT PERSONALDATEI A S S I G N TO O R G A N I Z A T I O N IS SEQUENTIAL. DATA DIVISION. FD PERSONALDATEI
01
"A:PERSDAT"
DATA RECORD IS PERSONALSATZ. PERSONALSATZ. 02 SATZART PIO XX. 02 P E R S O N A L N U M M E R PIC 9(6). 02 NAME. 03 V O R N A M E PIC X(17). 05 N A C H N A M E PIC X(20). 02 ANSCHRIFT. 03 STRASSE PIC X(20). 03 W O H N O R T PIC X(20). 02 GEHALT PIC 9(5)V99. 02 FILLER PIC X(8).
Bei der Codierung von Datenbeschreibungen sind folgende Regeln zu beachten: - Datengruppen dürfen keine PICTURE-Klausel, Datenelemente müssen eine PICTURE-Klausel enthalten. - Eine PICTURE-Zeichenkette darf nicht mehr als 30 Zeichen enthalten. Der durch die Zeichenkette definierte Speicherplatz kann - bei Einsatz des Wiederholungsfaktors - jedoch mehr als 30 Zeichen umfassen. (X(20) entspricht einer Länge von 5 Zeichen). - Zahlen dürfen maximal 18 Ziffern enthalten. 4.2.3.4 Druckaufbereitete alphanumerische Datenfelder
Zur Druckaufbereitung von Datenfeldern: Die bisher behandelten drei Datenfeldtypen und die ihnen zugeordneten Maskensymbole zeigen die interne Darstellung von Daten im Arbeitsspeicher. Die Inhalte derartig definierter Speicherfelder können - mit Hilfe von Ausgabeanweisungen - auch über periphere Einheiten, wie z.B. Drucker, ausgegeben werden. Oft entspricht die in einer Liste oder auf dem Bildschirm
Datensatz- und Datenfelderklärung
57
erscheinende Darstellung dann aber nicht den Wünschen des Programmierers. Beispiel: In einem Datenfeld mit dem Namen KONTOSTAND (zugehörige PICTUREZeichenkette 999V99) wird der Wert 54325 gespeichert. Die letzten beiden Stellen der Zahl verkörpern Dezimalstellen. Nach dem Drucken des Feldes erscheint in der Liste 54325. Ein Dezimalpunkt, der die Dezimalstellen abteilt und damit den Wert erst richtig wiedergibt, wird nicht ausgegeben. Der Grund für diese unbefriedigende Ausgabe ist das Zeichen V, das lediglich einen gedachten Dezimalpunkt beschreibt. Der Wert wird zwar speicherintern richtig beschrieben, nicht jedoch bei der Ausgabe. Sollen im Arbeitsspeicher stehende Daten ausgegeben werden, so ist, um ihre Interpretierbarkeit sicherzustellen und die Lesbarkeit zu verbessern, oft eine besondere optische Aufbereitung erforderlich. Dieser Vorgang wird als Druckaufbereitung bezeichnet. Technisch gesehen läuft die Druckaufbereitung wie folgt ab. Zusätzlich zu dem eigentlichen Speicherfeld, in dem die Daten zunächst dargestellt werden, wird allein für die Ausgabe der Daten ein zweites Speicherfeld mit speziellen druckaufbereitenden Symbolen, die das gewünschte Ausgabebild gewährleisten, definiert. Unmittelbar vor der endgültigen Ausgabe werden die Daten dann mittels eines Übertragungsbefehls (MOVE-Anweisung) von dem ersten Feld (dem sog. Sendefeld) in das druckaufbereitete Feld (das Empfangsfeld) übertragen. Daran schließt sich die Ausgabe des Empfangsfeldes an. Für eine Druckaufbereitung von alphanumerischen Datenfeldern werden, über die bereits bekannten Maskensymbole A, X und 9 hinausgehend, als weitere Symbole die Zeichen B, 0 und / zur Verfügung gestellt. Anders als die Zeichen V und S, die einen gedachten Dezimalpunkt bzw. ein gedachtes Vorzeichen beschreiben und keine Speicherkapazität beanspruchen, benötigen alle druckaufbereitenden Zeichen grundsätzlich eigene Speicherstellen. Bei der Bestimmung der Länge eines Datenfeldes sind sie daher immer mitzuzählen. Symbol „B" Steht der Buchstabe B in einer PICTURE-Zeichenkette, so erscheint bei der Ausgabe in der entsprechenden Position eine Leerstelle (engl.: blank).
58
Datenbeschreibung
Symbol „ 0 "
Steht die Ziffer 0 in einer PICTURE-Zeichenkette, so erscheint bei der Ausgabe in der entsprechenden Position eine 0. Symbol „ / "
Steht das Zeichen / in einer PICTURE-Zeichenkette, so erscheint bei der Ausgabe in der entsprechenden Position ein /. Beispiele:
Sendefelder Feldname
PICTURE-Maske
Feldinhalt
DATUM SCHLUESSEL NAME NUMMER
1(6) x(9) A(9)
100588 889556781 JANMÜLLER 123
XXX
Empfangsfelder Feldname
PICTURE-Maske
Druckbild
ADATUM ASCHLUESSEL ANAME ANUMMER
XXBXXBXX XXX/XX/XXXX AAABA(6) XXXOOO
10 05 88 889/55/6781 J A N MÜLLER 123000
Erläuterungen:
Die in den Sendefeldern gespeicherten Daten werden mit MOVE-Anweisungen (vgl. Kapitel 5) in die Empfangsfelder übertragen. Im ersten Falle würde diese Anweisung MOVE EDATUM TO
ADATUM
lauten. (Analog dazu wären die weiteren Datenübertragungen zu codieren.) Die anschließende Ausgabe der Empfangsfelder mit Hilfe entsprechender Befehle über einen Drucker (oder Bildschirm) ergibt die unter der Überschrift „Druckbild" beschriebene Darstellung.
Datensatz- und Datenfelderklärung
59
4.2.3.5 Druckaufbereitete numerische Datenfelder
In der Praxis wesentlich bedeutender als die Druckaufbereitung von alphanumerischen Datenfeldern ist die Druckaufbereitung von numerischen Feldern. Als weitere Druckaufbereitungssymbole stehen hier, neben den bereits bekannten Zeichen B, 0 und /, die Zeichen Z, *, +, -, $, DB, CR, . und , zur Verfügung. Jedes einzelne druckaufbereitende Zeichen belegt eine Speicherstelle. Die Zeichen DB und CR benötigen zwei Speicherstellen. Auf die Beschreibung der Zeichen DB, CR und $ wird hier, wegen ihrer sehr seltenen Verwendung, verzichtet. Wichtig! Druckaufbereitete numerische Datenfelder dürfen nicht für Rechenoperationen eingesetzt werden. Symbol „." Steht das Zeichen . in einer PICTURE-Zeichenkette, so wird bei der Ausgabe des Datenfeldes der jeweilige Wert mit einem Dezimalpunkt dargestellt. Voraussetzung für eine dezimalstellengerechte Wiedergabe ist, daß im Sendefeld durch das Zeichen V bereits eine Trennung des ganzzahligen Teils von den Dezimalstellen erfolgte. Der Dezimalpunkt erscheint bei der Ausgabe des Empfangsfeldes dann an der Stelle der Zahl, die vorher durch das V definiert wurde. Beispiel: Um das bereits zu Beginn des Gliederungspunktes 4.2.3.4 erwähnte Datenfeld KONTOSTAND mit der PICTURE-Zeichenkette 999V99 und dem Inhalt 54325 wie gewünscht mit Dezimalpunkt auszugeben, ist ein zweites, druckaufbereitetes Datenfeld mit PICTURE 999.99 zu definieren. Nach der Übertragung der Daten des ersten Feldes in das zweite Feld und der anschließenden Ausgabe erscheint dann die gewünschte Darstellung 543.25. Die Druckaufbereitung erfolgt immer dezimalstellengerecht. Ist das Empfangsfeld größer als der darzustellende Wert, so werden die nicht benötigten Stellen mit Nullen aufgefüllt. Im umgekehrten Fall werden Ziffern der auszugebenden Zahl abgeschnitten.
60
Datenbeschreibung
Beispiele: Sendefelder Feldname
PICTURE-Maske
Feldinhalt
BETRAG WERT SUMME
9(5)V99 9(4)V9(4) 99V99
0098765 23403333 3568
Empfangsfelder Feldname
PICTURE-Maske
Druckbild
ABETRAG AWERT ASUMME
9(4).99 999-99 9(5)-999
0987-65 340.33 00035-680
Erläuterungen:
Die in den Sendefeldern gespeicherten Daten werden mit MOVE-Anweisungen in die entsprechenden, jeweils mit A beginnenden Empfangsfelder übertragen. Nach der Ausgabe der Empfangsfelder ergibt sich die unter der Überschrift Druckbild beschriebene Darstellung. Der Dezimalpunkt darf nur einmal in einer Zeichenkette auftauchen. Gemäß ANS COBOL 85 kann der Dezimalpunkt auch, anders als in früheren COBOLNormen, als letztes Zeichen einer Maske ausgegeben werden, wenn der abschließende Punkt unmittelbar folgt. Symbol „," Steht das Zeichen, in einer PICTURE-Zeichenkette, so wird bei der Ausgabe des Datenfeldes an der entsprechenden Stelle des Wertes ein Komma eingefügt. Praktisch bedeutsam ist diese Möglichkeit, um z.B. sehr lange Zeilen optisch zu unterteilen. Anders als der Dezimalpunkt kann das Komma in einer PICTURE-Maske mehrfach gesetzt werden.
61
Datensatz- und Datenfelderklärung
Beispiele: Sendefelder Feldname
PICTURE-Maske
Feldinhalt
BETRAG-1 FELDA ZAHL
9(5)V99 9(7) 9(5)
0432150 9876543 00125
Empfangsfelder Feldname
PICTURE-Maske
Druckbild
ABETRAG-1 AFELDA AZAHL
99,999-99 9,999,999-9 99,999-
04,321.50 9,876,543.0 00,125
Wird im Druckbild statt des Dezimalpunktes ein Dezimalkomma und statt der Unterteilung der Zahlen mit Kommas eine mit Punkten gewünscht, so bietet COBOL dazu eine einfache Möglichkeit. Die Eintragung DECIMALPOINT IS COMMA unter dem Paragraphen SPECIAL-NAMES in der ENVIRONMENT DIVISION (vgl. Punkt 3.2) bewirkt, daß statt des Dezimalpunktes in den Datenfeldern ein Komma und statt des Kommas Punkte verwandt werden können. Die oben beschriebenen Regeln für Punkte gelten dann also für Kommas und umgekehrt. Symbol „Z" Steht das Zeichen Z in einer PICTURE-Zeichenkette, so werden bei der Ausgabe des Datenfeldes Nullen, die in den mit Z gekennzeichneten Speicherstellen stehen, unterdrückt, also nicht ausgegeben. Statt der Nullen erscheinen Leerstellen im Druckbild. Z dient ausschließlich zur Unterdrückung führender~N\A\en, d. h. von Nullen, die im Speicherfeld links vor der ersten von Null abweichenden Ziffer stehen. Grundsätzlich sollte Z in einer PICTURE-Zeichenkette nur links von dem Maskensymbol 9 bzw. vor dem Dezimalpunkt aufgeführt werden. Erscheint Z rechts von dem Zeichen 9 bzw. hinter dem Dezimalpunkt, dann erfolgt in diesen Positionen keine Nullenunterdrückung mehr. Die Wirkung von Z entspricht in derartigen Fällen der des Symbols 9.
62
Datenbeschreibung
Steht ein Dezimalpunkt oder Komma in dem mit Z in der PICTURE-Maske definierten Bereich und wird in diesem Bereich - aufgrund der gespeicherten Daten - die Nullenunterdrückung wirksam, so werden auch Dezimalpunkt bzw. Komma nicht ausgegeben. An ihrer Stelle erscheinen wiederum Leerstellen. Beispiele: Sendefelder Feldname
PICTURE-Maske
Feldinhalt
ZWISU BETRAG-1 BETRAG-2 BETRAG-3 FELD
9(5)V99 9(5)V99 9(5)V99 9(4) 9(5)
0432199 0000050 0000000 0000 00079
Empfangsfelder Feldname
PICTURE-Maske
Druckbild
AZWISU ABETRAG-1 ABETRAG-2 ABETRAG-3 AFELD
ZZ,ZZ9.99 ZZ,ZZ9.99 ZZ,ZZ9-ZZ zzzz Z9999
Ll2,321 .99 I I I I I 10.50 II I I I lo. 0 0 4Leerstellen U0079
BLANK WHEN ZERO-Klausel Format: BLANK WHEN ZERO Sind in einem mit Z definierten Feld (vgl. Beispiel ABETRAG-3) nur Nullen vorhanden, dann erscheint bei der Ausgabe eine entsprechende Anzahl von Leerstellen. Die gleiche Wirkung kann auch mit der Eintragung BLANK WHEN ZERO hinter der PICTURE-Klausel erreicht werden. Enthält ein mit diesem Zusatz gekennzeichnetes, numerisch definiertes Speicherfeld (Datenelement) ausschließlich Nullen, dann werden bei der Ausgabe des Feldes die Nullen unterdrückt. An ihrer Stelle erscheinen Leerstellen.
63
Datensatz- und Datenfelderklärung
Beispiel: Sendefeld: Empfangsfeld: Druckbild:
PREIS PIC 9 ( 4 ) V 9 9 (Feldinhalt 000000) APREIS PIC ZZZ9-99 BLANK WHEN ZERO 7 Leerstellen
Symbol „*" Steht das Zeichen * in einer PICTURE-Zeichenkette, so werden bei der Ausgabe des Datenfeldes - wie bei Verwendung des Symbols Z - führende Nullen unterdrückt. Anstelle der Nullen erscheinen jedoch keine Leerstellen, sondern Sterne. Diese „Schutzsterne" sollen eine Verfälschung von Beträgen durch Vorsetzen zusätzlicher Ziffern verhindern. In einer PICTURE-Zeichenkette kann jeweils nur das Zeichen Z oder * verwandt werden. Für die Anwendung des Symbols * gelten dieselben Regeln wie für das Symbol Z. Beispiele: Sendefelder Feldname
PICTURE-Maske
Feldinhalt
BRUTTO NETTO GEHALT
9(6) 9(5)V99 9(5)V99
000465 0000123 0543210
Empfangsfelder Feldname
PICTURE-Maske
Druckbild
ABRUTTO ANETTO AGEHALT
* (5)9 * *,* *9•99 * *,* *9•99
* * *465 ** * * ^ 25 *5,432.10
Symbole „+" und „-" Steht das Zeichen + oder - in einer PICTURE-Zeichenkette, so wird bei der Ausgabe des Datenfeldes, in Abhängigkeit von bestimmten Voraussetzungen, an der definierten Stelle ein positives oder negatives Vorzeichen ausge-
64
Datenbeschreibung
geben oder unterdrückt. Folgende Regeln sind im einzelnen dabei zu beachten: - In einer PICTURE-Zeichenkette kann immer nur das Zeichen + oder verwandt werden. - Die Zeichen + oder - können am Anfang oder Ende einer PICTUREMaske stehen. - Die Angabe des Symbols + bewirkt, daß bei der Ausgabe des Feldes bei einem positiven Wert das Zeichen +, bei einem negativen Wert das Zeichen - an der definierten Stelle erscheint. - Die Angabe des Symbols - bewirkt, daß bei der Ausgabe des Feldes bei einem negativen Wert das Zeichen -, bei einem positiven Wert jedoch kein Vorzeichen erscheint. - Wird ein Vorzeichen, entsprechend den oben formulierten Bedingungen, nicht ausgegeben, so erscheint an seiner Stelle ein Leerzeichen. In bestimmten Fällen (vgl. unten Beispiel AFELDD) können zwischen dem Vorzeichen und der ersten Ziffer des nachfolgenden Wertes mehrere Leerstellen auftreten. Diese fast immer unerwünschte Darstellung kann durch den Einsatz eines sog. gleitenden Vorzeichens vermieden werden. Das gleitende Vorzeichen wird durch eine Folge von mehreren + oder - Zeichen in der PICTURE-Zeichenkette ausgedrückt. Es bewirkt zunächst die Unterdrükkung führender Nullen und ersetzt damit das Zeichen Z. Darüber hinaus stellt es - in Abhängigkeit von den obigen Regeln - die Ausgabe des Vorzeichens unmittelbar vor der ersten von Null abweichenden Ziffer der Zahl sicher. Beispiele: Sendefelder Feldname
PICTURE-Maske
Feldinhalt
FELDA FELDB FELDC FELDD FELDE FELDF
S9(5) S9C5) S9(5)V99 S9(6)V9 S9(6)V9 S9(4)V99
+00324 +005^3 -0432176 +0000002 -0000015 +347500
Datensatz- und Datenfelderklärung
65
Empfangsfelder Feldname
PICTURE-Maske
Druckbild
AFELDA AFELDB AFELDC AFELDD AFELDE AFELDF
+9(5) -9(5) 99,999-99-
+00324U0054-3 04,321.76+l I I I I I In PO ™ U+34.75
+ZZZ,ZZ9.99
,—9.99 +(3)9-99
4.2.4 VALUE-Klausel Mit der VALUE-Klausel können Datenfeldern Anfangswerte zugewiesen werden, die bei Beginn der Programmausführung in diesen Feldern zur Verfügung stehen sollen. Die in den Datenfeldern gespeicherten Werte bleiben solange erhalten, bis durch Programmanweisungen Veränderungen des Feldinhaltes erfolgen. Format: VALUE IS Literal Die VALUE-Klausel kann nur in der WORKING-STORAGE SECTION und der COMMUNICATION SECTION verwandt werden. Eine Ausnahme von dieser Regel stellen mit der Stufennummer 88 gekennzeichnete sog. Bedingungsnamen dar (vgl. Kapitel 7), bei denen die VALUE-Klausel auch in der FILE SECTION und der LINKAGE SECTION eingesetzt werden kann. Die mit einer VALUE-Klausel einem Datenfeld zugewiesenen Werte müssen mit dem Typ des Datenfeldes übereinstimmen. Numerisch definierten Datenfeldern können nur numerische Literale zugewiesen werden. Entsprechendes gilt für alphabetisch bzw. alphanumerisch definierte Felder. Die Literale können auch in der Form von figurativen Konstanten auftreten. Die Länge des Literais sollte mit der Länge des Speicherfeldes übereinstimmen. Weicht die Länge des Literais von der Feldlänge ab, so gelten (analog zur MOVE-Anweisung vgl. Kapitel 5) folgende Regeln: - Bei numerischen Literalen wird grundsätzlich rechtsbündig in dem definierten Datenfeld gespeichert. Enthält das Literal durch einen Dezimalpunkt abgeteilte Dezimalstellen, so wird dezimalstellengerecht gespeichert.
Datenbeschreibung
66
Ist das Speicherfeld größer als das Literal, so werden die nicht benötigten Stellen mit Nullen aufgefüllt. Im umgekehrten Fall werden nicht m e h r speicherbare Stellen abgeschnitten. - Bei alphabetischen u n d alphanumerischen Literalen wird grundsätzlich linksbündig in dem definierten Datenfeld gespeichert. Nicht genutzte Speicherstellen werden mit Leerstellen aufgefüllt. Bei einem zu kleinen Speicherfeld werden Zeichen rechtsbündig abgetrennt. Beispiele: 77 77 01
nuhmer TEXT
p i c 9(4)v99 value 1234.5- (Feldinhalt: 123450) PIC X(10) VALUE "DOKUMENTATION". (Feldinhalt: DOKUMENTAT) AZEILE PIC X(15) VALUE "PEOVISIONSLISTE". (Feldinhalt: PROVISIONSLISTE) 02 f i l l e r p i c x(6) value spaces. (Feldinhalt: 6 Leerstellen) 02 summe p i c 9(5)V99 value zeeos. (Feldinhalt: 0000000)
4.3 Übungsaufgaben Aufgabe 1 F ü r folgenden Auftragssatz ist die Datenbeschreibung zu erstellen: Satzfelder Speichersteilen
Satzart 1-2
Auftr. K u n d e n d a t e n Nr. Kd. Nr. N a m e
frei
8-12
33-42
3-7
13-32
Artikeldaten Art. Nr. Art. Bez. Preis 43-47
48-74
75-80 (mit 2 Dezimalstellen)
Übungsaufgaben
67
Aufgabe 2 Wie sieht das Druckbild aus? Sendefeld
Empfangsfeld
PICTURE-Maske
Feldinhalt
PICTURE-Maske
S999V99 9(5)V99 S9(4)V99 S9(4)V99 S9(4)V99 9(6)V99
+56490 0000125 -000001 +000001 -000001 00004-532
999.99zz,zzz.zz -z.zz9.99 — ,—9-99 — ,—9-99 * * *
Aufgabe 3 Welcher Inhalt steht in den Datenfeldern? 02 ZEICHENFELD PIC X(20) VALUE ALL 02 DM PIC 9999V99 VALUE 54-521.9-
u,u
.
Aufgabe 4 Ist die nachfolgende Felddefinition zulässig? 77 WERT -1 PIC 9 ( 5 )
VALUE SPACES.
Lösungen im Anhang A.
?
*
.
Druckbild?
5 Grundlegende COBOL-Anweisungen
Nach der Darstellung der allgemeinen Grundlagen der COBOL-Sprache und der Beschreibung der IDENTIFICATION DIVISION, ENVIRONMENT DIVISION und DATA DIVISION werden in den folgenden Kapiteln die eigentlichen COBOL-Anweisungen, die Bestandteil der PROCEDURE DIVISION sind, behandelt. In Kapitel 5 werden zunächst 5 einfache Anweisungen erläutert.
5.1 ACCEPT-An Weisung Die ACCEPT-Anweisung ist eine einfache Anweisung zur Eingabe kleinerer Datenmengen, die nicht Bestandteil einer Datei sein müssen. Format 1: ACCEPT Datenname [FROM mnemonischer Name] Erläuterungen: Die über eine Eingabeeinheit eingelesenen Daten werden unter dem Datennamen gespeichert und stehen dort für die weitere Verarbeitung zur Verfügung. Wird auf den Zusatz „FROM mnemonischer Name" verzichtet, so erfolgt die Eingabe über das vom Anlagenhersteller als Standardeinheit festgelegte Gerät. Bei Mikrocomputern wird das in aller Regel die Tastatur sein. In anderen Fällen kann es z.B. ein Terminal oder die Operator-Konsole sein. Beispiel: W O R K I N G - S T O R A G E SECTION. 77 E - F E L D PIC 9 ( 5 ) • P R O C E D U R E DIVISION. ACCEPT E - F E L D
Die über die Tastatur (als angenommene Standardeinheit) eingegebenen und am Bildschirm angezeigten Daten werden bei der Ausführung der ACCEPTAnweisung unter dem Namen E-FELD gespeichert. Bei der Ausführung des Programms wird die Verarbeitung beim Erreichen der ACCEPT-Anweisung
ACCEPT-Anweisung
69
unterbrochen. Das eigentliche Einlesen beginnt in der jeweiligen aktuellen Cursorposition. (Diese Position entspricht der ersten Stelle der auf die ursprüngliche Ausgangsposition des Cursors folgenden Zeile). Bei anderen Hardwareeinheiten ergibt sich eine analoge Verarbeitung. Erst nach Abschluß der Eingabe (ENTER-Taste) wird die Programmausführung fortgesetzt. Die Länge der mit der ACCEPT-Anweisung übertragenen Daten ist anlagenabhängig. Unabhängig von der PICTURE-Zeichenkette werden die übertragenen Daten grundsätzlich linksbündig im Empfangsfeld eingeordnet. Überstehende Stellen werden abgeschnitten. Nichtgenutzte Stellen des Empfangsfeldes bleiben frei bzw. werden - bei numerischen Feldern - mit Nullen aufgefüllt. Bei der Eingabe von numerischen Werten ist deshalb immer darauf zu achten, daß die Anzahl der eingegebenen Ziffern der Länge des Empfangsfeldes entspricht. Ist der Wert kleiner als das Feld, so ist eine entsprechende Anzahl von führenden Nullen vor dem Wert einzugeben. Eine Ausnahme von dieser Regel gilt dann, wenn der Wert mit einem Dezimalpunkt eingegeben wird und das Empfangsfeld entsprechend mit Dezimalstellen definiert ist. In diesem Fall wird dezimalpunktgerecht übertragen. Beispiel: Ein Empfangsfeld ist mit 9(4) definiert. Der Eingabewert 9 ist dann als 0009 einzugeben, um spätere Fehler zu vermeiden. Soll die ACCEPT-Anweisung benutzt werden, um Daten über eine andere als die Standardeinheit einzulesen, so kann das mit Hilfe der Klausel „FROM mnemonischer Name" erfolgen. Der vom Programmierer frei wählbare mnemonische Name^ kennzeichnet ein anderes Eingabegerät. Damit die gewünschte Eingabeeinheit auch vom Betriebssystem identifiziert werden kann, ist allerdings eine weitere Angabe erforderlich. Der mnemonische Name muß im Paragraphen SPECIAL-NAMES einem speziellen, herstellerabhängigen Funktionsnamen zugeordnet werden. Dieser feststehende Funktionsname entspricht der dem Betriebssystem bekannten Gerätebezeichnung.
^ Unter einem mnemonischen Namen - häufig auch als Merknamen bezeichnet versteht man allgemein Namen, die einen Rückschluß auf den zugrundeliegenden Sachverhalt zulassen bzw. im vorliegenden konkreten Fall deutlich machen, welches Eingabegerät gemeint ist. Mnemonische Namen und Abkürzungen verbessern die Lesbarkeit von Quellenprogrammen und sind einprägsamer.
70
Grundlegende COBOl^Anweisungen
Beispiel: In vielen Betriebssystemen wird die Operator-Konsole mit dem Funktionsnamen „CONSOLE" bezeichnet. Unterstellt man, daß die Operator-Konsole nicht die standardmäßig zugeordnete Eingabeeinheit ist, so wäre zum Einlesen von Daten über die Konsole mit der ACCEPT-Anweisung dann z.B. folgende Codierung erforderlich. SPECIAL-NAMES. CONSOLE IS KONSOLTASTATUR. WORKING-STORAGE SECTION. 77 E-FELD PIC 9(5)• ACCEPT E-FELD FROM KONSOLTASTATUR
Verschiedene Compiler ermöglichen hier auch eine vereinfachte Codierung in der Form, daß in der ACCEPT-Anweisung anstelle des mnemonischen Namens unmittelbar der Funktionsname angegeben werden kann. Damit entfällt die Eintragung unter SPECIAL-NAMES. Neben der beschriebenen Form der ACCEPT-Anweisung kennt ANS-COBOL 85 noch ein zweites Format, das die Übernahme eines vom System bereitgestellten Tagesdatums, Wochentages, Jahrestages und der Uhrzeit in ein entsprechend definiertes Speicherfeld ermöglicht. Format 2: ACCEPT Datenname FROM
DATE DAY DAY-OF-WEEK TIME
Unter DATE ist das Datum in der Form JJMMTT gespeichert. Entsprechend ist das Empfangsfeld mit 9(6) zu definieren. Beispiel: Der 11. April 89 wird dargestellt als 890411. DAY enthält das Jahr und eine Tagesangabe als fortlaufende Nummer in der Form JJTTT. Das Empfangsfeld ist mit 9(5) zu definieren. Beispiel: Der 30. Dezember 88 wird dargestellt als 88364. DAY-OF-WEEK enthält eine Ziffer, die den Wochentag angibt. Dabei steht 1 für Montag, 2 für Dienstag usw. Das Empfangsfeld ist mit 9 zu definieren. TIME speichert in 8 Stellen die Tageszeit in der Reihenfolge HHMMSSHH (Stunden, Minuten, Sekunden und hundertstel Sekunden). Die Definition des Empfangsfeldes muß lauten 9(8).
71
ACCEPT-Anweisung
Beispiel: Die Uhrzeit 8.30, 15.45 Sekunden wird dargestellt als 08301545. Über die bisher gezeigten - in der Norm beschriebenen - Anwendungsformen der ACCEPT-Anweisung hinausgehend, bieten gerade COBOLCompiler für Mikrocomputer eine Fülle weiterer Möglichkeiten. Diese zusätzlichen Möglichkeiten betreffen insbesondere Bildschirmpositionierungen und spezielle Aufbereitungsarten. Nachfolgend wird exemplarisch, anhand des Compilers „VS COBOL Workbench", Version 2 der Firma Micro Focus, eine Form der ACCEPT-Anweisung, die eine Eingabe von bestimmten Bildschirmpositionen aus ermöglicht, dargestellt. Da sich die Compiler der verschiedenen Hersteller gerade im Hinblick auf diese Anwendungen stark unterscheiden, sei hier bezüglich weiterer Einzelheiten auf die Spezialliteratur zu den jeweiligen Compilern verwiesen. Format 3: (keine COBOLNorm) Datenname-2 ACCEPT Datenname-1
AT
[FROM CRT] Literal
Erläuterungen:
Die AT-Klausel ermöglicht die Eingabe der Daten von einer bestimmten Bildschirmposition. Dabei bestehen prinzipiell zwei Möglichkeiten. Die Cursorposition kann über ein Literal oder über einen Datennamen fixiert werden. Im zuerst genannten Fall muß als Literal eine vierstellige Zahl definiert werden. Die ersten beiden Stellen dieser Zahl bestimmen die Bildschirmzeile, die letzten beiden Stellen die Bildschirmspalte. Da grundsätzlich von einer Bildschirmgröße von maximal 24 Zeilen und 80 Spalten auszugehen ist, muß sich die Zeilenangabe innerhalb der Grenzen 01-24 und die Spaltenangabe innerhalb der Grenzen 01-80 bewegen. Beispiel: ACCEPT E - F E L D AT 0 2 0 5
FROM CHT
Das Einlesen der Daten beginnt hier in Zeile 2, Spalte 3. An die Stelle der direkten Bestimmung der Eingabeposition über ein Literal kann auch eine indirekte Festlegung über einen Datennamen treten. Der mit
72
Grundlegende COBOL Anweisungen
9(4) in der WORKING-STORAGE SECTION zu definierende Name muß dann wiederum in jeweils 2 Stellen die Zeilen- und Spaltennummer enthalten. Als Vorteil dieses zweiten Verfahrens ist die Möglichkeit zu nennen, Cursorpositionen von außen zu verändern. Die Klausel „FROM CRT" (CRT = Cathode Ray Tube; deutsch: Kathodenstrahlröhre) kennzeichnet in dem genannten Compiler die Eingabe vom Bildschirm in einem von der ANS-Norm abweichenden Format. Die Eingabe erfolgt in diesen Fällen grundsätzlich aus der durch die AT-Klausel angegebenen Position. Fehlt die AT-Klausel, so beginnt die Eingabe in der Position 0101. „FROM CRT" kann - ohne daß es zu einer Veränderung bei der Ausführung der Anweisung kommt - nur dann in der ACCEPT-Anweisung entfallen, wenn im Paragraphen SPECIAL-NAMES die Klausel „CONSOLE IS CRT" erscheint.
5.2 DISPLAY-Anweisung Die DISPLAY-Anweisung ist das Gegenstück zur ACCEPT-Anweisung. Sie ermöglicht die Ausgabe kleinerer Datenmengen über verschiedene Ausgabeeinheiten. Format 1: ' Datenname DISPLAY
. . . [UPON mnemonischer Name] [WITH NO ADVANCING] Literal
Erläuterungen:
Wird auf den Zusatz „UPON mnemonischer Name" verzichtet, so erfolgt die Ausgabe des Literais bzw. der unter Datenname gespeicherten Daten über das vom Hersteller als Standardausgabeeinheit festgelegte Gerät. Bei Mikrocomputern wird das im Regelfall der Bildschirm sein. In anderen Fällen kann es z.B. ein Drucker oder die Konsolschreibmaschine sein. 1 2 Grundsätzlich können auch mehrere Literale bzw. die Inhalte mehrerer Datenfelder mit
12
Bei verschiedenen Compilern für Mikrocomputer kann die DISPLAY-Anweisung nur noch für die Bildschirmausgabe genutzt werden.
DISPLAY-Anweisung
73
einer DISPLAY-Anweisung ausgegeben werden. Literale k ö n n e n auch in Form von figurativen Konstanten auftreten. Wird eine figurative Konstante als Operand aufgeführt, so wird das entsprechende Zeichen j e d o c h nur einmal ausgegeben. ( A u s n a h m e s. u. CRT-Klausel). Beispiele: 77 A-FELD PIC 9(5) V A L Ü E 12345DISPLAY A-FELD
Ausgabezeile: 12345 0 1 X PIC 999 VALDE
123.
DISPLAY "LÖSUNG X = " X
Ausgabezeile: L Ö S U N G X=123 Die unter d e m D a t e n n a m e n gespeicherten D a t e n werden über die Standardausgabeeinheit ausgegeben. Die Ausgabe über den Bildschirm beginnt dabei in der aktuellen Cursorposition, d. h. in der ersten Ausgabestelle in der auf die ursprüngliche Ausgangsposition des Cursors nachfolgenden Zeile. Analog dazu erfolgt die Ausgabe über Drucker. Wie bei der ACCEPT-Anweisung ist auch bei der DISPLAY-Anweisung die maximale Länge der zu übertragenden Daten hersteiler- bzw. anlagenabhängig. Die Gesamtlänge wird dabei definiert als S u m m e der Längenangaben der in einer DISPLAY-Anweisung aufgeführten D a t e n n a m e n u n d Literale. Reicht eine Bildschirmzeile zur Ausgabe der Daten nicht aus, so wird die Ausgabe in der nächsten Zeile fortgesetzt. Soll die DISPLAY-Anweisung verwandt werden, u m Daten ü b e r eine andere als die vom Hersteller zugeordnete Standardeinheit auszugeben, so kann das mit Hilfe der Klausel „UPON m n e m o n i s c h e r N a m e " geschehen. Der vom Programmierer frei wählbare m n e m o n i s c h e N a m e beschreibt das gewünschte Ausgabegerät. Wie bei der ACCEPT-Anweisung ist auch hier - im Paragrap h e n S P E C I A I ^ N A M E S - eine Z u o r d n u n g des m n e m o n i s c h e n N a m e n s zu einem speziellen, herstellerabhängigen Funktionsnamen erforderlich. Beispiel: Der bereits f r ü h e r - bei der Darstellung der ACCEPT-Anweisung - erwähnte F u n k t i o n s n a m e C O N S O L E kennzeichnet die Operator-Konsole mit der Eingabeeinheit Tastatur und der Ausgabeeinheit Schreibmaschine.
74
Grundlegende COBOLAnweisungen
Unterstellt man, daß die standardmäßig zugeordnete Ausgabeeinheit der Bildschirm ist, so wäre zur Ausgabe von Daten über die Konsolschreibmaschine mit der DISPLAY-Anweisung z. B. folgende Codierung erforderlich. SPECIAL-NAHES. CONSOLE IS K O N S O L S C H R E I B M A S C H I N E . WORKING- STORAGE SECTION. 77 A-FELD PIC 9 ( 5 ) • DISPLAY A-FELD U P O N
KONSOLSCHREIBMASCHINE
Analog zur ACCEPT-Anweisung ist auch hier bei verschiedenen Compilern wiederum eine Vereinfachung durch Angabe des Funktionsnamens in der DISPLAY-Anweisung möglich. Der Zusatz „WITH NO ADVANCING" bewirkt eine Ausgabe, ohne daß vorher ein Zeilenvorschub erfolgt. Für die Bildschirmausgabe bedeutet das, daß der Cursor in der nach der letzten Ausgabe eingenommenen Position (einer Leerstelle) verbleibt und von dort aus weitergeschrieben wird. Entfällt die Klausel „WITH NO ADVANCING", so beginnt die Ausgabe generell mit der ersten Stelle der nachfolgenden Zeile. Die bereits im Zusammenhang mit der Darstellung der ACCEPT-Anweisung erläuterten Möglichkeiten für eine Positionierung des Cursors sowie für spezielle Aufbereitungsarten gelten entsprechend auch für die DISPLAY-Anweisung. Der folgenden Beschreibung liegt dabei wiederum der COBOI^Compiler „VS COBOL Workbench", Version 2 der Firma Micro Focus zugrunde. Format 2: (keine COBOLNorm) Datenname-2
Datenname-1 DISPLAY
[UPON CRT]
AT Literal-1
Literal-2
Erläuterungen:
Die AT-Klausel ermöglicht die Ausgabe der Daten in einer bestimmten Bildschirmposition. Die Position wird durch eine vierstellige Zahl, deren erste zwei Stellen die Zeile und deren letzte zwei Stellen die Spalte festlegen, bestimmt. Zu weiteren Einzelheiten vgl. die entsprechenden Erklärungen zur ACCEPT-Anweisung.
MOVE-Anweisung
75
Die Klausel „UPON CRT" kennzeichnet die Ausgabe auf dem Bildschirm in einem von der ANS-Norm abweichenden Format. Die Ausgabe beginnt grundsätzlich in der durch die AT-Klausel festgelegten Position. Fehlt die AT-Klausel, so erfolgt die Ausgabe in der ersten Zeichenposition der ersten Zeile. Die Angabe „UPON CRT" in der DISPLAY-Anweisung bietet auch eine besonders einfache Möglichkeit, den Bildschirm zu löschen. Die Anweisung DISPLAY SPACES U P O N CHT
löscht den gesamten Bildschirm. Enthält die DISPLAY-Anweisung die AT-Klausel, so wird der Bildschirm ab der in der AT-Klausel definierten Position gelöscht.
5.3 MOVE-Anweisung Die MOVE-Anweisung überträgt die Daten von einem Datenbereich in einen oder mehrere andere Bereiche. Format:
Datenname-1 MOVE
TO {Datenname-2}.. , 1 3
Literal Erläuterungen:
Wie bereits an anderer Stelle (Punkt 4.2.3) ausgeführt, werden mit der MOVE-Anweisung die Inhalte eines Sendefeldes (Datenname-1 oder Literal) in ein oder mehrere Empfangsfelder (Datenname-2 usw.) übertragen. Der Inhalt der Empfangsfelder wird dabei durch die Daten des Sendefeldes überschrieben, d.h. zerstört. Der Inhalt des Sendefeldes bleibt dagegen erhalten. Die wesentlichen für die Datenübertragung geltenden - je nach dem zugrundeliegenden Datenfeldtyp anders lautenden - Regeln wurden schon bei der Beschreibung der VALUE-Klausel kurz erwähnt. Wegen der herausragenden Bedeutung der MOVE-Anweisung und einiger wichtiger Besonderheiten werden sie hier noch einmal ausführlich dargestellt.
13
Zu der Sonderform „MOVE CORRESPONDING" vgl. Kapitel 9, Punkt 9.5.
76
Grundlegende COBOL-Anweisungen
Numerisches M O V E Ein numerisches M O V E liegt vor, wenn das Sendefeld numerisch und das Empfangsfeld numerisch oder numerisch druckaufbereitet definiert sind. Regeln: - Ganze Zahlen (weder im Sende- noch im Empfangsfeld sind Dezimalstellen vorgesehen) werden rechtsbündig gespeichert. In allen anderen Fällen wird dezimalpunktgerecht in das Empfangsfeld übertragen. - I m Empfangsfeld nicht speicherbare Ziffern werden (ohne Fehlermeldung) abgeschnitten; nach der Übertragung freigebliebene Speicherstellen werden mit Nullen aufgefüllt. Beispiele: Sendefelder Feldname
PICTURE-Maske
Feldinhalt
SFELD-1 SFELD-2
999
123 6543a21
9(4)V99
Empfangsfelder Feldname
PICTURE-Maske
Druckbild
AFELD-1
9(4)
0123
AFELD-2
9(5)
06543
AFELD-3
9(4)V99
1234a50
Anmerkung: Das Zeichen
A
kennzeichnet die Stellung eines gedachten Dezimalpunktes.
D i e Inhalte der Empfangsfelder A F E L D - 1 und A F E L D - 2 ergeben sich nach Ausführung folgender M O V E - A n Weisungen: und
MOVE
SFELD-1
TO
AFELD-1
MOVE
SFELD-2
TO
AFELD-2
Der Inhalt des Empfangsfeldes A F E L D - 3 ist das Resultat der M O V E - A n weisung MOVE
1234-.5
TO
AFELD-3
77
MOVE-Anweisung
Alphanumerisches MOVE Ein alphanumerisches MOVE liegt vor, wenn das Sendefeld alphabetisch oder alphanumerisch und das Empfangsfeld alphabetisch oder alphanumerisch oder alphabetisch/alphanumerisch druckaufbereitet definiert sind. Regeln: - Es wird grundsätzlich linksbündig im Empfangsfeld gespeichert. - Ist das Empfangsfeld kleiner als das Sendefeld, so werden die nicht mehr speicherbaren Zeichen abgetrennt. - Ist das Empfangsfeld größer als das Sendefeld, so werden die nicht genutzten Speicherstellen mit Leerstellen aufgefüllt. Soll bei einem alphanumerischen MOVE, abweichend von der obengenannten Grundregel, rechtsbündig gespeichert werden, so kann das durch Angabe der Klausel JUSTIFIED RIGHT (abgekürzt: JUST) bei der Definition des Empfangsfeldes erreicht werden (s. u. Beispiele). Beispiele: Sendefelder Feldname
PICTURE-Maske
Feldinhalt
SFELD
X(5)
HELGA
Empfangsfelder Feldname
PICTURE-Maske
Druckbild
AFELD-1 AFELD-2 AFELD-3
X(8) X(3) X (8)
HELGAI I I I HEL I I I IHELGA
Die Inhalte der Empfangsfelder ergeben sich nach Ausführung folgender MOVE-Anweisungen: MOVE S F E L D MOVE S F E L D MOVE S F E L D
TO TO TO
AFELD-1 AFELD-2 AFELD-3
78
Grundlegende COBOL Anweisungen
Die Definition für das Empfangsfeld AFELD-3 muß dabei lauten: 77 AFELD-3 PIC X(8) JUSTIFIED
RIGHT.
MOVE mit figurativen Konstanten Werden im Sendefeld der MOVE-Anweisung figurative Konstanten (vgl. Punkt 2.3.3.3) verwendet, so wird das Empfangsfeld - nach den Regeln des alphanumerischen MOVE - in seiner gesamten Länge mit dem durch die figurative Konstante bestimmten Zeichen aufgefüllt. Mit der Ausnahme der Konstanten ZERO, die auch in ein numerisches Empfangsfeld übertragen werden kann, müssen die Empfangsfelder dabei stets alphanumerisch definiert sein. Beispiele: 77
ZWISCHENSUMME PIC M O V E ZEEOS TO
9(8).
ZWISCHENSUMME
Feldinhalt ZWISCHENSUMME: 00000000 Das gleiche Resultat kann erzielt werden durch die Anweisungen: M O V E A L L "O" T O Z W I S C H E N S U M M E b z w . M O V E " O O O O O O O O " TO Z W I S C H E N S U M M E
77
ZEILE PIC
X(80).
M O V E S P A C E S TO
ZEILE
Feldinhalt ZEILE: 80 Leerstellen.
MOVE mit Feldern unterschiedlichen Datentyps Die bisherigen Anmerkungen zur MOVE-Anweisung bezogen sich auf Datenübertragungen zwischen Feldern gleichen Datentyps. Daneben gibt es auch im beschränkten Maße die Möglichkeit, die MOVE-Anweisung für Übertragungen zwischen Feldern verschiedenen Datentyps einzusetzen. Grundsätzlich treten dabei jedoch häufig Probleme auf, so daß auf derartige Anwendungen - sofern nicht zwingend erforderlich - verzichtet werden sollte. Nachfolgend werden zwei der für die Praxis bedeutsamsten Fälle kurz beschrieben:
GO TO-Anweisung
79
- Sendefeld numerisch - Empfangsfeld alphabetisch bzw. alphanumerisch Eine Übertragung ist möglich, wenn das Sendefeld ganzzahlig (ohne Dezimalstellen) definiert ist. Übertragen wird nach den Regeln des alphanumerischen MOVE. Eventuell vorhandene Vorzeichen gehen jedoch verloren. - Sendefeld alphanumerisch - Empfangsfeld numerisch Eine Übertragung ist möglich, wenn im Sendefeld ausschließlich Ziffern gespeichert sind. Übertragen wird nach den Regeln des numerischen MOVE. Vorsicht! Werden nicht-numerische Zeichen in das Empfangsfeld übertragen, so kommt es bei der Programmausführung zu einem Programmabbruch. MOVE mit Datengruppen In der MOVE-Anweisung können auch Datengruppen als Sende- oder Empfangsfeld erscheinen. Die Übertragung erfolgt dann entsprechend einem alphanumerischen MOVE. Die interne Darstellung der Daten wird nicht verändert.
5.4 GO TO-Anweisung Die GO TO-Anweisung ist eine Sprunganweisung, die die sequentielle Verarbeitung der Programmanweisungen unterbricht und zu einer Fortsetzung an einer anderen Stelle des Programms führt. Format 1: GO TO [Prozedurname] Erläuterungen: Bei der unter Format 1 beschriebenen Form der GO TO-Anweisung handelt es sich um einen unbedingten Sprungbefehl. Der Befehl bewirkt einen Abbruch der Ausführung aufeinanderfolgender Anweisungen und einen Vorwärts- oder Rückwärtssprung zum angegebenen Prozedurnamen. Dort wird die Verarbeitung mit der ersten Anweisung der Prozedur fortgesetzt. Prozedurnamen (Marken) kennzeichnen Paragraphen oder Kapitel (SECTIONS) in der PROCEDURE SECTION. In ganz bestimmten, sehr seltenen Fällen, die hier nicht behandelt werden sollen, kann die Angabe eines Prozedurnamens auch entfallen.
80
Grundlegende C O B O L Anweisungen
Wird - nach Verarbeitung der in der GO TO-Anweisung genannten Prozedur ein Rücksprung zur aufrufenden Stelle gewünscht, so kann das nur durch einen weiteren GO TO-Befehl geschehen. Beispiel: GO TO LESEN
Die Programmausfuhrung wird mit einem Sprung zum Paragraphen LESEN fortgesetzt. Anschließend erfolgt eine sequentielle Verarbeitung der nachfolgenden Anweisungen. Eine Variante der einfachen GO TO-Anweisung stellt die unter Format 2 beschriebene GO TO-Anweisung mit der DEPENDING ON-Klausel dar. Format 2: GO TO {Prozedurname}... DEPENDING ON Datenname In dieser GO TO-Anweisung kann eine Liste von Prozedurnamen angegeben werden, zu denen in Abhängigkeit von dem unter „Datenname" gespeicherten Wert verzweigt wird. Das Feld Datenname darf dabei nur ganz bestimmte positive ganzzahlige Werte annehmen. Ist der unter Datenname gespeicherte Wert gleich 1, so erfolgt ein Sprung zum ersten Prozedurnamen. Bei einem Feldinhalt 2 wird zum zweiten Prozedurnamen verzweigt usw.. Kein Sprung erfolgt, wenn der Datenname einen Wert enthält, der größer ist als die Zahl der definierten Prozedurnamen oder wenn es sich um nicht positive, nicht ganzzahlige Werte außerhalb der Reihe 1, 2 usw. handelt. In den zuletzt genannten Fällen wird die Verarbeitung mit der auf die GO TO-Anweisung nächstfolgenden Anweisung des Programms fortgesetzt. Beispiel: GO TO LESEN AUFBAUEN AENDEHN LOESCHEN DEPENDING ON KENNZEICHEN
Enthält das Speicherfeld KENNZEICHEN eine 1, wird zum Paragraphen LESEN verzweigt. Bei einer 2 erfolgt ein Sprung zum Paragraphen AUFBAUEN. Eine 3 bzw. 4 im Feld KENNZEICHEN führt entsprechend zu einem Sprung zu den Paragraphen AENDERN bzw. LOESCHEN. Wichtig! Die Verwendung der GO TO-Anweisung sollte auf ein Minimum beschränkt bleiben, da ihr Einsatz den Zielen der Strukturierten Programmierung widerspricht. Anstelle der GO T O . . . DEPENDING ON-Anweisung empfiehlt sich der Einsatz der EVALUATE-Anweisung (vgl. Kapitel 7, Punkt 7.4).
Übungsaufgaben
81
5.5 STOP-AnWeisung Die STOP-Anweisung b e e n d e t die Verarbeitung eines Objektprogrammes. Format (verkürzt): STOP R U N STOP R U N kennzeichnet das logische Programmende u n d sollte im Prog r a m m n u r einmal verwendet werden. Die Anweisung schließt die A u s f u h rung des Programms ab u n d übergibt die Steuerung wieder d e m Betriebssystem.
5.6 Übungsaufgaben Aufgabe 1 Wie lauten die Felddefinitionen u n d Anweisungen f ü r die Ü b e r n a h m e des systeminternen Tagesdatums in das Feld „ D a t u m " u n d die anschließende Ausgabe einer Zeile mit d e m Text „Anwesenheitsliste vom" u n d d e m Tagesd a t u m (in der F o r m JJ.MM.TT) auf dem Bildschirm? Aufgabe 2 In der W O R K I N G - S T O R A G E SECTION wurde ein Speicherfeld mit d e m N a m e n Z W I S U definiert. Der Inhalt dieses Feldes soll mit d e m vorangestellten Text „Die Z w i s c h e n s u m m e beträgt" auf dem Bildschirm ausgegeben werden. Wie lautet die entsprechende Anweisung? Aufgabe 3 77 77
B E T R A G PIC 9(4)V99 V A L U E 2345.67. SUMME PIC 999V999. M O V E B E T R A G TO SUMME
Welchen Inhalt hat das Empfangsfeld? Aufgabe 4 77
ZWISCHENRAUM PIC X(6).
Mit welchen MOVE-Anweisungen kann das F E L D Z W I S C H E N R A U M mit Leerstellen aufgefüllt werden?
6 Anweisungen zur Verarbeitung von sequentiellen Dateien
Im vorherigen Kapitel wurden mit der ACCEPT- und DISPLAY-Anweisung Möglichkeiten beschrieben, kleinere Datenmengen, die nicht Bestandteil einer Datei sind oder werden sollen, einzulesen bzw. auszugeben. Nachfolgend werden die Anweisungen erläutert, die zur Verarbeitung von Dateien notwendig sind. Dabei werden zunächst nur sequentielle Dateien (vgl. dazu Punkt 1.3.2) behandelt. Mit Hilfe dieser Anweisungen werden die ersten zwei COBOL-Programme erstellt.
6.1 OPEN-Anweisung Bevor Daten aus einer Datei gelesen bzw. in einer Datei gespeichert werden können, muß diese zunächst mit einer OPEN-Anweisung eröffnet werden. Die Eröffnung stellt die Voraussetzung für jede Verarbeitung der entsprechenden Daten dar. Je nach dem gewählten Format bewirkt sie, daß das Betriebssystem Kennsätze (vgl. Punkt 4.1) prüft oder schreibt, die in der DATA DIVISION definierten Ein-Ausgabebereiche (Puffer) im Hauptspeicher bereitstellt, die Positionierung für die Verarbeitung der Datensätze am Anfang oder am Ende der Datei vornimmt usw.. Format (verkürzt): INPUT {Dateiname-1}... OUTPUT {Dateiname-2}... OPEN 1-0 {Dateiname-3}... EXTEND {Dateiname-4}... Erläuterungen: Die Klauseln INPUT, OUTPUT, 1-0 und EXTEND definieren die Verwendungsart: OPEN INPUT eröffnet eine bereits existierende Eingabedatei, die nur gelesen werden kann. Der Lesevorgang beginnt mit dem ersten Satz.
CLOSE-Anweisung
83
OPEN OUTPUT eröffnet eine noch nicht existierende Ausgabedatei, in die nur geschrieben werden kann. OPEN 1-0 eröffnet eine existierende Datei, aus der Sätze gelesen und (in veränderter Form) zurückgeschrieben werden können. Der Lesevorgang beginnt wiederum mit dem ersten Satz. OPEN EXTEND eröffnet eine existierende sequentielle Datei, in die nur geschrieben werden kann. Die Ausgabe neuer Sätze beginnt hinter dem letzten Satz der Datei. Folgende Regeln sind zu beachten: - Die Eröffnung einer Datei muß grundsätzlich vordem ersten sie betreffenden Lese-Schreibbefehl erfolgen. - Jede Datei darf nur einmal eröffnet werden. Ausnahme: Die Datei wurde vor einer zweiten Eröffnung durch eine CLOSE-Anweisung (vgl. Punkt 6.2) wieder geschlossen. - Die Klauseln INPUT, OUTPUT usw. sowie der Name einer Datei dürfen in einer OPEN-Anweisung nur einmal erscheinen. Beispiele: (1)
OPEN INPUT P E R S O N A L D A T E I OPEN OUTPUT DRUCKDATEI
Kürzer und besser wäre eine Zusammenfassung der beiden Dateieröffnungen in einer OPEN-Anweisung in folgender Form: OPEN INPUT P E H S O N A L D A T E I OUTPUT (2)
DRUCKDATEI
O P E N INPUT A U F T E A G S D A T E I 1 - 0 LAGERDATEI OUTPUT R E C H N U N G B E S T A N D S L I S T E
6.2 CLOSE-Anweisung Die CLOSE-Anweisung stellt das logische Gegenstück zur OPEN-Anweisung dar. CLOSE veranlaßt das Betriebssystem, die in den Ausgabebereichen im Hauptspeicher noch vorhandenen Datensätze in die Dateien zu übertragen und die Bereiche selbst wieder freizugeben. Ferner erfolgt ggf. eine Verarbeitung von Datei-Endekennsätzen. Format (verkürzt): CLOSE {Dateiname-1}...
84
Anweisungen zur Verarbeitung von sequentiellen Dateien
Erläuterungen: Jede mit OPEN eröffnete Datei muß mit CLOSE wieder geschlossen werden. Danach ist eine Verarbeitung dieser Datei nicht mehr möglich. CLOSE sollte daher im Regelfall erst unmittelbar vor dem logischen Programmende (STOP RUN) codiert werden. Die Klauseln INPUT, OUTPUT, 1-0 und EXTEND werden in der CLOSEAnweisung nicht verwandt. Beispiel: CLOSE P E R S O N A L D A T E I CLOSE D R U C K D A T E I
Kürzer und besser wäre die Zusammenfassung in einer Anweisung: CLOSE P E R S O N A L D A T E I
DRÜCKDATEI
Wichtig! Die in der OPEN- und CLOSE-An Weisung verwendeten Dateinamen müssen vorher schon in den SELECT . . . ASSIGN-Eintragungen und in den FD-Eintragungen aufgeführt worden sein.
6.3 READ-An Weisung Nach der Eröffnung können die Sätze einer sequentiellen Datei mit der READ-Anweisung eingelesen werden. Bei jeder Ausführung der Anweisung wird jeweils ein logischer Satz (vgl. Punkt 4.1) in den entsprechenden, in der FILE SECTION mit Stufennummer Ol definierten, Eingabebereich (= Eingabepuffer) der Datei übertragen. Format: READ Dateiname RECORD [INTO Datenname] [AT END unbedingte Anweisung-1] [NOT AT END unbedingte Anweisung-2] [END-READ1 Erläuterungen: Obwohl in der READ-Anweisung grundsätzlich der Dateiname erscheint, wird immer nur ein Datensatz eingelesen. Jeder Satz wird nur einmal gelesen. Ein nochmaliges Lesen erfordert zunächst das Schließen der Datei (CLOSE) und dann ein erneutes Eröffnen (OPEN).
85
READ-Anweisung
Wird die INTO-Klausel verwandt, so wird der eingelesene Satz zusätzlich (nach den f ü r die MOVE-Anweisung geltenden Regeln) in einen weiteren, durch D a t e n n a m e gekennzeichneten Bereich in der W O R K I N G - S T O R A G E SECTION übertragen. Die AT END-Klausel bzw. N O T AT END-Klausel werden wirksam, w e n n die Bedingung „kein Datensatz m e h r vorhanden" erfüllt bzw. nicht erfüllt ist. Danach werden die jeweils codierten unbedingten Anweisungen ausgeführt (z.B. CLOSE, STOP usw.). E N D - R E A D schließt den Geltungsbereich der READ-Anweisung ab. Nähere Erläuterungen u n d Beispiele zur A n w e n d u n g des Bereichsbegrenzers E N D finden sich bei der Darstellung der IF-Anweisung in Kapitel 7. Folgende Regeln sind zu beachten: - Dateien, die mit der READ-Anweisung gelesen werden sollen, m ü s s e n mit O P E N I N P U T oder OPEN 1 - 0 e r ö f f n e t worden sein. - D e r in der READ-Anweisung genannte D a t e i n a m e m u ß ebenfalls in den S E L E C T . . . ASSIGN-Eintragungen, den FD-Eintragungen u n d den OPENu n d CLOSE-Anweisungen aufgeführt werden. Beispiel: SELECT P E R S O N A L D A T E I A S S I G N TO O R G A N I Z A T I O N IS SEQUENTIAL. DATA FILE FD 01
"A:PERSDAT"
DIVISION. SECTION. PERSONALDATEI. PERSONALSATZ. 02 . . .
W O R K I N G - S T O R A G E SECTION. 01 E - F E L D PIC X(100). P R O C E D U R E DIVISION. O P E N INPUT P E R S O N A L D A T E I OUTPUT D R U C K D A T E I READ P E R S O N A L D A T E I RECORD INTO E - F E L D AT END CLOSE PERSONALDATEI, DRUCKDATEI STOP RUN END-READ
Erläuterungen: Mit jeder A u s f ü h r u n g der READ-Anweisung wird ein Satz der P E R S O N A ! ^ DATEI eingelesen u n d in den Eingabebereich (Ol PERSON ALS ATZ) über-
86
Anweisungen zur Verarbeitung von sequentiellen Dateien
tragen. Zusätzlich erfolgt eine Speicherung des Satzes im Datenbereich E-FELD. Die AT END-KLAUSEL (und mit ihr die nachfolgenden Anweisungen) werden wirksam, wenn bei einem erneuten Zugriff auf die Datei - nach dem Einlesen des letzten Datensatzes - kein Datensatz mehr gefunden wird.
6.4 WRITE-Anweisung Die WRITE-Anweisung dient zur Ausgabe von Datensätzen in Dateien sowie zur Druckausgabe. Bei sequentiellen Dateien kann die WRITE-Anweisung nur eingesetzt werden, wenn die Dateien vorher mit OPEN OUTPUT oder OPEN EXTEND eröffnet wurden. Format: WRITE Satzname [FROM Datenname-1]
{
Datenname-2 Ganzzahl
ADVANCING AFTER
{
mnemom. Name PAGE
LINE LINES 1 J
END-OF-PAGE AT
unbedingte Anweisung-1 EOP END-OF-PAGE
NOTAT
unbedingte Anweisung-2 EOP
[END-WRITE] Erläuterungen:
Im Unterschied zur READ-Anweisung erscheint in der WRITE-Anweisung nicht der Dateiname, sondern der Satzname. Ausgegeben wird jeweils der im Ausgabebereich enthaltene Datensatz bzw. die entsprechende Zeile. Ausgabebereiche (= Ausgabepuffer) sind die in der FILE SECTION den Ausgabedateien zugeordneten, mit Stufennummer Ol definierten Datennamen. Die Zuordnung der gewünschten Ausgabeeinheit m u ß bereits vorher in der SELECT . . . ASSIGN-Eintragung erfolgt sein.
WRITE-Anweisung
87
Bei Verwendung der FROM-Klausel wird der Inhalt eines in der DATA DIVISION - im allgemeinen in der WORKING-STORAGE SECTION definierten Datenfeldes (Datenname-1) vor der Ausfuhrung des Befehls in den Ausgabebereich übertragen. Die Übertragung erfolgt dabei nach den Regeln der MOVE-Anweisung. Diese Verfahrensweise wird vor allem für die Ausgabe von Listen häufig genutzt. Nach Ausführung der WRITE-Anweisung steht der ausgegebene Satz im Regelfall im Ausgabebereich nicht mehr zur Verfügung. Der mit FROM in den Satznamen übertragene Inhalt von Datenname-1 bleibt dagegen auch nach der Ausgabe noch erhalten. Die nachfolgend dargestellten Klauseln der WRITE-Anweisung finden nur für die Druckausgabe Anwendung. Die ADVANCING-Klausel steuert den Zeilen- und Seitenvorschub (Blattvorschub). Bei Angabe von BEFORE wird vor dem Vorschub gedruckt, AFTER bewirkt dagegen ein Drucken nach dem Vorschub. Unter Datenname-2 bzw. Ganzzahl wird angegeben, um wieviel Zeilen vorgeschoben werden soll. Der maximal mögliche Zeilenvorschub ist anlagenabhängig, üblicherweise kann jedoch bis zu 99 Zeilen vorgeschoben werden. Wird als Zeilenvorschub „0" vermerkt, so erfolgt kein Vorschub. Diese Möglichkeit dient gelegentlich zum Überschreiben einer bereits vorhandenen Zeile (mit dem Ziel einer optischen Hervorhebung). Beispiele: WHITE ZEILE AFTER A D V A N C I N G 2 LINES
Nach einem Vorschub von zwei Zeilen wird gedruckt, d. h. im Text erscheint vor der neuen Ausgabezeile eine Leerzeile. WHITE ZEILE BEFORE A D V A N C I N G 3 LINES
Zunächst wird die Zeile gedruckt. Danach erscheinen zwei Leerzeilen. Bei Ausführung einer weiteren WRITE-Anweisung würde der Druckvorgang in der darauf folgenden Zeile fortgesetzt werden. Bei einem Verzicht auf die Codierung des Zeilenvorschubs wird standardmäßig vom Compiler „AFTER ADVANCING 1 LINE" unterstellt, d.h. es wird ohne Leerzeile jeweils in der nächsten Zeile weitergedruckt. Der Blattvorschub kann durch die Angabe eines mnemonischen Namens oder das COBOL-Wort PAGE gesteuert werden. Der frei wählbare mnemonische Name muß, damit das Betriebssystem den Blattvorschub erkennen kann, im Paragraphen SPECIAL-NAMES einem anlageabhängigen Funktionsna-
Anweisungen zur Verarbeitung von sequentiellen Dateien
88
men zugeordnet werden. Dieser Funktionsname verkörpert die dem Betriebssystem bekannte Bezeichnung für einen Blattvorschub. Beispiel: Bei vielen DV-Anlagen (IBM, Siemens) ist der Funktionsname für den Blattvorschub C01. Verwendet man als mnemonischen Namen in der WRITEAnweisung „BLATTVORSCHUB", so ergibt sich folgende Codierung: SPECIAL-NAMES. C01
IS
PROCEDURE
BLATTVORSCHUB. DIVISION.
WRITE ZEILE AFTER A D V A N C I N G
BLATTVORSCHUB
Eine (einfachere) Alternative zur Verwendung eines mnemonischen Namens bietet das COBOI/Wort PAGE. Die Angabe von PAGE bewirkt einen Vorschub auf die erste Zeile einer neuen Seite. Die AT END-OF-PAGE- bzw. NOT AT END-OF-PAGE-Klausel wird wirksam, wenn die eingenommene Zeilenposition gleich bzw. kleiner ist als der in der LINAGE-Klausel (s.u.) genannte Wert. Danach werden die jeweils angegebenen unbedingten Anweisungen ausgeführt. END-WRITE schließt den Geltungsbereich der WRITE-Anweisung ab. Nähere Erläuterungen und Beispiele zur Anwendung des Bereichsbegrenzers END finden sich bei der Darstellung der IF-Anweisung in Kapitel 7. Die Ausführung eines Blattvorschubs erfolgt häufig in Abhängigkeit von der Ausgabe einer bestimmten Zeilenanzahl pro Seite. Eine Möglichkeit, die Größe einer Druckseite exakt festzulegen sowie die Ausgabepositionen für die erste und letzte Zeile zu bestimmen, bietet die LINAGE-Klausel. Format (verkürzt): Datenname-1 LINAGE IS
LINES Ganzzahl-1 Datenname-2
LINES AT TOP
Datenname-3 LINES AT BOTTOM
Ganzzahl-2
Ganzzahl-3
WRITE-Anweisung
89
Erläuterungen:
Die LINAGE-Klausel ist bei der Dateibeschreibung der Druckdatei zu codieren. Unter Datenname-1 bzw. Ganzzahl-1 wird die Anzahl der Zeilen pro Seite angegeben. Mit Hilfe der Eintragung LINES AT TOP bzw. LINES AT BOTTOM kann die Anzahl der Leerzeilen am Anfang bzw. Ende einer Druckseite festgelegt werden. Beispiel: SELECT D R U C K D A T E I A S S I G N TO " :LF: " . DATA DIVISION. FILE SECTION. FD D R U C K D A T E I D A T A R E C O R D IS Z E I L E L I N A G E IS 32 L I N E S L I N E S A T TOP 4 L I N E S A T B O T T O M 6. 01 ZEILE. PROCEDURE DIVISION. O P E N INPUT P E R S O N A L D A T E I O U T P U T D R U C K D A T E I W R I T E ZEILE B E F O R E A D V A N C I N G 1 L I N E AT E N D - O F - P A G E . . .
Erläuterungen:
Die AT END-OF-PAGE-Klausel wird wirksam, wenn 42 Druckzeilen ausgegeben wurden. Im Anschluß daran werden die jeweils codierten unbedingten Anweisungen ausgeführt. Die Druckausgabe wird in der 5. Zeile der nächsten Seite fortgesetzt. Folgende Regeln sind zu beachten: - Die Eintragungen ADVANCING PAGE und END-OF-PAGE dürfen nicht zusammen in einer WRITE-Anweisung erscheinen. - Die Eintragungen END-OF-PAGE oder NOT END-OF-PAGE können immer nur zusammen mit der Definition einer LINAGE-Klausel für die betreffende Datei eingesetzt werden. - Die Eintragung ADVANCING mnemonischer Name kann nicht für die Ausgabe von Sätzen angegeben werden, bei denen die zugehörige Dateibeschreibung eine LINAGE-Klausel enthält.
90
Anweisungen zur Verarbeitung von sequentiellen Dateien
6.5 REWRITE-Anweisung Die REWRITE-ANWEISUNG ermöglicht das Zurückschreiben inhaltlich veränderter Datensätze auf ihren alten Speicherplatz (sog. updating). Für die Verarbeitung sequentieller Dateien hat die REWRITE-Anweisung das Format: REWRITE Satzname [FROM Datenname] [END-REWRITE] Erläuterungen: Der zuvor mit einer READ-Anweisung eingelesene Satz wird in einem EinAusgabebereich verändert und dann mit REWRITE auf seinen früheren Speicherplatz zurückgeschrieben. Bei sequentiellen Dateien handelt es sich dabei grundsätzlich um den zuletzt gelesenen Satz. Findet die Klausel FROM Verwendung, so wird zunächst der Inhalt des Feldes Datenname in das Feld Satzname übertragen. Anschließend wird mit dem Inhalt von Satzname der alte Datensatz in der Datei überschrieben. END-REWRITE schließt den Geltungsbereich der REWRITE-Anweisung ab. Folgende Regeln sind zu beachten: - Dateien, für die der REWRITE-Befehl eingesetzt wird, müssen immer mit OPEN 1-0 eröffnet werden. - Der zurückgeschriebene Satz muß immer die gleiche Länge wie der vorher gelesene Satz haben. Beispiel: DATA DIVISION. FILE SECTION. FD PERSONALDATEI. 01 PERSONALSATZ. 02 . . . W O R K I N G - S T O R A G E SECTION. 01 E - F E L D PIC X(100). P R O C E D U R E DIVISION. OPEN 1-0 P E R S O N A L D A T E I READ PERSONALDATEI R E C O R D INTO E - F E L D AT END . . . R E W E I T E PERSONALSATZ
FROM E - F E L D
Programmbeispiele: Aufbau und Drucken einer sequentiellen Datei
91
6.6 Programmbeispiele: Aufbau und Drucken einer sequentiellen Datei Aufgabenstellung: Die Teilnehmer eines Programmierpraktikums sollen für spätere statistische Auswertungen in einer Datei gespeichert werden. Erfaßt werden sollen die Namen der Teilnehmer sowie ihre Anwesenheit bzw. Abwesenheit bei den einzelnen Veranstaltungsterminen. Zur Lösung der Aufgabenstellung sind zwei Programme zu entwerfen. In Programm 1 erfolgt die Eingabe der Daten und ihre Speicherung in einer sequentiellen Datei. Programm 2 liest diese Datei und druckt die vorgesehene Liste. Die Verarbeitungsschritte beider Programme werden nachfolgend sowohl in Form von Programmablaufplänen als auch in Struktogrammen dargestellt. Für alle weiteren Programme werden als Entwurfsbeschreibungsmittel ausschließlich Struktogramme verwendet. Programmablaufplan und Struktogramm zeigen unterschiedliche Lösungen der oben beschriebenen Aufgabenstellung. Der Programmablaufplan und das darauf aufbauende, unten wiedergegebene Quellenprogramm beschreiben einen Lösungsweg, der (ausgenommen ist die Abfrage des Letzte-EingabeKennzeichens) mit den bisher erläuterten Befehlen codiert werden kann. Dabei muß hier allerdings die - wie früher bereits erwähnt - nach Möglichkeit zu vermeidende GO TO-Anweisung eingesetzt werden. Für die Codierung der den Regeln der Strukturierten Programmierung entsprechenden Struktogrammdarstellung ist eine weitere Anweisung (die PERFORM-Anweisung) erforderlich, die im Kapitel 7 behandelt wird. In diesem Kapitel folgt auch das Quellenprogramm zur Struktogrammlösung. Erläuterungen zum Programmablaufplan
(Programm
1):
Der PAP beschreibt die in der PROCEDURE DIVISION zu codierenden Arbeitsschritte. Nach dem Eröffnen der Dateien und dem Einlesen des Datums wird zunächst der Bildschirm für die anschließende Ausgabe der Maske gelöscht. 14 Auf die Ausgabe der Bildschirmmaske, mit der der Anwender des
14
Unter einer Maske (genauer: Bildschirmmaske) wird eine formularmäßige Einteilung des Bildschirms zur Erleichterung der Dateneingabe verstanden. Die Maske wird in dem hier beschriebenen Programm durch mehrere aufeinanderfolgende DISPLAY-
92
Anweisungen zur Verarbeitung von sequentiellen Dateien
Eröffnen Datei Lesen Datum Löschen Bildschirm Ausgeben Maske 1 Lesen LE-KZ Ausgeben Maske 2 Lesen Name, A—KZ Verarbeiten, solange LE-KZ nicht = j Ausgeben Satz Löschen Name, A—KZ Löschen Bildschirm Ausgeben Maske 1 Lesen LE—KZ " \ L E - K Z nicht = j ? ^/nein Löschen Bildschirm Ausgeben Maske 2 Lesen, Name, A-KZ Schließen Datei Ende Abb. 14: Programmablaufplan und Struktogramm zum Programm 1 (Aufbau einer sequentiellen Datei)
Programms zur Eingabe der Daten aufgefordert wird, folgt das Lesen des Teilnehmernamens, eines An- bzw. Abwesenheitskennzeichens und eines weiteren Kennzeichens (Letzte-Eingabe-Kennzeichen). Anschließend werAnweisungen erzeugt. Sehr häufig werden Masken mit Hilfe eigener spezieller Programme (sog. Maskengeneratoren) erstellt.
Programmbeispiele: A u f b a u und Drucken einer sequentiellen Datei
93
den der Name, das An-Abwesenheitskennzeichen und das Datum - als ein Datensatz zusammengefaßt - in die Teilnehmerdatei ausgegeben. Das nachfolgende Entscheidungs- oder Verzweigungssymbol (dargestellt durch die Raute) kennzeichnet eine Selektion. Abgefragt wird der Inhalt des Letzte-Eingabe-Kennzeichens. Enthält dieses Datenfeld ein „J", so wird die Datei geschlossen und die Verarbeitung beendet. Im anderen Fall (LE-KZ=N) werden die Inhalte der Felder Name und An-Abwesenheitskennzeichen gelöscht. Danach folgt - über die Verbindungsstelle Lesen - ein Rücksprung zum Anfang der Verarbeitung. Beginnend mit „Löschen Bildschirm", werden die Arbeitsschritte ein zweites Mal durchlaufen. Diese durch den Konnektor Lesen eingeschlossenen Schritte stellen die Schleife (Iteration) des Programmes dar. Sie werden so lange wiederholt, bis als LE-KZ ein „N" eingegeben wird. Im Anschluß daran wird die Schleife verlassen und die Verarbeitung beendet. Die Codierung des PAP ergibt das untenstehende Quellenprogramm: IDENTIFICATION DIVISION. PROGRAM-ID. AUFBAU-TEILNEHMERDATEI. DATE-COMPILED. ENVIRONMENT DIVISION. CONFIGURATION SECTION. SPECIAL-NAMES. CONSOLE IS CRT. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT TEILNEHMERDATEI ASSIGN TO "A: TEILDAT.SEQ" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL. DATA DIVISION. FILE SECTION. FD TEILNEHMERDATEI. 01 TEILNEHMERSATZ PIC X(37) • WORKING-STORAGE SECTION. 77 LETZTE-EINGABE-KZ PIC X VALUE "N«. 01 EINGABE. 02 TNAME PIC X(30). 02 DATUM PIC X(6) . 02 AN-ABWESENHEITS-KZ PIC X. PROCEDURE DIVISION. BEGINN. OPEN OUTPUT TEILNEHMERDATEI ACCEPT DATUM FROM DATE. LESEN. DISPLAY SPACES DISPLAY "GEBEN SIE NAMEN UND VORNAMEN IN DER FORM XXXXXXXXXXX "XXXXX,XXXXXXXXXXXXXXX EIN" AT 0203 DISPLAY "GEBEN SIE BEI ABWESENHEIT DES TEILNEHMERS EIN N, BEI "ANWESENHEIT EIN J EIN" AT 0603 DISPLAY "GEBEN SIE EIN J EIN, WENN KEINE WEITERE EINGABE ERFO "LGEN SOLL" AT 1003
94
A n w e i s u n g e n zur Verarbeitung v o n s e q u e n t i e l l e n D a t e i e n ACCEPT TNAME AT 0403 ACCEPT A N - A B W E S E N H E I T S - K Z AT 0803 ACCEPT LETZTE-EINGABE-KZ AT 1203 W E I T E TEILNEHMERSATZ FROM E I N G A B E IF LETZTE-EINGABE-KZ = "J" CLOSE TEILNEHMERDATEI STOP RUN. MOVE SPACES TO TNAME, A N - A B W E S E N H E I T S - K Z GO TO LESEN.
Hinweise
zum
Quellenprogramm:
(Das Programm wurde - wie alle in diesem Lehrbuch enthaltenen Programme - mit der „VS COBOL Workbench" der Firma Micro Focus unter MS-DOS erstellt. Bei Verwendung anderer Compiler und Betriebssysteme bzw. Anlagen ist darauf zu achten, daß die Bezeichnungen fiir die mit ASSIGN . . . TO zugewiesenen Einheiten anders lauten können). Die Teilnehmerdatei wird auf dem Diskettenlaufwerk A unter dem Namen TEILDAT.SEQ gespeichert. Die Dateierweiterung SEQ kann entfallen. Sie wurde hier hinzugefügt, um bereits anhand des Dateinamens zu zeigen, daß es sich um eine sequentielle Datei handelt. Die Klausel „ORGANIZATION IS SEQUENTIAL" kann, wie schon früher erwähnt wurde, entfallen. Sie verkörpert eine sog. „default"-Angabe, d. h. eine Angabe, die auch zugrundegelegt wird, wenn keine entsprechende Eintragung codiert wurde. Ergänzend wurde hier ferner die Klausel „ACCESS MODE IS SEQUENTIAL" vermerkt. Dieser Zusatz bestimmt die Zugriffsart auf die Datei. Bei sequentiellen Dateien kann er entfallen, da keine andere Zugriffsform möglich ist. Es handelt sich also wiederum um einen „default"-Wert. Literale, die über die Spalte 72 des COBOI^Programmschemas hinausgehen, müssen in der nächsten Zeile fortgesetzt werden. In der zweiten Zeile ist dann ein Fortsetzungskennzeichen ( - in Spalte 7 vgl. Punkt 2.5) zu setzen. Die einzelnen Felder des Teilnehmersatzes (TNAME, DATUM, ANABWESENHEITS-KZ) werden unter dem Oberbegriff EINGABE in der WORKING-STORAGE SECTION definiert. In der WRITE-Anweisung erfolgt die Übertragung des Feldes EINGABE in den eigentlichen Ausgabesatz (TEILNEHMERSATZ) und das Speichern dieses Satzes in die Datei. Die Abfrage des ebenfalls in der WORKING-STORAGE SECTION definierten LETZTE-EINGABE-KZ wird mit der IF-Anweisung codiert, die über die weiteren Verarbeitungsschritte entscheidet. In der Ausgangsstellung enthält das Feld LETZTE-EINGABE-KZ den - auch am Bildschirm angezeigten - Buchstaben „N". Wird dieser Zustand nicht durch eine
95
Programmbeispiele: Aufbau und Drucken einer sequentiellen Datei
andere Eingabe verändert, so verarbeitet das Programm als nächste Anweisung die MOVE-Anweisung. Überschreibt der Bediener dagegen den Feldinhalt des LETZTE-EINGABE-KZ mit „J", so sind die Anweisungen CLOSE . . . und STOP RUN auszufuhren. Eine ausführliche Beschreibung der IF-Anweisung folgt in Kapitel 7. Eröffnen Datei Drucken Überschrift Lesen Datei Verarbeiten, solange Dateiende (EOF) nicht erreicht Übertragen E-Felder A-Felder Drucken Zeile Seitenende? nein Drucken Überschrift Lesen Schließen Datei Ende
Abb. 15: Programmablaufplan und Struktogramm zum Programm 2 (Drucken Teilnehmerliste)
Auch beim zweiten Programm unterscheiden sich die im Programmablaufplan und Struktogramm beschriebenen Lösungen. Die entsprechenden Anmerkungen zu Programm 1 gelten hier analog. Das unten folgende Quellen-
96
Anweisungen zur Verarbeitung von sequentiellen Dateien
Programm basiert auf der PAP-Darstellung. Das Quellenprogramm zur Struktogrammlösung wird in Kapitel 7 beschrieben. Erläuterungen zum Programmablaufplan (Programm 2): Nach dem Eröffnen der Teilnehmerdatei wird die Überschrift der Liste gedruckt. Es folgt das Lesen des ersten Satzes der Datei und unmittelbar danach die Abfrage des Dateiendes. Bei Erreichen des Dateiendes wird die Teilnehmerdatei geschlossen und die Verarbeitung beendet. Im anderen Falle schließt sich an die Ende-Abfrage die Übertragung der Eingabefelder (TNAME, DATUM, AN-ABWESENHEITS-KZ) in die Ausgabefelder (ATNAME, ADATUM, AAN-ABWESENHEITS-KZ) an. Danach wird die Einzelzeile ausgegeben. Die anschließende Abfrage auf „Seitenende" bewirkt, daß beim Erkennen des Seitenendes ein Rücksprung zum „Drucken Überschrift" erfolgt. (Das Seitenende gilt als erreicht, wenn eine bestimmte Zeilenanzahl - hier: 16 Zeilen - gedruckt wurde.) Ist die für eine Seite vorgesehene maximale Zeilenanzahl noch nicht ausgegeben, wird die Verarbeitung mit dem Lesen der Datei fortgeführt. Wie man sieht, enthält der Programmablaufplan zwei - in der Mehrzahl der Arbeitsschritte übereinstimmende - Schleifen, deren Inhalt durch die Konnektoren „Lesen" bzw. „Kopf eingegrenzt wird. Nachfolgend das entsprechende Quellenprogramm: I D E N T I F I C A T I O N DIVISION. PROGRAM-ID. D R U C K E N - T E I L N E H M E R D A T E I . DATE-COMPILED. E N V I R O N M E N T DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT TEILNEHMERDATEI A S S I G N TO "A:TEILDAT.SEQ" O R G A N I Z A T I O N IS S E Q U E N T I A L ACCESS M O D E IS SEQUENTIAL. SELECT LISTE A S S I G N TO " : L P : U . DATA DIVISION. FILE SECTION. FD TEILNEHMERDATEI. 01 TEILNEHMERSATZ. 02 TNAME PIC X(30). 02 DATUM PIC X(6). 02 A N - A B W E S E N H E I T S - K Z PIC X. FD LISTE LINAGE IS 12 LINES LINES AT TOP 4-. 01 ZEILE PIC X(80). W O R K I N G - S T O R A G E SECTION. 77 U E B E R S C H R I F T S Z E I L E PIC X(80) V A L U E " DATUM "NAME, V O R N A M E ANWESEND". 01 EINZELZEILE.
Übungsaufgabe
97
02 FILLER PIC X(6) V A L U E SPACES. 02 ADATUM PIC X(6) . 02 FILLEH PIC X(6) V A L U E SPACES. 02 A T N A M E PIC X(30) . 02 FILLEH PIC X(9) V A L U E SPACES. 02 A A N - A B W E S E N H E I T S - K Z PIC X. 02 FILLEH PIC X(22) V A L U E SPACES. P E O C E D U H E DIVISION. OPEN INPUT TEILNEHMERDATEI OUTPUT LISTE. KOPF. W H I T E ZEILE FROM U E B E R S C H R I F T S Z E I L E B E F O R E A D V A N C I N G 1 LINE. LESEN. READ TEILNEHMERDATEI AT END CLOSE TEILNEHMERDATEI LISTE STOP RUN. M O V E DATUM TO ADATUM M O V E TNAME TO A T N A M E M O V E A N - A B W E S E N H E I T S - K Z TO A A N - A B W E S E N H E I T S - K Z W R I T E ZEILE FROM E I N Z E L Z E I L E B E F O R E A D V A N C I N G 1 LINE AT E N D - O F - P A G E GO TO KOPF. GO TO LESEN.
Hinweise zum Quellenprogramm: Die Aufbereitung der Überschriftszeile und Einzelzeile erfolgt in der WORKING-STORAGE SECTION. Bei der Beschreibung der Einzelzeile sind zwischen die einzelnen Datenfelder jeweils mit VALUE SPACES definierte FILLER eingefügt worden, durch die in der Ausgabezeile entsprechende Leerräume entstehen. Überschriftszeile und Einzelzeile werden in den WRITE-Anweisungen in den eigentlichen, zur Datei LISTE gehörenden, Ausgabesatz ZEILE übertragen. Die Codierung der Dateiende- bzw. Seitenende-Abfrage erfolgt mit Hilfe der AT END- bzw. AT END-OF-PAGE-Klausel. Sind diese Bedingungen nicht erfüllt, so wird die Verarbeitung jeweils mit der nächsten Anweisung (MOVE DATUM TO ADATUM bzw. GO TO LESEN) fortgesetzt.
6.7 Übungsaufgabe Zu folgender Aufgabenstellung ist ein Programm zu schreiben: Die Sätze der Teilnehmerdatei (vgl. Punkt 6.6) sind zu lesen und nacheinander am Bildschirm anzuzeigen. Anschließend sollen bei fehlerhaften Daten Korrekturen vorgenommen werden können. Die korrigierten Sätze sind in die Datei zurückzuschreiben. Lösung im Anhang A.
7 Steueranweisungen
Unter Steueranweisungen werden Befehle verstanden, die den Programmablauf, d.h. die Reihenfolge, in der die Anweisungen auszufuhren sind, steuern. Die ersten Steueranweisungen (GO TO- und STOP-Anweisung) wurden bereits in Kapitel 5 erläutert. Nachfolgend werden weitere Steueranweisungen behandelt, die u. a. zur Darstellung der Kontrollstrukturen „Iteration", „Selektion" und „Case" (vgl. Kapitel 1) dienen. Eine letzte Steueranweisung folgt in Kapitel 11 im Zusammenhang mit der Beschreibung der externen Unterprogramme.
7.1 Programmschleifen Die wiederholte Verarbeitung einer Befehlsfolge mit jeweils anderen Daten wird als Programmschleife oder Iteration bezeichnet. Werden die Befehle einer Schleife „endlos" wiederholt, weil die Schleife keine Ausfuhrungs- oder Abbruchbedingung enthält, so handelt es sich um eine Endlosschleife. Die Codierung einer derartigen Schleife stellt letztlich immer einen Programmierfehler dar, da das entsprechende Programm nie ein Ende erreicht. Eine korrekt aufgebaute Programmschleife wird stets durch eine Bedingung kontrolliert, die beim Erreichen einer bestimmten Situation zu einem Verlassen der Schleife führt. Bei dieser bedingten Schleife sind zwei Hauptformen zu unterscheiden. DO WHILE-Schleife: In Abhängigkeit von der Erfüllung einer Bedingung werden die Anweisungen der Schleife keinmal, einmal oder mehrmals ausgeführt. Die Bedingung wird vor der Verarbeitung der Anweisungen geprüft. Jeweils nach dem Durchlaufen der Befehlsfolge wird zur Abfrage der Bedingung zurückgegeben. Die Schleife wird solange wiederholt, wie die Bedingung gilt. Eine Konsequenz der DO WHILE-Schleife ist die Technik des sog. Vorauslesens (vgl. dazu Kapitel 1). Die Struktogrammdarstellung der DO WHILE-Schleife zeigt Abb. 16. Die DO WHILE-Schleife wird in COBOL durch die Anweisungen PERFORM . . . UNTIL bzw. PERFORM . . . WITH TEST BEFORE codiert.
PERFORM-Anweisung
99
Wiederhole, solange Bedingung gilt Arbeitsanweisung
Abb. 16: Kontrollstruktur DO WHILE-Schleife
DO UNTIL-SCHLEIFE (REPEAT UNTII^Schleife): In Abhängigkeit von der Erfüllung einer Bedingung werden die Anweisungen einer Schleife einmal oder mehrmals ausgeführt. Die Bedingung wird nach der Verarbeitung der Anweisungen geprüft, die Befehlsfolge wird also mindestens einmal durchlaufen. Die Schleife wird verlassen, wenn die (AbbruchBedingung erfüllt ist. Die Struktogrammdarstellung der DO UNTILSchleife zeigt Abb. 17.
Arbeitsanweisung Wiederhole, bis Abbruchbedingung erfüllt ist
Abb. 17: Kontrollstruktur DO UNTIL-Schleife
Die DO UNTIL- Schleife wird in COBOL durch die Anweisung P E R F O R M . . . WITH TEST AFTER codiert.
7.2 PERFORM-Anweisung Bei der PERFORM-Anweisung sind zwei Unterarten zu unterscheiden: Mit der OUT-OF-LINE-PERFORM-Anweisung können - von beliebigen Punkten eines Programmes aus - Prozeduren an anderen Stellen desselben Programmes aufgerufen werden. 15 Nach dem Durchlaufen der Prozedur wird zurückverzweigt und die Verarbeitung mit der auf die aufrufende PERFORM-
15
Unter einer Prozedur versteht man einen Programmabschnitt, zu dem von anderen Programmteilen verzweigt werden kann (vgl. Punkt 3.4).
100
Steueranweisungen
Anweisung folgenden Anweisung fortgesetzt. In dieser Art genutzte Prozeduren werden auch als interne Unterprogramme bezeichnet.^ Bei der OUT-OF-LINE-PERFORM-Anweisung darf der Zusatz END-PERFORM (s.u. Formate) nicht verwendet werden. Im Unterschied zur OUT-OF-LINE-PERFORM-Anweisung ruft die IN-LINEPERFORM-Anweisung keine Prozedur auf. Diese PERFORM-Anweisung bewirkt die Ausfuhrung einer sich unmittelbar an PERFORM anschließenden Folge von unbedingten Anweisungen, die grundsätzlich mit END-PERFORM abzuschließen sind. Format 1: THROUGH PERFORM
Prozedurname-1
Prozedurname-2 THRU
[unbedingte Anweisung-1 END-PERFORM] Erläuterungen: Wird ein Prozedurname-1 angegeben (OUT-OF-LINE-PERFORM), dürfen unbedingte Anweisung und END-PERFORM nicht verwendet werden. Im umgekehrten Fall, wenn der Prozedurname-1 entfällt (IN-LINE-PERFORM), müssen unbedingte Anweisung und END-PERFORM aufgeführt werden. Als Prozedurnamen können PARAGRAPH- oder SECTION-Namen angegeben werden. Wird nur ein Prozedurname-1 codiert, so bewirkt die PERFORMAnweisung einen Sprung zu der entsprechenden Prozedur. Nach dem Durchlaufen der Befehle der Prozedur erfolgt ein Rücksprung zu der auf die PERFORM-Anweisung folgenden Anweisung, mit der die Verarbeitung fortgesetzt wird. Werden Prozedurname-1 und Prozedurname-2 angegeben, so bewirkt der PERFORM-Befehl einen Sprung zum Prozedurnamen-1. Anschließend werden die Befehle dieser Prozedur und aller nachfolgenden bis zum Ende der unter Prozedurname-2 genannten Prozedur durchlaufen. Danach erfolgt wiederum ein Rücksprung zu der auf die PERFORM-Anweisung folgenden 16
Interne Unterprogramme sind Programmteile eines Hauptprogramms, die mit dem Hauptprogramm gemeinsam übersetzt werden. Von ihnen zu unterscheiden sind die externen Unterprogramme (vgl. Kapitel 11), die unabhängig v o m Hauptprogramm übersetzt werden und vor der Ausführung - vom Systemprogramm Binder (vgl. Punkt 1.4.4) - mit dem Hauptprogramm zusammengefügt werden.
PERFORM-Anweisung
101
Anweisung. Die COBOI/Worter THROUGH und THRU haben beide dieselbe Bedeutung. Als unbedingte Anweisung-1 kann auch eine Folge von mehreren Anweisungen aufgeführt werden. END-PERFORM beendet den Geltungsbereich der IN-LINE-PERFORMAnweisung. Beispiel (OUT-OF-LINE-PERFORM): PROCEDURE DIVISION. START. PERFORM LESEN PERFORM . . . LESEN. READ . . . DISPLAY . . . SATZAUSWAHL. GRUPPENVERARB. MOVE . . . SATZVERARB. Erläuterungen:
Die Anweisung PERFORM LESEN bewirkt einen Sprung zum Paragraphen LESEN und die Ausführung der dort aufgeführten Befehle. Nach der Verarbeitung der DISPLAY-Anweisung erfolgt ein Rücksprung zur zweiten PERFORM-Anweisung, mit der die Verarbeitung fortgesetzt wird. Tritt an die Stelle der Anweisung PERFORM LESEN die Anweisung PERFORM LESEN THRU GRUPPENVERARB,
so werden alle Befehle der Paragraphen LESEN, SATZAUSWAHL und GRUPPENVERARB ausgeführt. Nach der Verarbeitung der letzten MOVEAnweisung erfolgt wiederum ein Rücksprung zur zweiten PERFORM-Anweisung usw.. Neben dem oben beschriebenen Format 1 kennt ANS-COBOL 85 noch drei weitere Formate der PERFORM-Anweisung, von denen in diesem Kapitel nur noch Format 2 und 3 behandelt werden. Format 4 wird an anderer Stelle (Kapitel 10) im Zusammenhang mit der Tabellenverarbeitung dargestellt.
102
Steueranweisungen
Nachfolgend wird kurz das Format 2 beschrieben, das sich vom Format 1 nur durch eine kleine Erweiterung unterscheidet. Format 2: THROUGH PERFORM
Prozedurname-1
Prozedurname-2 THRU
Datenname-1 TIMES [unbedingte Anweisung-1 END-PERFORM] Ganzzahl Erläuterungen:
Durch die Angabe einer Ganzzahl bzw. eines Datennamens, dem vorher eine entsprechende Zahl zugewiesen wurde, kann zusätzlich die Anzahl der Durchläufe durch eine Prozedur, eine Folge von Prozeduren oder Anweisungen festgelegt werden. Beispiel: PERFORM LESEN THRU GRUPPENVEEAEB 3 TIMES
Beginnend mit der ersten Anweisung des Paragraphen LESEN, werden alle nachfolgenden Anweisungen bis einschließlich der letzten Anweisung des Paragraphen GRUPPENVERARB dreimal durchlaufen. Eine gegenüber den ersten beiden Formaten der PERFORM-Anweisung bedeutsame Erweiterung bringt das Format 3. Die in diesem Format enthaltenen Ergänzungen ermöglichen es, mit der PERFORM-Anweisung sowohl DO WHILE- als auch DO UNTILSchleifen zu codieren. Format 3: THROUGH PERFORM
Prozedurname-1
Prozedurname-2 THRU
BEFORE WITH TEST
UNTIL Bedingung-1 AFTER
[unbedingte Anweisung-1 END-PERFORM]
PERFORM-Anweisung
103
Erläuterungen: Durch den Zusatz UNTIL kann die Anzahl der Durchläufe durch eine Prozedur bzw. eine Folge von Prozeduren oder Anweisungen von der Erfüllung einer Bedingung abhängig gemacht werden. Die Verarbeitung der Prozedur erfolgt solange, bis die hinter UNTIL definierte Bedingung erfüllt ist. Die Zusätze WITH TEST BEFORE bzw. WITH TEST AFTER legen fest, ob die Bedingung vor oder nach Ausführung der Prozedur geprüft wird. WITH TEST BEFORE entspricht mithin der Logik der DO WHILE-Schleife, während der Zusatz WITH TEST AFTER immer die Logik der DO UNTILSchleife verkörpert. Fehlen diese Zusätze, so wird WITH TEST BEFORE unterstellt. Zu den allgemeinen Regeln für die Formulierung von Bedingungen vgl. die Ausführungen zur IF-Anweisung unter Punkt 7.4. Beispiel (IN-LINE-PERFORM): OPEN INPUT VDATEI READ VDATEI AT END M O V E
. . . . . .
PERFORM U N T I L SATZART NOT = T2 MOVE . . . WRITE . . . R E A D VDATEI AT END M O V E . . . END-READ DISPLAY . . . END-PERFORM
Erläuterungen: Die Anweisungsfolge MOVE . . . , WRITE . . . , READ . . . , DISPLAY . . . wird solange durchlaufen, wie die eingelesenen Sätze von der Satzart T2 sind. Bei einem Satz mit einer anderen Satzart wird die Verarbeitung mit der auf END-PERFORM folgenden Anweisung fortgesetzt. Wird vorher das Dateiende erreicht, so wird die in der READ-Anweisung enthaltene AT ENDKlausel wirksam und die sich daran anschließende MOVE-Anweisung wird ausgeführt. (Vgl. dazu die nachfolgende Codierung des Programms 2). END-READ bewirkt den Abschluß der READ-Anweisung. Bei einem Fehlen von END-READ würde die DISPLAY-Anweisung einen Bestandteil des AT END-Zweiges der READ-Anweisung bilden und nur bei Erreichen des Dateiendes ausgeführt werden. In dem hier vorliegenden Fall erfolgt die Ausgabe grundsätzlich nach Beendigung des READ-Befehls. Nähere Erläute-
104
Steueranweisungen
rungen zu den expliziten Bereichsbegrenzern wie END-READ usw. folgen unter Punkt 7.4. Eine elegantere Lösung derselben Aufgabenstellung zeigt die nachfolgende Codierung. Durch Einsatz einer weiteren OUT-OF-LINE-PERFORM-Anweisung wird ein im obigen Beispiel enthaltener „Schönheitsfehler", die zweifache Codierung der READ-Anweisung, vermieden. OPEN INPUT VDATEI . . . PERFORM LESEN PERFORM UNTIL SATZART NOT = T2 MOVE . . . WHITE . . . PERFORM LESEN DISPLAY . . . END-PERFORM LESEN. READ VDATEI AT END MOVE
....
Wichtig! Die Anweisungen in der IN-LINE-PERFORM-Schleife dürfen nicht mit einem Punkt abgeschlossen werden. Die Kenntnis der PERFORM-Anweisung ermöglicht nun auch eine den Regeln der Strukturierten Programmierung entsprechende Codierung der bereits in Kapitel 6 erstellten Programme. Die nachfolgende Codierung basiert auf den in Abb. 14 und Abb. 15 beschriebenen Struktogrammen. Programm 1 (Aufbau einer sequentiellen Datei) Erläuterungen zum Struktogramm (Abb. 14): Die Struktogrammlösung ist offensichtlich länger und umständlicher als die Programmablaufplanlösung. 1 7 Die Gründe dafür liegen in der Verwendung der DO WHILE-Schleife, die das bereits mehrfach erwähnte Vorauslesen notwendig macht, das in diesem Beispiel eine zweifache Codierung der Arbeitsschritte Löschen Bildschirm, Ausgabe Masken und Lesen LE-KZ, Name, A-KZ erfordert.
17
Gerade bei kleinen, einfachen Programmen wird die Strukturierte Programmierung häufig zu einer Verlängerung der Programme fuhren. Diese aufwendigere Programmierung ist jedoch wegen der überzeugenden Vorteile der Strukturierten Programmierung in Kauf zu nehmen.
PERFORM-Anweisung
105
Um zu einer übersichtlicheren Lösung zu kommen, wurde die Bildschirmausgabe in zwei Masken aufgeteilt und entsprechend auch die Eingabe getrennt. Da die ersten drei DIVISIONS unverändert geblieben sind, wird nur die PROCEDURE DIVISION wiedergegeben. P R O C E D U R E DIVISION. BEGINN. OPEN OUTPUT TEILNEHMERDATEI ACCEPT DATUM FROM DATE P E R F O R M E I N G A B E - E N D E THRU E I N G E B E N P E R F O R M V E R A R B E I T U N G U N T I L L E T Z T E - E I N G A B E - K Z = "J" CLOSE TEILNEHMERDATEI STOP RUN. EINGABE-ENDE. DISPLAY SPACES DISPLAY "GEBEN SIE EIN J EIN, W E N N K E I N E E I N G A B E E R F O L G E N SOL "L"AT 1003 ACCEPT LETZTE-EINGABE-KZ AT 120?. EINGEBEN. DISPLAY SPACES DISPLAY "GEBEN SIE N A M E N UND V O R N A M E N IN DER FORM XXXXXXXXXXX "XXXXX.XXXXXXXXXXXXXXX EIN" AT 0203 DISPLAY "GEBEN SIE BEI A B W E S E N H E I T DES TEILNEHMERS E I N N, BEI « A N W E S E N H E I T E I N J EIN" AT 0603 ACCEPT TNAME AT 0403 ACCEPT A N - A B W E S E N H E I T S - K Z AT 0803. VERARBEITUNG. W R I T E TEILNEHMERSATZ FROM E I N G A B E M O V E SPACES TO TNAME, A N - A B W E S E N H E I T S - K Z PERFORM EINGABE-ENDE IF LETZTE-EINGABE-KZ NOT = "J" PERFORM EINGEBEN.
Hinweise zum
Quellenprogramm:
Nach der Dateieröffnung und dem Einlesen des Datums werden zunächst die Anweisungen in den Paragraphen EINGABE-ENDE und EINGEBEN ausgeführt. Danach erfolgt ein Rücksprung zur zweiten PERFORM-ANWEISUNG und anschließend das Durchlaufen der Anweisungen im Paragraphen VERARBEITUNG. Mit PERFORM EINGABE-ENDE werden wiederum die Anweisungen im Paragraphen EINGABE-ENDE aufgerufen. Zum Paragraphen EINGEBEN wird verzweigt, wenn das LETZTE-EINGABE-KZ nicht gleich „J" ist. In diesem Fall wird, nach dem Einlesen von TNAME und dem AN-ABWESENHEITS-KZ, die Ausführung der Schleife VERARBEITUNG fortgesetzt. Im anderen Fall wird die Steuerung zur Anweisung PERFORM VERARBEITUNG . . . zurückgegeben und die Verarbeitung mit CLOSE . . . und STOP RUN beendet.
106
Steueranweisungen
Programm 2 (Drucken Teilnehmerliste) Erläuterungen zum Struktogramm (Abb. 15): Auch hier ergibt sich - als Konsequenz der DO WHILE-Schleife - wiederum die Notwendigkeit des Vorauslesens. Nachfolgend werden nur die WORKING-STORAGE SECTION und die PROCEDURE DIVISION wiedergegeben. In den anderen Programmteilen haben sich gegenüber der in Kapitel 6 abgedruckten Version keine Veränderungen ergeben. W O R K I N G - S T O R A G E SECTION. 77 U E B E R S C H B I F T S Z E I L E PIC 1(80) V A L U E " DATUM "NAME, V O R N A M E ANWESEND". 77 DATEI-ENDE-KZ PIC 9 V A L U E 0. 01 EINZELZEILE. 02 FILLER PIC 1(6) VALUE SPACES. 02 A D A T U M PIC X(6). 02 FILLER PIC X(6) VALUE SPACES. 02 A T N A M E PIC X(30). 02 FILLER PIC 1(9) V A L U E SPACES. 02 A A N - A B W E S E N H E I T S - K Z PIC X. 02 FILLER PIC X(22) V A L U E SPACES. P R O C E D U R E DIVISION. OPEN INPUT TEILNEHMERDATEI OUTPUT LISTE PERFORM K O P F PERFORM LESEN P E R F O R M V E R A R B E I T U N G U N T I L DATEI-ENDE-KZ = 1 CLOSE TEILNEHMERDATEI LISTE STOP RUN. KOPF. W R I T E ZEILE FROM U E B E R S C H R I F T S Z E I L E B E F O R E A D V A N C I N G 1 LINE. LESEN. READ TEILNEHMERDATEI AT END M O V E 1 TO DATEI-ENDE-KZ. VERARBEITUNG. M O V E DATUM TO ADATUM M O V E TNAME TO A T N A M E M O V E A N - A B W E S E N H E I T S - K Z TO A A N - A B W E S E N H E I T S - K Z W R I T E ZEILE FROM E I N Z E L Z E I L E B E F O R E A D V A N C I N G 1 LINE AT E N D - O F - P A G E PERFORM KOPF. PERFORM LESEN.
Hinweise zum Quellenprogramm: Im Paragraphen KOPF wird zunächst die Überschriftszeile der Liste ausgegeben. PERFORM LESEN bewirkt einen Sprung zum Paragraphen Lesen und die Ausführung der READ-Anweisung. Wird beim Lesen festgestellt, daß das Dateiende erreicht ist, so wird eine 1 in das vorher in der WORKINGSTORAGE SECTION definierte Feld DATEI-ENDE-KZ übertragen. Das Feld DATEI-ENDE-KZ dient anschließend zum Erkennen des Dateiendes bei der Schleifenverarbeitung.
EXIT-Anweisung
107
Nach dem Lesen erfolgt der Rücksprung zu PERFORM VERARBEITUNG sowie die Ausfuhrung der im Paragraphen VERARBEITUNG enthaltenen Anweisungen. Bei Erreichen des Seitenendes (vgl. dazu die Dateidefinition LISTE) wird zum Paragraphen KOPF verzweigt und nachfolgend zum Paragraphen LESEN. Ist das Seitenende nicht erreicht, so wird die Verarbeitung sofort mit dem Paragraphen LESEN fortgesetzt. Zu einem Verlassen der Schleife (und der Beendigung der Verarbeitung) kommt es, wenn in der Anweisung PERFORM VERARBEITUNG . . . erkannt wird, daß das DATEI-ENDE-KZ = 1 ist.
7.3 EXIT-Anweisung Die EXIT-Anweisung bildet einen Endpunkt für ein durch PERFORM aufgerufenes (internes) Unterprogramm. Sie verkörpert eine sog. Leeranweisung, d. h. eine Anweisung, die keinen Einfluß auf die Programmausfiihrung hat. Die EXIT-Anweisung steht immer als einzige Anweisung in einem Paragraphen. Format: EXIT Erläuterungen:
Geschachtelte PERFORM-Unterprogramme dürfen nach herkömmlichen COBOL^Regeln nicht mit einem gleichen Endpunkt enden. Die EXIT-Anweisung bietet hier die Möglichkeit, weitere Endpunkte einzufügen und damit jedem Unterprogramm einen eindeutigen Abschluß zuzuordnen. Beispiel: PERFORM LESEN THRU SATZVERARB LESEN. SATZAUSWAHL. PERFORM SATZVERARB GRUPPENVERARB. SATZVERARB.
108
Steueranweisungen
Das äußere PERFORM-Unterprogramm (PERFORM LESEN THRU SATZVERARB) und das innere PERFORM-Unterprogramm (PERFORM SATZVERARB) enden mit demselben Paragraphen. Eine derartige Darstellung ist unzulässig, weil nach der Ausführung des Paragraphen SATZVERARB nicht eindeutig ist, mit welcher Anweisung die Verarbeitung fortzusetzen ist. „Rücksprungadresse" könnte entweder die auf PERFORM LESEN THRU SATZVERARBEITUNG oder die auf PERFORM SATZVERARB folgende Anweisung sein. 18 Durch Einfügung einer EXIT-Anweisung in einem weiteren Paragraphen ABSCHLUSS wird dieses Problem gelöst. FERFORM LESEN THRU ABSCHLUSS LESEN. SATZAUSWAHL. PERFORM SATZVERARB GRUPPENVERARB. SATZVERARB. ABSCHLUSS. EXIT.
Die Endpunkte der beiden Unterprogramme und damit die Rücksprungadressen sind jetzt klar getrennt. Bei der Ausführung von PERFORM SATZVERARB wird - nach der Verarbeitung der letzten Anweisung des Paragraphen SATZVERARB - zu der auf PERFORM SATZVERARB folgenden Anweisung zurückverzweigt. Nach der EXIT-Anweisung erfolgt ein Rücksprung zu der sich an PERFORM LESEN THRU ABSCHLUSS anschließenden Anweisung. Zur Anweisung EXIT PROGRAM vgl. Kapitel 11.
7.4 IF-Anweisung Die Kontrollstruktur „Selektion" (Verzweigung) wird durch die IF-Anweisung codiert. Die IF-Anweisung prüft, ob eine Bedingung erfüllt (= wahr) ^ Bei verschiedenen neuen Compilern sind derartig verschachtelte Unterprogramme zulässig. Bei diesen Compilern ist die EXIT-Anweisung nicht mehr erforderlich.
109
IF-Anweisung
oder nicht erfüllt (= falsch) ist. In Abhängigkeit von der Erfüllung oder Nichterfüllung der Bedingung ergeben sich unterschiedliche Arbeitsschritte im Objektprogramm. Format: Anweisung-1 . . . IF Bedingung THEN NEXT SENTENCE ELSE Anweisung-2 . . . [END-IF] ELSE NEXT SENTENCE END-IF Erläuterungen
Die IF-Anweisung wird, weil sie mit der Abfrage einer Bedingung beginnt, auch als bedingte Anweisung bezeichnet. ^ Ist die Bedingung erfüllt, wird der THEN-Zweig (Ja-Zweig) mit der Anweisung-1 ausgeführt; ist die Bedingung nicht erfüllt, wird der ELSE-Zweig (Nein-Zweig) mit Anweisung-2 ausgeführt. Jeder Zweig kann eine unbestimmte Anzahl von Anweisungen enthalten. Grundsätzlich bildet die IF-Anweisung mit allen Anweisungen im THENund ELSE-Zweig immer einen COBOL-Satz. Ein solcher Satz (vgl. Kapitel 3) muß mit einem Punkt oder mit END-IF abgeschlossen werden. Nach Ausführung eines Zweiges wird die Verarbeitung des Programmes mit dem nächsten, auf die IF-Anweisung folgenden Satz fortgesetzt. Eine Ausnahme von dieser Regel besteht nur dann, wenn der ausgeführte Zweig mit einer GO TO-Anweisung endet, die die Fortführung des Programms an einer anderen Stelle bewirkt. Für die einzelnen Zweige gelten folgende Regeln: Der THEN-Zweig endet mit dem COBOL Wort ELSE oder - bei Verzicht auf die Codierung des ELSE-Zweiges - mit dem Satzende. Ist kein ELSE-Zweig angegeben und ist die Bedingung nicht erfüllt, so wird das Programm unmittelbar mit der nächsten Anweisung im nachfolgenden Satz fortgesetzt. "
Das Gegenteil zu den bedingten Anweisungen (dazu gehören auch Anweisungen, die mit bestimmten Bedingungen verknüpft werden können, wie z. B. R E A D . . . AT E N D . . . , PERFORM . . . U N T I L usw.) verkörpern die unbedingten Anweisungen. Dabei handelt es sich u m alle Anweisungen, deren Ausführung nicht von einer Bedingung abhängig gemacht wird.
110
Steueranweisungen
Der ELSE-Zweig endet mit dem Ende des Satzes. In Fällen, in denen nur der Wahrheitswert der Bedingung abgefragt werden soll, kann auf die Codierung des ELSE-Zweiges ganz verzichtet werden. Die Angabe NEXT SENTENCE in einem Zweig der IF-Anweisung wird codiert, wenn in diesem Zweig keine Anweisungen ausgeführt werden sollen. Sie muß im THEN-Zweig dann codiert werden, wenn hier keine Anweisungen vorgesehen sind und ein ELSE-Zweig folgt. Sollen im ELSE-Zweig keine Arbeitsanweisungen ausgeführt werden, so kann auf diesen Zweig insgesamt - und damit auch auf die Eintragung NEXT SENTENCE - verzichtet werden. Eine Ausnahme von dieser Regel gilt für den Fall geschachtelter IF-Anweisungen (s.u. Beispiel). Geschachtelte IF-Anweisungen sind Anweisungen, die im THEN- oder ELSE-Zweig einer anderen IF-Anweisung erscheinen. Beispiel: Eine Firma zahlt ihren Mitarbeitern ein Urlaubsgeld (UG) in unterschiedlicher Höhe. Mitarbeiter mit mindestens 15 Jahren Betriebszugehörigkeit (BZ) bekommen ausnahmslos DM 2000,-. Bei einer kürzeren Betriebszugehörigkeit wird noch einmal nach der Kinderzahl (KZ) differenziert. Mitarbeiter mit mehr als einem Kind erhalten einen Betrag von DM 1500,-, alle anderen bekommen nur DM 1000,-. Im Struktogramm ergibt sich folgende Darstellung: B Z < 15? ja
—
K Z > 1? ^^^^lein U G = 1500
I
—
nein U G = 2000
U G = 1000
Die Codierung erfordert geschachtelte IF-Anweisungen: IF BZ < 15 THEN IF KZ > 1 THEN M O V E 1500 TO UG E L S E M O V E 1000 TO UG ELSE M O V E 2000 TO UG.
Für das Verständnis der Codierung ist die Zuordnung der ELSE-Zweige zu den IF-Anweisungen von entscheidender Bedeutung. Diese Zuordnung er-
IF-Anweisung
111
folgt immer nach dem Grundsatz „von innen nach außen", d.h. der erste ELSE-Zweig wird der zuletzt aufgeführten IF-Anweisung zugewiesen usw. Würde der erste ELSE-Zweig fehlen, weil für die in dem ELSE-Zweig geltenden Bedingungen keine Arbeitsanweisung vorgesehen wäre, so ergäbe sich eine falsche Zuordnung. In einem solchen Fall muß ELSE NEXT SENTENCE codiert werden, um zu der richtigen Zuordnung zu kommen. Eine andere Möglichkeit wäre die Beendigung des THEN-Zweiges der zweiten (inneren) IF-Anweisung mit END-IF (s.u.). Die Angabe von END-IF schließt den Geltungsbereich des THEN- bzw. ELSE-Zweiges der IF-Anweisung ab und trennt damit die IF-Anweisung von den nachfolgenden Anweisungen. Dabei ist jedoch zu beachten, daß END-IF nicht auf eine NEXT SENTENCE-Eintragung folgen darf. END-IF kann einen ELSE NEXT SENTENCE-Zweig nicht abschließen. END-IF wird als expliziter Bereichsbegrenzer (engl.: scope terminator) bezeichnet. Die erst mit der neuen ANS 85 Norm in die COBOLSprache für alle bedingten Anweisungen eingeführten Bereichsbegrenzer (in den vorherigen Kapiteln wurden bereits END-READ, END-WRITE, END-REWRITE und END-PERFORM erwähnt) sind vor allem für die Codierung geschachtelter Bedingungen von praktischer Bedeutung. Sie ermöglichen eine Begrenzung geschachtelter Bedingungen ohne eine Beendigung anderer Bedingungen. Nachfolgend soll die Verwendung des Bereichsbegrenzers END an mehreren Beispielen dargestellt werden. Beispiele: (1) In Abänderung des obigen Beispiels zur Urlaubsgeldbestimmung wird unterstellt, daß bei einer Kinderzahl < 2 kein Urlaubsgeld (d. h. keine Anweisung) vorgesehen ist. Unter Einsatz von END-IF kann dann wie folgt codiert werden: IF BZ < 15 THEN IF KZ > 1 THEN M O V E 1500 TO U G END-IF E L S E M O V E 2000 TO UG.
(Statt des Punktes kann hier auch ein zweites END-IF gesetzt werden.) END-IF beendet die zweite (innere) IF-Anweisung. Damit wird deutlich, daß der ELSE-Zweig zur ersten IF-Anweisung gehört.
Steueranweisungen
112
Wichtig! In keinem Fall darf statt des END-IF ein Punkt gesetzt werden. Dieser Punkt würde auch die erste (äußere) IF-Anweisung beenden, die damit nur aus einem THEN-Zweig bestände. (2) Das obige Beispiel Urlaubsgeldbestimmung wird noch einmal wie folgt abgewandelt: Das Urlaubsgeld für Mitarbeiter mit einer Betriebszugehörigkeit unter 15 Jahren soll, unabhängig von der Kinderzahl, in einer gesonderten Liste erfaßt werden. Aufbereitung und Ausgabe dieser Liste erfolgen in einem Unterprogramm DRUCK. Das zugehörige Struktogramm hat den nachstehenden Aufbau:
U G = 1500
UG = 1000
UPRO DRUCK
Auch in diesem Fall ist der Einsatz von END-IF zur Codierung erforderlich: IF BZ < 15 THEN IF KZ > 1 THEN MOVE 1500 TO UG ELSE MOVE 1000 TO UG END-IF PERFORM DRUCK ELSE HOVE 2000 TO UG.
(Statt Punkt auch END-IF.) Bei einem Verzicht auf die erste END-IF Angabe würde PERFORM DRUCK ein Bestandteil des ELSE-Zweiges der geschachtelten (inneren) IF-Anweisung sein. Das Unterprogramm DRUCK würde dann, abweichend von der Aufgabenstellung, nur ausgeführt werden bei Mitarbeitern mit einer Betriebszugehörigkeit < 15 und einer Kinderzahl < 2. (3) Eine mit dem END-IF in Beispiel 2 vergleichbare Aufgabenstellung hat der Bereichsbegrenzer END-READ in der nachstehenden Codierung: IF PERSONALNR > 10000 THEN READ PERSONALDATEI AT END DISPLAY "ENDE" CLOSE PERSONALDATEI
IF-Anweisung
113
END-READ PERFORM VERARBEITUNG E L S E DISPLAY "FEHLERMELDUNG".
(Statt Punkt auch END-IF.) Bei einem Verzicht auf END-READ ergäbe sich ein anderer Sachverhalt. Die Anweisung PERFORM VERARBEITUNG würde dann nur ausgeführt werden, wenn die AT END-Bedingung erfüllt ist. Nach der obigen Codierung wird sie dagegen grundsätzlich im Anschluß an die READ-Anweisung ausgeführt. Nachfolgend werden die verschiedenen Möglichkeiten zur Formulierung der in der IF-Anweisung enthaltenen Bedingung dargestellt. Grundsätzlich ist dabei zunächst zwischen einfachen und komplexen (zusammengesetzten) Bedingungen zu unterscheiden. Die einfachen Bedingungen lassen sich weiter in Vergleichsbedingungen, Klassenbedingungen, Bedingungsnamen-Bedingungen und Vorzeichenbedingungen unterteilen. Einfache Bedingungen Vergleichsbedingung In einer Vergleichsbedingung werden zwei Operanden, die die Form von Datennamen, Literalen, arithmetischen Ausdrücken oder Indexnamen haben können, miteinander verglichen. 2 0 Format:
Datenname-1 Literal-1 arithm. Ausdruck-1 Indexname-1
20
IS IS IS IS IS IS IS IS IS IS
[NOT] GREATER THAN [NOT] > [NOT] LESS THAN [NOT] < [NOT] EQUAL TO [NOT] = GREATER THAN OR EQUAL TO >= LESS THAN OR EQUAL TO , =, < = muß eine Leerstelle erscheinen. - Bei einem Vergleich zweier numerischer Operanden ist ausschließlich der algebraische Wert maßgebend. Die Feldlänge und die interne Darstellung (vgl. Punkt 1.2.3) der Operanden haben keine Bedeutung. - Bei einem Vergleich nicht-numerischer Operanden bzw. einem Vergleich eines numerischen mit einem nicht-numerischen Operanden gilt folgendes: Die Speicherstellen der beiden Operanden werden von links nach rechts verglichen. Sind die Operanden von unterschiedlicher Länge, so wird der kürzere Operand durch Anfügen von Leerstellen auf die Länge des längeren Operanden ergänzt. Dem Vergleich werden die dualen Verschlüsselungen der Zeichen, wie sie sich aus dem jeweils verwendeten Code ergeben, zugrundegelegt. 21 Anders als bei einem Vergleich numerischer Daten muß hier die interne Darstellung der Operanden übereinstimmen. Nach ANS COBOL 85 ist für beide Operanden grundsätzlich dieselbe (alphanumerische) Speicherungsform vorgeschrieben. 22 Ausnahmen von dieser Regel erlauben nur einige neuere Compiler. 21
22
In aller Regel wird es sich um den EBCDI- oder ASCII-Code handeln (vgl. Punkt 1.2.2). Die interne alphanumerische Darstellung von nicht-numerischen Daten in einem Speicherfeld (vgl. Punkt 1.2.2 und 1.2.3) ergibt sich implizit bei alphabetisch und alphanumerisch definierten Feldern, d.h. bei Verwendung der Maskensymbole A und X. Sie kann ferner durch Hinzufügung des Zusatzes U S A G E IS DISPLAY zur Felddefinition explizit vorgeschrieben werden. Die verschiedenen Möglichkeiten, die interne Speicherung von Daten festzulegen, werden bei der Beschreibung der USAGE-Klausel (vgl. Kapitel 9, Punkt 9.1) erläutert.
115
IF-Anweisung
Beispiel: 02 NAME -1 PIC X VALUE "A" . 02 NAME -2 PIC X VALUE "B" . IF NAME -1 < NAME-2 THEN PERFOKM . . . . ELSE DISPLAY . . . . END-IF Je nach dem verwendeten Code werden in der Bedingung der IF-Anweisung verschiedene Dualkombinationen miteinander verglichen. Beim EBCDICode ist der Inhalt der Operanden 1100 0001 (A) und 1100 0010 (B). Beim ASCII-Code enthalten die Datenfelder die Ziffernkombinationen 0100 0001 (A) und 0100 0010 (B). In beiden Fällen ergibt sich mithin, daß der NAME-1 kleiner ist als der NAME-2. Klassenbedingung Die Klassenbedingung ermöglicht die Feststellung, ob ein Datenfeld einen numerischen oder alphanumerischen Inhalt hat. Format (verkürzt): Datenname IS [NOT]
NUMERIC ALPHABETIC
Erläuterungen:
Die Klassenbedingung ist dann erfüllt, wenn das Datenfeld bei einem Vergleich mit NUMERIC ausschließlich die Ziffern 0-9; bei einem Vergleich mit ALPHABETIC ausschließlich die Buchstaben A-Z und das Leerzeichen enthält. 23 Folgende Regeln sind zu beachten: - Eine Prüfung auf NUMERIC darf nur bei numerisch oder alphanumerisch definierten Datenfeldern erfolgen. - Eine Prüfung auf ALPHABETIC darf nur bei alphabetisch oder alphanumerisch definierten Datenfeldern erfolgen.
Die im Operanden enthaltenen Daten müssen alphanumerisch bzw. ungepackt gespeichert sein, d.h. daß der Datenname implizit oder explizit mit USAGE IS DISPLAY definiert sein muß. Vgl. dazu Fußnote 2 0 .
116
Steueranweisungen
Beispiel: IF E-FELD NOT N U M E R I C THEN PERFORM ELSE PERFORM END-IF
FEHLER VERARBEITUNG
Bedingungsnamen-Bedingung Die Darstellung der Bedingungsnamen-Bedingung erfordert zunächst eine Klärung des Begriffes „Bedingungsname". Bedingungsnamen sind Namen, die einem bestimmten Inhalt eines Datenfeldes zugeordnet werden können. Sie werden entsprechend den Regeln für Datennamen gebildet und mit der Stufennummer 88 gekennzeichnet. Die Deklaration von Bedingungsnamen folgt immer im Anschluß an die Definition des Datenfeldes, dessen Werte ihnen zugewiesen werden. Bedingungsnamen werden eingesetzt, um die Lesbarkeit von Programmen zu verbessern. In erster Linie finden sie in bedingten Anweisungen Verwendung. Format: 00D
88 Bedingungsname
I VALUE IS j VALUES ARE
THROUGH Literal-1
Literal-2 THRU
Erläuterungen: Hinter der Stufennummer 88 und dem Bedingungsnamen folgen die - völlig gleichwertigen - Eintragungen VALUE IS bzw. VALUES ARE. Literal-1 und Literal-2 sind mögliche Inhalte des übergeordneten Datenfeldes, die mit dem Datentyp dieses Feldes übereinstimmen müssen und die in einer bedingten Anweisung abgeprüft werden sollen. Die COBOI^Wörter THROUGH bzw. THRU ermöglichen die Angabe von Wertebereichen und ihre Zuordnung zu einem einzelnen Bedingungsnamen.
IF-Anweisung
117
Beispiel: Das Programm 2 (Drucken Teilnehmerliste) enthält in der WORKINGSTORAGE SECTION die Felddefinition 77 DATEI-ENDE-KZ PIC 9 V A L U E 0. ,
die als Ende-Bedingung in einer PERFORM-Anweisung eingesetzt wird. Die Definition eines Bedingungsnamens DATEI-ENDE in der Form 77 DATEI-ENDE-KZ 9 PIC VALUE 0. 88 D A T E I - E N D E V A L U E 1.
ermöglicht die nachfolgende, aussagekräftigere Form der PERFORM-Anweisung: PERFORM V E E A E B E I T U N G U N T I L DATEI-ENDE.
Die Anweisungen des Paragraphen VERARBEITUNG werden solange ausgeführt, bis die mit dem Bedingungsnamen DATEI-ENDE verbundene Konstellation (DATEI-ENDE-KZ = 1) vorliegt. Im obigen Beispiel enthält die PERFORM-Anweisung eine Bedingungsnamen-Bedingung, für die folgendes Format gilt: Format: Bedingungsname Die Bedingungsnamen-Bedingung ist immer eine Alternative zu einer Vergleichsbedingung. Gegenüber der Vergleichsbedingung hat sie den Vorteil, daß sie aussagekräftigere Formulierungen zuläßt. Nachfolgend ein weiteres Beispiel zum Einsatz von Bedingungsnamen-Bedingungen in IF-Anweisungen. Beispiel: Ein Versandhaus gewährt in Abhängigkeit von dem Wert der Bestellung seinen Kunden unterschiedliche Lieferkonditionen (Rabatte, Versandkosten usw.). 01 AUFTRAGSWERT PIC 9(4)V99. 88 L I E F E R K O N D I T I O N E N - K A T E G O R I E - A VALUE 9 9 9 9 - 9 9 88 L I E F E R K O N D I T I O N E N - K A T E G O R I E - B V A L U E 4-999.99 88 L I E F E R K O N D I T I O N E N - K A T E G O R I E - C VALUE 9 9 9 - 9 9 88 L I E F E R K O N D I T I O N E N - K A T E G O R I E - D V A L U E 99-99 IF
LIEFERKONDITIONEN-KATEGORIE-A THEN PERFORM BERECHNUNG-1
THRU 5000. THRU 1000. THRU 100. THRU 1.
118
Steueranweisungen E L S E IF
LIEFERKONDITIONEN-KATEGORIE-B THEN P E R F O R M B E R E C H N U N G - 2 E L S E IF L I E F E R K O N D I T I O N E N - K A T E G O R I E - C T H E N P E R F O R M BERECHNUNG-3 E L S E IF L I E F E R K O N D I T I O N E N - K A T E G O R I E - D THEN P E R F O R M B E R E C H N U N G - ^ END-IF END-IF END-IF
END-IF
Vorzeichenbedingung Die Vorzeichenbedingung ist eine Alternative zur Vergleichsbedingung. Sie ermöglicht die Feststellung, ob ein arithmetischer Ausdruck positiv, negativ oder gleich Null ist. 2 4 Format: arithmetischer Ausdruck IS [NOT!
POSITIVE NEGATIVE ZERO
Erläuterungen:
An die Stelle des in der COBOL-Norm ANS 85 ausschließlich erwähnten arithmetischen Ausdrucks kann bei allen z. Z. bekannten Compilern auch ein Datenname treten. Die oben dargestellte Vorzeichenbedingung ist letztlich nur eine Verkürzung folgender Vergleichsbedingung:
arithmetischer Ausdruck IS [NOT]
24
GREATER THAN > LESS THAN < EQUAL TO
ZERO
Zur Bildung von arithmetischen Ausdrücken vgl. die Darstellung der COMPUTEAnweisung im nächsten Kapitel.
119
IF-Anweisung
Folgende Regeln sind zu beachten: - Der arithmetische Ausdruck muß mindestens einen Datennamen enthalten. - Ein in der Vorzeichenbedingung enthaltener Datenname muß numerisch definiert sein. Beispiel: IF (A-B) IS N E G A T I V E THEN P E R F O R M BERECHNUNG-1 ELSE PERFORM BERECHNUNG-2 END-IF
Komplexe (zusammengesetzte) Bedingungen Eine komplexe Bedingung entsteht durch eine Zusammenfassung einfacher Bedingungen, die durch logische Verknüpfungen miteinander verbunden werden. Derartige Verknüpfungen werden durch die logischen Operatoren AND und OR sowie durch die Negierung dieser Operatoren mit NOT hergestellt. Format (zusammengefaßt): AND [NOT] Bedingung-1
[NOT] Bedingung-2 OR
Folgende Regeln sind zu beachten: - Werden Bedingungen mit dem logischen Operator AND verknüpft, so gilt die daraus entstandene komplexe Bedingung dann als erfüllt, wenn alle Einzelbedingungen erfüllt sind. - Werden Bedingungen mit dem logischen Operator OR verknüpft, so gilt die daraus entstandene komplexe Bedingung dann als erfüllt, wenn eine der Einzelbedingungen erfüllt ist. - Steht der Operator NOT vor einer Bedingung, so gilt diese Bedingung dann als erfüllt, wenn die eigentliche - hinter NOT folgende Bedingung - falsch ist. Beispiele: (1) IF SATZART = A AND KDNR > 9999 AND KDNR < THEN P E R F O R M V E R A R B E I T U N G ELSE P E R F O R M FEHLER END-IF
20000
Steueranweisungen
120
Das Unterprogramm „ V E R A R B E I T U N G " wird nur ausgeführt, wenn alle drei Bedingungen erfüllt sind. Enthält eine komplexe Bedingung mehrere Vergleiche, die sich auf dasselbe Subjekt (hier: KDNR) beziehen, so besteht die Möglichkeit, die Codierung dadurch zu verkürzen, daß das Subjekt nur einmal aufgeführt wird. Die obenstehende Bedingung kann mithin wie folgt verkürzt werden: IF SATZART = A AND K D N R >
9999 AND
1 0 0 0 0 AND KONTOSTAND > U E B E R Z I E H U N G S L I M I T = "J" THEN P E R F O R M A U F T R A G ELSE . . .
ZERO OR
Das Unterprogramm „ A U F T R A G " wird dann ausgeführt, wenn der Auftragswert nicht größer als 10000 ist und wenn entweder der Kontostand positiv ist oder ein Überziehungslimit vereinbart wurde. Werden bei komplexen Bedingungen verschiedene Operatoren verwendet, so gelten folgende - hier nur verkürzt wiedergegebene - Regeln zur Auswertungsreihenfolge der Bedingungen: - Zuerst werden die einfachen Bedingungen - von links nach rechts - ausgewertet, d.h. es wird festgestellt, ob sie erfüllt oder nicht erfüllt sind. - Danach werden ggf. vorhandene NOT-Operatoren berücksichtigt. - Anschließend werden - von links nach rechts - alle AND-Verknüpfungen ausgewertet. - Im letzten Schritt erfolgt schließlich - wiederum von links nach rechts - die Auswertung der OR-Verknüpfungen. Beispiel: Folgende Daten werden für die Auswertung der nachstehenden IF-Anweisung zugrundegelegt: Menge=50, Wert=900, Konto=500
CONTINUE-Anweisung IF M E N G E >
(1)
121
60 OR W E H T >
nein
1000 AND NOT KONTO
B THEN IF C > END-IF E L S E DISPLAY
D THEN CONTINUE ELSE MOVE . . . . . .
END-IF
Im oberen Beispiel sind im THEN-Zweig der inneren IF-Anweisung keine ausführbaren Anweisungen vorgesehen. CONTINUE bewirkt hier die Fortsetzung der Verarbeitung mit dem zweiten ELSE-Zweig.
Steueranweisungen
122
7.6 EVALUATE-Anweisung Wie die CONTINUE-Anweisung ist auch die EVALUATE-Anweisung erst mit der Norm ANS 85 in die COBOI^Sprache eingeführt worden. Die EVALUATE-Anweisung dient zur Codierung der Kontrollstruktur „Case" (Mehrfachverzweigung). Neben vielen anderen Einsatzmöglichkeiten, wie der Programmierung von Entscheidungstabellen, kann sie auch die GO TO DEPENDING ON-Anweisung (vgl. Punkt 5.4) ersetzen. Format (verkürzt): Bedingung EVALUATE
Datenname-1 Literal-1 (WHEN Ausdruck
[WHEN OTHER
[NOTI
Datenname-2 Literal-2 arithm. Ausdruck
Unbedingte-Anweisung-1}... Unbedingte-Anweisung-2]
[END-EVALUATE1 Erläuterungen: Die vor dem Wort WHEN angegebenen Operanden werden als Auswahlsubjekte, die danach aufgeführten Operanden als Auswahlobjekte bezeichnet. Die EVALUATE-Anweisung überprüft das Auswahlsubjekt im Hinblick auf eine Übereinstimmung mit den Auswahlobjekten. Entspricht das Subjekt dem Objekt-1, so wird die auf das Objekt-1 folgende unbedingte Anweisung ausgeführt. Entspricht das Subjekt dem Objekt-2, so wird die auf das Objekt-2 folgende unbedingte Anweisung ausgeführt usw.. Stimmt keines der angegebenen Objekte mit dem Subjekt überein, erfolgt, wenn der WHEN OTHERZusatz codiert wurde, die Fortsetzung der Verarbeitung mit den sich an WHEN OTHER anschließenden Anweisungen. Fehlt dieser Zusatz, wird die Programmausfuhrung mit der nächsten Anweisung nach END-EVALUATE fortgesetzt. Bei dem als Auswahlsubjekt zulässigen Operanden „Ausdruck" kann es sich sowohl um einen arithmetischen Ausdruck als auch um einen Bedingungsausdruck handeln. Beispiel: In einem Dialogprogramm können zu Beginn über eine Maske die gewünschten Verarbeitungsfunktionen Eingabe, Abfrage, Änderung und Löschung
EVALUATE-Anweisung
123
durch Eingabe einer Ziffer von 1-4 gewählt werden. Entsprechend der eingegebenen Ziffer werden im Programm die jeweiligen Unterprogramme aufgerufen. Das zugehörige Struktogramm zeigt Abb. 18.
Löschen
Fehlermeldung
A b b . 18: Darstellung einer M e h r f a c h v e r z w e i g u n g i m Struktogramm
Die Codierung hat folgendes Aussehen: WORKING-STORAGE SECTION. 77 EINGABE-KENNZEICHEN PIC 9. PROCEDURE DIVISION. ACCEPT EINGABE-KENNZEICHEN EVALUATE EINGABE-KENNZEICHEN WHEN 1 PERFORM ABFRAGE WHEN 2 PERFORM EINGABE WHEN 3 PERFORM AENDERUNG WHEN 4 PERFORM LOESCHUNG WHEN OTHER PERFORM FEHLERMELDUNG END-EVALUATE Erläuterung:
Die EVALUATE-Anweisung vergleicht den Inhalt des Feldes EINGABEKENNZEICHEN mit den hinter WHEN angegebenen Literalen. Enthält das EINGABE-KENNZEICHEN eine 1, kommt es zum Aufruf des Unterprogramms ABFRAGE. Wurde eine 2 als EINGABE-KENNZEICHEN eingelesen, wird zum Unterprogramm EINGABE verzweigt usw.. Bei Eingabe einer anderen Ziffer als 1-4 wird PERFORM FEHLERMELDUNG ausgeführt. Danach erfolgt die Fortführung der Verarbeitung in allen Fällen mit der auf END-EVALUATE folgenden Anweisung.
124
Steueranweisungen
7.7 Übungsaufgaben Aufgabe 1
Codieren Sie die unter Punkt 6.7 beschriebene Aufgabenstellung mit Hilfe der PERFORM-Anweisung. Aufgabe 2 IF A = B THEN MOVE X TO Y IF C = D THEN MOVE Z TO W END-IF WHITE SATZ ELSE PEHFORM FEHLER.
Fragen: (1) Von welcher Bedingung hängt die Ausführung der WRITE-Anweisung ab? Zeichnen Sie das Struktogramm zu der obenstehenden Codierung. (2) Was würde sich bei der Programmausfiihrung ändern, wenn in der Codierung hinter Y ein Punkt steht und ELSE PERFORM FEHLER entfallt? Zeichnen Sie das entsprechende Struktogramm. (3) Welche andere Möglichkeit der Codierung bestand im obigen Falle vor der Einführung expliziter Bereichsbegrenzer (hier: END-IF) in die COBOI^ Programmierung? Lösungen im Anhang A.
8 Arithmetische Anweisungen
8.1 ADD-Anweisung Die ADD-Anweisung addiert die Inhalte von zwei oder mehreren numerischen Operanden. Zwei Hauptformate sind zu unterscheiden: Format 1: Datenname-1 ADD
. . . TO {Datenname-2 [ROUNDED]}... Literal-1 [ON SIZE ERROR unbedingte Anweisung-1] [NOT ON SIZE ERROR unbedingte Anweisung-2] [END-ADD1
Erläuterungen:
Bei der Verwendung des Formats 1 werden die Inhalte der vor dem Wort TO stehenden Operanden zu einem Zwischenergebnis addiert. In einem zweiten Schritt folgt die Addition des Zwischenergebnisses zu dem Wert des nach dem Wort TO folgenden Operanden und die Speicherung des Endresultates in diesem Operanden (dem eigentlichen Ergebnisfeld). Der ursprüngliche Inhalt des Ergebnisfeldes wird dabei überschrieben, während die Inhalte der vor dem Wort TO aufgeführten Operanden erhalten bleiben. Statt eines Ergebnisfeldes kann die ADD-Anweisung auch mehrere derartige Felder enthalten. Die obigen Erklärungen gelten dann entsprechend. Wird der Zusatz ROUNDED angegeben, so werden die Dezimalstellen des Endresultates - bei einer nicht ausreichenden Anzahl von Speicherstellen im Ergebnisfeld - vor der Speicherung entsprechend der Feldgröße des Operanden nach den bekannten algebraischen Regeln gerundet. Fehlt diese Angabe und ist die Zahl der im Ergebnisfeld für die Aufnahme von Dezimalstellen vorgesehenen Speicherplätze zu gering, so werden die nicht mehr speicherbaren Ziffern ohne Rundung abgetrennt. Der Zusatz ON SIZE ERROR bzw. NOT ON SIZE ERROR kann dann angewendet werden, wenn es darum geht festzustellen, ob im Ergebnisfeld die
Arithmetische Anweisungen
126
Anzahl der Speicherstellen vordem Dezimalpunkt zur Aufnahme des Resultates nicht ausreicht bzw. ausreicht. Im Falle eines zu klein definierten Ergebnisfeldes würden die ersten Stellen des zu speichernden Wertes abgeschnitten werden. Der damit im Ergebnisfeld enthaltene fehlerhafte Wert würde bei der Ausgabe u. U. nicht einmal als falsch erkannt werden. Bei Verwendung des Zusatzes ON SIZE ERROR wird ein Stellenüberlauf rechtzeitig entdeckt. Die arithmetische Anweisung wird nicht ausgeführt, und der Inhalt des Ergebnisfeldes bleibt unverändert. Durch die auf ON SIZE ERROR folgende unbedingte Anweisung können ferner spezielle Maßnahmen, wie z. B. die Ausgabe einer entsprechenden Fehlernachricht, programmiert werden. NOT ON SIZE ERROR bietet die Möglichkeit, im Falle eines nicht auftretenden Stellenüberlaufs bestimmte unbedingte Anweisungen auszuführen. END-ADD schließt den Geltungsbereich der ADD-Anweisung ab. Format 2: Datenname-2
Datenname-1 ADD
TO Literal-1
Literal-2
GIVING {Datenname-3 [ R O U N D E D ] . . . [ON SIZE ERROR unbedingte Anweisung-1] [NOT ON SIZE ERROR unbedingte Anweisung-2] [END-ADD] Erläuterungen:
Bei Verwendung des Formats 2 werden die Inhalte der vor dem Wort GIVING stehenden Operanden zu einem Zwischenergebnis addiert. (Der Einsatz des Wortes TO ist dabei - nach ANS COBOL 85 - wahlfrei). In einem zweiten Schritt wird das Zwischenergebnis in das hinter dem Wort GIVING stehende Ergebnisfeld übertragen und dort gespeichert. Der ursprüngliche Inhalt des Ergebnisfeldes wird dabei gelöscht, während die Inhalte der vor dem Wort GIVING aufgeführten Operanden erhalten bleiben. Auch hier können wiederum mehrere Ergebnisfelder definiert werden. Anders als beim Format 1, bei dem im Ergebnisfeld die Summe der Werte aus allen Operanden (einschließlich des ursprünglich im Ergebnisfeld vorhande-
127
ADD-Anweisung
nen Wertes) gespeichert ist, steht beim Format 2 nur die Summe der Werte der vor dem Wort GIVING stehenden Operanden im Ergebnisfeld. Folgende Regeln sind bei beiden Formaten zu beachten: - Es dürfen ausschließlich numerische Operanden (Datenfelder und Literale) verwendet werden. Bei Verwendung von GIVING kann das nachfolgende Ergebnisfeld auch numerisch druckaufbereitet definiert sein. Das gilt jedoch nicht für die anderen Operanden. - Datenfelder und Literale dürfen nicht mehr als 18 Ziffern enthalten. Diese Einschränkung gilt für alle arithmetischen Anweisungen. Beispiele: (1)
ADD BETRAG-1 TO BETRAG-2
Das Datenfeld BETRAG-2 enthält die Summe aus den Datenfeldern BETRAG-1 und BETRAG-2. Der ursprüngliche Inhalt von BETRAG-1 bleibt erhalten. (2)
ADD BETRAG-1 TO BETRAG-2 BETRAG-?
Das Datenfeld BETRAG-2 enthält die Summe aus den Datenfeldern BETRAG-1 und BETRAG-2. Das Datenfeld BETRAG-3 enthält die Summe aus den Datenfeldern BETRAG-1 und BETRAG-3. Der ursprüngliche Inhalt von BETRAG-1 bleibt erhalten. (3)
ADD BETRAG-1 BETRAG-2 1200 TO BETRAG-3
Das Datenfeld BETRAG-3 enthält die Summe aus den Datenfeldern BETRAG-1, BETRAG-2, BETRAG-3 und dem Literal 1200. Der ursprüngliche Inhalt von BETRAG-1, BETRAG-2 und das Literal bleiben erhalten. (4)
ADD BETRAG-1 BETRAG-2 BETRAG-3 1200 GIVING ERGEBNIS
Das Datenfeld ERGEBNIS enthält die Summe aus den Datenfeldern BETRAG-1, BETRAG-2, BETRAG-3 und dem Literal 1200. Der ursprüngliche Inhalt von BETRAG-1, BETRAG-2, BETRAG-3 und das Literal bleiben erhalten. (5)
02
BETRAG-1 PIC
9WV99-
[Inhalt:432159]
02 ERGEBNIS PIC 9(4)-9ADD BETRAG-1 1200.00 GIVING ERGEBNIS ROÜNDED
In diesem Fall kann die zweite Dezimalstelle der Summe nicht im Feld ERGEBNIS gespeichert werden. Der Zusatz ROUNDED bewirkt, daß als
128
Arithmetische Anweisungen
Summe 5521.6 ermittelt und ausgewiesen wird. Ohne die Rundung würde hier der Wert 5521.5 im Feld ERGEBNIS dargestellt werden. (6)
02 betrag-1 pic 9(4)v9902 betrag-2 pic 90)v99-
[Inhalt:400050] [Inhalt:810010]
02 ERGEBNIS PIC 9CO-99ADE BETRAG-1 BETRAG-2 GIVING ERGEBNIS ON SIZE ERROR PERFORM FEHLERMELDUNG Da das Feld ERGEBNIS zu klein definiert ist, um die ermittelte Summe aufzunehmen, wird hier der Zusatz ON SIZE ERROR wirksam, und es wird zu FEHLERMELDUNG verzweigt. Hätte man auf die Angabe ON SIZE ERROR verzichtet, so wäre im Feld ERGEBNIS 2100.60 gespeichert und die Verarbeitung fortgesetzt worden.
8.2 SUBTRACT-Anweisung Die SUBTRACT-Anweisung subtrahiert den Inhalt eines numerischen Operanden oder die Inhalte mehrerer zu einer Summe zusammengefaßter numerischer Operanden von einem oder mehreren numerischen Operanden. Zwei Hauptformate sind zu unterscheiden: Format 1: Datenname-1 SUBTRACT
, . . FROM {Datenname-2 [ROUNDED]}... Literal-1 [ON SIZE ERROR unbedingte Anweisung-1] [NOT ON SIZE ERROR unbedingte Anweisung-2] [END-SUBTRACT]
Erläuterungen:
Bei Verwendung des Formats 1 werden die Inhalte der vor dem Wort FROM stehenden Operanden zu einem Zwischenergebnis addiert. In einem zweiten Schritt folgt die Subtraktion des Zwischenergebnisses von dem Wert des nach dem Wort FROM folgenden Operanden und die Speicherung des Endresultates in diesem Operanden (dem Ergebnisfeld). Der ursprüngliche Inhalt des Ergebnisfeldes wird dabei überschrieben, während die Inhalte der vor dem Wort FROM stehenden Operanden erhalten bleiben. Statt eines Ergebnisfei-
IF-Anweisung
129
des kann die SUBTRACT-Anweisung auch mehrere derartige Felder enthalten. Die obigen Erklärungen gelten dann entsprechend. Zur Anwendung der Zusätze ROUNDED und ON SIZE ERROR bzw. NOT ON SIZE ERROR vgl. die Erläuterungen zur ADD-Anweisung. END-SUBTRACT schließt den Geltungsbereich der SUBTRACT-Anweisung ab. Format 2: SUBTRACT
Datenname-2
Datenname-1 . . . FROM Literal-1
Literal-2
GIVING {Datenname-3 [ R O U N D E D ] } . . . [ON SIZE ERROR unbedingte Anweisung-1] [NOT ON SIZE ERROR unbedingte Anweisung-2] [END-SUBTRACT! Erläuterungen:
Bei Verwendung des Formats 2 werden die Inhalte der vor dem Wort FROM stehenden Operanden zu einem Zwischenergebnis addiert. In einem zweiten Schritt wird das Zwischenergebnis von dem Wert des hinter FROM stehenden Operanden, der auch ein numerisches Literal sein kann, subtrahiert und das Resultat in das hinter GIVING stehende Ergebnisfeld übertragen. Der ursprüngliche Inhalt des Ergebnisfeldes wird dabei gelöscht, während die Inhalte der vor dem Wort GIVING aufgeführten Operanden erhalten bleiben. Es können wiederum mehrere Ergebnisfelder definiert werden. Die bei der ADD-Anweisung aufgeführten Regeln gelten für die SUBTRACTAnweisung analog. Beispiele: (1)
SUBTEACT
BETRAG-1
BETRAG-2
FROM
BETRAG-J
Die Inhalte der Datenfelder BETRAG-1 und BETRAG-2 werden addiert und vom Inhalt des Datenfeldes BETRAG-3 subtrahiert. BETRAG-3 enthält anschließend das Subtraktionsergebnis. Die ursprünglichen Inhalte der Felder BETRAG-1 und BETRAG-2 bleiben erhalten. (2)
SUBTRACT
BETRAG-1
FROM B E T R A G - 2
BETRAG-3
130
Arithmetische A n w e i s u n g e n
Der Inhalt des Datenfeldes BETRAG-1 wird vom Inhalt der Datenfelder BETRAG-2 und BETRAG-3 subtrahiert. BETRAG-2 und BETRAG-3 enthalten anschließend das jeweilige Subtraktionsergebnis. Der ursprüngliche Inhalt von BETRAG-1 bleibt erhalten. (3)
02 BETRAG-1 PIC 9(4)V99-
[Inhalt:432121]
02 ERGEBNIS PIC 9(4).9SUBTRACT BETRAG-1 FROM 5200.00 GIVING ERGEBNIS ROUNDED
Die zweite Dezimalstelle des Subtraktionsergebnisses kann nicht im Feld ERGEBNIS gespeichert werden. Durch den Zusatz ROUNDED wird das Ergebnis entsprechend gerundet. Im Ergebnisfeld erscheint der Wert 878.8. Ohne ROUNDED wäre dort 878.7 gespeichert worden. (4)
02 BETRAG-1 PIC 9(4)V9902 BETRAG-2 PIC 9(4)V9902 ERGEBNIS-1 PIC 9(4)V9902 ERGEBNIS-2 PIC 9 (4-). 99.
SUBTRACT BETRAG-1 FROM BETRAG-2 GIVING ERGEBNIS-1 ERGEBNIS-2
Das Resultat der Subtraktion wird in den Feldern ERGEBNIS-1 und ERGEBNIS-2 gespeichert. Eine solche Codierung wird immer dann sinnvoll sein, wenn das Rechenergebnis sowohl ausgegeben als auch für weitere Berechnungen eingesetzt werden soll. Für die Ausgabe wird im Regelfall ein druckaufbereitetes Feld erforderlich sein, während der Einsatz eines Feldes als Rechenfeld eine Druckaufbereitung verbietet.
8.3 MULTIPLY-Anweisung Die MULTIPLY-Anweisung multipliziert die Inhalte von zwei oder mehreren numerischen Operanden. Zwei Formate sind zu unterscheiden: Format 1: Datenname-1 BY {Datenname-2 [ROUNDED]}...
MULTIPLY Literal-1
[ON SIZE ERROR unbedingte Anweisung-1]
131
IF-Anweisung
[NOT ON SIZE ERROR unbedingte Anweisung-2] [END-MULTIPLY] Erläuterungen: Bei Verwendung des Formats 1 wird der Inhalt des vor dem Wort BY stehenden Operanden mit dem Inhalt des nach dem Wort BY stehenden Operanden multipliziert. Das entstandene Produkt wird in dem auf BY folgenden Operanden gespeichert. Der ursprüngliche Inhalt dieses Ergebnisfeldes wird dabei überschrieben, während der Inhalt des ersten Operanden erhalten bleibt. Sind hinter dem Wort BY weitere Operanden aufgeführt, so wird der Inhalt des ersten Operanden zusätzlich mit den Inhalten der anderen auf BY folgenden Operanden multipliziert, in denen auch die errechneten Produkte gespeichert werden. Zur Anwendung der Zusätze ROUNDED und ON SIZE ERROR bzw. NOT ON SIZE ERROR vgl. die Erläuterungen zur ADD-Anweisung. END-MULTIPLY schließt den Geltungsbereich der MULTIPLY-Anweisung ab. Format 2: Datenname-1 MULTIPLY
Datenname-2 BY
Literal-1
Literal-2
GIVING {Datenname-3 [ROUNDED]}... [ON SIZE ERROR unbedingte Anweisung-1] [NOT ON SIZE ERROR unbedingte Anweisung-2] [END-MULTIPLY] Erläuterungen: Bei Verwendung des Formats 2 wird das bei der Multiplikation entstandene Produkt in das nach dem Wort GIVING folgende Ergebnisfeld übertragen. Der ursprüngliche Inhalt des Ergebnisfeldes wird dabei gelöscht, während die Inhalte der vor dem Wort GIVING aufgeführten Operanden erhalten bleiben. Im Unterschied zum Format 1 kann hier hinter dem Wort BY nur ein Operand, in Form eines Datennamens oder Literais, als Multiplikator codiert werden. Es können jedoch wieder mehrere Ergebnisfelder angegeben werden.
132
Anweisungen zur Verarbeitung von sequentiellen Dateien
Die bei der ADD-Anweisung aufgeführten Regeln gelten für die MULTIPLYAnweisung analog. Beispiele: (1)
MULTIPLY PREIS BT M E N G E
Der Inhalt des Datenfeldes PREIS wird mit dem Inhalt des Datenfeldes MENGE multipliziert. Das Ergebnis wird unter MENGE gespeichert. Der ursprüngliche Inhalt des Feldes PREIS bleibt erhalten. (2)
MULTIPLY PREIS BY M E N G E GIVING UMSATZ
Der Inhalt des Datenfeldes PREIS wird mit dem Inhalt des Datenfeldes MENGE multipliziert. Das Ergebnis wird unter UMSATZ gespeichert. Der ursprüngliche Inhalt der Felder PREIS und MENGE bleibt erhalten. (3)
MULTIPLY PREIS BY M E N G E -1 MENGE- 2
Der Inhalt des Datenfeldes PREIS wird mit dem Inhalt der Datenfelder MENGE-1 und MENGE-2 multipliziert. Die bei der Multiplikation entstandenen Produkte werden unter MENGE-1 und MENGE-2 gespeichert. Der ursprüngliche Inhalt des Feldes PREIS bleibt erhalten. (4)
02 PREIS
PIC 999V99.
02 M E N G E
PIC 999V99.
02 UMSATZ-1 PIC 9(6)V99. 02 UMSATZ - 2 PIC 9(6).99. MULTIPLY PREIS BY M E N G E G I V I N G UMSATZ-1
UMSATZ-2
Das Ergebnis der Multiplikation wird in den Feldern UMSATZ-1 und UMSATZ-2 gespeichert. Zur Begründung für eine derartige Codierung vgl. die Erläuterungen zum Beispiel (4) der SUBTRACT-Anweisung.
8.4 DIVIDE-Anweisung Die DIVIDE-Anweisung dividiert den Inhalt eines numerischen Operanden durch den Inhalt eines oder mehrerer anderer numerischer Operanden. Zwei Hauptformate sind zu unterscheiden. 2 5
25
Die Formate mit dem Zusatz REMAINDER, die eine getrennte Abspeicherung des Divisionsrestes ermöglichen, werden hier nicht behandelt.
133
DIVIDE-Anweisung Format 1: Datenname-1 DIVIDE
. . . INTO {Datenname-2 [ROUNDED!}... Literal-1 [ON SIZE ERROR unbedingte Anweisung-1] [NOT ON SIZE ERROR unbedingte Anweisung-2] [END-DIVIDE1
Erläuterungen:
Bei Verwendung des Formats 1 wird der Inhalt des nach dem Wort INTO stehenden Operanden durch den Inhalt des vor dem Wort INTO stehenden Operanden dividiert. Das Resultat der Division wird in dem hinter INTO stehenden Operanden (dem Ergebnisfeld) gespeichert. Dabei wird dessen ursprünglicher Inhalt überschrieben, während der Inhalt des vor INTO stehenden Operanden erhalten bleibt. Sind hinter INTO weitere Operanden aufgeführt, so wird auch der Inhalt dieser Datenfelder durch den Inhalt des ersten Operanden dividiert. Die Speicherung der Ergebnisse erfolgt in den jeweiligen auf INTO folgenden Operanden. Zur Anwendung der Zusätze ROUNDED und ON SIZE ERROR bzw. NOT ON SIZE ERROR vgl. die Erläuterungen zur ADD-Anweisung. END-DIVIDE schließt den Geltungsbereich der DI VIDE-Anweisung ab. Format 2: Datenname-1
INTO
Datenname-2
Literal-1
BY
Literal-2
DIVIDE GIVING {Datenname-3 [ROUNDED]}... [ON SIZE ERROR unbedingte Anweisung-1] [NOT ON SIZE ERROR unbedingte Anweisung-2] [END-DIVIDE1
134
Arithmetische Anweisungen
Erläuterungen: Beim Format 2 ist zwischen zwei grundsätzlichen Möglichkeiten zu unterscheiden. Wird für die Division das Wort INTO gewählt, so erfolgt die Berechnung wie für Format 1 beschrieben, mit dem Unterschied, daß das Resultat in dem hinter GIVING folgenden Operanden gespeichert wird und die Inhalte aller vor GIVING stehenden Operanden unverändert bleiben. Wird für die Division dagegen das Wort BY gewählt, so werden Dividend und Divisor gegenüber dem Format 1 vertauscht, d. h. der Inhalt des vor dem Wort BY stehenden Operanden wird durch den Inhalt des nach dem Wort BY folgenden Operanden dividiert. Auch in diesem Fall gilt, daß das Resultat in dem hinter GIVING stehenden Ergebnisfeld gespeichert wird. Es können wiederum mehrere Ergebnisfelder angegeben werden. Die bei der ADD-Anweisung aufgeführten Regeln gelten für die DIVIDEAnweisung analog. Beispiele: (1)
DIVIDE PREIS INTO UMSATZ
Der Inhalt des Datenfeldes UMSATZ wird durch den Inhalt des Datenfeldes PREIS dividiert. Das Ergebnis wird unter UMSATZ gespeichert. Der ursprüngliche Inhalt des Feldes PREIS bleibt erhalten. (2)
D I V I D E PREIS INTO UMSATZ-1
UMSATZ-2
Die Inhalte der Datenfelder UMSATZ-1 und UMSATZ-2 werden durch den Inhalt des Datenfeldes PREIS dividiert. Die jeweiligen Ergebnisse werden unter UMSATZ-1 bzw. UMSATZ-2 gespeichert. (3)
DIVIDE PREIS INTO U M S A T Z GIVING M E N G E
Der Inhalt des Datenfeldes UMSATZ wird durch den Inhalt des Datenfeldes PREIS dividiert. Das Ergebnis wird unter MENGE gespeichert. Der ursprüngliche Inhalt der Felder PREIS und UMSATZ bleibt erhalten. (4)
DIVIDE UMSATZ BT P R E I S G I V I N G M E N G E
Ausführung und Ergebnisse entsprechen dem Beispiel (3).
5 COMPUTE-Anweisung
135
8.5 COMPUTE-Anweisung Zur verkürzten Codierung umfangreicher Rechenoperationen stellt die COBOL-Sprache als besondere Möglichkeit, neben den bisher beschriebenen einfachen arithmetischen Befehlen, die COMPUTE-Anweisung zur Verfügung. Die COMPUTE-Anweisung ermittelt den Wert eines arithmetischen Ausdrucks und weist ihn einem oder mehreren Datennamen zu. Format: COMPUTE
{Datenname [ROUNDED]}... = arithmetischer Ausdruck [ON SIZE ERROR unbedingte Anweisung-1] [NOT ON SIZE ERROR unbedingte Anweisung-2] [END-COMPUTE1
Erläuterungen:
Bei der Ausführung der COMPUTE-Anweisung wird zunächst der rechts vom Zeichen = stehende arithmetische Ausdruck berechnet. Anstelle eines arithmetischen Ausdrucks kann die COMPUTE-Anweisung auch nur einen einzelnen Operanden enthalten. In einem zweiten Schritt erfolgt die Zuweisung des Resultates an das vor dem Zeichen = stehende Ergebnisfeld. Die Zuweisung wird entsprechend den Regeln eines numerischen MOVE durchgeführt (vgl. Punkt 5.3). Werden mehrere Ergebnisfelder, die numerisch oder numerisch druckaufbereitet definiert sein können, angegeben, so wird das Resultat allen Feldern zugewiesen. Für die Durchfuhrung von Rechenoperationen mit den im arithmethischen Ausdruck enthaltenen numerischen Operanden (Datenfeldern und Literalen) stehen folgende Operatoren zur Verfügung: Rechenoperation Addition Subtraktion Multiplikation Division Potenzierung
Operator + —
*
/ **
136
Arithmetische Anweisungen
Zur Anwendung der Zusätze ROUNDED und ON SIZE ERROR bzw. NOT ON SIZE ERROR vgl. die Erläuterungen zur ADD-Anweisung. END-COMPUTE schließt den Geltungsbereich der COMPUTE-Anweisung ab. Folgende Regeln sind bei der Formulierung der arithmetischen Ausdrücke zu beachten: - Vor und hinter den Operatoren muß eine Leerstelle erscheinen. - Werden Klammern verwandt, so muß vor der eröffnenden Klammer und hinter der abschließenden Klammer eine Leerstelle stehen. Bei direkt aufeinanderfolgenden gleichartigen Klammern (in geschachtelten Klammerausdrücken) dürfen zwischen den Klammern keine Leerstellen erscheinen. - Für die Auflösung arithmetischer Ausdrücke gelten die bekannten mathematischen Regeln zur Rangordnung von Rechenoperationen, die hier noch einmal kurz zusammengefaßt werden. 1. Berechnung der Klammerinhalte. Bei geschachtelten Klammern erfolgt die Berechnung von innen nach außen. 2. Potenzierung. 3. Multiplikation und Division. 4. Addition und Subtraktion. 5. Enthält ein arithmetischer Ausdruck mehrere gleichrangige Rechenoperationen, so wird die Berechnung von links nach rechts vorgenommen. Beispiele: (1)
COMPUTE ERGEBNIS = WEHT
Der Inhalt des Datenfeldes WERT wird in das Datenfeld ERGEBNIS übertragen. Diese COMPUTE-Anweisung ist gleichbedeutend mit der Anweisung MOVE WERT TO ERGEBNIS. (2)
COMPUTE SUMME = SUMME + B E T H A G
Die Inhalte der Datenfelder SUMME und BETRAG werden addiert und das Ergebnis wird in das Datenfeld SUMME übertragen. Dabei wird der ursprüngliche Inhalt des Datenfeldes SUMME überschrieben. Diese COMPUTE-Anweisung ist gleichbedeutend mit der Anweisung ADD BETRAG TO SUMME. (3)
02 ERGEBNIS-1 PIC 9 0 ) V 9 9 02 E R G E B N I S - 2 PIC 9(4).99COMPUTE ERGEBNIS-1 ERGEBNIS-2 = BETRAG-1
+ BETRAG-2
137
Programmbeispiel: einstufiger Gruppenwechsel
Die Inhalte der Datenfelder BETRAG-1 und BETRAG-2 werden addiert. Die Summe wird in die Felder ERGEBNIS-1 und ERGEBNIS-2 übertragen. Zur Begründung für eine derartige Codierung vgl. die Erläuterungen zum Beispiel (4) der SUBTRACT-Anweisung. (4)
COMPUTE ERGEBNIS =
(A
+
E:>
*
(1)
"
^ iL
(2)
(3)
(4) (5) Die Ausführung der einzelnen Rechenoperationen erfolgt in der durch die Ziffern angegebenen Reihenfolge. Das Endresultat der Berechnung wird in das Feld ERGEBNIS übertragen.
8.6 Programmbeispiel: einstufiger Gruppenwechsel In der kaufmännischen Datenverarbeitung, für die oft die Verarbeitung großer Datenmengen und - trotz Dialogverarbeitung - die Ausgaben langer Listen typisch ist, kommt der Programmierung des sog. Gruppenwechsels erhebliche Bedeutung zu. Als Gruppe (genauer: Datensatzgruppe) gilt dabei eine Menge von Datensätzen einer Datei, die ein bestimmtes Kriterium (üblicherweise einen Ordnungsbegriff oder einen Teil eines Ordnungsbegriffes) gemeinsam haben. Ein derartiger Ordnungsbegriff wird auch als Gruppenbegriff bezeichnet. Der als Gruppenwechsel benannte Übergang von einer Gruppe zur nächsten Gruppe ist im Regelfall mit einer besonderen Verarbeitung wie z. B. der Ausgabe von Zwischensummen verbunden. Das untenstehende Beispiel soll das verdeutlichen. Eingabe: Eingelesen werden Sätze einer sequentiellen Datei mit folgenden Inhalten:
1. Satz 2. Satz 3. Satz
Kundennummer
Rechnungsnummer
Umsatz
2310 2310 2312
54321 54322 54319
1000 800 2000
Ausgabe: Die Sätze der Datei sind in eine Liste auszugeben. Jeweils bei einem Wechsel der Kundennummer (= Gruppenwechsel) ist eine Umsatzzwischensumme zu drucken. Am Ende der Liste soll eine Umsatzendsumme erscheinen.
138
Arithmetische Anweisungen
Es ergibt sich somit folgendes Listbild: Kundennummer 2310 2310 2312
Rechnungsnummer 54321 54322 Zwischensumme 54319
Zwischensumme Endsumme
Umsatz 1000 800 1800
2000
xxxx xxxxx
Im vorstehenden Fall handelt es sich um einen einstufigen Gruppenwechsel, da nur bei einem Wechsel einer (aus Sätzen mit gleicher Kundennummer gebildeten) Datengruppe eine spezielle Verarbeitung erfolgt. Ein mehrstufiger Gruppenwechsel liegt dagegen dann vor, wenn mehrere Datengruppen gebildet werden können, deren Wechsel wiederum besondere Verarbeitungen notwendig macht. Beispiel: In den Sätzen einer Umsatzdatei werden neben dem Umsatz noch die Ordnungsbegriffe Bezirksnummer, Vertreternummer, Kundennummer und Rechnungsnummer gespeichert. In der daraus zu erstellenden Auflistung sollen Umsatzzwischensummen bei einem Wechsel der Bezirksnummer, der Vertreternummer und der Kundennummer ausgegeben werden (vgl. dazu die Übungsaufgabe unter Punkt 8.7). Für die programmtechnische Lösung des Gruppenwechselproblems gibt es einige wenige, sich nur geringfügig unterscheidende Standardlösungen. Allen diesen Lösungen ist gemeinsam, daß der eigentliche Gruppenwechsel im Programm durch einen Vergleich des (die Datengruppe definierenden) Ordnungsbegriffes des gerade eingelesenen Satzes mit dem entsprechenden Ordnungsbegriff des vorher gelesenen Satzes erkannt wird. Damit ein solcher Vergleich durchgeführt werden kann, ist es notwendig, vor dem Einlesen eines neuen Satzes den Gruppenbegriff des gerade im Arbeitsspeicher vorhandenen Satzes in ein Hilfsfeld zu übertragen. Geschähe dies nicht, so würde mit dem Einlesen eines neuen Satzes neben den anderen im Eingabepuffer definierten Daten auch der Gruppenbegriff des vorherigen Satzes überschrie-
Programmbeispiel: einstufiger Gruppenwechsel
139
ben werden. Ein Vergleich des „alten" Gruppenbegriffes (AGRU) mit dem „neuen" Gruppenbegriff (NGRU) wäre dann nicht mehr möglich. Grundsätzlich setzt die Programmierung eines Gruppenwechsels immer eine aufsteigende Sortierung der Datensätze der Datei nach den für den Gruppenwechsel relevanten Ordnungsbegriffen voraus. In dem obenstehenden Beispiel zum einstufigen Gruppenwechsel ist die Eingabedatei aufsteigend nach Kundennummern und - innerhalb der Kundennummern - nach Rechnungsnummern sortiert. Abb. 19 enthält das Struktogramm zu diesem Beispiel. Eröffnen Dateien Drucken Überschrift Lesen Umsatzdatei Verarbeiten Satzgruppe, solange Dateiende nicht erreicht Löschen Zwischensumme Übertragen KDNR - AGRU Verarbeiten Einzelsatz, solange Dateiende nicht erreicht oder KDNR nicht = AGRU Übertragen E-Felder -• A-Felder Drucken Postenzeile Addieren Umsatz zu Zwischensumme Lesen Umsatzdatei Drucken Zwischensummenzeile Addieren Zwischensumme zu Endsumme Drucken Endsummenzeile Schließen Dateien Abb. 19: Struktogramm zum Programm „Einstufiger Gruppenwechsel"
Auf der Grundlage dieses Struktogramms ergibt sich dann die nachfolgende Codierung. IDENTIFICATION DIVISION. PROGRAM-ID. EINSTUFIGER-GRUPFENWECHSEL. ENVIRONMENT DIVISION.
140
Arithmetische Anweisungen
INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT UMSATZDATEI ASSIGN TO "A : UMSATZ.SEQ" ORGANIZATION IS LINE SEQUENTIAL. SELECT UMSATZLISTE ASSIGN TO U :LP:". DATA DIVISION. FILE SECTION. FD UMSATZDATEI. 01 UMSATZSATZ. 02 KDNR PIC 9(4). 02 RECHNR PIC 9(5). 02 UMSATZ PIC 9(4)V99FD UMSATZLISTE. 01 ZEILE PIC X(80). WORKING-STORAGE SECTION. 77 AGRU PIC 9(4) VALUE ZEROS. PIC 9(5)V99 VALUE ZEROS. 77 ZWISU PIC 9(6)V99 VALUE ZEROS. 77 ENDSUM PIC X(80) VALUE " KUNDENNR 77 UEBERSCHRIFTSZEILE UMSATZ " RECHNUNGSNR PIC 9 VALUE 0. 77 DATEI-ENDE-KZ 88 DATEI-ENDE VALUE 01 POSTENZEILE. VALUE SPACES. PIC X(8) 02 FILLER 02 AKDNR PIC 9(4). 02 FILLER PIC X(15) VALUE SPACES. 02 ARECHNR PIC 9(5). 02 FILLER PIC X(10) VALUE SPACES. 02 AUMSATZ PIC ZZZ9.99 01 ZWISCHENSUMMENZEILE. 02 FILLER PIC X(41) VALUE SPACES. 02 AZWISU PIC Z(4)9.99. 01 ENDSUMMENZEILE. 02 FILLER PIC X(40) VALUE SPACES. 02 AENDSUM PIC Z(5)9.99. PROCEDURE DIVISION. OPEN INPUT UMSATZDATEI OUTPUT UMSATZLISTE WRITE ZEILE FROM UEBERSCHRIFTSZEILE PERFORM LESEN PERFORM SATZGRUPPENVERARBEITUNG UNTIL DATEIENDE WRITE ZEILE FROM ENDSUMMENZEILE CLOSE UMSATZDATEI UMSATZLISTE STOP RUN. LESEN. READ UMSATZDATEI AT END MOVE 1 TO DATEI-ENDE-KZ. SATZGRUPPENVERARBEITUNG. MOVE ZEROS TO ZWISU MOVE KDNR TO AGRU PERFORM EINZELSATZVERARBEITUNG UNTIL DATEI-ENDE OH KDNR NOT = AGRU WRITE ZEILE FROM ZWISCHENSUMMENZEILE ADD ZWISU ENDSUM GIVING ENDSUM AENDSUM. EINZELSATZVERARBEITUNG. MOVE KDNR TO AKDNR MOVE RECHNR TO ARECHNR
141
Übungsaufgaben M O V E UMSATZ TO AUMSATZ W H I T E ZEILE FEOM P O S T E N Z E I L E ADD UMSATZ TO ZWISU GIVING ZWISU A Z W I S U PEHFORM LESEN.
Hinweise zum Quellenprogramm: Anders als bei den in Kapitel 6 und 7 dargestellten Programmen wurde beim Test des obenstehenden Programmes die Eingabedatei (= UMSATZDATEI) mit Hilfe des zum Compiler gehörenden Editors aufgebaut. Das Resultat stellt eine sog. zeilen-sequentielle Datei dar, die sich von den früher verarbeiteten sequentiellen Dateien u.a. dadurch unterscheidet, daß sie Sätze unterschiedlicher (variabler) Länge enthalten kann. 2 6 Die Verarbeitung zeilensequentieller Dateien erfordert immer den Zusatz ORGANIZATION IS LINE SEQUENTIAL. In dem obenstehenden Quellenprogramm enthält das Feld KDNR die neue Kundennummer, das Feld AGRU die alte Kundennummer, d. h. die Kundenn u m m e r des vorherigen Satzes.
8.7 Übungsaufgaben Aufgabe 1 Mit welchen Anweisungen können die Inhalte der Felder BETRAG-1, BETRAG-2 und SUMME addiert werden? Aufgabe 2 Mit welchen Anweisungen kann die Grundfläche eines Raumes errechnet werden, wenn die Höhe des Raumes und der Rauminhalt bekannt sind? Aufgabe 3 Für folgende Aufgabe mit einem dreistufigen Gruppenwechsel ist ein Programm zu schreiben. Eingabe: Die Sätze einer sequentiellen Datei enthalten folgende Angaben: Bezirks-Nr. 2
Vertreter-Nr.
Kunden-Nr.
Rechnungs-Nr.
Umsatz.
® Das setzt dann allerdings auch die Definition unterschiedlich langer Satzbereiche bei der Dateibeschreibung voraus.
142
Arithmetische Anweisungen
Die Datei ist aufsteigend nach allen vier Ordnungsbegriffen sortiert. Ausgabe: Es ist eine Liste auszugeben. Umsatzzwischensummen sind jeweils bei einem Wechsel der Bezirksnummer, Vertreternummer und Kundennummer zu drukken. Am Ende der Liste soll eine Umsatzendsumme erscheinen. Lösungen im Anhang A.
9 Weitere COBOL-Klauseln und -Angaben
9.1 USAGE-Klausel Mit der USAGE-Klausel wird die speicherinterne Darstellungsform in einem Datenfeld festgelegt. Bei den bisher behandelten Datenfelddefinitionen wurden keine expliziten Angaben zur internen Darstellung der Daten gemacht. In allen derartigen Fällen wird vom Compiler als Darstellungsform immer das sog. Standardformat, das identisch ist mit der unter Punkt 1.2.3 beschriebenen alphanumerischen bzw. angepackten Speicherungsform, gewählt. Neben diesem Standardformat besteht - für numerische Felder - die Möglichkeit, mit Hilfe der USAGE-Klausel andere Darstellungsformen zu bestimmen. Da die USAGE-Klausel, je nach dem eingesetzten Compiler, sehr unterschiedliche Eintragungen ermöglicht, wird nachfolgend nicht das in der ANSNorm 85 enthaltene Format wiedergegeben. Beschrieben werden vielmehr die für die kaufmännische Programmierung wichtigsten Anwendungsfälle, wie sie gegenwärtig von der Mehrzahl der Compiler angeboten werden. Sollten beim Einsatz einzelner unten aufgeführter Alternativen Probleme auftreten oder besteht der Wunsch nach weiteren Darstellungsformen, so ist in jedem Fall das entsprechende Handbuch des Compilers heranzuziehen. Format (verkürzt):
[USAGE IS1
DISPLAY COMPUTATIONAL-3 COMP-3 PACKED-DECIMAL BINARY COMPUTATIONAL COMP
Erläuterungen: Wird hinter einer Datenfelddefinition die Klausel USAGE IS DISPLAY codiert, so ist das Ergebnis dieser expliziten Angabe identisch mit einer impliziten - Felddefinition ohne USAGE-Klausel, d.h. es wird wieder im Standardformat (alphanumerisch bzw. ungepackt) gespeichert.
144
Weitere COBOl^Klauseln und -Angaben
Die Zusätze COMPUTATIONAL, COMP-3 oder PACKED-DECIMAL, die ausschließlich für numerische Datenfelder verwendet werden können, bewirken eine Datenspeicherung in gepackter Form. Ein Vorteil der gepackten Darstellung ist, wie bereits in Kapitel 1 (Punkt 1.2.3) erläutert wurde, die Einsparung von Speicherkapazität. Darüber hinaus kann die gepackte Darstellung von Daten auch die Ausfuhrung von Rechenoperationen mit diesen Feldern erheblich beschleunigen. 27 Anders als bei der Darstellung im Standardformat entspricht bei der gepackten Verschlüsselung die Anzahl der reservierten Speicherstellen nicht der Anzahl der in der PICTURE-Maske enthaltenen Ziffern (9en). Die Definition der Datenfelder erfolgt - wie bei der DISPLAY-Angabe - in der Form, daß für jede Ziffer eine 9 angegeben wird. Der tatsächlich benötigte Speicherbereich wird jedoch, bei Zahlen mit mehr als zwei Stellen, immer unter der Anzahl der Ziffern in der PICTURE-Maske liegen (vgl. dazu Beispiel 1 unten). Die Speicherung als Festkommawert, die ebenfalls bereits in Kapitel 1 beschrieben wurde, kann durch die Zusätze BINARY, COMPUTATIONAL oder COMP festgelegt werden. Wie bereits in Kapitel 1 dargestellt, erfolgt die Festkommadarstellung üblicherweise in Wörtern und Halbwörtern. Verschiedene Compiler lassen jedoch auch eine Byte-bezogene Darstellung zu. Für alle Formen der Festkommadarstellung gilt, daß die Anzahl der Ziffern in der PICTURE-Maske, die sich an der Länge der zu speichernden Dezimalzahl orientiert, nicht identisch ist mit der Anzahl der Speicherstellen (vgl. dazu Beispiel 2 unten). Einzelheiten sind den jeweiligen Compiler-Handbüchern zu entnehmen. 2 8 Folgende Regel ist bei der Verwendung der USAGE-Klausel zu beachten: 27
28
Inwieweit das der Fall ist, hängt von dem in der Anlage vorhandenen Rechenwerk ab. Bei vielen EDV-Anlagen, zumal Universalrechnern, müssen ungepackte Zahlen vor der Durchführung von Rechenoperationen in die gepackte Form überführt werden. Die eigentliche Berechnung erfolgt dann mit gepackten Werten. Die ermittelten Ergebnisse werden anschließend wiederum in eine ungepackte Darstellung zurückverwandelt. Obwohl diese Vorgänge vom Compiler automatisch ausgeführt werden, sind sie sehr zeitaufwendig. Sie können durch Festlegung der gepackten Speicherungsform von vornherein vermieden werden. Neben der Festkommadarstellung bieten einzelne COBOL-Compiler auch die Möglichkeit der Gleitkommaverschlüsselung. Als entsprechende Zusätze finden die Eintragungen COMPUTATIONAL-1 (Gleitkommadarstellung mit einfacher Genauigkeit) und COMPUTATIONAL2 (Gleitkommadarstellung mit erweiterter Genauigkeit) Anwendung. Für die normale kaufmännische Programmierung spielen diese Möglichkeiten jedoch keine Rolle.
SIGN-Klausel
145
Die USAGE-Klausel kann auf jeder Stufe einer Datenhierarchie verwandt werden. Die Angabe hinter einer Datengruppe bewirkt, daß für alle untergeordneten Datenelemente die gleiche interne Darstellungsform gilt. Werden für einzelne Datenelemente eigene USAGE-Eintragungen codiert, so dürfen diese nicht der (expliziten) USAGE-Klausel einer übergeordneten Datengruppe widersprechen. Beispiele: (1)
02 WERT -1 PIC 9(4) V A L U E 1234 U S A G E IS PACKED
DECIMAL.
Intern wird in drei Bytes dual wie folgt gespeichert: 0000 0001 0010 0011 0100 1111 Die entsprechende hexadezimale Darstellung lautet: 0
1
2
3
4
F
1111 bzw. F im rechten Halbbyte des rechten Bytes drückt (im EBCDI-Code) das Vorzeichen + aus. Hinweis: Wird das Feld WERT-1 mit PIC S9(4) definiert, so erscheint bei einem positiven Feldinhalt das Vorzeichen 1100 (hexadezimal C), bei einem negativen Feldinhalt das Vorzeichen 1101 (hexadezimal D). (2)
01 W E R T - 2 PIC S9(3) V A L U E 255 USAGE IS BINARY.
Intern wird in einem Wort (hier gleichgesetzt mit 16 Bits) wie folgt gespeichert: 0000 0000 1111 1111 Hexadezimal ergibt das: 0
0
F
F
Das Vorzeichen wird durch das erste Bit (0 entspricht +) dargestellt.
9.2 SIGN-Klausel Die SIGN-Klausel beschreibt die Position und die Art der Darstellung des Vorzeichens in einem numerischen Datenfeld.
146
Weitere COBOL^Klauseln und -Angaben
Format: LEADING [SIGN IS]
[SEPARATE CHARACTER] TRAILING
Erläuterungen: Wird bei der Definition eines numerischen Datenfeldes die Klausel SIGN IS LEADING codiert, so wird das Vorzeichen in der ersten Speicherstelle dieses Feldes verschlüsselt. Bei Verwendung der Klausel SIGN IS TRAILING erfolgt dagegen eine Speicherung des Vorzeichens in der letzten Stelle des Feldes. Die durch SIGN IS TRAILING bewirkte Vorzeichenposition entspricht mithin der Standarddarstellung von Vorzeichen, die sich auch bei einem Fortfall der SIGN-Klausel ergibt (vgl. dazu Kapitel 1, Punkt 1.2.3). Soll das Vorzeichen in einem eigenen Byte vor oder hinter der gespeicherten Ziffernfolge erscheinen, so kann das durch die Verwendung des Zusatzes SEPARATE CHARACTER erreicht werden. In diesem Fall zählt die durch S in der PICTURE-Maske beschriebene Vorzeichenstelle als zusätzliche Speicherstelle, die bei der Längenangabe des Feldes mit berücksichtigt werden muß. Folgende Regeln sind bei der Verwendung der SIGN-Klausel zu beachten: - Die SIGN-Klausel darf nur für Datenfelder, die in der PICTURE-Maske das Symbol S enthalten, angegeben werden. - Die Datenfelder dürfen ausschließlich ungepackte Werte enthalten, d. h. sie müssen - implizit oder explizit - der Darstellungsform USAGE IS DISPLAY entsprechen. Beispiele: (1)
02 SALDO-1 PIC S9999 VALUE -1234. 02 SALDO-1 PIC S9999 VALUE -1234 SIGN IS THAILING.
In beiden Fällen ergibt sich - nach dem EBCDI-Code - folgende duale bzw. hexadezimale Darstellung: 1111 0001 1111 0 0 1 0 1111 0011 1101 F .
1
F
2
F
3
D
0100 4
1101 bzw. D verkörpern dabei das negative Vorzeichen. (2)
02 SALDO-2 PIC S9999 VALUE -1234 SIGN IS LEADING SEPARATE CHARACTER.
Intern ergibt sich - in 5 Speicherstellen - folgende Verschlüsselung:
147
RENAMES-Klausel 0110 6
0000 0
1111 F
0001 1
1111 F
0010 2
1111 F
0011 3
1111 F
0100 4
0110 0000 bzw. 60 stellen hier das negative Vorzeichen dar (vgl. Abb. 5 in Kapitel 1).
9.3 RENAMES-Klausel Die RENAMES-Klausel ermöglicht die Vergabe zusätzlicher Datennamen für einzelne Datenfelder oder Datenfeldgruppen. Von besonderer Bedeutung ist dabei die Möglichkeit, mehrere einzelne Datenfelder unter einem neuen Oberbegriff zusammenzufassen. Format:
THROUGH Datenname-3
66 Datenname-1 RENAMES Datenname-2 THRU Erläuterungen:
Die Einfuhrung weiterer, neuer Namen (Angabe unter Datenname-1) für bereits bezeichnete Datenfelder (Datenname-2 bis Datenname-3) mit der RENAMES-Klausel ist grundsätzlich an die Verwendung der Stufennummer 66 gebunden. Die unter Datenname-2 bis Datenname-3 aufgeführten Felder können dagegen mit einer beliebigen Stufennummer zwischen 02 und 49 (ausgenommen sind hier die Nummern Ol, 66, 77 und 88) definiert werden. Die Bezeichnungen THRU und THROUGH sind gleichwertig. Für die neuen Datenfeldnamen gelten die für Datenname-1 bis Datenname-3 festgelegten PICTURE-Masken. Folgende Regeln sind zu beachten: - Die Verwendung der RENAMES-Klausel muß in der Datensatzbeschreibung erfolgen, in der auch Datenname-2 und Datenname-3 definiert wurden. - Datenname-2 und Datenname-3 müssen Namen von elementaren Datenfeldern oder Datenfeldgruppen im gleichen Datensatz sein. Datenname-2 muß dabei ein Datenfeld im Satz bezeichnen, das vor Datenname-3 liegt. - Die Definitionen von Datenname-1 und Datenname- 2 dürfen weder selbst eine OCCURS-Klausel enthalten noch dürfen sie einem mit der OCCURSKlausel definierten Datenfeld untergeordnet sein. (Zur Verwendung der OCCURS-Klausel vgl. Kapitel 10 „Tabellenverarbeitung").
148
Weitere COBOI^Klauseln und -Angaben
Beispiel: Aus dem nachfolgend beschriebenen Kundensatz wird für bestimmte Verarbeitungen jeweils nur ein Teil der Anschrift benötigt. 01
KUNDENSATZ. 02 SATZART PIO 02 K U N D E N N U M M E R PIC 02 KUNDENNAME. PIC 03 V O R N A M E PIC 03 N A C H N A M E 02 ANSCHRIFT. PIC 03 P O S T F A C H PIC 03 STRASSE 03 P O S T L E I T Z A H L PIC PIC 03 W O H N O R T 02 BANKVERBINDUNG. PIC 03 B A N K N A M E 03 K O N T O N U M M E E PIC 66 ANSCHRIFT-1 BENAMES
XX. 9(4). X(20) X(30) 9(5). X(20) X(20) X(20) 9(8). P O S T L E I T Z A H L THEU WOHNORT.
In diesem Fall wird der Inhalt der Datenfelder POSTLEITZAHL und WOHNORT unter dem neuen Oberbegriff ANSCHRIFT-1 zusammengefaßt und kann entprechend genutzt werden.
9.4 REDEFINES-Klausel Die REDEFINES-Klausel dient zur Neudefinition bereits einmal beschriebener Datenbereiche. Im Unterschied zur RENAMES-Klausel, bei der nur zusätzliche Datennamen vergeben werden, können bei der REDEFINESKlausel für die neu definierten Datenbereiche andere Unterteilungen, Datenfeldtypen (Maskensymbole) und speicherinterne Darstellungsformen (USAGE-Eintragungen) als bei der Erstbeschreibung angegeben werden. Datenname-1 Stufennummer
REDEFINES Datenname-2 FILLER
Erläuterungen:
Die REDEFINES-Klausel bewirkt, daß der ursprünglich unter Datenname-2 beschriebene Speicherbereich unter Datenname-1 (bzw. FILLER) noch einmal in anderer Weise neu definiert wird und entsprechend vom Programm genutzt werden kann. Als Stufennummer für eine Redefinition kann dabei jede Nummer zwischen Ol und 49 eingesetzt werden. Die Stufennummer Ol darf allerdings nur in der WORKING-STORAGE SECTION und nicht in der FILE SECTION verwandt werden.
149
REDEFINES-Klausel
Neu definierter Datenbereich (Datenname-1) und erstdefinierter Datenbereich (Datenname-2) müssen immer die gleiche Stufennummer haben. Folgende Regeln sind weiter zu beachten: - Die REDEFINES-Klausel (mit nachfolgendem Datennamen-2) muß sich unmittelbar an Datenname-1 anschließen. - Die Redefinition eines Speicherbereiches muß immer direkt im Anschluß an die Erstdefinition des Bereiches erfolgen. Die Redefinition kann beliebig oft wiederholt werden. Als Datenname-2 muß jedoch immer das erstdefinierte Feld erscheinen. - Die Länge des redefinierten Speicherbereiches darf kürzer sein als die Länge des erstdefinierten Bereiches. Ausnahme: Nach der COBOI^Norm 74 gilt dies nur, wenn die Redefinition unter der Stufennummer Ol erfolgt. - Der redefinierte Bereich darf keine VALUE-Angabe enthalten. Von dieser Regel ausgenommen sind Bedingungsnamen. - Die Definition des Datenfeldes-2 darf keine OCCURS-Klausel enthalten (Zur Verwendung der OCCURS-Klausel vgl. Kapitel 10 „Tabellenverarbeitung"). Beispiele: (1)
02 K O N T O N U M M E R PIC 9(8). 02 K O N T O N U M M E R - A U F T E I L U N G REDEFINES 03 FILLER PIC X(4) 03 TEILNUMMER-A PIC 99. 03 TEILNUMMER-B PIC 99-
KONTONUMMER.
Im obigen Beispiel können mit dem numerisch definierten Feld KONTONUMMER Rechenoperationen (wie z. B. die Errechnung von sog. Prüfziffern) ausgeführt werden. Die Redefinition ermöglicht ferner eine Verarbeitung (Übertragungen, Berechnungen) von bestimmten Unterteilungen der Kontonummer. Die oben beschriebenen Verarbeitungsmöglichkeiten wären nicht möglich bei folgender Datenstruktur: 02 KONTONUMMER. 03 FILLER PIC X O ) . 03 TEILNUMMER-A PIC 9903 TEILNUMMER-B PIC 99.
In diesem Falle wäre KONTONUMMER - als Gruppenbegriff - alphanumerisch definiert und nicht für Rechenoperationen einsetzbar.
150 (2)
Weitere COBOLKlauseln und -Angaben 02 DATUM PIC 9(6). 02 D A T U M - U N T E R T E I L U N G R E D E F I N E S DATUM. 03 TT PIC 9903 MM PIC 9903 J J PIC 99-
Die vorstehende Codierung macht es möglich, das Datum sowohl als Einheit wie auch in Teilen, aufgeschlüsselt nach Tagen, Monaten und Jahren, zu verwenden. Das Feld DATUM kann insbesondere für eine Druckaufbereitung in folgender Form eingesetzt werden: DECIMAL-POINT IS COMMA. 02 A - D A T U M PIC 99•99•99• M O V E DATUM TO ADATUM
(3) In einer Auftragsdatei sind zwei Satzarten (Auftragsgrundsätze = Satzart AI und Auftragspositionssätze = Satzart A2), die sich nur in bestimmten Feldern voneinander unterscheiden, gespeichert. 01
AUFTRAGSSATZ. 02 SATZART PIC XX. 88 A U F T R A G S G R U N D S A T Z VALUE "A1". 88 A U F T R A G S P O S I T I O N S S A T Z VALUE "A2". 02 A U F T R A G S N U M M E R PIC 9(5). 02 GRUNDDATEN. 03 K U N D E N N U M M E R PIC 9(4). 03 B E S T E L L D A T U M PIC 9(6). 03 LIEFERDATUM PIC 9(6). 03 LIEFERANSCHRIFT PIC X (20). 03 G E S A M T B E S T E L L W E R T PIC 9(5)V9902 P O S I T I O N S D A T E N R E D E F I N E S GRUNDDATEN. 03 P O S I T I O N S N U M M E R PIC 999. 03 A R T I K E L N U M M E R PIC 9(5). 03 M E N G E PIC 99903 WERT PIC 9(4-)V99. 03 FILLER PIC X(26).
Im Programm kann - in Abhängigkeit von der eingelesenen Satzart - eine Verarbeitung der GRUNDDATEN oder der POSITIONSDATEN erfolgen. Die Angabe des FILLERS ist bei Compilern, die bereits die neue ANSNorm 85 berücksichtigen, entbehrlich.
9.5 CORRESPONDING-Angabe Vor einer Beschreibung der CORRESPONDING-Angabe sollen zunächst die Möglichkeiten einer „Kennzeichnung von Datennamen", die die Grundlage einer Anwendung der CORRESPONDING-Angabe darstellen, behandelt werden.
151
CORRESPONDING-Klausel
Kennzeichnung (Qualifikation) von Datennamen In den bisher behandelten Beispielen wurden für verschiedene Speicherfelder stets auch unterschiedliche Datennamen angegeben. Jeder Datenname trat dementsprechend nur einmal in der DATA DIVISION auf. Dieser Verfahrensweise liegt die Forderung zugrunde, daß jedes Speicherfeld eindeutig gekennzeichnet und von anderen Feldern unterscheidbar sein muß. Die Erfüllung der Forderung nach einer Eindeutigkeit von Datennamen kann jedoch mit einer mehrfachen Verwendung desselben Datennamens durchaus in Einklang gebracht werden. Grundsätzlich ist die Eindeutigkeit von Datennamen auch bei mehrfacher Vergabe dann noch gewährleistet, wenn den Datennamen ein oder mehrere in der Datenstruktur übergeordnete Datennamen zugeordnet werden, die sie wieder voneinander unterscheidbar machen. Eine derartige Vorgehensweise wird als Kennzeichnung oder Qualifikation (engl.: qualification) von Datennamen bezeichnet, für die folgendes Format gilt: Format (verkürzt): Datenname-1
IN
Bedingungsname
OF
Datenname-2
Erläuterungen: In der obigen Darstellung dient der Datenname-2, der auch als Kennzeichner (engl.: qualifier) bezeichnet wird, zur eindeutigen Identifizierung eines Datennamens-1 oder eines Bedingungsnamens. Als Kennzeichner fungiert immer ein in der betreffenden Datenstruktur vorhandener, übergeordneter Datenname, der wiederum eindeutig sein muß. Ist das nicht der Fall, so können weitere, jeweils übergeordnete Datennamen angegeben werden, solange bis die Eindeutigkeit erzielt ist. Jedem zusätzlichen Kennzeichner müssen dabei die - gleichwertigen - COBOLrWörter IN oder OF vorangestellt werden. Eine Verkürzung bei der Kennzeichnung von Datenfeldern ist insofern möglich, als Kennzeichner nicht über mehrere Hierarchiestufen hinweg aufgeführt werden müssen. Unter der Voraussetzung, daß damit die Eindeutigkeit des Datennamens gewährleistet ist, reicht die Angabe eines Kennzeichners auf einer beliebigen, höheren Hierarchiestufe. Die höchste Kennzeichnungsstufe verkörpern in der FILE SECTION die Dateinamen, in der WORKING-STORAGE SECTION Datennamen mit den
Weitere COBOL-Klauseln und -Angaben
152
Stufenniimmern Ol und 77. Daraus ergibt sich, daß diese Namen in jedem Fall eindeutig sein müssen, d. h. nicht mehrfach vergeben werden dürfen. Abschließend sei noch darauf hingeweisen, daß auch die mehrfache Verwendung eines Paragraphens in der PROCEDURE DIVISION zulässig ist, da derartige Namen durch Hinzufugung eines SECTION-Namens eindeutig gemacht werden können. Beispiel: Aufgrund der Möglichkeit der Kennzeichnung von Datennamen können in Eingabe- und Ausgabesätzen gleiche Namen verwandt werden. 01
01
PERSONALSATZ. 02 SATZART 02 P E R S O N A L N U M M E R 02 NAME. 03 V O R N A M E 03 N A C H N A M E 02 ANSCHRIFT. 03 STRASSE 03 WOHNORT 02 GEHALT 02 FILLER ZEILE. 02 P E R S O N A L N U M M E R 02 V O R N A M E 02 N A C H N A M E 02 STRASSE 02 WOHNORT 02 GEHALT
PIC XX. PIC 9(6). PIC X(17). PIC X(20). PIC PIC PIC PIC
X(20). X(20). 9(5)V99 X(8).
PIC PIC PIC PIC PIC PIC
9(6). X(17) • X(20). X(20). X(20). 9(5).99
Die Übertragung der Personalnummer aus dem Eingabefeld in das Ausgabefeld kann in folgender Form erfolgen: M O V E P E R S O N A L N U M M E R IN P E R S O H A L S A T Z TO P E R S O N A L N U M M E R IN ZEILE.
Für die Übertragung des Wohnorts bestehen drei Möglichkeiten: H O V E WOHNORT IN ANSCHRIFT TO WOHNORT IN ZEILE M O V E WOHNORT IN ANSCHRIFT IN PERSONALSATZ TO W O H N O R T IN ZEILE M O V E W O H N O R T IN P E R S O N A L S A T Z TO WOHNORT IN ZEILE
Die Kenntnis der Möglichkeiten zur Kennzeichnung von Datenfeldern erlaubt nun eine direkte Überleitung zur CORRESPONDING-Angabe. Die Anwendung der CORRESPONDING-Angabe läßt in vielen Fällen, insbesondere bei langen Datensatzbeschreibungen, eine erhebliche Reduzierung des Schreibaufwandes bei der Programmerstellung zu. Grundsätzlich möglich ist ihre Verwendung bei der MOVE-, ADD- und SUBTRACT-
153
CORRESPONDING-Klausel
Anweisung. Da sie jedoch bei den arithmetischen Anweisungen in der Praxis nur selten eingesetzt wird, wird sie hier nur im Zusammenhang mit der MOVE-Anweisung behandelt. Für MOVE CORRESPONDING gilt folgendes Format: CORRESPONDING MOVE
Datenname-1 TO Datenname-2 CORR
Erläuterungen: CORR ist die Abkürzung für CORRESPONDING. Datenname-1 und Datenname-2 sind die Bezeichnungen für Datengruppen, die ihrerseits wieder gekennzeichnet sein dürfen. Die MOVE CORRESPONDING-Anweisung überträgt miteinander korrespondierende Datenfelder, unabhängig von ihrer Anordnung, aus der Datengruppe-1 in die Datengruppe-2. Unter korrespondierenden Datenfeldern werden dabei Datenfelder mit gleichen Datennamen und gleicher, lückenloser Kennzeichnung verstanden. Mindestens eins der Felder muß darüber hinaus ein elementares Datenfeld sein. Die Gruppennamen Datenname-1 und Datenname-2 müssen eindeutig sein. Für Übertragungen mit Feldern unterschiedlichen Datentyps gelten im übrigen die bereits bei der MOVE-Anweisung (Kapitel 5, Punkt 5.3) beschriebenen Regeln. Nicht übertragen werden die Inhalte von Datenfeldern, deren Namen nicht in beiden Datengruppen erscheinen. Unberücksichtigt bleiben ferner die durch das COBOL-Wort FILLER gekennzeichneten Bereiche. Beispiele: (1) Ausgehend von dem oben - in Zusammenhang mit der Kennzeichnung von Datennamen - behandelten Beispiel, kann jetzt die Anweisung MOVE C O E E E S P O N D I N G P E R S O N A L S A T Z TO ZEILE
codiert werden. Diese Anweisung ersetzt die folgenden zwei Anweisungen: MOVE P E E S O N A L N U M M E E IN PEESONALSATZ TO P E E S O N A L N U M M E E IN ZEILE MOVE GEHALT IN PEESONALSATZ TO GEHALT IN ZEILE
N A M E und ANSCHRIFT werden durch die MOVE CORRESPONDINGAnweisung nicht übertragen, da sie nicht die gleiche Kennzeichnung aufweisen.
154 (2)
Weitere C O B O L K l a u s e l n und -Angaben 01 AUFTRAGSSATZ. 02 AUFTRAGSNUMMER 02 KUNDENNUMMER 02 AUFTRAGSDATUM 02 EINZELPOSITION. 03 ARTIKELNUMHER 03 PREIS 03 MENGE 01 RECHNUNGSSATZ. 02 RECHNUNGSNUMMER 02 KUNDENNUMMER 02 AUFTRAGSNUMMER 02 AUFTRAGSDATUM 02 RECHNUNGSDATUM 02 EINZELPOSITION. 03 ARTIKELNUMMER 03 PREIS 03 MENGE
PIC 9 ( 4 ) . PIC 9(5). PIC 9 ( 6 ) . PIC 999PIC 9(4)V99. PIC 9(4). PIC PIC PIC PIC PIC
9(5). 9(5). 9(6). 9(6). 9(6).
PIC 999PIC 9(4)V99PIC 9(40 •
Die Anweisung MOVE CORRESPONDING AUFTRAGSSATZ TO RECHNUNGSSATZ
überträgt die Inhalte der Sendefelder AUFTRAGSNUMMER, KUNDENNUMMER, AUFTRAGSDATUM, ARTIKELNUMMER, PREIS und MENGE in die gleichnamigen Empfangsfelder.
9.6 FILE STATUS-Klausel Wird in einer Dateibeschreibung die FILE STATUS-Klausel verwandt, so wird nach jeder - die Datei betreffenden - Ein-Ausgabeoperation ein numerischer Zustandscode in ein zweistelliges Datenfeld übertragen. Dieser Code gibt Auskunft über die Ausfuhrung der Ein-Ausgabeoperation. 29 So ermöglicht er z.B. die Feststellung, ob ein Dateizugriff korrekt ausgeführt wurde oder bei nicht erfolgreicher Verarbeitung, ob keine Sätze mehr vorhanden sind, der Datenträger keinen Speicherplatz mehr bietet usw.. Treten Fehler bei der Dateiverarbeitung auf, so verhindert die Angabe der FILE STATUSKlausel grundsätzlich einen sonst eventuell auftretenden Programmabbruch. Die FILE STATUS-Klausel hat das folgende allgemeine Format: FILE STATUS
i s Datenname-1
Bei sequentiellen Dateien stehen für Ein-Ausgabeoperationen die A n w e i s u n g e n OPEN, CLOSE, R E A D , W R I T E und REWRITE zur Verfügung. Für die anderen Dateiorganisationsformen gibt es weitere Anweisungen. Vgl. dazu Kapitel 12 und 13.
FILE STATUS-Klausel
155
Erläuterungen: Die FILE STATUS-Klausel ist unter der SELECT . . . ASSIGN-Eintragung zu codieren. Datenname-1 muß als zweistelliges alphanumerisches Feld in I-O Status Klasse 0 Erfolgreiche Ausführung 2. Byte Ein-Ausgabeanweisung erfolgreich ausgeführt, keine 0 weiteren Informationen verfügbar. READ-Anweisung erfolgreich ausgeführt, aber die Länge des verarbeiteten Satzes entspricht nicht den Eigenschaften einer mit fester Satzlänge definierten Datei. Klasse 1 AT END-Bedingung (Ausführung erfolglos) 2. Byte Eine READ-Anweisung konnte nicht ausgeführt wer0 den, weil kein weiterer logischer Satz in der Datei existiert. Dieser Fall kann u.a. dann eintreten, wenn das Ende der Datei erreicht ist. Klasse 3 Permanenter Fehler (Ausführung erfolglos) 2. Byte Keine weiteren die E/A-Operation betreffenden Infor0 mationen verfügbar. Dateigröße überschritten. Klasse 4 Logischer Fehler (Ausführung erfolglos) 2. Byte Versuch einer Dateieröffnung für eine bereits eröffnete 1 Datei. Versuch eines Dateischließens für eine bereits geschlossene Datei. Die - vor einer REWRITE-Anweisung - im sequentiellen Zugriffsmodus zuletzt ausgeführte E/A-Anweisung war keine READ-Anweisung. I-O Status Klasse 9 Die Verschlüsselung in dieser Klasse bleibt nach ANS COBOL 85 den Herstellern überlassen. Daher ist in jedem Fall beim Auftreten eines mit 9 beginnenden Codewertes das Handbuch des jeweiligen Compilers zu Rate zu ziehen. Abb. 20: Ausgewählte I-O Status Werte für sequentielle Dateien
156
Weitere COBOL-Klauseln und -Angaben
der WORKING-STORAGE SECTION oder LINKAGE SECTION definiert werden (vgl. die untenstehenden Beispiele). Dieses Feld enthält nach jedem Dateizugriff den jeweiligen Zustandscode. Die wichtigsten Codewerte für sequentielle Dateien werden in Abb. 20 dargestellt. Die Werte für nichtsequentielle Dateien werden in Kapitel 12 beschrieben. Hinsichtlich weiterer Angaben sei auf die entsprechenden CompilerHandbücher verwiesen. Beispiele: (1) Eine Dateiendeabfrage kann - unter Verwendung der FILE STATUSKlausel - wie folgt codiert werden: FILE-CONTROL. SELECT TEILNEHMEEDATEI A S S I G N TO "A:TEILDAT.SEQ" O R G A N I Z A T I O N IS S E Q U E N T I A L ACCESS M O D E IS S E Q U E N T I A L FILE STATUS IS DATEIZUSTANDS-FELD. W O R K I N G - S T O E A G E SECTION. 77 D A T E I Z U S T A N D S - F E L D PIC XX. 88 D A T E I - E N D E V A L U E "10". P R O C E D U R E DIVISION. PERFORM V E R A R B E I T U N G U N T I L D A T E I - E N D E
(2) Unter Bezugnahme auf den 1 - 0 Status kann im Programm eine allgemeine Fehlermeldung vorgesehen werden. 77 DATEIZUSTANDS-FELD PIC XX. 88 K E I N - F E H L E R V A L U E "00". P R O C E D U R E DIVISION. IF K E I N - F E H L E R THEN P E R F O R M V E R A R B E I T U N G E L S E P E R F O R M FEHLERMELDUNG. FEHLERMELDUNG. DISPLAY "FEHLER BEI A U S F Ü H R U N G EINES D A T E I Z U G R I F F E S " DISPLAY "1-0 STATUS =" DATEIZUSTANDS-FELD.
Anmerkung: Einzelne Compiler-Hersteller (z.B. die Firma Micro Focus) verschlüsseln in der 1 - 0 Status Klasse 9 im zweiten Byte eine 3stellige Zahl in binärer Form. Bei Zugrundelegung der obigen Codierung würde dann in der zweiten Stelle des Dateizustandsfeldes bei 1 - 0 Status Klasse 9 kein interpretierbares Zeichen erscheinen.
157
Übungsaufgaben
Eine Lösung zu diesem Problem wird bei den nachfolgenden Übungsaufgaben behandelt.
9.7 Übungsaufgaben Aufgabe 1 01 SALDO-3 PIC S9999 V A L U E -1234 SIGN IS THAILING. 01 SALDO-4 PIC S9999 V A L U E -1234 SIGN IS T H A I L I N G SEPARATE CHAHACTEE.
Wie lautet die interne duale und hexadezimale Darstellung im ASCII-Code? Vgl. dazu die Code-Verschlüsselung in Kapitel 1, Abb. 5. Steht für die Vorzeichendarstellung kein separates Byte zur Verfügung, so wird das Vorzeichen wie beim EBCDI-Code im linken Halbbyte des rechten Bytes gespeichert. Ein negatives Vorzeichen wird im ASCII-Code durch hexadezimal „7" (statt „D" im EBCDI-Code) ausgedrückt. Aufgabe 2 Ist die Codierung folgender Datenstruktur zulässig? 01
PERSONALSATZ. 02 ADRESSE. 03 N A M E 03 ADRESSE. 04 STRASSE 04 W O H N O R T
PIC X(30). PIC X(20). PIC X(20).
Aufgabe 3 01 E - B E H E I C H . 03 FELD-1. 05 A 05 B 05 C 03 FELD-2. 05 D 05 E 05 F 03 FILLER A-BEHEICH. 02 FELD-1. 03 A 03 B 03 FILLER 02 FELD-2 02 FELD-3.
PIC 99PIC XX. PIC XX. PIC PIC PIC PIC
999. XXX, 99x(4;
PIC PIC PIC PIC
99. XX. XX. 999.
Weitere COBOL-Klauseln und -Angaben
158 03 FILLER 03 E 03 F
PIC X(4). PIC III. PIC 99-
M O V E CORRESPONDING E - B E E E I C H TO A - B E R E I C H
Welche Felder werden durch die obige MOVE-Anweisung übertragen? Aufgabe 4 Die Ausgabe einer allgemeinen Fehlermeldung mit dem 1 - 0 Status ist zu programmieren. Dabei ist davon auszugehen, daß in der 1 - 0 Status Klasse 9 im zweiten Byte eine 3stellige Zahl in binärer Darstellung verschlüsselt ist. Lösungen im Anhang A.
10 Tabellenverarbeitung
10.1 Grundlagen In der Programmierung versteht man unter einer Tabelle eine Folge von logisch zusammengehörenden Datenfeldern oder -Segmenten, die zumeist die gleiche Datenlänge und den gleichen Datentyp aufweisen. Die einzelnen Felder bzw. Segmente einer Tabelle werden als Tabellenelemente bezeichnet. Jedes Tabellenelement kann über eine laufende Nummer, die Index oder Subskript (s. u.) genannt wird, eindeutig identifiziert werden. Der Einsatz von Tabellen spielt in der Entwicklung von Software für betriebswirtschaftliche Aufgabenstellungen eine außerordentlich bedeutsame Rolle. Beim Programmentwurf ermöglichen Tabellen eine Verkürzung und übersichtlichere Darstellung der Codierung. Bei der Programmausführung ergibt sich eine schnellere Verarbeitung. Dies gilt insbesondere dann, wenn Tabellen - wie üblich - zu Beginn der Verarbeitung von einer Magnetplatte in den Hauptspeicher geladen werden. Die Speicherung in Form von Tabellen erfolgt häufig bei Daten, die auch außerhalb der Datenverarbeitung schon in tabellarischer Form vorliegen. Beispiel: Die unterschiedlichen Stundenlohnsätze eines Betriebes sind in folgender Tariftabelle zusammengefaßt: Tariftabelle Lfd. Nr. (= Pos. Nr.) 1 2 3
Tarifklasse
Stundenlohn
11 12 13
12,00 13,50 16,00
19
25,00
160
Tabellenverarbeitung
Bei der Speicherung dieser Tariftabelle auf einer Magnetplatte oder im Arbeitsspeicher der Zentraleinheit werden aus den einzelnen Zeilen der obigen Tabelle die Tabellenelemente. Beginnend mit einem bestimmten Speicherplatz (der sog. Anfangsadresse), werden die Tabellenelemente hintereinander gespeichert. Nimmt man für jedes Tabellenelement die gleiche Datenlänge an, so kann, ausgehend von der laufenden Nummer (Positionsnummer) und der Anfangsadresse des Speicherbereiches der Tabelle, die Adresse jedes einzelnen Tabellenelementes errechnet werden. Beispiel: Die Speicherung der Tariftabelle im Arbeitsspeicher zeigt folgendes Bild: 111200121350131600
192500
Unterstellt man eine Anfangsadresse von 1200 (d.h. die Speicherung der Tabelle beginnt in Byte 1200 des Arbeitsspeichers) und eine Länge der Tabellenelemente von 6 Bytes, so kann die Ermittlung der Adresse jedes einzelnen Tabellenelementes nach der Formel Adresse Tabellenelement = Anfangsadresse Speicherbereich + (Pos. Nr. - 1) x Tabellenelementlänge erfolgen. In der Programmierung wird die Anfangsadresse des Speicherbereiches auch als Basisadresse, das Resultat aus der Berechnung des arithmetischen Ausdrucks (Pos. Nr. - 1) x Tabellenelementlänge auch als Relativadresse bezeichnet. Die oben beschriebene Adreßrechnung ist die Grundlage für den Zugriff auf Tabellenelemente mit Hilfe eines Subskripts. Bei Verwendung eines Indexes ergeben sich insofern geringfügige Abweichungen, als die Relativadresse nicht erst errechnet werden muß (vgl. dazu Punkt 10.4). Der Aufbau einer Tabelle im Arbeitsspeicher der Zentraleinheit durch ein Programm setzt die Definition einer entsprechenden Anzahl von Speicherfeldern - im Regelfall in der WORKING-STORAGE SECTION - voraus. Ausgehend von den bisherigen Kenntnissen, gibt es dabei nur eine Möglichkeit: Für jedes in der Tabelle enthaltene Datenfeld muß ein entsprechendes Speicherfeld mit einem eigenen, eindeutigen Namen angelegt werden. Auf das Beispiel der Tariftabelle bezogen, ergäbe sich damit folgende Codierung:
Grundlagen
161
W O R K I N G - S T O R A G E SECTION. 01 TARIFTABELLE. 02 TARIFKLASSE-1 PIC 02 STUNDENLOHN-1 PIC 02 TARIFKLASSE-2 PIC 02 STUNDENLOHN-2 PIC
02 TARIFKLASSE-9 02 STUNDENLOHN-9
9999V99. 99-. 99V99.
PIC 99PIC 99V99.
Eine derartige Verfahrensweise würde zur Erstellung von sehr umfangreichen Programmen fuhren. Neben einer Vielzahl von Felddefinitionen in der DATA DIVISION ergäbe sich auch eine entsprechend umständliche und unübersichtliche Darstellung in der PROCEDURE DIVISION. Bei sehr großen Tabellen wäre eine solche Verfahrensweise überhaupt nicht praktikabel. Tatsächlich finden Aufbau und Verarbeitung von Tabellen auch in ganz anderer, wesentlich einfacherer Form statt. Grundsätzlich wird für alle zur Aufnahme von bestimmten Begriffen vorgesehenen Datenfelder einer Tabelle nur ein Datenname vergeben. (Im vorliegenden Fall würde es sich dabei um einen Gruppenbegriff handeln, dem zwei elementare Datenfelder, die die Namen TARIFKLASSE und STUNDENLOHN tragen könnten, untergeordnet wären. Vgl. Beispiel unter Punkt 10.2). Ergänzend zu diesem Namen, erfolgt jedoch für den Compiler durch eine angeschlossene spezielle Klausel (die OCCURS-Klausel) ein Hinweis, daß unter diesem Namen mehrere Speicherfelder bereitzustellen sind. Obwohl nur ein Datenname vergeben wurde, kann jedes darunter definierte Speicherfeld eindeutig identifiziert und somit angesprochen werden. Zur Erkennung des Speicherfeldes dient dabei ein dem Namen im Programm hinzugefugter Index bzw. ein Subskript. Index oder Subskript entsprechen im Grundsatz einer fortlaufenden Nummer. Im allgemeinen werden sie nicht gespeichert. Die Ermittlung des Speicherfeldes erfolgt über eine interne Adreßrechnung in der oben geschilderten Form. Beispiel: TARIFKLASSE (3) (3) verkörpert den Index bzw. das Subskript. Der Name TARIFKLASSE (3) bezieht sich auf das 3. Tarifklassenfeld, d.h. das Feld mit dem Inhalt „13".
162
Tabellenverarbeitung
10.2 OCCURS-Klausel Die OCCURS-Klausel dient zur Definition von Tabellen. Format (verkürzt): OCCURS Ganzzahl TIMES fINDEXED BY {Indexname-1}... ] Erläuterungen: Wie bereits erwähnt, bewirkt die Verwendung der OCCURS-Klausel bei einer Datenfelddefinition, daß unter diesem Datennamen mehrere Speicherfelder bereitgestellt werden. Mit Hilfe der Angabe „Ganzzahl" wird festgelegt, um wieviel Speicherfelder es sich handeln soll. Typ und Länge der Speicherfelder werden dabei durch die dem Datennamen zugeordnete(n) PICTUREMaske(n) bestimmt. Die OCCURS-Klausel kann grundsätzlich an jeder beliebigen Stelle der DATA DIVISION codiert werden. Die Anlage von Tabellen erfolgt jedoch im Regelfall in der WORKING-STORAGE SECTION. Zur Erklärung des Zusatzes INDEXED BY vgl. Punkt 10.4. Folgende Regeln sind zu beachten: - Die OCCURS-Klausel darf nicht bei Datenfelddefinitionen mit den Stufennummern 01, 66, 77 und 88 verwendet werden. - Ganzzahl ist als positive, ganze Zahl zu definieren. - Die OCCURS-Klausel kann bei Datengruppen oder Datenelementen angegeben werden. - Die nach ANS 74 COBOL geltende Beschränkung, daß für Datenfelder, die mit der OCCURS-Klausel definiert werden, nicht gleichzeitig die VALUEKlausel eingesetzt werden darf, trifft nicht mehr zu. ANS 85 COBOL erlaubt die Verwendung der VALUE-Klausel sowohl für Felder, denen direkt eine OCCURS-Klausel zugeordnet wurde, wie auch für Felder, die einer mit OCCURS definierten Datengruppe untergeordnet sind. Beispiel: Die Speicherung der unter Punkt 10.1 beschriebenen Tariftabelle im Arbeitsspeicher kann wie folgt codiert werden: W O R K I N G - S T O R A G E SECTION. 01 TARIFTABELLE. 02 TABELLENELEMENT OCCURS 9 TIMES. OJ TARIFKLASSE PIC 9903 STUNDENLOHN PIC 99V99•
Subskript-Methode
163
Die damit definierte Tabelle besteht aus neun Tabellenelementen, die jeweils in ein Feld TARIFKLASSE mit zwei Speicherstellen und ein Feld STUNDENLOHN mit 4 Speicherstellen unterteilt sind. Der insgesamt für die Tabelle reservierte Speicherplatz umfaßt 54 Speicherstellen. Sowohl die unter der Bezeichnung TABELLENELEMENT definierten Datengruppen als auch die verschiedenen unter den Namen TARIFKLASSE und STUNDENLOHN aufgeführten Datenelemente können unter ihren um ein angefügtes Subskript bzw. einen Index ergänzten Namen einzeln angesprochen werden. Einzelheiten dazu werden im Zusammenhang mit der Subskript- und IndexMethode erläutert.
10.3 Subskript-Methode Die COBOL-Programmierung unterscheidet zwei Formen der Tabellenverarbeitung: die Subskript-Methode, die auch als Subskribierung oder Normalindizierung bezeichnet wird, und die Index-Methodedie auch unter dem Namen Spezialindizierung behandelt wird. Der Subskript-Methode liegt die OCCURS-Klausel ohne den Zusatz INDEXED BY . . . zugrunde. Wesentliches Merkmal dieser Methode ist die Kennzeichnung eines Tabellenelementes durch eine in Klammern hinter dem Namen angefügte Zahl, die die Positionsnummer des Elementes in der Tabelle verkörpert. (Sie entspricht der laufenden Nummer im Beispiel „Tariftabelle".) Statt einer Zahl kann zur Beschreibung eines Tabellenelementes auch ein Datenname verwendet werden, der dann in der DATA DIVISION in der üblichen Form zu definieren ist. Zahl bzw. entsprechender Datenname werden als Normalindex oder Subskript bezeichnet. Beispiele: (1)
30
01
TAEIFTABELLE. 02 TABELLENELEMENT OCCUBS 9 TIMES. 03 T A R I F K L A S S E PIC 9903 STUNDENLOHN PIC 99V99•
Diese für die Tabellenverarbeitung genutzte Index-Methode darf nicht mit der in Kapitel 12 beschriebenen Verarbeitung indexsequentieller Dateien, die auch gelegentlich als Index-Methode bezeichnet wird, verwechselt werden.
164
Tabellenverarbeitung
Die neun Tabellenelemente können unter den Namen TABELLENELEMENT (1), TABELLENELEMENT (2) . . . usw. einzeln angesprochen werden. Da durch die obige Definition gleichzeitig auch die elementaren Datenfelder TARIFKLASSE und STUNDENLOHN subskribiert sind, können sie ebenfalls in analoger Form, d.h. als TARIFKLASSE (1), STUNDENLOHN (2) usw., gekennzeichnet werden. Die so eindeutig beschriebenen Felder werden in der bekannten Form in Anweisungen eingesetzt. M O V E TABELLENELEMENT (9) TO A U S G A B E B E R E I C H MULTIPLY S T U N D E N L O H N (3) BY S T U N D E N Z A H L GIVING B R U T T O L O H N
(2) Die Verwendung von Datennamen als Subskript eröffnet besonders interessante Verarbeitungsmöglichkeiten. WORKING-STORAGE 77 N PIO 99.
SECTION.
P R O C E D U R E DIVISION. M O V E 1 TO N PERFORM V E R A R B E I T U N G U N T I L N VERARBEITUNG. MULTIPLY STUNDENLOHN DISPLAY B R U T T O L O H N ADD 1 TO N.
>
(N) BY S T U N D E N Z A H L G I V I N G B R U T T O L O H N
In der Programmschleife VERARBEITUNG werden nacheinander die Inhalte der Datenfelder STUNDENLOHN (1) bis STUNDENLOHN (9) mit dem unter STUNDENZAHL gespeicherten Wert multipliziert, unter BRUTTOLOHN gespeichert und ausgegeben. Folgende Regeln sind bei der Subskript-Methode zu beachten: - Als Subskript darf immer nur eine positive, ganze Zahl verwendet werden. - Wird ein Datenfeld als Subskript eingesetzt, so muß dieses Datenfeld numerisch ganzzahlig definiert sein. Eine mit ANS 85 COBOL neu geschaffene Möglichkeit ist das sog. relative Subskribieren, d. h. zu dem als Subskript verwandten Datennamen kann eine weitere positive Ganzzahl addiert oder subtrahiert werden, z.B. STUNDENLOHN (N + 2). - Beim Tabellenzugriff muß das Subskript auf ein vorhandenes Tabellenelement hinweisen, d. h. der Wert des Subskripts darf nicht kleiner als 1 oder größer als die in der OCCURS-Klausel genannte Ganzzahl sein. Die Anwendung der Subskript-Methode wird nachfolgend noch einmal an einem vollständigen Programm demonstriert.
Subskript-Methode
165
Programmbeispiel: Errechnung von Bruttolöhnen Aufgabenstellung: Zu Beginn der Verarbeitung sind die Überschriftszeilen für die Ausgabeliste zu drucken. In der ersten Zeile soll die Bezeichnung BRUTTOLOHNLISTE erscheinen. Zeile zwei zeigt am rechten Zeilenrand das Tagesdatum in der Form TT.MM.JJ. Die dritte Überschriftszeile schließlich enthält die Begriffe Name, Vorname, Personalnummer, Arbeitsstunden, Stundenlohn und Bruttolohn. Im zweiten Verarbeitungsabschnitt wird aus einer extern auf einer Magnetplatte geführten Tarifdatei, in der maximal 99 Sätze (jeweils mit dem Inhalt Tarifklasse und Tarifstundenlohn) gespeichert sind, eine Tariftabelle im Arbeitsspeicher aufgebaut. Im letzten Programmteil schließlich sollen die Sätze einer sequentiellen Personaldatei (Inhalt: Name, Vorname, Personalnummer, Tarifklasse und Arbeitsstunden) eingelesen und nacheinander verarbeitet werden. Für jeden Mitarbeiter ist zunächst der Bruttolohn zu errechnen. Dazu ist es erforderlich, aus der Tariftabelle über die Tarifklasse den jeweiligen Stundenlohn zu ermitteln. Danach sind für jeden Mitarbeiter die Ausgabedaten (entsprechend Überschriftszeile drei) zu drucken. Wird ein Personalsatz mit einer Tarifklasse eingelesen, die nicht in der Tabelle gespeichert ist, so ist über den Bildschirm eine Fehlernachricht auszugeben. Nachfolgend das entsprechende Quellenprogramm: I D E N T I F I C A T I O N DIVISION. PROGRAM-ID. BRUTTOLOHNLISTE. AUTHOR. H. HOECKER. E N V I R O N M E N T DIVISION. C O N F I G U R A T I O N SECTION. SPECIAL-NAMES. C O N S O L E IS ORT. FILE-CONTROL. SELECT TARIFDATEI A S S I G N TO "A:TARIF.SEQ" O R G A N I Z A T I O N IS LINE SEQUENTIAL FILE STATUS IS TARIFDATEI-FELD. SELECT P E R S O N A L D A T E I A S S I G N TO "A:PERSONAL.SEQ" O R G A N I Z A T I O N IS LINE S E Q U E N T I A L FILE STATUS IS PERSONALDATEI-FELD. SELECT L O H N L I S T E A S S I G N TO ":LP:". DATA DIVISION. FILE SECTION. FD TARIFDATEI. 01 TARIFSATZ. 02 E T A R I F K L A S S E PIC 9902 E S T U N D E N L O H N PIC 99V99.
166
Tabellenverarbeitung
Eröffnen Dateien Drucken Überschriftszeilen Lesen Tarifdatei Verarbeiten Tarifdatei, solange Dateiende nicht erreicht Übertragen E-Tarifklasse — Tarifklasse (I) Übertragen E-Stundenlohn ->• Stundenlohn (I) Addieren 1 zu I Lesen Tarifdatei Errechnen K = I — 1 Lesen Personaldatei Verarbeiten Personaldatei, solange Dateiende nicht erreicht Übertragen 1 -* I Durchsuchen Tariftabelle, solange I nicht > K —P-Tarifklasse ja
-
= Tarifklasse (I)? ^
^ nein
Errechnen B-Lohn Übertragen E-Felder - A-Felder
Addieren 1 zu I
Übertragen B-Lohn - AB-Lohn Drucken Zeile Übertragen K — I Addieren 2 zu I —
—
ja
1 —-—
= K + 1? _____ _
— ~
nein
Ausgeben Fehlermeldung Lesen Personaldatei Schließen Dateien Ende A b b . 21: Struktogramm zum Programm "Errechnung v o n Bruttolöhnen" (nach Subskript-Methode)
—
Subskript-Methode FD PERSONALDATEI. 01 PERSONALSATZ. PIC X(18). 02 N N A M E 02 VORNAME PIC X(12). 02 PERSONALNUMMER PIC 9(5). 02 PTARIFKLASSE PIC 99. 02 A R B E I T S S T U N D E N PIC 999V99. FD LOHNLISTE. 01 ZEILE PIC 1(80). WORKING-STORAGE SECTION. 01 TARIFDATEI-FELD PIC XI. 88 TARIFDATEI-ENDE V A L U E "10". 77 PERSONALDATEI-FELD PIC XX. 88 P E R S O N A L D A T E I - E N D E VALUE "10". PIC 999 V A L U E 1. 77 I PIC 999 VALUE ZERO. 77 K 01 DATUM. 02 J J PIC 9902 M M PIC 9902 TT PIC 9977 B R U T T O L O H N PIC 9(9)V99 V A L U E ZERO. 01 TARIFTABELLE. 02 TABELLENELEMENT OCCURS 9903 TARIFKLASSE PIC 99. 03 STUNDENLOHN PIC 99V9901 UEBERSCHRIFTSZEILE-1. 02 FILLER PIC X(25) VALUE SPACES. 02 FILLER PIC X(30) VALUE " B R U T T O L O H N L I S T E " 02 FILLER PIC X(25) V A L U E SPACES. 01 UEBERSCHRIFTSZEILE-2. 02 FILLER PIC X(60) VALUE SPACES. 02 ADATUM. 03 ATT PIC 99B. 03 AMM PIC 99B. 03 A J J PIC 9902 FILLER PIC x ( 1 2 ) VALUE SPACES. UEBERSCHRIFTSZEILE- 3. 02 FILLER PIC X(6) VALUE SPACES. 02 FILLER PIC xw VALUE "NAME". 02 FILLER PIC X(12) VALUE SPACES. 02 FILLER PIC X(7) V A L U E "VORNAME". 02 FILLER PIC X(3) V A L U E SPACES. 02 FILLER PIC X(10) V A L U E "PERSONALNR". 02 FILLER PIC x ( 1 ) V A L U E SPACES. 02 FILLER PIC X(14) V A L U E "ARBEITSSTUNDEN" 02 FILLER PIC x ( 1 ) V A L U E SPACES. 02 FILLER PIC x ( 1 1 ) V A L U E "STUNDENLOHN". 02 FILLER PIC X(1) VALUE SPACES. 02 FILLER PIC X(10) V A L U E "BRUTTOLOHN". 01 POSTENZEILE. 02 N N A M E PIC X(18) 02 FILLER PIC X VALUE SPACES 02 VORNAME PIC X(12) 02 FILLER PIC X(4) VALUE SPACES 02 PERSONALNUMMER PIC 9(5). 02 FILLER PIC X(6) VALUE SPACES
168
Tabellenverarbeitung
02 A R B E I T S S T U N D E N PIC 999-9902 FILLEE PIC 1(7) V A L U E SPACES. 02 A S T U N D E N L O H N PIC 99-9902 FILLER PIC X(6) V A L U E SPACES. 02 A B E U T T O L O H N PIC ZZZ9.99. P E O C E D U E E DIVISION. STEUEELEISTE. OPEN INPUT TAEIFDATEI P E E S O N A L D A T E I OUTPUT L O H N L I S T E PEBFOEM U E B E B S C H E I F T BEAD TAEIFDATEI PEBFOEM A U F B A U - T A B I F T A B E L L E U N T I L T A B I F D A T E I E N D E COMPUTE K = I - 1 BEAD P E E S O N A L D A T E I PEBFOEM PEESONALDATEI-VEBAEBEITUNG UNTIL PEESONDALDATEI-ENDE CLOSE TAEIFDATEI P E E S O N A L D A T E I L O H N L I S T E STOP EUN. UEBEBSCHEIFT. ACCEPT DATUM FEOM D A T E M O V E JJ TO A J J MOVE MM TO A M M M O V E TT TO ATT W E I T E ZEILE A F T E E P A G E WBITE ZEILE FEOM UEBEESCHBIFTSZEILE-1 W E I T E ZEILE FEOM U E B E E S C H E I F T S Z E I L E - 2 W E I T E ZEILE FEOM U E B E R S C H R I F T S Z E I L E - 3 M O V E ALL" " TO ZEILE W E I T E ZEILE A F T E E 2. AUFBAU-TABIFTABELLE. MOVE E T A R I F K L A S S E TO TABIFKLASSE(I) MOVE E S T U N D E N L O H N TO STUNDENLOHN(I) ADD 1 TO I READ TAEIFDATEI. PEESONALDATEI-VEBAEBEITUNG. M O V E 1 TO I PEEFORM S U C H E N - T A B I F T A B E L L E U N T I L I > K IF I = K + 1 THEN PEEFOEM FEHLEEMELDUNG. READ PEESONALDATEI. SUCHEN-TABIFTABELLE. IF P T A B I F K L A S S E = T A E I F K L A S S E (I) T H E N M U L T I P L Y A E B E I T S S T U N D E N IN P E E S O N A L S A T Z BY S T U N D E N L O H N (I) GIVING B E U T T O L O H N M O V E C O E E E S P O N D I N G P E E S O N A L S A T Z TO P O S T E N Z E I L E M O V E S T U N D E N L O H N (I) TO A S T U N D E N L O H N M O V E B E U T T O L O H N TO A B E U T T O L O H N W E I T E ZEILE FEOM P O S T E N Z E I L E M O V E K TO I A D D 2 TO I E L S E ADD 1 TO I. FEHLERMELDUNG. DISPLAY SPACES DISPLAY "TARIFKLASSE" P T A R I F K L A S S E "NICHT IN D E R TARIFTABELLE" AT 0203.
169
Index-Methode Hinweise zum
Quellenprogramm:
Die beiden Eingabedateien sind auf einer Diskette unter den Namen TARIF.SEQ und PERSONAL.SEQ gespeichert. Die Dateierweiterung SEQ, die darauf hinweisen soll, daß es sich um sequentielle Dateien handelt, kann entfallen. Die Überschriftszeilen werden hier, anders als in früheren Programmen, vollständig in der WORKING-STORAGE SECTION definiert. Gegenüber einer Übertragung der Zeileninhalte mit Literalen hat diese Methode den Vorzug, daß Verschiebungen von Ausgabefeldern in einer Zeile leichter vorzunehmen sind. Das Datenfeld K enthält nach dem Tariftabellenaufbau die Anzahl der Tabellenelemente. Entsprechend wird das Suchen in der Tariftabelle dann abgebrochen, wenn I > K.
10.4 Index-Methode Die Verarbeitung von Tabellen nach der Subskript-Methode erfordert intern wie unter 10.1 beschrieben - eine Umrechnung des Subskript-Wertes in eine Relativadresse. Bei Programmen mit zahlreichen Tabellenzugriffen kann das zu einer erheblichen Verlängerung der Ausführungszeiten führen. Die IndexMethode bietet hier, wegen ihrer anderen Vorgehensweise (s. u.), eine Möglichkeit, Tabellen mit geringerem Zeitaufwand zu durchsuchen und damit die Programmlaufzeiten zu verkürzen. Grundlage der Index-Methode ist die OCCURS-Klausel mit dem Zusatz INDEXED BY. Die nach INDEXED BY aufgeführten Indexnamen verkörpern die für die Tabellenverarbeitung einzusetzenden Indizes. Indexnamen werden ausschließlich durch ihre Eintragung hinter der Klausel OCCURS . . . INDEXED BY definiert. Eine an dieser Stelle vorgenommene Codierung von Indexnamen veranlaßt den Compiler, entsprechende Felder, die nur mit bestimmten Befehlen (s.u.) angesprochen werden können, zu reservieren. Eine explizite Definition der Indizes als Datennamen ist nicht erlaubt. Im Unterschied zum Subskript, das die Positionsnummer eines Tabellenelementes oder -feldes enthält, wird unter dem Indexnamen immer die Relativadresse des Elementes gespeichert.
170
Tabellenverarbeitung
Beispiel: Für das unter Positionsnummer 3 gespeicherte dritte Element der Tariftabelle lautet die unter einem Indexnamen gespeicherte Relativadresse 12. Dieser Wert ergibt sich aus folgender Berechnung: Relativadresse = (Positionsnummer - 1) x Tabellenelementlänge 12 = ( 3 -l)x 6 Die unter Punkt 10.1 beschriebene - für die Tabellenverarbeitung geltende Adreßrechnung vereinfacht sich bei der Index-Methode durch den Fortfall der Ermittlung der relativen Adresse. Hier liegt auch der Grund für die gegenüber der Subskript-Methode - schnellere Verarbeitung. Das Ansprechen einzelner Tabellenelemente im Programm erfolgt bei der Index-Methode ähnlich wie bei der Subskript-Methode. Dem Indexnamen wird im Programm zunächst eine Positionsnummer zugewiesen (s.u. SETAnweisung). Diese Positionsnummer entspricht einer bestimmten relativen Adresse, die dann unter dem Indexnamen gespeichert wird. Während die relative Subskribierung erst seit der Einführung der neuen COBOL-Norm ANS 85 möglich geworden ist, gibt es die relative Indizierung schon seit langem. Bezogen auf das Beispiel „Tariftabelle", bestehen also auch folgende Möglichkeiten, ein Tabellenelement anzusprechen: 02 T A R I F T A B E L L E N E L E K E N T OCCUKS 99 INDEZED BY I. 03 TARIFKLASSE PIC 9903 STUNDENLOHN PIC 99V99. TARIFKLASSE
(I + 2) O d e r
TARIFKLASSE
(1-1)
USW.
Ist vorher I die Positionsnummer 2 zugewiesen worden, so wird im ersten Fall unter dem Indexnamen I die Relativadresse 18, im zweiten Fall die Relativadresse 0 gespeichert. 10.4.1 SET-Anweisung Durch den Zusatz INDEXED BY definierte Indexnamen dürfen nicht in MOVE- oder arithmetischen Anweisungen erscheinen. Eine Veränderung von Indizes kann grundsätzlich nur mit der SET-Anweisung erfolgen. Dabei stehen zwei Hauptformate zur Verfügung: Format 1:
Indexname-1 SET
...TO Datenname-1
Indexname-2 Datenname-2 Ganzzahl
171
Index-Methode
Erläuterungen: Datenname-2 muß immer eine positive ganze Zahl enthalten. Im Format 1 dient die SET-Anweisung zur Zuweisung von Anfangswerten an Indexnamen oder zur Übertragung eines Indexnamens an Datennamen. Sie ermöglicht also einen Datentransfer zwischen Indexnamen und Datennamen bzw. Zahlen und übernimmt insofern der MOVE-Anweisung entsprechende Funktionen. Wichtig! Gegenüber der MOVE-Anweisung sind Sendefelder und Empfangsfelder jedoch vertauscht. Dem auf SET folgenden Namen wird also der Wert eines Indexnamens, Datennamens oder einer Zahl zugewiesen. Beispiel: SET I TO 1. Die Positionsnummer 1 wird dem Indexnamen I zugewiesen, d. h. unter I wird die Relativadresse 0 gespeichert. Möglichkeiten, den Indexwert zu verändern, bietet das Format 2 der SETAnweisung. Format 2: UP BY
Datenname
DOWN BY
Ganzzahl
SET {Indexname}...
Die Angabe UP BY bewirkt, daß der Wert des Indexnamens u m die unter Datenname gespeicherte Zahl bzw. um Ganzzahl erhöht wird. Entsprechend erfolgt eine Verminderung des Wertes des Indexnamens, wenn DOWN BY in der SET-Anweisung erscheint. Beispiel: SET I UP BY 1. Der Indexname I wird um 1 erhöht. Folgende Regeln sind bei der SET-Anweisung zu beachten: - Der Indexname muß auf ein vorhandenes Tabellenelement hinweisen, d. h. der dem Indexnamen zugewiesene Wert darf nicht kleiner als 1 oder größer als die in der OCCURS-Klausel angegebene Ganzzahl sein.
172
Tabellenverarbeitung
- Neu mit der COBOI^Norm ANS 85 eingeführt wurde die Möglichkeit, im Format 1 der SET-Anweisung vor dem COBOL-Wort TO Indexnamen und Datennamen gemischt aufzuführen. 10.4.2 SEARCH-Anweisung Aufgabe der SEARCH-Anweisung in dem hier beschriebenen Format ist das sequentielle Durchsuchen von Tabellen. Format:
Datenname-2 SEARCH Datenname-1 VARYING Indexname [AT END unbedingte Anweisung-1] unbedingte Anweisung-2 WHEN Bedingung NEXT SENTENCE fEND-SEARCHl Erläuterungen:
Durch die SEARCH-Anweisung wird eine Tabelle, beginnend mit einem festgelegten Indexwert (dem sog. Suchindex), nach einem Tabellenelement, das einer bestimmten Bedingung entspricht, durchsucht. Ist diese Bedingung für den geltenden Index erfüllt, wird die Suche beendet. Im anderen Fall wird der Suchvorgang in der Tabelle - mit jeweils um 1 erhöhten Indexwert solange fortgesetzt, bis die Bedingung erfüllt ist oder erkannt wird, daß die Bedingung nicht erfüllbar ist. Nachfolgend die Erklärung der einzelnen Angaben in der SEARCH-Anweisung: Als Datenname-1 ist der Name des Feldes, das mit OCCURS und INDEXED BY definiert wurde, also der eigentliche Tabellenname, anzugeben. Dieser Name muß in der SEARCH-Anweisung ohne Index aufgeführt werden. Der Zusatz VARYING bewirkt, daß der Wert des anschließend genannten Indexnamens oder Datennamens-2 während der Suche in der Tabelle von einem Anfangswert an mit einer Schrittweite von 1 hochgezählt wird. Indexname kann dabei der unter Datenname-1 mit der INDEXED BY-Klausel
Index-Methode
173
definierte Name oder ein Indexname einer anderen Tabelle, der parallel erhöht werden soll, sein. Im ersten Fall kann der Zusatz VARYING auch ganz entfallen, da dann grundsätzlich der erste für die Tabelle definierte Indexname als Suchbegriff verwendet und hochgezählt wird. Im zweiten Fall nimmt der erste Indexname der unter Datenname-1 definierten Tabelle den Suchbegriff, der entsprechend dem Indexnamen der anderen Tabelle erhöht wird, auf. Statt eines Indexnamens kann hinter dem Zusatz VARYING ein numerisches Datenfeld angegeben werden. Auch in diesem Fall fungiert als Suchbegriff der an erster Stelle - für die unter Datenname-1 definierte Tabelle - genannte Indexname. Der AT END-Zusatz wird wirksam, wenn die definierte Bedingung nicht erfüllt wurde und das Ende der Tabelle erreicht ist oder wenn der Wert des Suchindexes (Suchbegriffes) schon am Anfang der Verarbeitung größer ist als die Anzahl der Tabellenelemente. Die hinter WHEN aufgeführte Bedingung steuert den eigentlichen Suchvorgang in der Tabelle. Ist die Bedingung erfüllt, so wird das Durchsuchen der Tabelle abgebrochen und die Verarbeitung mit der angegebenen unbedingten Anweisung fortgesetzt. Bei Nichterfüllung der Bedingung dagegen wird der Index um 1 erhöht und der Suchprozeß fortgesetzt. An Stelle einer unbedingten Anweisung kann hinter der Bedingung auch die NEXT SENTENCE-Eintragung codiert werden. Die Verarbeitung wird dann mit der sich an die SEARCH-Anweisung anschließenden Anweisung weitergeführt. Der Geltungsbereich der SEARCH-Anweisung wird mit dem expliziten Bereichsbegrenzer END-SEARCH abgeschlossen. Folgende Regeln sind weiter bei der SEARCH-Anweisung zu beachten: - Da der Suchvorgang in der Tabelle immer mit dem gerade unter dem Indexnamen gespeicherten Wert beginnt, sollte diesem Namen vorher mit der SET-Anweisung ein Anfangswert zugewiesen werden. - Der mit einer Bedingung verknüpfte WHEN-Zusatz muß mindestens einmal in der SEARCH-Anweisung angegeben werden. Programmbeispiel: Das bereits zur Erläuterung der Subskript-Methode herangezogene Beispiel „Errechnung von Bruttolöhnen" wird nachfolgend noch einmal mit der IndexMethode gelöst.
174 I D E N T I F I C A T I O N DIVISION. PROGRAM-ID. BRUTTOLOHNLISTE. AUTHOR. H. HOECKER. E N V I R O N M E N T DIVISION. C O N F I G U R A T I O N SECTION. SPECIAL-NAMES. CONSOLE IS CRT. FILE-CONTROL. SELECT TARIFDATEI A S S I G N TO "A:TARIF.SEQ" O R G A N I Z A T I O N IS L I N E S E Q U E N T I A L FILE STATUS IS TARIFDATEI- FELD. SELECT P E R S O N A L D A T E I A S S I G N TO "A:PERSONAL.SEQ" O R G A N I Z A T I O N IS LINE S E Q U E N T I A L FILE STATUS IS P E R S O N A L D A T E I - FELD . SELECT L O H N L I S T E A S S I G N TO ":LP:". DATA DIVISION. FILE SECTION. FD TARIFDATEI. 01 TARIFSATZ. PIC 9902 E T A R I F K L A S S E PIC 99V99. 02 E S T U N D E N L O H N FD PERSONALDATEI. 01 PERSONALSATZ. 02 N N A M E PIC X(18). 02 V O R N A M E PIC 1(12) . 02 P E R S O N A L N U M M E R PIC 9(5). 02 P T A R I F K L A S S E PIC 99. 02 A R B E I T S S T U N D E N PIC 999V99. FD LOHNLISTE. 01 ZEILE PIC X(80) V A L U E SPACES. W O R K I N G - S T O R A G E SECTION. 01 TARIFDATEI-FELD PIC XX. 88 T A R I F D A T E I - E N D E V A L U E "10". 77 P E R S O N A L D A T E I - F E L D PIC XX. 88 P E R S O N A L D A T E I - E N D E V A L U E "10". 01 DATUM. 02 J J PIC 9902 MM PIC 9902 TT PIC 9977 B R U T T O L O H N PIC 9(9)V99 V A L U E ZERO. 01 TARIFTABELLE. 02 TABELLENELEMENT OCCURS 99 INDEXED BY I. 03 TARIFKLASSE PIC 9903 S T U N D E N L O H N PIC 99V99. 01 UEBERSCHRIFTSZEILE-1. 02 FILLER PIC X(25) V A L U E SPACES. 02 FILLER PIC X(30) V A L U E " B R U T T O L O H N L I S T E " . 02 FILLER PIC X(25) V A L U E SPACES. 01 UEBERSCHRIFTSZEILE-2. 02 FILLER PIC X(60) V A L U E SPACES. 02 ADATUM. 03 ATT PIC 99B. 03 A M M PIC 99B. 03 A J J PIC 9902 FILLER PIC X(12) V A L U E SPACES. 01 UEBERSCHRIFTSZEILE-302 FILLER PIC X(6) V A L U E SPACES.
Tabellenverarbeitung
Index-Methode 02 FILLER PIC ï O ) VALUE "NAME". 02 FILLER PIC X(12) VALUE SPACES. 02 FILLER PIC K 7 ) VALUE "VORNAME". 02 FILLER PIC 1(3) VALUE SPACES. 02 FILLER PIC X(10) VALUE "PERSONALNR". 02 FILLER PIC X(1) VALUE SPACES. 02 FILLER PIC 1(14) VALUE "ARBEITSSTUNDEN" 02 FILLER PIC X(1) VALUE SPACES. 02 FILLER PIC X(11) VALUE "STUNDENLOHN". 02 FILLER PIC X(1) VALUE SPACES. 02 F I L L E R PIC X(10) VALUE "BRUTTOLOHN". 01 P O S T E N Z E I L E . 02 N N A M E PIC 1 ( 1 8 ) . 02 F I L L E R PIC X VALUE SPACES. 02 V O R N A M E PIC 1 ( 1 2 ) . 02 F I L L E R PIC X(4) VALUE SPACES 02 P E R S O N A L N U M M E R PIC 9 ( 5 ) • 02 F I L L E R PIC X ( 6 ) VALUE SPACES 02 A R B E I T S S T U N D E N PIC 9 9 9 - 9 9 02 F I L L E R PIC X(7) VALUE SPACES 02 A S T U N D E N L O H N PIC 9 9 - 9 9 02 F I L L E R PIC X ( 6 ) VALUE SPACES 02 A B R U T T O L O H N PIC Z Z Z 9 - 9 9 PROCEDURE DIVISION. STEUERLEISTE. OPEN INPUT TARIFDATEI PERSONALDATEI OUTPUT LOHNLISTE PERFORM UEBERSCHRIFT READ TARIFDATEI S E T I TO 1 PERFORM AUFBAU-TARIFTABELLE UNTIL TARIFDATEI-ENDE READ PERSONALDATEI S E T I TO 1 PERFORM PERSONALDATEI-VERARBEITUNG UNTIL PERSONALDATEI-ENDE CLOSE TARIFDATEI PERSONALDATEI LOHNLISTE STOP RUN. UEBERSCHRIFT. ACCEPT DATUM FROM DATE M O V E J J TO A J J M O V E M M TO A M M M O V E TT TO A T T WRITE ZEILE AFTER PAGE WRITE ZEILE FROM UEBERSCHRIFTSZEILE-1 WRITE ZEILE FROM UEBERSCHRIFTSZEILE-2 WHITE ZEILE FROM UEBERSCHRIFTSZEILE-5 M O V E A L L " " TO Z E I L E W R I T E Z E I L E A F T E R 2. AUFBAU-TARIFTABELLE. M O V E E T A R I F K L A S S E TO T A R I F K L A S S E (I) M O V E E S T U N D E N L O H N TO S T U N D E N L O H N (I) SET I UP BY 1 READ TARIFDATEI. PERSONALDATEI-VERARBEITUNG. PERFORM SUCHEN-TARIFTABELLE READ PERSONALDATEI S E T I TO 1.
175
176
Tabellenverarbeitung
SUCHEN-TARIFTABELLE. SEARCH TABELLENELEMENT AT E N D P E R F O R M F E H L E R M E L D U N G W H E N P T A R I F K L A S S E = T A R I F K L A S S E (I) MULTIPLY A R B E I T S S T U N D E N IN PERSONALSATZ BY S T U N D E N L O H N (I) G I V I N G B R U T T O L O H N M O V E C O R R E S P O N D I N G P E R S O N A L S A T Z TO P O S T E N Z E I L E M O V E S T U N D E N L O H N (I) TO A S T U N D E N L O H N M O V E B R U T T O L O H N TO A B R U T T O L O H N W R I T E ZEILE FROM POSTENZEILE. FEHLERMELDUNG. DISPLAY SPACES DISPLAY "TARIFKLASSE " P T A R I F K L A S S E « NICHT IN D E R TARI FTAB E L L E " AT 0203.
10.5 PERFORM ... VARYING-Anweisung Im Zusammenhang mit der Tabellenverarbeitung soll nun auch als eine weitere Variante der PERFORM-Anweisung das Format 4, auf das bereits in Kapitel 7 hingewiesen wurde, dargestellt werden. Format 4: THROUGH PERFORM
Prozedurname-1
Prozedurname-2 THRU
BEFORE WITH TEST AFTER Datenname-1 VARYING
FROM Indexname-1
Datenname-2 Indexname-2 Literal-1
Datenname-3 BY
UNTIL Bedingung-1 Literal-2
Datenname-4 AFTER
FROM Indexname-3
Datenname-5 Indexname-4 Literal-3
177
PERFORM . . . VARYING-Anweisung
Datenname-6 BY
UNTIL Bedingung-2 Literal-4
[unbedingte Anweisung-1 END-PERFORM! Erläuterungen:
Die P E R F O R M . . . VARYING-Anweisung ermöglicht das wiederholte Durchlaufen einer Programmschleife. Dabei wird der Inhalt einer sog. Laufvariablen, ausgehend von einem bestimmten Anfangswert, mit jedem Durchlauf um einen festgelegten Wert erhöht oder vermindert. Als Laufvariablen können Indexnamen oder Datennamen, die z.B. als Subskripte Verwendung finden, eingesetzt werden. In dieser Form ist die PERFORM . . . VARYINGAnweisung insbesondere für die Tabellenverarbeitung geeignet. Zum ersten Teil der Anweisung vgl. die Erklärungen in Kapitel 7. Auf das COBOLWort VARYING folgt die Angabe der Laufvariablen, deren Anfangswert hinter FROM definiert werden muß. Die im Anschluß an BY vorzunehmende Eintragung stellt die Schrittweite dar, d. h. den Wert, um den der aktuelle Wert der Laufvariablen bei jedem Schleifendurchlauf erhöht oder vermindert wird. Die Veränderung der Laufvariablen erfolgt jeweils nach dem Durchlauf der Schleife bzw. der Prozedur. Gesteuert wird die PERFORM-Schleife durch die hinter UNTIL aufgeführte Bedingung. Ist diese Bedingung erfüllt, so wird die Verarbeitung abgebrochen. Wann die Bedingung geprüft wird, ist dabei wiederum abhängig von der Art der Schleife (DO WHILE- oder DO UNTII^Schleife). Der AFTER-Zusatz ermöglicht die Definition weiterer Laufvariablen. Diese Möglichkeit ist vor allem im Zusammenhang mit der Verarbeitung mehrdimensionaler Tabellen von Interesse. Ein entsprechendes Anwendungsbeispiel wird unter Punkt 10.6 behandelt. Folgende Regeln sind weiter zu beachten: - Alle Datennamen und Literale müssen numerisch ganzzahlig sein. - Die nach BY angegebene Schrittweite darf nicht 0 sein. - Bei der hinter UNTIL genannten Bedingung kann es sich um eine einfache oder komplexe Bedingung handeln.
178
Tabellenverarbeitung
Beispiel: Verarbeitung der Personaldatei aus dem Programm „Errechnung von Bruttolöhnen" (nach der Subskript-Methode). PERSONALDATEI-VERARBEITUNG. P E R F O R M S U C H E N - T A R I F T A B E L L E V A R Y I N G I FROM 1 BY 1 U N T I L
I >K
IF I = K + 1 THEN PERFORM FEHLERMELDUNG. READ PERSONALDATEI. SUCHEN- TARIFTABELLE. IF P T A R I F K L A S S E = TARIFKLASSE (I) T H E N MULTIPLY A R B E I T S S T U N D E N IN PERSONALSATZ B T STUNDEN (I) GlVING B R U T T O L O H N M O V E C O R R E S P O N D I N G PERSONALSATZ TO P O S T E N Z E I L E M O V E S T U N D E N L O H N (I) TO A S T U N D E N L O H N M O V E B R U T T O L O H N TO A B R U T T O L O H N W R I T E ZEILE FROM P O S T E N Z E I L E M O V E K TO I ADD 2 TO I. FEHLERMELDUNG.
Gegenüber der ursprünglichen Version macht der Einsatz von P E R F O R M . . . VARYING die Anweisungen MOVE 1 TO I (nach dem Paragraphennamen PERSONALDATEI- VERARBEITUNG) und ADD 1 TO I (im ELSE-Zweig) überflüssig.
10.6 Mehrdimensionale Tabellen Die bisherigen Beispiele zur Tabellenverarbeitung bezogen sich ausschließlich auf eindimensionale Tabellen. COBOL ermöglicht darüberhinaus auch das Arbeiten mit mehrdimensionalen Tabellen. Nach ANS COBOL 74 war bereits eine Verarbeitung von Tabellen mit maximal drei Dimensionen erlaubt. Die neue Norm ANS 85 bietet mit sieben Dimensionen hier noch erheblich weitergehende Möglichkeiten. Nachfolgend soll die Verarbeitung mehrdimensionaler Tabellen am Beispiel einer zweidimensionalen Tabelle, einer Matrix, demonstriert werden. Die in diesem Zusammenhang erworbenen Kenntnisse gestatten es dem Leser, auch Tabellen mit mehr als zwei Dimensionen problemlos anzuwenden. Eine zweidimensionale Tabelle bzw. Matrix liegt dann vor, wenn die einzelnen Tabellenelemente einer eindimensionalen Tabelle weiter unterteilt und entsprechend mit OCCURS erneut beschrieben werden. Konsequenz der zweifachen Verwendung der OCCURS-Klausel ist die doppelte Indizierung
Mehrdimensionale Tabellen
179
(bzw. Subskribierung) der Matrixelemente. Dabei verkörpert der an erster Stelle angegebene Index den Zeilenindex, der an zweiter Stelle genannte Index den Spaltenindex der Matrix. Beispiel: Die Datensätze einer sequentiellen, aber nicht sortierten Plattendatei enthalten die Datenfelder Kostenart, Kostenstelle und Betrag. Die Inhalte der Sätze sollen eingelesen und im Arbeitsspeicher als Matrix dargestellt werden. Der Begriff Kostenart ist dabei als Zeilenindex, der Begriff Kostenstelle als Spaltenindex zu verwenden. Die im Arbeitsspeicher aufzubauende Matrix zeigt dann folgendes Aussehen: Spaltenindex j Kostenstelle) Zeilenindex (= Kostenart)
1
2
n
1 2 3
Betrag (1,1) Betrag (2,1) Betrag (3,1)
Betrag (1,2) Betrag (2,2) Betrag (3,2)
. . . .
Betrag (l,n) Betrag (2,n) Betrag (3,n)
m
Betrag (m,l)
Betrag (m,2)
. .
Betrag (m,n)
Jedes Matrixelement ist durch einen Zeilen- und Spaltenindex, der in Form eines Subskriptes oder Indexes angegeben werden kann, eindeutig definiert. Folgende Codierung ist dafür die Voraussetzung. 01 MATRIX. 02 ZEILE OCCURS M TIMES. 03 B E T R A G PIC S9(4)V99 OCCURS N TIMES.
Durch die erste OCCURS-Klausel wird das Datenfeld ZEILE m mal bereitgestellt. Die zweite OCCURS-Klausel bewirkt, daß jedes einzelne Datenfeld ZEILE noch einmal in n Felder mit dem Namen BETRAG weiter unterteilt wird. Erst diese Felder verkörpern die eigentlichen Matrixelemente, die entsprechend mit einer PICTURE-Maske zu beschreiben sind und beim Aufruf mit zwei Index- bzw. Subskriptangaben gekennzeichnet werden müssen. Die Verarbeitung von Matrizen wird anschließend noch einmal an einem ausführlichen Beispiel dargestellt.
Tabellenverarbeitung
180
Programmbeispiel: Sortieren mit Matrix Aufgabenstellung: Die Hauptaufgabe des Programms besteht darin, aus den Daten einer unsortierten Eingabedatei eine sortierte Ausgabeliste zu erstellen. Das obige Beispiel wird dazu wie folgt erweitert: Nach der Einordnung der aus den Sätzen der unsortierten Datei stammenden Daten (Kostenart, Kostenstelle und Betrag) in eine Matrix soll eine nach Kostenarten und Kostenstellen sortierte Liste der Beträge ausgegeben werden. Jeweils bei einem Wechsel der Kostenart ist eine Zwischensumme zu drucken. Am Ende der Liste soll die Endsumme aller Beträge erscheinen. Um die Größe der Matrix zu begrenzen, wird unterstellt, daß maximal 15 Kostenarten und 10 Kostenstellen auftreten können. Die Ausgabeliste hat dann folgendes Aussehen: Kostenart
Kostenstelle
Betrag
01 01 01 01
01 02 03 07
2000,00 1500,50 1800,00 3000,00 8300,50
02 02
01 03
Zwischensumme Kostenart
1200,00 4000,00
xxxxx.xx
Zwischensumme Kostenart
xxxxx,xx xxxxxx,xx
Zwischensumme Kostenart Endsumme
Das Programm ist in drei Abschnitte zu untergliedern. Im ersten Abschnitt sollen die Felder der Matrix auf 0 gesetzt werden. Danach sind die Datensätze der Datei einzulesen und ihre Inhalte in die Matrix zu übertragen. Im letzten Teil schließlich soll - durch zeilenweises Verarbeiten der Matrix - die oben beschriebene, nach Kostenarten und Kostenstellen sortierte Liste ausgegeben werden.
181
Mehrdimensionale Tabellen Eröffnen Dateien Drucken Überschriftszeile Verarbeiten Matrixzeile, beginnend mit Zeilenindex (IKA) = 1, Indexzuwachs = 1, solange IKA nicht > 15 Verarbeiten Matrixspalte, beginnend mit Spaltenindex (IKST) = 1, Indexzuwachs = 1, solange IKST nicht > 10 Löschen Matrixelement (Betrag (IKA, IKST) Lesen Kostenarten-Datei Übertragen in Matrix, solange Dateiende nicht erreicht Übertragen Kostenart
IKA
Übertragen Kostenstelle -• IKST Übertragen E-Betrag - Betrag (IKA, IKST) Lesen Kostenarten-Datei Ausgeben Liste, beginnend mit Zeilenindex (IKA) = 1, Indexzuwachs = 1, solange IKA nicht > 15 Ausgeben Zeile, beginnend mit Spaltenindex (IKST) = 1, Indexzuwachs = 1, solange IKST nicht > 10 —
^ ^ ^ ^
Betrag (IKA,IKST) nicht = 0?
ja Übertragen IKA
^ ^ ^ ^ nein
—_ A-Kostenart
Übertragen IKST
A-Kostenstelle
Ubertragen Betrag (IKA, IKST) - A-Betrag Drucken Postenzeile Addieren Betrag (IKA, IKST) zu Zwischensumme, Endsumme ——_
^
ja Übertragen Zwischensumme
Zwischensumme nicht = 0? —
nein
A-Zwischensumme
Drucken Zwischensummenzeile Löschen Zwischensumme Übertragen Endsumme
A-Endsumme
Drucken Endsummenzeile Schließen Dateien Ende Abb. 22: Struktogramm „Sortieren mit Matrix" (nach Subskript-Methode)
182
Tabellenverarbeitung
Nachfolgend das entsprechende Quellenprogramm. IDENTIFICATION DIVISION. PROGRAM-ID. SORTIEHUNG-MIT-MATRIX. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT KOSTENARTEN-DATEI ASSIGN TO "A : KOSTEN.SEQ" ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS KOSTENARTEN-DATEI- FELD. SELECT LISTE ASSIGN TO ":LP:". DATA DIVISION. FILE SECTION. FD KOSTENARTEN-DATEI. 01 KOSTENSATZ. 02 KOSTENART PIC 99. 02 KOSTENSTELLE PIC 99. PIC 9(4)V99. 02 E-BETRAG FD LISTE. A-ZEILE 01 PIC X(63). WORKING-STORAGE SECTION. 77 KOSTENARTEN-DATEI- FELD PIC XX. 88 KOSTENARTEN-DATEI-ENDE VALUE "10". PIC 9(5)V99. 77 ZWISCHENSUMME PIC 9(6)V99. 77 ENDSUMME PIC 99. 77 IKA PIC 9977 IKST MATRIX. 01 02 ZEILE OCCURS 15 TIMES. 03 BETRAG PIC 9COV99 OCCURS 1 0 . 01 UEBERSCHRIFTSZEILE. 02 FILLER PIC X(6) VALUE SPACES. PIC X(9) VALUE "KOSTENART". 02 FILLER PIC X(6) VALUE SPACES. 02 FILLER PIC X(12) VALUE "KOSTENSTELLE". 02 FILLER PIC X(6) VALUE SPACES. 02 FILLER PIC X(6) VALUE "BETRAG". 02 FILLER POSTENZEILE. 01 02 FILLER PIC X(9) VALUE SPACES. 02 AKOSTENART PIC 9902 FILLER PIC X(13) VALUE SPACES. 02 AKOSTENSTELLE PIC 9902 FILLER PIC X(13) VALUE SPACES. 02 ABETRAG PIC Z(4)9.99. 01 ZWISCHENSUMMENZEILE. 02 FILLER PIC X(38) VALUE SPACES. 02 AZWISCHENSUMME PIC Z(5)9.99. 02 FILLER PIC X(16) VALUE "ZWISCHENSUMME KA". ENDSUMMENZEILE. 01 02 FILLER PIC X(37). 02 AENDSUMME PIC Z(6)9.99. 02 FILLER PIC X(16) VALUE "ENDSUMME". PROCEDURE DIVISION. STEUERLEISTE. OPEN INPUT KOSTENARTEN-DATEI OUTPUT LISTE PERFORM UEBERSCHRIFT
Mehrdimensionale Tabellen
183
P E R F O R M LOESCHEN-1 V A R Y I N G IKA FROM 1 BY 1 U N T I L IKA > 1 5 READ K O S T E N A R T E N - D A T E I PERFORM EINLESEN-IN-MATRIX UNTIL KOSTENARTEN-DATEI-ENDE P E R F O R M A U S G E B E N - L I S T E V A R Y I N G IKA FROM 1 BY 1 U N T I L IKA > 15 M O V E E N D S U M M E TO A E N D S U M M E W R I T E A - Z E I L E FROM E N D S U M M E N Z E I L E CLOSE K O S T E N A R T E N - D A T E I LISTE STOP RUN. UEBERSCHRIFT. W R I T E A - Z E I L E A F T E R PAGE W R I T E A - Z E I L E FROM U E B E R S C H R I F T S Z E I L E M O V E A L L " " TO A - Z E I L E W R I T E A - Z E I L E A F T E R 2. LOESCHEN-1. P E R F O R M LOESCHEN-2 V A R Y I N G IKST FROM 1 BY 1 U N T I L IKST > 1 0 . LOESCHEN-2. M O V E ZEROS TO B E T R A G (IKA, IKST). EINLESEN-IN-MATRIX. M O V E KOSTENART TO IKA M O V E K O S T E N S T E L L E TO IKST M O V E E - B E T R A G TO B E T R A G (IKA, IKST) READ KOSTENARTEN-DATEI. AUSGEBEN-LISTE. P E R F O R M A U S G E B E N - Z E I L E V A R Y I N G IKST FORM 1 BY 1 U N T I L IKST > 10 IF ZWISCHENSUMME NOT = 0 THEN M O V E ZWISCHENSUMME TO A Z W I S C H E N S U M M E W R I T E A - Z E I L E FORM Z W I S C H E N S U M M E N Z E I L E M O V E ZEROS TO ZWISCHENSUMME. AUSGEBEN-ZEILE. IF B E T R A G (IKA, IKST) NOT = 0 THEN M O V E IKA TO AKOSTENART M O V E IKST TO A K O S T E N S T E L L E M O V E B E T R A G (IKA, IKST) TO A B E T R A G W R I T E A - Z E I L E FORM P O S T E N Z E I L E ADD B E T R A G (IKA, IKST) TO Z W I S C H E N S U M M E ENDSUMME.
Hinweise zum Quellenprogramm: Das Löschen der einzelnen Matrixfelder wird in dem obenstehenden Programm - aus Übungsgründen - mit zwei geschachtelten P E R F O R M . . . V A R Y I N G - A n w e i s u n g e n vorgenommen. Eine andere Möglichkeit wäre die Anwendung einer P E R F O R M - A n w e i s u n g mit dem Zusatz A F T E R . Die Codierung würde sich dann wie folgt ändern: PERFORM
LOESCHEN V A R Y I N G IKA FROM 1 BY 1 U N T I L IKA > A F T E R IKST FROM 1 BY 1 U N T I L IKST >
LOESCHEN. M O V E ZEROS TO B E T R A G (IKA, IKST).
15 10
184
Tabellenverarbeitung
Die einfachste Möglichkeit, die Felder der Matrix auf 0 zu setzen, wäre eine entsprechende Definition der Matrixelemente in der WORKINGSTORAGE SECTION. 01
MATRIX. 02 ZEILE OCCURS 15. 03 B E T R A G PIC 9(4)V99 OCCURS 10 VALUE ZEROS.
Beim Einlesen der Kostenarten-Datei in die Matrix werden die Inhalte der Felder Kostenart und Kostenstelle den Subskriptnamen IKA und IKST zugewiesen. Anschließend wird der Eingabebetrag (E-BETRAG) in einem durch die Subskriptwerte bestimmten Matrixfeld gespeichert. Beispiel: Eingelesen wird ein Datensatz mit folgenden Inhalten: Kostenart Ol
Kostenstelle 07
Betrag 300000 (mit 2 Dezimalstellen)
Der Betrag wird unter dem Feldnamen BETRAG (01,07) gespeichert. Da beim Einlesen der Datei nicht zwingend alle Felder der Matrix mit Beträgen besetzt werden, d. h. Felder auch nach dem Einlesen der Datei noch Nullen enthalten werden, die in der Liste nicht erscheinen sollen, sind diese Matrixfelder von der Ausgabe auszuschließen. Dies geschieht durch die beiden IF-An Weisungen. Nachfolgend eine zweite Version des obenstehenden Programms, bei dem die OUT-OF-LINE-PERFORM-Anweisungen durch IN-LINE-PERFORM-Anweisungen ersetzt wurden. Wiedergegeben wird nur die PROCEDURE DIVISION, da sich in den anderen Programmabschnitten nichts verändert hat. Der Leser möge entscheiden, ob ihm diese Lösung, die erst mit der neuen COBOL-Norm 85 möglich geworden ist, besser gefällt oder nicht. P R O C E D U R E DIVISION. OPEN INPUT K O S T E N A R T E N - D A T E I OUTPUT LISTE WRITE A-ZEILE AFTER PAGE W R I T E A - Z E I L E FROM U E B E R S C H R I F T S Z E I L E M O V E SPACES TO A - Z E I L E WRITE A-ZEILE AFTER 2 PERFORM V A R Y I N G IKA FROM 1 BY 1 U N T I L IKA > 1 5 PERFORM V A R Y I N G IKST FROM 1 BY 1 U N T I L IKST M O V E O TO B E T R A G (IKA, IKST) END-PERFORM END-PERFORM READ K O S T E N A R T E N - D A T E I PERFORM U N T I L K O S T E N A R T E N - D A T E I - E N D E
>10
Übungsaufgaben
185
M O V E K O S T E N A R T TO IKA M O V E K O S T E N S T E L L E TO IKST M O V E E - B E T R A G TO B E T R A G (IKA, IKST) READ K O S T E N A R T E N - D A T E I END-PERFORM PERFORM V A R Y I N G IKA FROM 1 BY 1 U N T I L IKA > 1 5 P E R F O R M V A R Y I N G IKST FROM 1 BY 1 U N T I L IKST > 1 0 IF B E T R A G (IKA, IKST) NOT = 0 M O V E IKA TO AKOSTENART M O V E IKST TO A K O S T E N S T E L L E M O V E B E T R A G (IKA, IKST) TO A B E T R A G W H I T E A - Z E I L E FROM P O S T E N Z E I L E A D D B E T R A G (IKA, IKST) TO Z W I S C H E N S U M M E E N D S U M M E END-IF END-PERFORM IF ZWISCHENSUMME NOT = 0 M O V E Z W I S C H E N S U M M E TO A Z W I S C H E N S U M M E W R I T E A - Z E I L E FROM Z W I S C H E N S U M M E N Z E I L E M O V E 0 TO ZWISCHENSUMME END-IF END-PERFORM M O V E E N D S U M M E TO A E N D S U M M E W R I T E A - Z E I L E FROM E N D S U M M E N Z E I L E CLOSE K O S T E N A R T E N - D A T E I L I S T E STOP RUN.
10.7 Übungsaufgaben Aufgabe 1 Für folgende Datenstrukturen sind die Definitionen zu schreiben: (1) A B C
> XXX
XXX | XXX
XXX
>
>
> >
XXX | XXX
XXX | XXX | XXX
XXX | XXX | XXX
A kennzeichnet den Gesamtbereich, in dem die Datengruppe B viermal vorkommt. Jede Datengruppe B enthält jeweils dreimal den mit drei alphanumerischen Speicherstellen definierten Bereich C.
186
Tabellenverarbeitung
(2)
A B
- > - >
> C
1
D 6
alphanum.
7 num. mit 2 Dezimalst.
E 14
15 alphanum.
F 20
21
28
num. mit 2 Dezimalst.
A kennzeichnet den Gesamtbereich, in dem die Datengruppe B zweimal vorkommt. Die Bereiche B enthalten jeweils ein sechsstelliges alphanumerisches und ein achtstelliges numerisches Feld. Aufgabe 2
Es ist ein Programm zur Sortierung von Werten, die vorher aus einer unsortierten Datei in eine eindimensionale Tabelle eingelesen werden, zu entwickeln. Hinweise zur
Lösung:
Das Programm soll nach dem Verfahren der „Auswahl des jeweils kleinsten Wertes" arbeiten. Zu Beginn sind dazu zwei Tabellen für die Aufnahme der unsortierten und der sortierten Werte zu definieren. Nach dem Einlesen der Werte aus der Datei in die unsortierte Tabelle ist zunächst der Wert aus dem ersten Feld dieser Tabelle in das erste Feld der zweiten Tabelle zu übertragen. Anschließend werden alle anderen Werte der ersten, unsortierten Tabelle nacheinander mit dem Inhalt des ersten Feldes der zweiten Tabelle verglichen. Ist eine Zahl kleiner als der Inhalt des ersten Feldes der zweiten Tabelle, wird sie in dieses Tabellenfeld übertragen und löscht den dort vorher gespeicherten Wert. Im anderen Fall wird die nächste Zahl für den Vergleich herangezogen. Das Verfahren wird solange fortgesetzt, bis alle Zahlen der Tabelle überprüft worden sind. Am Ende steht der kleinste Wert im ersten Feld der sortierten Tabelle. Danach wird in der oben beschriebenen Form der zweitkleinste Wert ausgesucht und im zweiten Feld der sortierten Tabelle gespeichert usw.. Grundsätzlich ist darauf zu achten, daß die jeweils als kleinste Zahl ausgewählten Werte bei den weiteren Vergleichen nicht mehr berücksichtigt werden.
11 Externe Unterprogramme
Bereits im Kapitel 7 wurde - im Zusammenhang mit der Beschreibung der OUT-OF-LINE-PERFORM-Anweisung - auf die damit verbundene Verwendung interner Unterprogramme eingegangen. Nachfolgend werden die für eine Programmierung externer Unterprogramme notwendigen COBOl^Sprachbestandteile erläutert.
11.1 Grundlagen der Unterprogrammtechnik Anders als bei den internen Unterprogrammen, die fester Bestandteil des Hauptprogrammes sind und mit diesem gemeinsam übersetzt werden, handelt es sich bei den externen Unterprogrammen um selbständige Programme. Ihre Umwandlung in ein Objektprogramm erfolgt losgelöst vom Hauptprogramm. Erst bei der Ausführung des Hauptprogramms findet wieder eine Einbeziehung des Unterprogrammes in die Verarbeitungsfolge des Hauptprogrammes statt. Die Verbindung zwischen dem Hauptprogramm (dem „aufrufenden" Programm) und dem Unterprogramm (dem „aufgerufenen" Programm) wird mit Hilfe spezieller Anweisungen, Klauseln und Definitionen hergestellt. Im Hauptprogramm ist es die CALL Anweisung, die bei der Programmausführung bewirkt, daß die Ablaufsteuerung an das Unterprogramm übergeben wird und die Verarbeitung mit der ersten Anweisung des aufgerufenen Programms fortgesetzt wird. Hinter dem COBOL-Wort CALL muß dazu der Name des Unterprogrammes erscheinen. Ist ein Austausch von Daten zwischen dem aufrufenden und dem aufgerufenen Programm beabsichtigt, so enthält die CALL-Anweisung noch eine zusätzliche USING-Klausel. Im Unterprogramm muß im Regelfall zunächst - als ein weiteres Kapitel in der DATA DIVISION - die LINKAGE SECTION angegeben werden. In dieser SECTION erscheinen die Namen der Datenfelder, die gemeinsam mit dem Hauptprogramm benutzt werden. Wird die LINKAGE SECTION aufgeführt, so muß im aufgerufenen Programm ferner hinter der Abschnittsüberschrift PROCEDURE DIVISION die USING-Klausel verwendet werden. Schließlich ist am Ende des Unterprogramms als Anweisung, die den Rück-
188
Externe Unterprogramme
sprung in das Hauptprogramm bewirkt, EXIT PROGRAM zu codieren. Nach der Ausführung dieser Anweisung wird die Verarbeitung im Hauptprogramm mit dem auf die CALL Anweisung folgenden Befehl fortgesetzt. Die Zusammenhänge zwischen Haupt- und Unterprogramm zeigt Abb. 23. Hauptprogramm
Unterprogramm
IDENTIFICATION D I V I S I O N .
IDENTIFICATION D I V I S I O N . PROGRAM-ID. UPRO-1
DATA D I V I S I O N , (enthält u. a. gemeinsam mit Unterprogramm benutzte Felder)
DATA D I V I S I O N . LINKAGE SECTION. (enthält ausschließlich gemeinsam mit dem Hauptprogramm benutzte Felder)
PROCEDURE D I V I S I O N . STAET.
JÎ*5 CALL UPRO-1 USING t (Anweisung X) RÜCKSPRUNG PERFORM t (Anweisung X+l)
PROCEDURE D I V I S I O N USING START. IF . . . — (Anweisung 1)
ENDE
EXIT PROGRAM.
Abb. 23: Beziehungen zwischen Haupt- und Unterprogramm
Jedes Unterprogramm kann mit Hilfe von CALL-Anweisungen andere Unterprogramme einsetzen, die ihrerseits wiederum weitere Programme aufrufen können usw.. Unzulässig ist lediglich der Aufruf von Unterprogrammen, die in der Aufrufhierarchie über dem aufrufenden Programm stehen (sog. rekursiver Aufruf). Mit dieser Regelung soll ausgeschlossen werden, daß ein Unterprogramm sich - indirekt - selber aufruft. Die Bedeutung von Unterprogrammen ergibt sich aus den mit ihrem Einsatz verbundenen besonderen Möglichkeiten für die Programmierung. Folgende Hauptvorteile seien hier erwähnt:
189
CALL Anweisung
- Programme können modular aufgebaut werden (die Programmodule werden in Form der Unterprogramme realisiert, vgl. dazu Kapitel 1, Punkt 1.4.2). 31 - Die Gliederung großer Programme in Unterprogramme ermöglicht die Aufteilung der Softwareentwicklung auf mehrere (parallel) arbeitende Personen und damit die Verkürzung der Entwicklungszeit. - Unterprogramme, in denen häufiger benötigte Lösungen realisiert worden sind, können in Unterprogramm-Bibliotheken zusammengefaßt werden und stehen dann auch für andere Aufgaben zur Verfügung. - Grundsätzlich können Unterprogramme auch in anderen Programmiersprachen als das Hauptprogramm erstellt werden. Damit können in Unterprogrammen Lösungen (z.B. Rechenverfahren) eingesetzt werden, die die im Hauptprogramm verwandte Programmiersprache nicht ermöglicht.
11.2 CALL-Anweisung Die CALL-Anweisung stellt eine weitere Steueranweisung dar (vgl. Kapitel 7). Mit Hilfe dieser Anweisung wird die Programmsteuerung von einem Objektprogramm an ein anderes Objektprogramm übergeben. Format (verkürzt): Datenname-1 CALL
[USING {Datenname-2}...] Literal
Erläuterungen:
Als alphanumerisches Literal bzw. Inhalt des - ebenfalls alphanumerisch zu definierenden - Feldes Datenname erscheint der Name des Unterprogrammes, das durch die C A L L An Weisung aufgerufen werden soll. Unterprogrammname ist dabei immer der Name, der im Unterprogramm im Paragraphen PROGRAM-ID angegeben wird. Die Ausführung der CALL-Anweisung bewirkt zunächst, daß das Unterprogramm in den Arbeitsspeicher geladen wird. Anschließend schließt sich, 31
Die Strukturierte Programmierung, die in ihrem Kern die Forderung nach ausschließlicher Verwendung der Kontrollstrukturen Sequenz, Selektion und Iteration für die Ablaufsteuerung beinhaltet (sog. Mikrostrukturierung), verlangt darüber hinaus auch eine Modularisierung von Programmen (sog. Makrostrukturierung). Durch die Modularisierung werden Programme insgesamt übersichtlicher, besser testbar und damit letztlich zuverlässiger und wartungsfreundlicher.
190
Externe Unterprogramme
beginnend mit der ersten Anweisung, die Verarbeitung des aufgerufenen Programmes an. Bei Erreichen der Anweisung EXIT PROGRAM erfolgt ein Rücksprung in das Hauptprogramm, dessen Ausfuhrung mit der auf die C A L L Anweisung folgenden Anweisung fortgesetzt wird. Wichtig! Bei Compilern für Mikrocomputer muß anstelle des Unterprogrammnamens im Regelfall der Name der Datei, die das übersetzte Unterprogramm enthält, angegeben werden. Im Falle des Compilers VS COBOL WORKBENCH der Firma Micro Focus handelt es sich dabei um Dateien des Typs .INT. USING-Klausel Zwischen dem aufrufenden und dem aufgerufenen Programm wird häufig ein Datenaustausch notwendig sein, in dem Sinne, daß das aufrufende Programm dem Unterprogramm für die Verarbeitung einerseits Daten übergibt und andererseits Verarbeitungsergebnisse zurück erhält. Ist ein solcher Datentransfer erforderlich, so muß grundsätzlich die USING-Klausel als Ergänzung zur CALI^Anweisung und zur Eintragung PROCEDURE DIVISION im Unterprogramm verwendet werden. In der CALL^Anweisung werden hinter der USING-Angabe Datenfelder aufgeführt, deren Inhalte auch dem Unterprogramm zur Verfügung stehen. Diese Datenfelder müssen in der FILE SECTION oder der WORKINGSTORAGE SECTION des aufrufenden Programms definiert worden sein. Handelt es sich bei dem aufrufenden Programm zugleich um ein aufgerufenes Programm, so können die Datenfelder auch in der LINKAGE SECTION erscheinen. Die ursprünglich geltende Einschränkung, daß derartige Felder nur mit den Stufennummern 01 oder 77 vereinbart werden dürfen, hat mit ANS COBOL 85 ihre Gültigkeit verloren. Das Gegenstück zur USING-Klausel der CALL-Anweisung stellt die USINGKlausel hinter dem Abschnittsnamen PROCEDURE DIVISION in dem aufgerufenen Programm dar. Die hier aufgeführten Datennamen müssen in der Zahl und in der Feldlänge mit den in der CALL-Anweisung aufgeführten Parametern übereinstimmen. Eine Namensgleichheit ist nicht erforderlich, da eine Zuordnung allein aufgrund der Reihenfolge in den USING-Klauseln erfolgt. Alle hinter PROCEDURE DIVISION USING aufgeführten Namen müssen in der LINKAGE SECTION definiert worden sein (s.u.).
EXIT PROGRAM-Anweisung
191
11.3 LINKAGE SECTION Die LINKAGE SECTION enthält die Definition der Datenfelder, die vom aufrufenden und aufgerufenen Programm gemeinsam benutzt werden. Ihre Codierung erfolgt hinter der FILE SECTION und der WORKINGSTORAGE SECTION. Im Unterschied zu den zuletzt genannten Kapiteln belegen die in der LINKAGE SECTION aufgeführten Datennamen keinen Speicherplatz. Sie verkörpern lediglich symbolische Adressen mit einer Platzhalterfunktion, an deren Stelle bei der Einbindung und Ausführung des Unterprogrammes die entsprechenden, in der CALL-Anweisung aufgeführten Felder des aufrufenden Programmes treten. Dementsprechend darf auch die VALUE-Angabe, ausgenommen bei der Definition von Bedingungsnamen, in der LINKAGE SECTION nicht verwendet werden. Sind zwischen dem aufrufenden und dem aufgerufenen Programm keine Daten auszutauschen, entfallen sowohl die LINKAGE SECTION als auch die USING-Klauseln.
11.4 EXIT PROGRAM-Anweisung Die EXIT PROGRAM-Anweisung kennzeichnet das logische Ende eines aufgerufenen Programmes. Format: EXIT PROGRAM Erläuterungen: Die Ausführung von EXIT PROGRAM bewirkt, daß ein Rücksprung in das aufrufende Programm erfolgt und die Verarbeitung dort mit der auf die C A L LAnweisung folgenden Anweisung fortgesetzt wird. Mit der Einführung von ANS COBOL 85 ist die bis zu diesem Zeitpunkt geltende Einschränkung, daß EXIT PROGRAM als einzige Anweisung in einer Prozedur erscheinen muß, entfallen. Nachfolgend ein Beispiel zum Einsatz externer Unterprogramme: In einem Unterprogramm sollen Umfang und Fläche von Kreisen mit unterschiedlichem Durchmesser berechnet werden. Die Eingabe des Radius und die Ausgabe der Fläche und des Umfanges erfolgen durch das Hauptprogramm.
192
Externe Unterprogramme
Das Hauptprogramm hat dann folgenden Aufbau: I D E N T I F I C A T I O N DIVISION. PROGRAM-ID. HAUPTPROGRAMM. ENVIRONMENT DIVISION. C O N F I G U R A T I O N SECTION. SPECIAL-NAHES. CONSOLE IS CRT. DATA DIVISION. W O R K I N G - S T O R A G E SECTION. 77 RADIUS PIC 99V99 V A L U E ZERO. 77 K - U M F A N G PIC 99-99 V A L U E ZERO. 77 K - F L A E C H E PIC 99-99 V A L U E ZERO. 01 ENDE-KZ PIC 9 V A L U E ZERO. 88 E I N G A B E - E N D E V A L U E 1. P R O C E D U R E DIVISION. ANFANG. PERFORM V E R A R B E I T U N G U N T I L EINGABE-ENDE. STOP RUN. VERARBEITUNG. DISPLAY SPACES DISPLAY "GEBEN SIE DEN RADIUS IN DER FORM 9999 EIN" AT 0203 ACCEPT RADIUS AT 0405 CALL "UPRO" U S I N G RADIUS K - U M F A N G K - F L A E C H E DISPLAY "KREISUMFANG =" AT 0603 DISPLAY K - U M F A N G AT 0615 DISPLAY "KREISFLÄCHE = " AT 0803 DISPLAY K - F L A E C H E AT 0815 DISPLAY "GEBEN SIE E I N E 1 EIN, W E N N K E I N E W E I T E R E EINGABE" AT 1003 ACCEPT ENDE-KZ AT 1203-
Nachfolgend das zugehörige Unterprogramm: IDENTIFICATION DIVISION. PROGRAM-ID. UNTERPROGRAMM. DATA DIVISION. W O R K I N G - S T O R A G E SECTION. 77 PI PIC 9V99 V A L U E 3.1^. LINKAGE SECTION. 77 R PIC 99V99. 77 U PIC 99-9977 F PIC 99-99P R O C E D U R E D I V I S I O N U S I N G R U F. ANFANG. COMPUTE U = 2 * R * PI COMPUTE F = R *• 2 * PI EXIT PROGRAM.
Hinweise zum Quellenprogramm: Bei dem hier verwendeten Compiler (COBOLWORKBENCH der Firma Micro Focus) muß als Unterprogrammname in der C A L L Anweisung der Name der Datei, in der das Objektprogramm gespeichert ist, angegeben werden. Damit sind bei der Festlegung des Unterprogrammnamens die MS-DOS Regeln für Dateinamen zu berücksichtigen.
Übungsaufgabe
193
11.5 Übungsaufgabe Es ist ein Programm zu entwickeln, das mit Hilfe der Zinseszinsformel aus einem Anfangskapital unter Berücksichtigung eines bestimmten Zinssatzes das Endkapital nach n Jahren ermittelt. Ein- und Ausgabe der Daten erfolgen im Hauptprogramm. Für die eigentliche Berechnung des Endkapitals soll ein Unterprogramm geschrieben werden. Zinseszinsformel K n = K 0 * q11 Kn K0 q n
= = = =
Endkapital Anfangskapital 1 + p/100 Anzahl Jahre
Lösung im Anhang A.
12 Verarbeitung indexsequentieller Dateien
Bei den bisher in Programmen verwandten Dateien handelte es sich ausschließlich um sequentielle Dateien. In den letzten beiden Kapiteln des Buches werden zwei weitere Formen der Dateiorganisation dargestellt, die einen direkten (wahlfreien) Zugriff auf die gespeicherten Datensätze ermöglichen. Ein solcher direkter Zugriff ist vor allem bei der Dialogverarbeitung (vgl. Punkt 1.5.2) unverzichtbar, da hier eine sequentielle Suche innerhalb eines Datenbestandes allein aus Zeitgründen ausscheidet. Das nachfolgende Kapitel 12 befaßt sich mit der indexsequentiellen Speicherung. In Kapitel 13 wird dann die relative Speicherung beschrieben.
12.1 Grundlagen der indexsequentiellen Speicherung Das besondere Merkmal indexsequentieller (indizierter) Dateien ist die Verwendung spezieller Inhaltsverzeichnisse, sog. Indextabellen, die zusätzlich zu dem eigentlichen Datenbestand angelegt werden. Über diese Indextabellen erfolgt der Zugriff auf die gespeicherten Daten. Die Einzelheiten des Verfahrens wurden bereits in Kapitel 1, Punkt 1.3.2 ausführlich beschrieben. Indizierte Dateien - wie auch relative Dateien - erlauben neben dem direkten Zugriff weitere Verarbeitungsmöglichkeiten. Folgende Zugriffsformen stehen insgesamt zur Verfügung: - Direkter (wahlfreier) Zugriff (ACCESS MODE IS RANDOM). Der Zugriff erfolgt durch Angabe des Schlüssels des betreffenden Satzes. - Sequentieller Zugriff (ACCESS MODE IS SEQUENTIAL). Die Datei wird, beginnend mit dem ersten Satz, in der gespeicherten Reihenfolge verarbeitet. - Dynamischer Zugriff (ACCESS MODE IS DYNAMIC). Hier besteht die Möglichkeit, sowohl wahlfrei als auch sequentiell zu lesen. So kann z.B. zunächst auf einen bestimmten Satz wahlfrei zugegriffen werden und anschließend sequentiell weiter verarbeitet werden. Der für den wahlfreien Dateizugriff einzusetzende Schlüssel ist ein Ordnungsbegriff des gesuchten Satzes und gleichzeitig Bestandteil der vom Laufzeitsystem bzw. dem Betriebssystem aufgebauten Indextabelle. Das entsprechende Schlüsselfeld ist bei der Beschreibung des Datensatzes zu
Anweisungen und Klauseln bei indexsequentiellen Dateien
195
definieren. Von vielen Compilern wird dabei eine alphanumerische Feldbeschreibung verlangt. Grundsätzlich können für den Zugriff auf indizierte Dateien mehrere Schlüssel Verwendung finden. Neben den Primärschlüssel, der den eigentlichen Hauptordnungsbegriff der Datei verkörpert und die Sortierordnung der Datei bestimmt, treten dann weitere Sekundärschlüssel, für die ebenfalls Indextabellen angelegt werden. Derartige Sekundärschlüssel müssen - anders als der Primärschlüssel - nicht zwingend eindeutig sein, sondern können in einer Datei mehrfach auftreten. Vgl. dazu die Erläuterungen zu Punkt 12.2.1. Nachfolgend werden die neuen Eintragungen und Anweisungen zur Dateiverarbeitung, die für die Verwendung indizierter Dateien erforderlich sind, dargestellt.
12.2 Anweisungen und Klauseln bei indexsequentiellen Dateien 12.2.1 SELECT . . . ASSIGN-Klausel Die für die Definition indizierter Dateien geltende SELECT . . . ASSIGNKlausel hat folgendes Format (verkürzt): SELECT Dateiname AS SIGN TO externer Dateiname [ORGANIZATION IS] INDEXED
ACCESS MODE IS
SEQUENTIAL RANDOM DYNAMIC
RECORD KEY IS Datenname-1 ALTERNATE RECORD KEY IS Datenname-2 [WITH DUPLICATESI. Erläuterungen: Der externe Dateiname ist - wie bei der sequentiellen Dateiverarbeitung der Name, unter dem die Datei dem Betriebssystem bekannt ist. Da ANS COBOL 85 in diesem Punkt keine weitere Festlegung trifft, unterscheiden sich die hier möglichen Eintragungen von Hersteller zu Hersteller erheblich.
196
Verarbeitung indexsequentieller Dateien
Um die genaue Form der Angabe des externen Dateinamens festzustellen, sollte in jedem Fall das Handbuch des Compilers herangezogen werden. Die Eintragung O R G A N I Z A T I O N IS I N D E X E D gibt an, daß es sich um eine indexsequentielle Datei handelt. Mit der nachfolgenden A C C E S S MODE-Klausel wird eine der drei möglichen Zugriffsformen festgelegt. Erfolgt hier keine Angabe, so gilt standardmäßig die Form SEQUENTIAL. Der hinter R E C O R D K E Y aufgeführte Datenname-1 entspricht dem für den Zugriff auf die Datei benutzten Schlüssel. Dieser Schlüssel ist in der D A T A DIVISION als Bestandteil des Datensatzes zu definieren. Die Klausel A L T E R N A T E R E C O R D K E Y ermöglicht die Angabe weiterer Sekundärschlüssel für den Zugriff auf die indizierte Datei. Wird dabei der Zusatz W I T H D U P L I C A T E S verwandt, so muß der Sekundärschlüssel nicht eindeutig sein, d. h. er kann in mehreren Sätzen der Datei auftreten. Beispiel: Eine indizierte Personaldatei soll wahlfrei verarbeitet werden. Der Zugriff erfolgt über den Ordnungsbegriff Personalnummer. (Compiler: V S C O B O L W O R K B E N C H von Micro Focus unter MS-DOS). INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT PERSONALDATEI ASSIGN TO ORGANIZATION IS INDEXED ACCESS MODE IS RANDOM RECORD KEY IS PERS-NR.
"A:PERSDAT"
DATA DIVISION. FILE SECTION. FD PERSONALDATEI. 01 PERSONALSATZ. 02 PERS-NR PIC XXXX.
12.2.2 READ-Anweisung Bei der Verarbeitung indizierter Dateien sind - in Abhängigkeit von der in der SELECT . . . ASSIGN-Eintragung festgelegten Zugriffsform - drei Varianten der READ-Anweisung zu unterscheiden: (1) Sequentieller Zugriff (ACCESS M O D E IS SEQUENTIAL)
Anweisungen und Klauseln bei indexsequentiellen Dateien
197
In diesem Fall hat die READ-Anweisung das bereits in Kapitel 6, Punkt 6.3 beschriebene Format. Die dortigen Ausfuhrungen gelten entsprechend. (2) Sequentieller Zugriff (ACCESS MODE IS DYNAMIC) Für die READ-Anweisung gilt das folgende Format: READ Dateiname NEXT RECORD [INTO Datenname] [AT END unbedingte Anweisung-1] [NOT AT END unbedingte Anweisung-2] [END-READ1 Erläuterungen: Ist als Zugriffsform DYNAMIC festgelegt, so kann sowohl wahlfrei als auch sequentiell verarbeitet werden. Durch Angabe des Zusatzes NEXT wird bestimmt, daß die READ-Anweisung, ausgehend von der jeweiligen aktuellen Position in der Datei, den logisch nächstfolgenden Datensatz liest. Zu den weiteren Angaben in der READ-Anweisung vgl. die Erläuterungen unter Punkt 6.3. (3) Wahlfreier Zugriff (ACCESS MODE IS RANDOM oder ACCESS MODE IS DYNAMIC) Es gilt das folgende Format (verkürzt): READ Dateiname RECORD [INTO Datenname] [INVALID KEY unbedingte Anweisung-1] [NOT INVALID KEY unbedingte Anweisung-2] [END-READ Erläuterungen: In diesem Falle liest die READ-Anweisung direkt den Datensatz, der durch den aktuellen Inhalt des vorher - unter RECORD KEY - festgelegten Schlüsselfeldes gekennzeichnet ist. Voraussetzung dafür ist, daß vor der Ausführung der READ-Anweisung dem fur den Zugriff eingesetzten Schlüssel ein bestimmter Inhalt zugewiesen wird (s.u. Beispiel). Die INVALID KEY- bzw. NOT INVALID KEY-Klausel ersetzt in dieser Variante der READ-Anweisung die sonst übliche AT END- bzw. NOT AT END-Klausel, die bei einem wahlfreien Zugriff - anders als bei sequentieller
198
Verarbeitung indexsequentieller Dateien
Verarbeitung, bei der irgendwann das Dateiende erreicht wird - ihren Sinn verloren hat. Die Klauseln werden wirksam, wenn die Bedingung, daß in der Datei kein Satz mit dem für den Zugriff verwendeten Suchbegriff vorhanden ist, erfüllt bzw. nicht erfüllt ist. Anschließend sind die jeweils angegebenen unbedingten Anweisungen auszuführen. Zur Funktion des expliziten Bereichsbegrenzers END-READ vgl. Punkt 6.3 und 7.4. Beispiel: (Fortsetzung des Beispiels unter Punkt 12.2.1) 01
PERSONALSATZ. 02 FEHS-NR PIC XZXX.
PROCEDURE DIVISION. MOVE 1 2 3 4 TO PERS-NR oder ACCEPT PERS-NR READ PERSONALDATEI INVALID KEY PERFORM FEHLERMELDUNG NOT INVALID KEY PERFORM . . .
12.2.3 WRITE-Anweisung Die hier beschriebene Form der WRITE-Anweisung dient zur Ausgabe von Datensätzen in indizierte Dateien. Voraussetzung dafür ist, daß die Dateien vorher mit OPEN OUTPUT, OPEN 1-0 oder OPEN EXTEND eröffnet wurden. Bei der Ausgabe der Sätze ist ferner darauf zu achten, daß der in den Sätzen enthaltene Schlüssel, der in der Eintragung RECORD KEY IS . . . festgelegt wurde, folgenden Bedingungen entspricht: - Bei sequentieller Verarbeitung (ACCESS MODE IS SEQUENTIAL) muß der in einem Ausgabesatz enthaltene Schlüssel immer größer sein als der Schlüssel des vorher geschriebenen Satzes. Wurde die Datei mit OPEN EXTEND eröffnet, so muß der Schlüssel des ersten Ausgabesatzes größer sein als der Schlüssel des letzten in der Datei vorhandenen Satzes. - Bei wahlfreier Verarbeitung (ACCESS MODE IS RANDOM oder DYNAMIC) darf der Ausgabesatz keinen Schlüssel enthalten, der bereits in einem in der Datei vorhandenen Satz vorkommt.
Anweisungen und Klauseln bei indexsequentiellen Dateien
199
Format: WRITE Satzname [FROM Datenname] [INVALID KEY unbedingte Anweisung-1] [NOT INVALID KEY unbedingte Anweisung-2] [END-WRITE1 Erläuterungen:
Zu den Angaben Satzname und zur FROM-Klausel vgl. die Erläuterungen in Kapitel 6, Punkt 6.4. Die INVALID KEY-Klausel wird wirksam, wenn die oben für die Schlüssel formulierten Bedingungen nicht erfüllt sind oder wenn der Speicherplatz nicht mehr ausreicht. Die Klausel NOT INVALID KEY trifft dagegen zu, wenn ein Satz korrekt ausgegeben wurde, d. h. gegen keine der für die Schlüssel genannten Bedingungen verstoßen wurde und der Speicherplatz ausreichte. Zur Funktion des Bereichsbegrenzers END-WRITE vgl. Punkt 6.4 und 7.4. Beispiel: (Fortsetzung des Beispiels unter Punkt 12.2.2.) Es soll - bei wahlfreier Verarbeitung - ein neuer Satz in die Datei ausgegeben werden. 01
PERSONALSATZ. 02 P E R S - N E PIC XXXX.
P R O C E D U R E DIVISION.
M O V E E P E R S - N R TO P E R S - N R WRITE PERSONALSATZ INVALID KEY PERFORM F E H L E R M E L D U N G NOT INVALID KEY P E R F O R M . . .
12.2.4
REWRITE-Anweisung
Die nachfolgend beschriebene Form der REWRITE-Anweisung ermöglicht das Zurückschreiben inhaltlich veränderter Datensätze in indizierten Dateien. Überschrieben wird - bei sequentieller Verarbeitung (ACCESS MODE IS SEQUENTIAL) jeweils der zuletzt gelesene Satz,
200
Verarbeitung indexsequentieller Dateien
- bei wahlfreier Verarbeitung (ACCESS MODE IS SEQUENTIAL oder DYNAMIC) der Satz, dessen Schlüssel in das - unter RECORD KEY IS . . . festgelegte - Schlüsselfeld des wieder auszugebenden Satzes übertragen wurde. Format: REWRITE Satzname [FROM Datenname] [INVALID KEY unbedingte Anweisung-1] [NOT INVALID KEY unbedingte Anweisung-2] [END-REWRITE1 Erläuterungen: Die Klausel INVALID KEY wird wirksam, wenn eine der folgenden Bedingungen erfüllt ist: - Bei sequentieller Verarbeitung entspricht der Schlüssel des zurückzuschreibenden Satzes nicht dem Schlüssel des zuletzt gelesenen Satzes. - Bei wahlfreier Verarbeitung entspricht der Schlüssel des zurückzuschreibenden Satzes nicht dem Schlüssel eines bereits in der Datei existierenden Satzes. Die INVALID KEY-Klausel kann nur in Kraft treten, wenn bei der Aktualisierung der Daten des eingelesenen und wieder auszugebenden Satzes auch der Inhalt des Schlüsselfeldes verändert wurde. Ein derartiges Vorgehen ist somit grundsätzlich fehlerhaft. Liegen die obenstehenden Bedingungen nicht vor, so wird der Satz auf den alten Speicherplatz zurückgeschrieben. Bei Verwendung der NOT INVALID KEY-Klausel schließt sich in diesem Fall die Ausführung der vorgesehenen unbedingten Anweisung an. Zu weiteren Erläuterungen zur REWRITE-Anweisung vgl. Punkt 6.5. 12.2.5 START-Anweisung Die hier beschriebene Form der START-Anweisung legt eine bestimmte Dateiposition als Ausgangspunkt für ein sequentielles Lesen in indizierten Dateien fest. Die Anweisung ist nur bei Dateien mit den Zugriffsformen SEQUENTIAL oder DYNAMIC, die mit OPEN INPUT oder OPEN 1-0 eröffnet werden, zulässig.
Anweisungen und Klauseln bei indexsequentiellen Dateien
201
Format: START Dateiname IS IS IS IS
EQUAL TO = GREATER THAN >
IS IS IS IS
NOT LESS THAN NOT < GREATER THAN OR EQUAL TO >=
Datenname
KEY
[INVALID KEY unbedingte Anweisung-1] [NOT INVALID KEY unbedingte Anweisung-2] [END-START] Erläuterungen:
Durch die KEY-Klausel wird der Datensatz festgelegt, mit dem der sequentielle Lesevorgang beginnt. Als Datenname ist dabei der hinter RECORD KEY IS aufgeführte Name des Schlüsselfeldes anzugeben. Folgende Festlegungen der Dateiposition sind möglich: - KEY = Datenname. Die Dateiposition entspricht dem Satz, dessen Schlüssel gleich dem Inhalt des Schlüsselfeldes ist. Wird auf die Angabe der KEY-Klausel verzichtet, so gilt ebenfalls diese Festlegung. - KEY > Datenname. Die Dateiposition entspricht dem ersten Satz, dessen Schlüssel größer ist als der Inhalt des Schlüsselfeldes. - KEY NOT < Datenname oder KEY > = Datenname. Die Dateiposition entspricht dem ersten Satz, dessen Schlüssel größer oder gleich ist dem Inhalt des Schlüsselfeldes. Die INVALID KEY- bzw. NOT INVALID KEY-Klausel wird wirksam, wenn die Datei keinen Satz enthält, der eine Positionierung in der oben beschriebenen Form ermöglicht bzw. nicht ermöglicht.
Verarbeitung indexsequentieller Dateien
202
Beispiel: EECOED KEY IS PEES-NE. FD 01
PEESONALDATEI. PEESONALSATZ. 02 P E E S - N E PIC XXIX. M O V E 1234- TO P E E S - N E STAET P E E S O N A L D A T E I KEY IS = P E E S - N E INVALID KEY P E E F O E M FEHLEEMELDUNG NOT INVALID KEY PEEFOEM . . . EEAD PEESONALDATEI NEXT AT END . . .
12.2.6 DELETE-Anweisung Die anschließend beschriebene Form der DELETE-Anweisung ermöglicht das Löschen von Sätzen in indizierten Dateien. Bei sequentieller Verarbeitung (ACCESS MODE IS SEQUENTIAL) wird jeweils der zuletzt gelesene Satz gelöscht. Bei wahlfreier Verarbeitung (ACCESS MODE IS RANDOM oder DYNAMIC) wird der Satz gelöscht, dessen Schlüssel in dem durch die Eintragung RECORD KEY IS . . . festgelegten Schlüsselfeld steht. Voraussetzung ist, daß die Datei vorher mit OPEN 1-0 eröffnet wurde. Format: DELETE Dateiname RECORD [INVALID KEY unbedingte Anweisung-1] [NOT INVALID KEY unbedingte Anweisung-2] [END-DELETE1 Erläuterungen: Die INVALID KEY- bzw. NOT INVALID KEY-Klausel darf nicht bei sequentieller Verarbeitung angegeben werden. Die Klauseln werden - bei wahlfreier Verarbeitung - wirksam, wenn in der Datei ein Satz mit dem im Schlüsselfeld enthaltenen Schlüssel nicht vorhanden bzw. vorhanden ist. Nach der Ausführung der DELETE-Anweisung wird der entsprechende Satz in der Datei logisch (nicht physisch) gelöscht, d. h. der entsprechende Speicherbereich wird als „frei" gekennzeichnet und bei späteren Zugängen neu belegt.
Programmbeispiel: Dialogverarbeitung mit indexsequentieller Datei
203
Beispiel: ACCESS M O D E IS RANDOM RECORD IS P E R S - N R M O V E 5678 TO P E R S - N R D E L E T E P E R S O N A L D A T E I RECORD INVALID KEY PERFORM F E H L E R M E L D U N G NOT INVALID KEY . . .
12.2.7 FILE STATUS-Klausel Die bereits in Kapitel 9, Punkt 9.6 beschriebene FILE STATUS-Klausel kann auch zur Bestimmung von Fehlern bei der Verarbeitung indexsequentieller Dateien herangezogen werden. Abb. 24 zeigt - in Ergänzung zu Abb. 20 einige der wichtigsten 1-0 Status Werte für indizierte Dateien. I-O Status Klasse 2 Ungültiger Schlüssel (Ausführung erfolglos) 2. Byte 1 Bei sequentieller Verarbeitung einer indizierten Datei sind die Schlüssel nicht aufsteigend sortiert oder ein mit REWRITE zurückzuschreibender Satz hat nicht den Schlüssel des eingelesenen Satzes. Der Schlüssel eines Satzes ist bereits in einem Satz der indizierten Datei vorhanden. Unter dem angegebenen Schlüssel ist kein Satz in der Datei vorhanden. Der Speicherplatz in der indizierten Datei ist erschöpft. Abb. 24: Ausgewählte 1-0 Status Werte für indexsequentielle Dateien
12.3 Programmbeispiel: Dialogverarbeitung mit indexsequentieller Datei Aufgabenstellung: Für eine indexsequentiell gespeicherte Artikeldatei sollen folgende Verarbeitungsfunktionen programmiert werden: - Anzeigen eines Satzes, - Eingeben eines Satzes,
204
Verarbeitung indexsequentieller Dateien
- Ändern eines Satzes (nur Preis), - Löschen eines Satzes. Als Suchbegriff ist dabei grundsätzlich die Artikelnummer einzusetzen. Zu Beginn der Verarbeitung ist eine entsprechende Maske auszugeben. Das entsprechende Struktogramm wird in Abb. 25 wiedergegeben.
Programmbeispiel: Dialogverarbeitung mit indexsequentieller Datei
205
ÄNDERN
Löschen Bildschirm Ausgeben Aufforderung für Eingabe der Artikelnummer Löschen Artikelnummer Eingeben Artikelnummer Lesen Artikeldatei Schlüssel nicht gültig? ja
nein
'
Ausgeben "Satz nicht vorhanden"
Ausgeben "Alter Preis =" Ausgeben Preis Ausgeben Eingabeaufforderung für neuen Preis Löschen Preis Eingeben Preis Zurückschreiben Artikelsatz —
Schlüssel nicht gültig?
ja Ausgeben "Satz nicht nicht vorhanden"
—
nein
Ausgeben "Preis wurde gespeichert"
206
Verarbeitung indexsequentieller D a t e i e n
FEHLERMELDUNG Ausgeben Fehlermeldung A b b . 25: Struktogramm z u m Programm "Dialogverarbeitung"
Nachfolgend das Quellenprogramm: IDENTIFICATION DIVISION. PROGRAM-ID. DIALOGVERARBEITUNG. ENVIRONMENT DIVISION. CONFIGURATION SECTION. SPECIAL-NAMES. CONSOLE IS CRT. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT ARTIKELDATEI ASSIGN TO "A : ARTIKEL.IND" ORGANIZATION IS INDEXED ACCESS MODE IS RANDOM RECORD KEY IS ARTNR. DATA DIVISION. FILE SECTION. FD ARTIKELDATEI. 01 ARTIKELSATZ. 02 ARTNR PIC 999. 02 ARTBZ PIC X(20). 02 PREIS PIC 999V99. 02 MENGE PIC 999WORKING-STORAGE SECTION. 77 KZ PIC 9 VALUE ZERO. 77 KZ-1 PIC X VALUE SPACE. 77 WPREIS PIC 999-99 VALUE ZEROS.
Programmbeispiel: Dialogverarbeitung mit indexsequentieller Datei P R O C E D U R E DIVISION. O P E N 1-0 A R T I K E L D A T E I PERFORM EINGABE-MASKE P E R F O R M V E R A R B E I T U N G U N T I L KZ = 5 CLOSE A R T I K E L D A T E I STOP RUN. EINGABE-MASKE. DISPLAY SPACES DISPLAY "GEBEN SIE FÜR D I E GEWÜNSCHTE V E R A R B E I T U N G DAS E N T S P R "ECHENDE K E N N Z E I C H E N EIN" AT 0202 DISPLAY "KZ = 1 - A N Z E I G E N EINES SATZES " AT 0502 DISPLAY "KZ = 2 - E I N G E B E N EINES SATZES " AT 0602 " AT 0702 DISPLAY "KZ = 3 - Ä N D E R N E I N E S SATZES DISPLAY "KZ = 4 - LÖSCHEN EINES SATZES " AT 0802 DISPLAY "KZ = 5 - E N D E D E R V E R A R B E I T U N G " AT 1202 VERARBEITUNG. M O V E ZEROS TO KZ ACCEPT KZ AT 1402 E V A L U A T E KZ WHEN 1 PERFORM ANZEIGEN W H E N 2 PERFORM E I N G E B E N WHEN 3 PERFORM AENDERN WHEN 4 PERFORM LOESCHEN W H E N 5 CONTINUE W H E N OTHER PERFORM FEHLERMELDUNG. DISPLAY "GEBEN SIE E I N J EIN, W E N N SIE E I N E R Ü C K K E H R INS H A U P "TMENÜ W Ü N S C H E N " AT 2002 ACCEPT KZ-1 AT 2102 P E R F O R M EINGABE-MASKE. ANZEIGEN. DISPLAY SPACES DISPLAY "GEBEN SIE DIE A R T I K E L N U M M E R EIN" AT 0302 M O V E ZEROS TO A R T N R ACCEPT A R T N R AT 0336 READ A R T I K E L D A T E I INVALID KEY DISPLAY "SATZ NICHT V O R H A N D E N " AT 0602 NOT INVALID KEY DISPLAY A R T I K E L S A T Z AT 0602. EINGEBEN. DISPLAY SPACES DISPLAY "GEBEN SIE DIE D A T E N DES N E U E N SATZES EIN" AT 0302 DISPLAY "ARTIKELNUMMER" AT 0502 DISPLAY "ARTIKELBEZEICHNUNG" AT 0702 DISPLAY "PREIS" AT 0902 DISPLAY "MENGE" AT 1102 M O V E ZEROS TO A R T N R WPREIS M E N G E M O V E SPACES TO ARTBZ A C C E P T A R T N R AT 0521 ACCEPT ARTBZ AT 0721 ACCEPT W P R E I S AT 0921 M O V E W P R E I S TO PREIS ACCEPT M E N G E AT 1121 W R I T E ARTIKELSATZ INVALID KEY DISPLAY "SATZ BEREITS V O R H A N D E N ODER S P E I C H E "RKAPAZITÄT ERSCHÖPFT" AT 1402 NOT INVALID KEY DISPLAY "SATZ W U R D E GESPEICHERT" AT 1402.
207
Verarbeitung indexsequentieller Dateien
208
AENDERN. DISPLAY SPACES DISPLAY "GEBEN SIE DIE A R T I K E L N U M M E R DES ZU Ä N D E R N D E N SATZES "EIN" AT 0302 MOVE ZEROS TO ARTNR ACCEPT ARTNR AT 0360 READ A R T I K E L D A T E I I N V A L I D KEY DISPLAY "SATZ NICHT V O R H A N D E N " A T 0602 NOT I N V A L I D KEY DISPLAY "ALTER PREIS =" AT 0602 MOVE PREIS TO WPREIS DISPLAY W P R E I S AT 0 6 2 4 DISPLAY "GEBEN SIE DEN NEUEN PREIS EIN" AT 0802 MOVE ZEROS TO WPREIS ACCEPT W P R E I S AT 0 8 4 0 MOVE WPREIS TO PREIS REWRITE A R T I K E L S A T Z INVALID KEY DISPLAY "SATZ NICHT V O R H A N D E N " AT 1002 NOT INVALID KEY DISPLAY "NEUER PREIS W U R D E GESPEICHE "RT" AT 1002. LOESCHEN. DISPLAY SPACES DISPLAY "GEBEN SIE DIE A R T I K E L N U M M E R DES ZU LÖSCHENDEN SATZES "EIN" AT 0302 MOVE ZEROS TO ARTNR ACCEPT ARTNR AT 0360 DELETE A R T I K E L D A T E I RECORD I N V A L I D KEY DISPLAY "SATZ NICHT V O R H A N D E N " AT 1002 NOT I N V A L I D KEY DISPLAY "SATZ W U R D E GELÖSCHT" AT 1002. FEHLERKELDUNG. DISPLAY "KENNZEICHEN A U S S E R H A L B DES ZULÄSSIGEN BEREICHES" AT
1602.
Hinweise zum Quellenprogramm: Die Artikeldatei ist unter dem Namen A R T I K E L . I N D gespeichert. W i e schon bei den früher benutzten Dateien soll auch hier die Dateierweiterung IND, deren Verwendung freigestellt ist, auf die Speicherungsform der Datei verweisen. Der für die Programmerstellung benutzte Compiler V S C O B O L W O R K B E N C H von Micro Focus erlaubt für den Zugriffsschlüssel A R T N R eine numerische Felddefinition. Zur Darstellung eines Dezimalpunktes im Preisfeld - bei der Ausgabe und Eingabe des Preises am Bildschirm - mußte ein entsprechend druckaufbereitetes Hilfsfeld W P R E I S in der W O R K I N G - S T O R A G E S E C T I O N definiert werden. A l s Konsequenz ergeben sich im Programm verschiedene Übertragungsoperationen, die im Struktogramm, wegen der besseren Übersichtlichkeit, nicht berücksichtigt worden sind. U m zu vermeiden, daß beim Einlesen von Feldinhalten mit der A C C E P T Anweisung der am Bildschirm angezeigte Eingabebereich die dort u. U. ge-
Übungsaufgabe
209
speicherten Werte enthält, mußten die entsprechenden Felder jeweils vorher gelöscht werden.
12.4 Übungsaufgabe Für die folgende Aufgabe ist ein Programm zu schreiben: Es ist eine indexsequentiell gespeicherte Auftragsdatei (Satzinhalt: Auftragsnummer, Kundennummer, Artikelnummer, Preis, Menge) aufzubauen. Die Sätze dieser Datei sind sowohl über den Ordnungsbegriff Auftragsnummer wie auch über die Kundennummer zu lesen und am Bildschirm anzuzeigen. Tritt eine Kundennummer in mehreren Sätzen auf, so sind alle Sätze mit dieser Kundennummer auszugeben.
13 Verarbeitung von Relativdateien
Neben der indexsequentiellen Speicherung stellt die relative Speicherung in der COBOL-Programmierung die zweite Möglichkeit dar, Dateien mit direktem Zugriff zu verarbeiten.
13.1 Grundlagen der relativen Speicherung Die Einzelheiten der relativen Speicherung wurden bereits im Kapitel 1, Punkt 1.3.2 ausfuhrlich behandelt. Wie indizierte Dateien erlauben auch Relativdateien neben dem direkten Zugriff weitere Verarbeitungsmöglichkeiten. Folgende Zugriffsformen stehen zur Verfugung: - Direkter (wahlfreier) Zugriff (ACCESS MODE IS RANDOM). Ausgehend von dem Schlüssel des Satzes, wird - über die Ermittlung der Positionsnummer des entsprechenden Speicherplatzes in der Datei - direkt auf die Anfangsadresse des Satzes zugegriffen. - Sequentieller Zugriff (ACCESS MODE IS SEQUENTIAL). Die Datei wird, beginnend mit dem ersten Satz, in der gespeicherten Reihenfolge verarbeitet. Freie Speicherplätze werden dabei übergangen. - Dynamischer Zugriff (ACCESS MODE IS DYNAMIC). Hier besteht die Möglichkeit, sowohl wahlfrei als auch sequentiell zu lesen. So kann z.B. über die aus dem Schlüssel ermittelte Positionsnummer auf einen bestimmten Satz wahlfrei zugegriffen und anschließend sequentiell weiter verarbeitet werden.
13.2 Anweisungen und Klauseln bei Relativdateien 13.2.1 SELECT . . . ASSIGN-Klausel Die für die Definition von Relativdateien geltende SELECT . . . ASSIGNKlausel hat folgendes Format (verkürzt):
Anweisungen und Klauseln bei Relativdateien
211
SELECT Dateiname ASSIGN TO externer Dateiname [ORGANIZATION! IS RELATIVE SEQUENTIAL [RELATIVE KEY IS Datenname] ACCESS MODE IS RANDOM RELATIVE KEY IS Datenname DYNAMIC
Erläuterungen:
Zu dem externen Dateinamen vgl. die Erläuterungen unter Punkt 12.2.1. Die Eintragung ORGANIZATION IS RELATIVE gibt an, daß es sich um eine Relativdatei handelt. Mit der nachfolgenden ACCESS MODE-Klausel wird eine der drei möglichen Zugriffsformen festgelegt. Erfolgt hier keine Angabe, so gilt standardmäßig die Form SEQUENTIAL. Der hinter RELATIVE KEY anzugebende Datenname bezeichnet das Feld, in dem die Positionsnummer des Speicherplatzes, der den gesuchten Satz enthält, vor dem Zugriff gespeichert werden muß. Der Datenname ist in der WORKING-STORAGE SECTION (nicht in der Satzbeschreibung, wie bei indizierten Dateien) zu definieren. Als Inhalt des Feldes muß stets ein ganzzahliger, positiver Wert angegeben werden. Wie sich aus der FORMAT-Beschreibung ergibt, kann die RELATIVE KEYKlausel bei sequentieller Verarbeitung entfallen. Beispiel: INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT P E R S O N A L D A T E I A S S I G N TO O R G A N I Z A T I O N IS R E L A T I V E ACCESS M O D E IS R A N D O M R E L A T I V E KEY IS REL-PERS-NR. DATA FILE FD 01
DIVISION. SECTION. PERSONALDATEI. PERSONALSATZ. 02 P E R S - N R PIC 9999.
U
A:PERSDAT"
212
Verarbeitung von Relativdateien
WOHKING-STOKAGE SECTION. 77 REL-FERS-NR PIC 9999-
13.2.2 Anweisungen Das Format der Anweisungen READ, WRITE, REWRITE, START und D E L E T E bei Relativdateien entspricht dem Format dieser Anweisungen bei indexsequentiellen Dateien. Zugriffe auf die Datei können nur ausgeführt werden, wenn Datensätze unter den angegebenen Speicherplätzen vorhanden sind. Die INVALID KEYKlausel wird entsprechend dann wirksam, wenn unter der für den Zugriff benutzten Positionsnummer kein Satz gefunden werden kann. 13.2.3 FILE STATUS-Klausel Die 1-0 Status Werte für sequentielle Dateien (vgl. Abb. 20) gelten - mit kleinen Einschränkungen - auch für Relativdateien. In der Klasse 2 haben bestimmte - in Kapitel 12 im Zusammenhang mit indizierten Dateien beschriebene - Status Werte (vgl. 1-0 Satus 22, 23, 24 in Abb. 24) analog Gültigkeit bei Relativdateien.
13.3 Programmbeispiel: Dialogverarbeitung mit Relativdatei Die unter Punkt 12.3 beschriebene Aufgabenstellung soll mit einer nach der Methode der relativen Dateiorganisation gespeicherten Artikeldatei gelöst werden. Auf die Wiedergabe des Struktogramms wird, wegen der nur geringfügigen Abweichungen gegenüber der Lösung mit der indizierten Datei, verzichtet. Im nachfolgenden Quellenprogramm sind die durch Verwendung einer Relativdatei bedingten Veränderungen durch Unterstreichung hervorgehoben. IDENTIFICATION DIVISION. PROGRAM-ID. DIALOGVERARBEITUNG. ENVIRONMENT DIVISION. CONFIGURATION SECTION. SPECIAL-NAHES. CONSOLE IS CRT. INPUT-OUTPUT SECTION.
Programmbeispiel: Dialogverarbeitung mit Relativdatei FILE-CONTROL. SELECT A R T I K E L D A T E I A S S I G N TO "A:ARTIKEL.REL" O R G A N I Z A T I O N IS R E L A T I V E ACCESS M O D E IS RANDOM R E L A T I V E KEY IS REL-ARTNR. DATA DIVISION. FILE SECTION. FD ARTIKELDATEI. 01 ARTIKELSATZ. 02 A R T N R PIC 99902 ARTBZ PIC X(20). 02 PREIS PIC 999V99. 02 M E N G E PIC 999W O R K I N G - S T O R A G E SECTION. 77 KZ PIC 9 V A L U E ZERO. 77 KZ-1 PIC X V A L U E SPACE. 77 V P R E I S PIC 999-99 V A L U E ZEROS. 77 R E L - A R T N R PIC 999P R O C E D U R E DIVISION. OPEN 1-0 ARTIKELDATEI PERFORM EINGABE-MASKE P E R F O R M V E R A R B E I T U N G U N T I L KZ = 5• CLOSE A R T I K E L D A T E I STOP RUN. EINGABE-MASKE. DISPLAY SPACES D I S P L A Y "GEBEN SIE FÜR DIE G E W Ü N S C H T E V E R A R B E I T U N G DAS E N T S P "RECHENDE K E N N Z E I C H E N EIN" AT 0202 D I S P L A Y "KZ = 1 - A N Z E I G E N EINES SATZES" AT 0502 D I S P L A Y "KZ = 2 - E I N G E B E N EINES SATZES" AT 0602 D I S P L A Y "KZ = 3 - Ä N D E R N EINES SATZES" AT 0702 D I S P L A Y "KZ = 4- - LÖSCHEN EINES SATZES" AT 0802 D I S P L A Y "KZ = 5 - E N D E D E R V E R A R B E I T U N G " AT 1202. VERARBEITUNG. M O V E ZEROS TO KZ ACCEPT KZ AT 1402 E V A L U A T E KZ W H E N 1 PERFORM A N Z E I G E N W H E N 2 PERFORM E I N G E B E N W H E N 3 PERFORM A E N D E R N W H E N H- PERFORM L O E S C H E N W H E N 5 CONTINUE W H E N O T H E R PERFORM FEHLERMELDUNG. DISPLAY "GEBEN SIE E I N J EIN, W E N N SIE E I N E R Ü C K K E H R INS H A U P "TMENÜ W Ü N S C H E N " AT 2002 A C C E P T KZ-1 AT 2102 P E R F O R M EINGABE-MASKE. ANZEIGEN. DISPLAY SPACES DISPLAY "GEBEN SIE DIE A R T I K E L N U M M E R EIN" AT 0302 M O V E ZEROS TO R E L - A R T N R A C C E P T R E L - A R T N R AT 0336 READ A R T I K E L D A T E I INVALID KEY DISPLAY "SATZ NICHT V O R H A N D E N " AT 0602 NOT INVALID KEY DISPLAY A R T I K E L S A T Z AT 0602. EINGEBEN.
213
214
Verarbeitung von Relativdateien
DISPLAY SPACES DISPLAY "GEBEN SIE DIE DATEN DES NEUEN SATZES EIN" AT 0502 DISPLAY "ARTIKELNUMMER" AT 0502 DISPLAY "ARTIKELBEZEICHNUNG" AT 0?02 DISPLAY "PREIS" AT 0902 DISPLAY "MENGE" AT 1102 MOVE ZEROS TO ARTNR WPREIS MENGE MOVE SPACES TO ARTBZ ACCEPT ARTNR AT 0521 ACCEPT ARTBZ AT 0721 ACCEPT WPREIS AT 0921 MOVE WPREIS TO PREIS ACCEPT MENGE AT 1121 MOVE ARTNR TO REL-ARTNR WRITE ARTIKELSATZ INVALID KEY DISPLAY "SATZ BEREITS VORHANDEN ODER SPEICHE "RKAPAZITÄT ERSCHÖPFT" AT 1402 NOT INVALID KEY DISPLAY "SATZ WURDE GESPEICHERT" AT 1402. AENDERN. DISPLAY SPACES DISPLAY "GEBEN SIE DIE ARTIKELNUMMER DES ZU ÄNDERNDEN SATZES "EIN" AT 0502 MOVE ZEROS TO REL-ARTNR ACCEPT REL-ARTNR AT 0560 READ ARTIKELDATEI INVALID KEY DISPLAY "SATZ NICHT VORHANDEN" AT 0602 NOT INVALID KEY DISPLAY "ALTER PREIS =" AT 0602 MOVE PREIS TO WPREIS DISPLAY WPREIS AT 0624 DISPLAY "GEBEN SIE DEN NEUEN PREIS EIN" AT 0802 MOVE ZEROS TO WPREIS ACCEPT WPREIS AT 0840 MOVE WPREIS TO PREIS REWRITE ARTIKELSATZ INVALID KEY DISPLAY "SATZ NICHT VORHANDEN" AT 1002 NOT INVALID KEY DISPLAY "NEUER PREIS WURDE GESPEICHE "RT" AT 1002. LOESCHEN. DISPLAY SPACES DISPLAY "GEBEN SIE DIE ARTIKELNUMMER DES ZU LÖSCHENDEN SATZES " EIN" AT 0502 MOVE ZEROS TO REL-ARTNR ACCEPT REL-ARTNR AT 0560 DELETE ARTIKELDATEI RECORD INVALID KEY DISPLAY "SATZ NICHT VORHANDEN" AT 1002 NOT INVALID KEY DISPLAY "SATZ WURDE GELÖSCHT" AT 1002. FEHLERMELDUNG. DISPLAY "KENNZEICHEN AUSSERHALB DES ZULÄSSIGEN BEREICHES" AT 1602.
Anhang A Lösungen zu den Übungsaufgaben Kapitel 4 Aufgabe 1 01
AUFTRAGSSATZ. 02 SATZABT 02 A U F T R A G S N U M N E R 02 KUNDENDATEN. 03 K U N D E N N U M M E R 03 N A M E 02 FILLER 02 ARTIKELDATEN. 03 A R T I K E L N U M M E R 03 A R T I K E L B E Z E I C H N U N G 03 PREIS
PIC XX. PIC 9(5). PIC 9(5). PIC X(20). PIC X(10). PIC 9(5). PIC X(27). PIC 9(t-)V99-
Aufgabe 2
Es ergeben sich folgende Druckbilder: 564.90 U (Das Vorzeichen + wird nicht ausgegeben. Hinter der Null erscheint eine Leerstelle.) I I I I I I 1.25 (Vor der ersten Ziffer erscheinen 5 Leerstellen.) -ULLI 0.01 I I I I I I 0.01 LLLLJ- 0.01 ***** 45 32 Aufgabe 3
ZEICHENFELD Feldinhalt:******************** DM Feldinhalt: 4321.90 Aufgabe 4
Nein. In numerisch definierten Feldern dürfen nur Ziffern stehen, keine Leerstellen. Erlaubt wäre dagegen: 77
WERT-1
PIC 9(5) V A L U E ZEROS.
216
Anhang A
Kapitel 5 Aufgabe 1 WORKING-STORAGE SECTION. 77 DATUM PIC XXXXXX. ACCEPT DATUM FROM DATE DISPLAY "ANWESENHEITSLISTE VOM" DATUM
Aufgabe 2 DISPLAY «DIE ZWISCHENSUMME BETRAGT" ZWISU
Für beide Aufgabenlösungen wird jeweils vorausgesetzt, daß der Bildschirm die zugeordnete Standardeinheit ist. Aufgabe 3 Inhalt von Summe: 345^670 (Das Zeichen a kennzeichnet einen gedachten Dezimalpunkt). Aufgabe 4 MOVE SPACES TO ZWISCHENRAUM MOVE ALL " " TO ZWISCHENRAUM MOVE " " T O ZWISCHENRAUM
Kapitel 6 IDENTIFICATION DIVISION. PROGRAM-ID.AENDERN-TEILNEHMERDATEI. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT TEILNEHMERDATEI ASSIGN TO "A :TEILDAT.SEQ" ORGANIZATION IS SEQUENTIAL. DATA DIVISION. FILE SECTION. FD TEILNEHMERDATEI. 01 TEILNEHMERSATZ. 02 TNAME PIC X(30). 02 DATUM PIC X(6). 02 AN-ABWESENHEITS-KZ PIC X. WORKING-STORAGE SECTION. 77 E-FELD PIC X(37). PROCEDURE DIVISION. OPEN 1-0 TEILNEHMERDATEI. LESEN. READ TEILNEHMERDATEI RECORD INTO E-FELD AT END CLOSE TEILNEHMERDATEI STOP RUN.
Lösungen zu den Übungsaufgaben
217
DISPLAY SPACES U P O N CRT DISPLAY E - F E L D AT 0204 U P O N CHT ACCEPT E - F E L D AT 0204 FROM CRT R E W R I T E TEILNEHMERSATZ FROM E - F E L D GO TO LESEN.
Kapitel 7 Aufgabe 1 I D E N T I F I C A T I O N DIVISION. PROGRAM-ID. A E N D E R N - T E I L N E H M E R D A T E I . E N V I R O N M E N T DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT TEILNEHMERDATEI A S S I G N TO "A:TEILDAT.SEQ" O R G A N I Z A T I O N IS SEQUENTIAL. DATA DIVISION. FILE SECTION. FD TEILNEHMERDATEI. 01 TEILNEHMERSATZ. 02 TNAME PIC X(30). 02 DATUM PIC X(6). 02 A N - A B W E S E N H E I T S - K Z PIC X. W O R K I N G - S T O R A G E SECTION. 77 E - F E L D PIC X(37)• 77 DATEI-ENDE-KZ PIC 9 V A L U E 0. 88 D A T E I - E N D E V A L U E 1. P R O C E D U R E DIVISION. O P E N 1-0 T E I L N E H M E R D A T E I PERFORM LESEN PERFORM V E R A R B E I T U N G U N T I L D A T E I - E N D E CLOSE TEILNEHMERDATEI STOP RUN. LESEN. READ TEILNEHMERDATEI RECORD INTO E - F E L D AT END M O V E 1 TO DATEI-ENDE-KZ. VERARBEITUNG. DISPLAY SPACES U P O N CRT DISPLAY E - F E L D AT 0204 U P O N CRT ACCEPT E - F E L D AT 0204 FROM CRT R E W R I T E TEILNEHMERSATZ FROM E - F E L D P E R F O R M LESEN.
Aufgabe 2 (1) Die Ausführung der WRITE-Anweisung ist allein abhängig von der Erfüllung der Bedingung A = B. Das Struktogramm hat folgenden Aufbau:
Anhang A
218
A = B? —-
ja
__——' nein
X- Y C = D? ja
^ ^ ^
^
^
^
^
nein
Ausgabe Fehlermeldung
Z - W Write Satz
(2) Die erste IF-Anweisung würde mit diesem Punkt abgeschlossen sein. Die Ausführung der zweiten IF-Anweisung und der WRITE-Anweisung wäre damit nicht mehr abhängig von der Erfüllung der Bedingung A = B. Das Struktogramm würde sich wie folgt ändern: A = B? nein
ja X-Y C = D?
nein
ja Z - W Write Satz
(3) IF A = B THEN PERFORM UPEO WEITE SATZ ELSE PEEFOEM FEHLEE. UPEO. WOVE X TO I IF C = E THEN MOVE Z TO W.
Nicht korrekt wäre folgende Codierung: IF A = B THEN MOVE X TO Y IF C = D THEN HOVE Z TO W ELSE NEXT SENTENCE WEITE SATZ ELSE PEEFOEM FEHLER.
Hier würde die Anweisung WRITE SATZ nicht ausgeführt werden.
Lösungen zu den Übungsaufgaben
219
Kapitel 8 Aufgabe 1 ADD BETKAG-1 BETRAG-2 TO SUMME ADD BETRAG-1 BETRAG-2 SUMME G I V I N G SUMME COMPUTE SUMME = BETRAG-1 + BETRAG-2 + S U M M E
Aufgabe 2 DIVIDE R A U M I N H A L T BY H O E H E G I V I N G G R U N D F L A E C H E DIVIDE H O E H E INTO RAUMINHALT D I V I D E H O E H E INTO RAUMINHALT G I V I N G G R U N D F L A E C H E COMPUTE G R U N D F L A E C H E = RAUMINHALT / H O E H E
Aufgabe 3
In der nachstehenden Lösung wird der Wechsel der Kundennummer - entsprechend den in der Praxis üblichen Bezeichnungen - als Untergruppenwechsel, der Wechsel der Vertreternummer als Hauptgruppenwechsel und der Wechsel der Bezirksnummer als Übergruppenwechsel bezeichnet. I D E N T I F I C A T I O N DIVISION. PROGRAM-ID. D R E I S T U F I G E R - G R U P P E N W E CHSEL. E N V I R O N M E N T DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT U M S A T Z D A T E I A S S I G N TO "A:UMSATZ1.SEQ" O R G A N I Z A T I O N IS L I N E SEQUENTIAL. SELECT U M S A T Z L I S T E A S S I G N TO ":LP:". DATA DIVISION. FILE SECTION. FD UMSATZDATEI. 01 UMSATZSATZ. 02 B Z N R PIC 9(3). 02 V N R PIC 9(4). 02 K D N R PIC 9(4). 02 R E C H N R PIC 9(5). 02 UMSATZ PIC 9(4)V99. FD UMSATZLISTE. 01 ZEILE PIC 1(80). W O R K I N G - S T O R A G E SECTION. PIC 9(3) V A L U E ZEROS. 77 A G R U B Z N R PIC 9(4-) V A L U E ZEROS. 77 A G R U V N R PIC 9(4) V A L U E ZEROS. 77 A G R U K D N R PIC 9(5)V99 V A L U E ZEROS. 77 U E B E R G R U P P E N Z W I S U PIC 9(5)V99 V A L U E ZEROS. 77 H A U P T G R U P P E N Z W I S U PIC 9(5)V99 V A L U E ZEROS. 77 U N T E R G R U P F E N Z W I S U PIC 9(6)V99 V A L U E ZEROS. 77 E N D S U M BEZIRKSNR PIC X(80) V A L U E 77 U E B E R S C H R I F T S Z E I L E KUNDENNR RECHUNGSNR UMSATZ "VERTRETERNR PIC 9 V A L U E 0. 77 D A T E I - E N D E - K Z 88 D A T E I - E N D E V A L U E 1.
220 01
Anhang
POSTENZEILE. 02 FILLER PIC X(8) VALUE SPACES 02 ABZNR PIC 9(3). 02 FILLER PIC X(12) VALUE SPACES 02 AVNR PIC 9(40. 02 FILLER PIC X(12) VALUE SPACES 02 AKDNR PIC 9(*). 02 FILLER PIC X(14) VALUE SPACES 02 ARECHNR PIC 9(5). 02 FILLER PIC X(8) VALUE SPACES 02 AUMSATZ PIC ZZZ9.99. 01 UNTERGRUPPENZWISUZEILE. 02 FILLER PIC x(69) VALUE SPACES 02 AUNTERGRUPPENZWISU PIC Z (4)9• 99. 01 HAUPTGRUPPENZWISUZEILE. 02 FILLER PIC X(69) VALUE SPACES 02 AHAUPTGRUPPENZWISU PIC Z(4)9 • 99. 01 UEBERGRUPPENZWISUZEILE. 02 FILLER PIC X(69) VALUE SPACES 02 AUEBERGRUPPENZWISU PIC Z(4)9 -9901 ENDSUMMENZEILE. 02 FILLER PIC X(68) VALUE SPACES 02 AENDSUM PIC z(5)9 • 99PROCEDURE DIVISION. OPEN INPUT UMSATZDATEI OUTPUT UMSATZLISTE WRITE ZEILE FROM UEBERSCHRIFTSZEILE PERFORM LESEN PERFORM UEBERGRUPPENVERARBEITUNG UNTIL DATEI-ENDE WRITE ZEILE FROM ENDSUMMENZEILE CLOSE UMSATZDATEI UMSATZLISTE STOP RUN. LESEN. READ UMSATZDATEI AT END MOVE 1 TO DATEI-ENDE-KZ. UEBERGRUPPENVERARBEITUNG. MOVE ZEROS TO UEBERGRUPPENZWISU MOVE BZNR TO AGRUBZNR PERFORM HAUPTGRUPPENVERARBEITUNG UNTIL DATEI-ENDE OR BZNR NOT - AGRUBZNR WRITE ZEILE FROM UEBERGRUPPENZWISUZEILE ADD UEBERGRUPPENZWISU TO ENDSUM GIVING ENDSUM AENDSUM. HAUPTGRUPPENVERARBEITUNG. MOVE ZEROS TO HAUPTGRUPPENZWISU MOVE VNR TO AGRUVNR PERFORM UNTERGRUPPENVERARBEITUNG UNTIL DATEI-ENDE OR VNR NOT = AGRUVNR WRITE ZEILE FROM HAUPTGRUPPENZWISUZEILE ADD HAUPTGRUPPENZWISU TO UEBERGRUPPENZWISU GIVING UEBERGRUPPENZWISU AUEBERGRUPPENZWISU. UNTERGRUPPENVERARBEITUNG. MOVE ZEROS TO UNTERGRUPPENZWISU MOVE KDNR TO AGHUKDNR PERFORM EINZELSATZVERARBEITUNG UNTIL DATEI-ENDE OR KDNR NOT = AGRUKDNR WRITE ZEILE FROM UNTERGRUPPENZWISUZEILE ADD UNTERGRUPPENZWISU TO HAUPTGRUPPENZWISU GIVING
221
Lösungen zu den Übungsaufgaben H A U P T G R U P P E N Z W I S U AHAUPTGRUPPENZWISU. EINZELSATZVERARBEITUNG. M O V E BZNR TO A B Z N R M O V E V N R TO A V N R M O V E K D N R TO A K D N R M O V E R E C H N R TO A R E C H N R M O V E ÜMSATZ TO AUMSATZ W R I T E ZEILE FROM P O S T E N Z E I L E ADD UMSATZ TO U N T E R G R U P P E N Z W I S U GIVING U N T E R G R U P P E N Z W I S U AUNTERGRUPPENZWISU P E R F O R M LESEN.
Die obige Programmlösung eines dreistufigen Gruppenwechsels setzt - neben der aufsteigenden Sortierung - voraus, daß mit dem Wechsel eines übergeordneten Ordnungsbegriffes auch die nachgeordneten Ordnungsbegriffe wechseln. Ein Wechsel der Bezirksnummer ist also mit einem Wechsel der Vertreternummer und Kundennummer verbunden, mit einem Wechsel der Vertreternummer erfolgt gleichzeitig ein Übergang zu einer neuen Kundennummer. Die nachfolgende Ausgabeliste des Programms zeigt diesen Sachverhalt noch einmal deutlich. BEZIRKSNR 111 111
VERTRETERNR 2221 2221
KUNDENNR 2311 2311
RECHNUNGSNR 12345 12346
111 111
2221 2221
2312 2312
13245 13246
111
2223
2310
23451
111 111
2223 2223
2314 2314
23457 23460
112
2225
2320
24577
UMSATZ 3000.00 1000.00 4000.00 2000.00 2500.00 4500.00 8500.00 1500.00 1500.00 5000.00 4000.00 9000.00 10500.00 19000.00 6000.00 6000.00 6000.00 6000.00 25000.00
Anhang A
222
Berücksichtigt man die Möglichkeit, daß mit dem Wechsel eines übergeordneten Gruppenbegriffes nicht gleichzeitig auch alle nachgeordneten Gruppenbegriffe wechseln (Ein solcher Fall läge in der obigen Liste z.B. dann vor, wenn anstelle der Kundennummer 2310 die Kundennummer 2312 erscheinen würde.), dann reicht die obenstehende Programmlösung nicht aus. Durch eine geringfügige Erweiterung kann jedoch auch dieser Fall berücksichtigt werden. Hinweis:
Die in den PERFORM-Anweisungen enthaltenen komplexen Bedingungen sind um zusätzliche OR-Verknüpfungen zu erweitern. So muß die PERFORMAnweisung für die Einzelsatzverarbeitung dann lauten: PERFORM EINZELSATZVERARBEITUNG UNTIL DATEI-ENDE OR BZNR NOT = AGRUBZNR OR VNR NOT = AGRUVNR OR KDNR NOT = AGRUKDNR Kapitel 9 Aufgabe 1 SALDO-3: 0011 3
0001 1
0011 3
0010 2
0011 3
0011 3
Olli 7
0100 4
SALDO-4: 0011 0001 0011 0010 0011 0011 0011 0100 0010 1101 3 1 3 2 3 3 3 4 2 D 0010 1101 bzw. hexadezimal 2 D verkörpert hier das negative Vorzeichen (Abb. 5 in Kapitel 1). Aufgabe 2 Nein! In einer Datenstruktur dürfen mehrere Felder mit gleichem Namen dann nicht auftreten, wenn dadurch eine eindeutige Kennzeichnung unmöglich wird. Zulässig wäre dagegen folgende Codierung: 01
PEESONALSATZ. 02 ADEESSE-1. 03 N A H E 03 ADEESSE.
PIC X(30).
Lösungen zu den Übungsaufgaben 04 STRASSE 04 W O H N O R T ADRESSE-2. 03 NAME 03 ADRESSE. 04 STRASSE 04 WOHNORT
PIC X(20) PIC X(20) PIC X(30) PIC X(20) PIC X(20)
Aufgabe 3
Übertragen werden die Felder A, B und D (als Unterfeld von FELD-2). Aufgabe 4 FILE STATUS IS D A T E I Z U S T A N D S - F E L D W O R K I N G - S T O R A G E SECTION. 01 DATEIZUSTANDS-FELD. 02 STELLE-1 PIC I. 02 STELLE-2 PIC X. 01 DATEI Z U S T A N D S - F E L D - B I N A E R REDEFINES D A T E I Z U S T A N D S - F E L D 9(4) BINARY. P R O C E D U R E DIVISION. IF D A T E I Z U S T A N D S - F E L D ="00" THEN P E R F O R M V E R A R B E I T U N G ELSE PERFORM FEHLERMELDUNG IF STELLE-1 NOT = "9" THEN PERFORM FEHLERMELDUNG-1 E L S E PERFORM FEHLERMELDUNG-2. VERARBEITUNG. FEHLERMELDUNG. DISPLAY "FEHLER BEI FEHLERMELDUNG-1. DISPLAY "1-0 STATUS FEHLERMELDUNG-2. M O V E LOW-VALUES TO DISPLAY "1-0 STATUS
A U S F Ü H R U N G EINES
DATEIZUGRIFFES".
=" DATEIZUSTANDSFELD. STELLE-1 =9" D A T E I - Z U S T A N D S F E L D - B I N A E R .
Kapitel 10 Aufgabe 1 (1)
01
A. 02 B OCCURS 4. 03 C PIC XXX OCCURS 3-
(2)
01
A. 02 B OCCURS 2. 03 C PIC X(6). 03 D PIC 9(6)V99-
PIC
224
Anhang A
Aufgabe 2 I D E N T I F I C A T I O N DIVISION. PROGRAM-ID . S O R T I E R U N G - D U R C H - A U S W A H L . ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT E I N G A B E - D A T E I A S S I G N TO "A:ZAHLEN.SEQ" O R G A N I Z A T I O N IS L I N E S E Q U E N T I A L FILE STATUS IS EINGABE-DATEI-FELD. SELECT L I S T E A S S I G N TO ":LP:". DATA DIVISION. FILE SECTION. FD EINGABE-DATEI. 01 EINGABE-SATZ. 02 WERT PIC 9999FD LISTE. 01 ZEILE. 02 AWERT PIC 9999W O R K I N G - S T O R A G E SECTION. 77 E I N G A B E - D A T E I - F E L D P I C XX. 88 E I N G A B E - D A T E I - E N D E V A L U E "10". 77 I PIC 999 V A L U E ZEROS. 77 J PIC 999 V A L U E ZEROS. 77 K PIC 999 V A L U E ZEROS. 77 L PIC 999 V A L U E ZEROS. 01 TAB-UNSORTIERT. 02 UKZ PIC 9 OCCURS 99 V A L U E ZERO. 02 UWERT PIC 9999 OCCURS 99 V A L U E ZEROS. 01 TAB-SORTIERT. 02 SWERT PIC 9999 OCCURS 99 V A L U E ZEROS. P R O C E D U R E DIVISION. STEUERLEISTE. OPEN INPUT E I N G A B E - D A T E I OUTPUT L I S T E READ E I N G A B E - D A T E I PERFORM E I N L E S E N - I N - T A B E L L E V A R Y I N G I FROM 1 BY 1 UNTIL EINGABE-DATEI-ENDE M O V E I TO K PERFORM V E R A R B E I T U N G V A R Y I N G J FROM 1 BY 1 U N T I L J > K - 1 PERFORM A U S G A B E V A R Y I N G J FROM 1 BY 1 U N T I L J > K - 1 CLOSE E I N G A B E - D A T E I L I S T E STOP RUN. EINLESEN-IN-TABELLE. M O V E WERT TO UWERT (I) READ EINGABE-DATEI. VERARBEITUNG. P E R F O R M V A R Y I N G I FROM 1 BY 1 U N T I L I > K - 1 OR UKZ (I) NOT = 1 END-PERFORM IF I NOT > K - 1 THEN M O V E UWERT (I) TO SWERT (J) PERFORM A U S W A H L - K L E I N S T E R - W E R T V A R Y I N G I FROM 1 BY 1 UNTIL I > K - 1 M O V E 1 TO UKZ (L). AUSWAHL-KLEINSTER-WERT. IF UWERT (I) NOT > SWERT (J) AND UKZ (I) NOT = 1
Lösungen zu den Übungsaufgaben THEN M O V E UWERT (I) TO SWEET HOVE I TO L. AUSGABE. M O V E SVERT (J) TO AWEHT. W E I T E ZEILE.
225 (J)
Hinweise zur Lösung:
Ist ein Wert aus der unsortierten Eingabetabelle (TAB-UNSORTIERT) als kleinster Wert ausgewählt worden, so wird dieser Wert aus dem weiteren Auswahlverfahren dadurch ausgeschlossen, daß eine 1 in das Feld UKZ (L) übertragen wird. L ist dabei der Index des Feldes mit dem gerade ermittelten kleinsten Wert.
Kapiteln Hauptprogramm: I D E N T I F I C A T I O N DIVISION. FROGRAM-ID. E N D K A P I T A L - B E R E C H N U N G . E N V I R O N M E N T DIVISION. C O N F I G U R A T I O N SECTION. SPECIAL-NAMES. CONSOLE IS CRT. DATA DIVISION. W O R K I N G - S T O R A G E SECTION. 77 A - K A P I T A L PIC 9(5)V99 V A L U E ZERO. 77 E - K A P I T A L PIC 9(6).99 V A L U E ZERO. 77 ZINSSATZ PIC 99 V A L U E ZERO. 77 LAUFZEIT PIC 99 V A L U E ZERO. 01 ENDE-KZ PIC 9 V A L U E ZERO. 88 E I N G A B E - E N D E VALUE 1. P R O C E D U R E DIVISION. ANFANG. PERFORM VERARBEITUNG UNTIL EINGABE-ENDE S T O P RUN. VERARBEITUNG. D I S P L A Y SPACES D I S P L A Y "GEBEN SIE DAS A N F A N G S K A P I T A L EIN" AT 0204 ACCEPT A - K A P I T A L AT 0304 DISPLAY "GEBEN SIE D E N ZINSSATZ EIN" AT 0404 ACCEPT ZINSSATZ AT 0504 DISPLAY "GEBEN SIE D I E LAUFZEIT IN J A H R E N EIN" AT 0604 ACCEPT LAUFZEIT AT 0704 C A L L "ZZINS" U S I N G A - K A P I T A L E - K A P I T A L ZINSSATZ LAUFZEIT D I S P L A Y "ENDKAPITAL =" AT 0904 D I S P L A Y E - K A P I T A L AT 0918 DISPLAY "GEBEN SIE E I N E 1 EIN, W E N N K E I N E W E I T E R E E I N G A B E ERW "ÜNSCHT" AT 1104 ACCEPT ENDE-KZ AT 1204.
226 Unterprogramm: I D E N T I F I C A T I O N DIVISION. PROGRAM-ID. ZINSESZINSFORMEL. DATA DIVISION. W O R K I N G - S T O R A G E SECTION. 77 Q PIC 99V99 VALUE ZERO. LINKAGE SECTION. 77 KO PIC 9(5)V99. 77 K N PIC 9(6).99. 77 p PIC 99. 77 N PIC 99P R O C E D U R E D I V I S I O N U S I N G KO K N P N. ANFANG. COMPUTE Q = 1 + P / 100 COMPUTE K N = KO * Q * * N EXIT PROGRAM.
Kapitel 1 2 IDENTIFICATION DIVISION. PROGRAM-ID. A B F R A G E - M I T - S E K U N D A E R S C H L . ENVIRONMENT DIVISION. C O N F I G U R A T I O N SECTION. SPECIAL-NAMES CONSOLE IS CRT. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT A U F T R A G S D A T E I A S S I G N TO "A:AUFTRAG.IND" O R G A N I Z A T I O N IS INDEXED. ACCESS M O D E IS DYNAMIC R E C O R D K E Y IS A U F T R A G S N H A L T E R N A T E RECORD KEY IS K D N R W I T H D U P L I C A T E S FILE STATUS IS ZUSTANDSFELD. DATA DIVISION. FILE SECTION. FD AUFTRAGSDATEI. 01 AUFTRAGSSATZ. 02 A U F T R A G S N R PIC 999902 K D N R PIC 9999. 02 A R T N R PIC 999. 02 PREIS PIC 999V99. 02 M E N G E PIC 999W O R K I N G - S T O R A G E SECTION. 77 KZ PIC 9 V A L U E ZERO. 77 KZ-1 PIC I V A L U E SPACE. 77 WPREIS PIC 999-99. 77 A K D N R PIC 9999. 01 ZUSTANDSFELD PIC XX. 88 D A T E I - E N D E V A L U E "10". 01 BILDSCHIRMPOSITION. 02 ZEILE PIC 9902 SPALTE PIC 99P R O C E D U R E DIVISION. OPEN 1 - 0 A U F T R A G S D A T E I
Anhang A
Lösungen zu den Übungsaufgaben PERFORM EINGABE-MASKE P E R F O R M V E R A R B E I T U N G U N T I L KZ = 5• EINGABE-MASKE. DISPLAY SPACES DISPLAY "GEBEN SIE FÜR DIE G E W Ü N S C H T E V E R A R B E I T U N G DAS E N S P R "ECHENDE K E N N Z E I C H E N EIN" AT 0202 DISPLAY "KZ = 1 - A N Z E I G E N EINES SATZES" AT 0402 DISPLAY "KZ = 2 - E I N G A B E EINES SATZES" AT 0602 DISPLAY "KZ = 3 - ENDE DER V E R A R B E I T U N G " AT 0802. VERARBEITUNG. M O V E ZEROS TO KZ ACCEPT KZ AT 1002 E V A L U A T E KZ WHEN 1 PERFORM ANZEIGEN WHEN 2 PERFORM EINGEBEN WHEN 5 PERFORM ENDE W H E N O T H E R P E R F O R M FEHLERMELDUNG. DISPLAY "GEBEN SIE E I N J EIN, W E N N SIE E I N E R Ü C K K E H R INS H A U P "TMENÜ W Ü N S C H E N " AT 2202 A C C E P T KZ-1 AT 2302 P E R F O R M EINGABE-MASKE. ANZEIGEN. DISPLAY SPACES DISPLAY "GEBEN SIE AN, W E L C H E R S U C H B E G R I F F ZUR A N Z E I G E DES A U "FTRAGSSATZES VERWANDT W E R D E N SOLL" AT 0201 DISPLAY "KZ = 1 - S U C H B E G R I F F A U F T R A G S N U M M E R " AT 0402 DISPLAY "KZ = 2 - S U C H B E G R I F F K U N D E N N U M M E R " AT 0602 M O V E ZERO TO KZ A C C E P T KZ AT 0802 DISPLAY SPACES IF KZ = 1 THEN DISPLAY "GEBEN SIE D I E A U F T R A G S N U M M E R EIN" AT 0204 M O V E ZEROS TO A U F T R A G S N R ACCEPT A U F T R A G S N R AT 0240 READ A U F T R A G S D A T E I INVALID KEY D I S P L A Y "SATZ NICHT V O R H A N D E N " AT 0406 NOT INVALID KEY DISPLAY A U F T R A G S S A T Z AT 0406 E L S E DISPLAY "GEBEN SIE DIE K U N D E N N U M M E R EIN" AT 0204 M O V E ZEROS TO K D N R ACCEPT K D N R AT 0240 M O V E K D N R TO A K D N R M O V E 10 TO ZEILE M O V E 20 TO SPALTE START A U F T R A G S D A T E I KEY - K D N R INVALID KEY DISPLAY "SATZ NICHT V O R H A N D E N " NOT INVALID KEY READ A U F T R A G S D A T E I NEXT RECORD PERFORM L E S E N - A U F T R A G S D A T E I U N T I L K D N R NOT = A K D N R OR DATEI-ENDE. LESEN-AUFTRAGSDATEI. DISPLAY A U F T R A G S S A T Z AT B I L D S C H I R M P O S I T I O N READ A U F T R A G S D A T E I NEXT R E C O R D ADD 1 TO ZEILE. EINGEBEN. DISPLAY SPACES
227
Anhang A
228
DISPLAY "GEBEN SIE DIE DATEN DES NEUEN SATZES EIN" AT 0202 DISPLAY "AUFTRAGSNUMMER" AT 0402 DISPLAY "KUNDENNUMMER" AT 0602 DISPLAY "ARTIKELNUMMER" AT 0802 DISPLAY "PREIS" AT 1002 DISPLAY "MENGE" AT 1202 MOVE ZEROS TO AUFTRAGSNR KDNR ARTNR WPREIS MENGE ACCEPT AUFTRAGSNR AT 0418 ACCEPT KDNR AT 0618 ACCEPT ARTNR AT 0818 ACCEPT WPREIS AT 1018 MOVE WPREIS TO PREIS ACCEPT MENGE AT 1218 WRITE AUFTRAGSSATZ INVALID KEY DISPLAY "SATZ BEREITS VORHANDEN ODER SPEICHE "RKAPAZITÄT ERSCHÖPFT" AT 1402 NOT INVALID KEY DISPLAY "SATZ WURDE GESPEICHERT" AT 1402. ENDE. CLOSE AUFTRAGSDATEI STOP RUN. FEHLERMELDUNG. DISPLAY "KENNZEICHEN AUSSERHALB DES ZULÄSSIGEN BEREICHES" AT
1602.
Hinweise zur Lösung: Sind mehrere Sätze mit gleicher Kundennummer in der Datei vorhanden, so ist darauf zu achten, daß diese Sätze nicht in dieselbe Zeile ausgegeben werden und damit nur ein Satz (der letzte) am Bildschirm sichtbar wird. Im obenstehenden Programm wurde das Problem durch eine variable Zeilenpositionierung (vgl. dazu das Datenfeld „BILDSCHIRMPOSITION" und den Paragraphen „LESEN-AUFTRAGSDATEI") gelöst.
Anhang B
Reservierte COBOL-Wörter ACCEPT ACCESS ADD ADVANCING AFTER ALL ALPHABET ALPHABETIC ALPHABETIC-LOWER ALPHABETIC-UPPER ALPHANUMERIC ALPHANUMERICEDITED ALSO ALTER ALTERNATIVE AND ANY ARE AREA AREAS ASCENDING ASSIGN AT AUTHOR BEFORE BINARY BLANK BLOCK BOTTOM BY CALL CANCEL CD CF
CH CHARACTER CHARACTERS CLASS CLOCK-UNITS CLOSE COBOL CODE CODE-SET COLLATING COLUMN COMMA COMMON COMMUNICATION COMP COMPUTATIONAL COMPUTE CONFIGURATION CONTAINS CONTENT CONTINUE CONTROL CONTROLS CONVERTING COPY CORR CORRESPONDING COUNT CURRENCY DATA DATE DATE-COMPILED DATE-WRITTEN DAY DAY-OF-WEEK DE
DEBUG-CONTENTS DEBUG-ITEM DEBUG-LINE DEBUG-NAME DEBUG-SUB-1 DEBUG-SUB-2 DEBUG-SUB-3 DEBUGGING DECIMAI^ POINT DECLARATIVES DELETE DELIMITED DELIMITER DEPENDING DESCENDING DESTINATION DETAIL DISABLE DISPLAY DIVIDE DIVISION DOWN DUBLICATES DYNAMIC EGI ELSE EMI ENABLE END END-ADD END-CALL END-COMPUTE END-DELETE END-DIVIDE END-EVALUATE END-IF
Anhang B
230
END-MULTIPLY END-OF-PAGE END-PERFORM END-READ END-RECEIVE END-RETURN END-REWRITE END-SEARCH END-START END-STRING END-SUBTRACT END-UNSTRING END-WRITE ENTER ENVIRONMENT EOP EQUAL ERROR ESI EVALUATE EVERY EXCEPTION EXIT EXTEND EXTERNAL FALSE FD FILE FILE-CONTROL FILLER FINAL FIRST FOOTING FOR FROM GENERATE GIVING GLOBAL GO GREATER GROUP
HEADING HIGH-VALUE HIGH-VALUES 1-0 I-O- CONTROL IDENTIFICATION IF IN INDEX INDEXED INDICATE INITIAL INITIALIZE INITIATE INPUT INPUT-OUTPUT INSPECT INSTALLATION INTO INVALID IS JUST JUSTIFIED KEY LABEL LAST LEADING LEFT LENGTH LESS LIMIT LIMITS LINAGE LINAGE-COUNTER LINE LINE-COUNTER LINES LINKAGE LOCK LOW-VALUE LOW-VALUES
MEMORY MERGE MESSAGE MODE MODULES MOVE MULTIPLE MULTIPLY NATIVE NEGATIVE NEXT NO NOT NUMBER NUMERIC NUMERIC-EDITED OBJECT-COMPUTER OCCURS OF OFF OMITTED ON OPEN OPTIONAL OR ORDER ORGANIZATION OTHER OUTPUT OVERFLOW PACKED-DECIMAL PADDING PAGE PAGE-COUNTER PERFORM PF PH PIC PICTURE PLUS POINTER POSITION
Anhang B POSITIVE PRINTING PROCEDURE PROCEDURES PROCEED PROGRAM PROGRAM-ID PURGE QUEUE QUOTE QUOTES RANDOM RD READ RECEIVE RECORD RECORDS REDEFINES REEL REFERENCE REFERENCES RELATIVE RELEASE REMAINDER REMOVAL RENAMES REPLACE REPLACING REPORT REPORTING REPORTS RERUN RESERVE RESET RETURN REVERSED REWIND REWRITE RF RH RIGHT ROUNDED RUN
231 SAME SD SEARCH SECTION SECURITY SEGMENT SEGMENT-LIMIT SELECT SEND SENTENCE SEPARATE SEQUENCE SEQUENTIAL SET SIGN SIZE SORT SORT-MERGE SOURCE SOURCE-COMPUTER SPACE SPACES SPECIALNAMES STANDARD STANDARD-1 STANDARD-2 START STATUS STOP STRING SUB-QUEUE-1 SUB-QUEUE-2 SUB-QUEUE-3 SUBTRACT SUM SUPPRESS SYMBOLIC SYNC SYNCHRONIZED
TEST TEXT THAN THEN THROUGH THRU TIME TIMES TO TOP TRAILING TRUE TYPE
TABLE TALLYING TAPE TERMINAL TERMINATE
>
UNIT UNSTRING UNTIL UP UPON USAGE USE USING VALUE VALUES VARYING WHEN WITH WORDS WORKING-STORAGE WRITE ZERO ZEROES ZEROS
/ **