Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

Dateien in Objekten

&pagelevel(4)&pagelevel

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:

  1. 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.

  2. 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.

  3. 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"
      ....