Eine Datei kann in einem Objekt definiert werden, indem man sie im FACTORY- bzw. OBJECT-Teil in einem FILE-CONTROL-Paragrafen und einer FILE SECTION beschreibt und in einer oder mehreren Methoden entsprechende Anweisungen zu ihrer Verarbeitung wie OPEN, CLOSE, READ, WRITE angibt.
Hat eine Anwendung mehrere Objektinstanzen von einer Klasse erzeugt, in der eine Datei definiert ist, dann ist diese Anwendung selbst dafür verantwortlich, dass es beim Zugriff auf die Datei zu keinen Konflikten kommt. Das kann folgendermaßen erreicht werden:
Die Datei hat die Eigenschaft EXTERNAL. Somit gibt es nur ein einziges Exemplar der Datei und alle Objekte arbeiten mit derselben Datei. Wegen der EXTERNAL-Eigenschaft können dann noch weitere Programme gleichzeitig auf die Datei zugreifen.
Die ASSIGN-Klausel der Datei verwendet die Variante „ASSIGN to datenname“. Gegebenenfalls kann dann zur Laufzeit jedes Objekt der Klasse beim OPEN ein eigenes Exemplar einer solchen Datei auswählen, indem es datenname mit einem objektspezifischen Wert versorgt. Auf diese Weise lassen sich Konflikte des Objektes mit den Dateien in den weiteren Objektinstanzen seiner Klasse vermeiden.
Wird Variante 2 nicht genutzt, dann arbeiten verschiedene Objektinstanzen auf derselben Datei. Die Anwendung koordiniert die Zugriffe auf die Datei so, dass beispielsweise zu jedem Zeitpunkt nur ein einziges Objekt (von mehreren derselben Klasse) die Datei geöffnet hat und bearbeitet. Eine andere Möglichkeit besteht darin, die Datei simultan zu bearbeiten (siehe Handbuch „COBOL2000 Benutzerhandbuch“ [ 1]). In der Regel ist es daher in diesem Fall am sinnvollsten, nur ein einziges Objekt der Klasse zu erzeugen.
Vererbung gilt nicht nur für Daten der WORKING-STORAGE SECTION, sondern auch für die in OBJECT bzw. FACTORY definierten Dateien. Zu beachten ist daher, dass auch das Erben von einer Klasse, die eine Dateidefinition enthält, zu den oben erwähnten Konflikten führen kann, selbst wenn von jeder Klasse nur ein einziges Objekt instanziiert worden ist.
Im Unterschied zu den oben beschriebenen Dateien in Objekten verhalten sich in Methoden definierte Dateien analog zu Dateidefinitionen in herkömmlichen Programmen: Durch Instanziierung neuer Objekte oder Ableitung (Vererbung) von Klassen entstehen keine weiteren Exemplare der Dateidefinition.
Beispiel 12-23
Die folgenden Klasse gewährleistet den Zugriff auf sequenzielle Dateien mit Sätzen, die jeweils aus 80 Zeichen bestehen.
>>>> CLASS-ID. cseqf80 INHERITS BASE. ENVIRONMENT DIVISION. CONFIGURATION SECTION. REPOSITORY. CLASS BASE. OBJECT. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT seq ASSIGN TO link-name FILE STATUS file-status. DATA DIVISION. FILE SECTION. FD seq RECORD CONTAINS 80. 01 recs PIC X(80). WORKING-STORAGE SECTION. 01 file-status PIC XX. 01 link-namePIC X(8). PROCEDURE DIVISION. +++ METHOD-ID. F-OPEN. DATA DIVISION. LINKAGE SECTION. 01 open-mode PIC X. 88 open-input VALUE "I". 88 open-output VALUE "O". 01 file-link PIC X(8). PROCEDURE DIVISION USING open-mode, file-link. DECLARATIVES. erst-mal SECTION. USE AFTER ERROR PROCEDURE ON seq. open-error. IF file-status = .... END DECLARATIVES. 1 SECTION. A. MOVE file-link TO link-name IF open-output OPEN OUTPUT seq ELSE OPEN INPUT seq END-IF EXIT METHOD. END METHOD F-OPEN. +++ METHOD-ID. F-CLOSE. .... *> ggf DECLARATIVES 1 SECTION. A. CLOSE seq. EXIT METHOD. END METHOD F-CLOSE. +++ METHOD-ID. F-READ. DATA DIVISION. LINKAGE SECTION. 01 rec PIC X(80). 01 eof-ind PIC X. 88 eof VALUE "Y" WHEN FALSE "N". PROCEDURE DIVISION USING rec RETURNING eof-ind. .... *> ggf DECLARATIVES 1 SECTION. A. SET eof TO FALSE READ seq INTO rec AT END SET eof TO TRUE END-READ EXIT METHOD. END METHOD F-READ. +++ METHOD-ID. F-WRITE. DATA DIVISION. LINKAGE SECTION. 01 rec PIC X(80). PROCEDURE DIVISION USING rec. .... *> ggf DECLARATIVES 1 SECTION. A. WRITE recs FROM rec. EXIT METHOD. END METHOD F-WRITE. END OBJECT. END CLASS cseqf80.
Diese Klasse kann z.B. verwendet werden, um eine solche Datei zu verarbeiten:
.... 01 obj1 USAGE OBJECT REFERENCE cseqf80. 01 obj2 USAGE OBJECT REFERENCE cseqf80. 01 xrec PIC X(80). 01 xind PIX X VALUE "N". 88 xeof VALUE "Y". .... INVOKE cseqf80 "NEW" RETURNING obj1 INVOKE cseqf80 "NEW" RETURNING obj2 INVOKE obj1 "F-OPEN" USING "I", "EIN-DAT" INVOKE obj2 "F-OPEN" USING "O", "AUS-DAT" INVOKE obj1 "F-READ" USING xrec RETURNING xind PERFORM UNTIL xeof .... *> Satz verarbeiten INVOKE obj2 "F-WRITE" USING xrec INVOKE obj1 "F-READ" USING xrec RETURNING xind END-PERFORM INVOKE obj1 "F-CLOSE" INVOKE obj2 "F-CLOSE" ....