READ WORK FILE

#### Search Results

Search

# READ WORK FILE

Dieses Dokument behandelt folgende Themen:

- Funktion

- Syntax 1 - READ WORK FILE mit Verarbeitungsschleife

- Syntax 2 - READ WORK FILE ohne Verarbeitungsschleife

- Syntax-Beschreibung

- Feldlängen

- Variabler Index-Bereich

- Verarbeitung dynamischer Variablen

- Verarbeitung von X-Arrays

- Beispiele

Verwandte Statements: `CLOSE WORK FILE` | `DEFINE WORK FILE` | `WRITE WORK FILE`

Gehört zur Funktionsgruppe: Verarbeitung von Arbeitsdateien/PC-Dateien

## Funktion

Das Statement `READ WORK FILE` dient dazu, Daten von einer physisch-sequentiellen Nicht-Adabas-Arbeitsdatei zu lesen. Die Daten werden sequentiell von der Arbeitdatei gelesen. Wie sie gelesen werden, ist unabhängig davon, wie Sie auf die Arbeitsdatei geschrieben wurden.

Das `READ WORK FILE`-Statement führt eine Verarbeitungsschleife aus, um alle Datensätze der Arbeitsdatei zu lesen. Innerhalb einer `READ WORK FILE`-Schleife können automatische Gruppenwechsel-Verarbeitungen durchgeführt werden.

Auf Großrechnern kann dieses Statement nur in einem Programm verwendet werden, das unter Com-plete, CICS, TSO oder im Batch-Betrieb ausgeführt wird. Die entsprechende JCL muss mit der Ausführungs-JCL bereitgestellt werden, wenn eine Arbeitsdatei gelesen werden soll. Näheres hierzu siehe Operations-Dokumentation.

Informationen bezüglich Arbeitsdateien finden Sie auch in der Beschreibung des Profilparameters `WORK` in der Parameter-Referenz.

Informationen zur Unicode- und Codepage-Unterstützung siehe Arbeitsdateien und Druckdateien in der Unicode- und Codepage-Unterstützung-Dokumentation.

Anmerkungen:

1. Wenn bei Ausführung eines `READ WORK FILE`-Statements eine End-of-File-Bedingung auftritt, schließt Natural die Arbeitsdatei automatisch.
2. Bei Entire Connection: Beim Lesen von Entire Connection-Arbeitsdateien darf innerhalb der `READ WORK FILE`-Verarbeitungsschleife kein I/O-Statement stehen.

## Syntax 1 - READ WORK FILE mit Verarbeitungsschleife

`READ` `WORK` [`FILE`] work-file-number
| `RECORD` operand1 |  |  |
[`AND`] [`SELECT`] |  |  |  | `OFFSET` n |  |  | operand2 |  |  |  |
`FILLER` n `X` |
|  |  | `OFFSET` n |  |  | operand2 |  |  |  |  | `OFFSET` n |  |  | operand4 [`AND`] `ADJUST` [`OCCURRENCES`]
`FILLER` n `X` | `FILLER` n `X`
[`GIVING LENGTH` operand3]
statement
`END-WORK` | (structured mode only)
`LOOP` | (reporting mode only)

Eine Erläuterung der in dem Syntax-Diagramm verwendeten Symbole entnehmen Sie dem Abschnitt Syntax-Symbole.

## Syntax 2 - READ WORK FILE ohne Verarbeitungsschleife

`READ` `WORK` [`FILE`] work-file-number `ONCE`
| `RECORD` operand1 |  |  |
[`AND`] [`SELECT`] |  |  |  | `OFFSET` n |  |  | operand2 |  |  |  |
`FILLER` n `X` |
|  |  | `OFFSET` n |  |  | operand2 |  |  |  |  | `OFFSET` n |  |  | operand4 [`AND`] `ADJUST` [`OCCURRENCES`]
`FILLER` n `X` | `FILLER` n `X`
[`GIVING LENGTH` operand3]
| `AT` [`END`] [`OF`] [`FILE`] |  |  |  |  |  |  |  | (structured mode only)
statement
`END-ENDFILE`
| `AT` [`END`] [`OF`] [`FILE`] |  | statement |  |  | (reporting mode only)
`DO` statement `DOEND`

Eine Erläuterung der in dem Syntax-Diagramm verwendeten Symbole entnehmen Sie dem Abschnitt Syntax-Symbole.

## Syntax-Beschreibung

Operanden-Definitionstabelle:

Operand | Mögliche Struktur | Mögliche Formate | Referenzierung erlaubt | Dynam. Definition
--- | --- | --- | --- | ---
operand1 |  | S | A | G |  | A | U | N | P | I | F | B | D | T | L | C |  |  | ja | ja
operand2 |  | S | A | G |  | A | U | N | P | I | F | B | D | T | L | C |  |  | ja | ja
operand3 |  | S |  |  |  |  |  |  |  | I |  |  |  |  |  |  |  |  | ja | ja
`operand4` |  |  | A |  |  | A | U | N | P | I | F | B | D | T | L | C |  |  | nein | nein

Format C ist bei Natural Connection nicht gültig.

Siehe auch Feldlängen.

Syntax-Element-Beschreibung:

Syntax-Element | Beschreibung
--- | ---
`work-file-number` | Arbeitsdateinummer: Gibt die für Natural definierte Nummer der Arbeitsdatei an, die gelesen werden soll. Die Nummer der Arbeitsdatei ist entweder eine numerische Konstante im Wertebereich 1:32 oder eine mit der Klausel `CONSTANT` definierte numerische Variable im Format B/N/P/I, die einen Wert im Bereich 1:32 zuweist. Dezimalstellen bei den Formaten (N/P) sind nicht erlaubt.
`ONCE` | ONCE-Option: Die `ONCE`-Option bewirkt, dass nur ein Datensatz gelesen und keine Verarbeitungsschleife initiiert wird (das schleifenbeendende Schlüsselwort `END−WORK` bzw. `LOOP` darf daher nicht zusammen mit `ONCE` verwendet werden). Wenn Sie `ONCE` verwenden, sollten Sie auch eine `AT END OF FILE`-Klausel verwenden. Wird ein `READ WORK FILE`-Statement mit `ONCE`-Option von einer benutzerinitiierten Verarbeitungsschleife gesteuert, kann es sein, dass auf der Arbeitsdatei eine End-of-File-Bedingung auftritt, bevor die Schleife beendet wird. Alle von der Arbeitsdatei gelesenen Felder enthalten dann immer noch die Werte des zuletzt gelesenen Datensatzes. Die Arbeitsdatei wird dann zum ersten Datensatz zurückpositioniert, welcher dann bei der nächsten Ausführung des `READ WORK FILE ONCE`-Statements gelesen wird.
`RECORD` `operand1` `FILLER nX` | RECORD-Option: Im Reporting Mode muss eine Operandenliste (`operand1`) entsprechend dem Layout des Datensatzes verfügbar gemacht werden. `FILLER nX` muss angegeben werden, wenn die Gesamtlänge der Operanden kleiner als die Länge des Arbeitsdateidatensatzes ist. Im Structured Mode oder wenn der zu verwendende Datensatz mittels einem `DEFINE DATA`-Statement definiert wird, kann nur ein Feld (oder eine Gruppe) angegeben werden, und `FILLER` darf nicht verwendet werden. Das Feld (oder die Gruppe) muss lang genug sein, um den gesamten Arbeitsdateidatensatz aufnehmen zu können. Natural überprüft die Daten des Datensatzes nicht. Demzufolge ist diese Option die schnellste Art, Datensätze von einer sequentiellen Datei zu verarbeiten. Allerdings müssen Sie selbst darauf achten, dass der Aufbau des Datensatzes korrekt beschrieben ist, da es sonst durch nicht-numerische Daten in numerischen Feldern zu einem ungewollten Programmabbruch kommen kann. Bevor der Datensatz gelesen wird, füllt Natural die Operandenliste (operand1) mit Leerzeichen; demzufolge wird bei einer End-of-File-Bedingung ein leerer Bereich zurückgegeben. Kurze Datensätze werden mit Leerzeichen aufgefüllt. Die `RECORD`-Option kann nicht benutzt werden: Wenn eine Entire Connection-Arbeitsdatei gelesen wird. Wenn dynamische Variablen benutzt werden.
`SELECT` | SELECT-Option (Voreinstellung): Wird die `SELECT`-Option verwendet, so werden nur die in der Operandenliste (operand2) angegebenen Felder zur Verfügung gestellt. Die Position der Felder im Eingabedatensatz kann durch eine `OFFSET`- und/oder `FILLER`-Angabe spezifiziert werden.
OFFSET n | `OFFSET 0` spezifiziert das erste Byte des Datensatzes. `OFFSET` kann nicht für Arbeitsdateien des Typs UNFORMATTED angegeben werden.
FILLER nX | Bedeutet, dass n Bytes des Eingabedatensatzes übersprungen werden.
Natural ordnet den einzelnen Feldern die ausgewählten Werte zu und überprüft, dass die vom Datensatz ausgewählten numerischen Felder entsprechend ihrer Definition auch wirklich gültige numerische Werte enthalten. Aufgrund dieser Prüfung dauert die Verarbeitung einer sequentiellen Datei mit der `SELECT`-Option etwas länger als mit der `RECORD`-Option. Wenn ein Datensatz nicht alle in der `SELECT`-Option angegebenen Felder füllt, gilt folgendes: Ein Feld, das nur teilweise gefüllt wurde, wird mit Leerzeichen bzw. Nullen aufgefüllt. Ein Feld, das gar nicht gefüllt wurde, behält denselben Inhalt wie zuvor. Beim Lesen des Datei-Typs CSV werden die Optionen `OFFSET` und `FILLER` ignoriert.
`operand4 AND ADJUST OCCURRENCES` | ADJUST-Klausel: Geben Sie ein eindimensionales X-Array mit vollständigem Bereich (*) an. Das X-Array wird auf bzw. um die Anzahl der Ausprägungen erweitert bzw. reduziert, die zur Aufnahme aller gelesenen Daten benötigt werden. Siehe Verarbeitung von X-Arrays weiter unten. Anmerkung Diese Klausel wird von Entire Connection nicht unterstützt.
`GIVING LENGTH operand3` | GIVING LENGTH-Klausel Mit dieser Klausel können Sie die tatsächliche Länge des gelesenen Datensatzes feststellen. Die Länge (Anzahl der Bytes) erhalten Sie in operand3. operand3 muss mit Format/Länge I4 definiert sein. Wenn die Arbeitsdatei als `TYPE UNFORMATTED` definiert ist, verweist die zurückgegebene Länge auf die Anzahl der aus dem Byte-Strom gelesenen Bytes, einschließlich der beim `FILLER`-Operanden übersprungenen Bytes.
`AT END OF FILE` | AT END OF FILE-Klausel Diese Klausel kann nur zusammen mit der `ONCE`-Option verwendet werden. Wenn Sie die `ONCE`-Option verwenden, dann sollten Sie auch eine `AT END OF FILE`-Klausel angeben, um festzulegen, was beim Auftreten einer End-of-File-Bedingung geschehen soll. Wenn Sie die `ONCE`-Option nicht verwenden, wird eine End-of-File-Bedingung wie das normale Ende einer Verarbeitungsschleife behandelt.
`END-WORK` | Ende des READ WORK FILE-Statements: Im Structured Mode ohne Verarbeitungsschleife muss dass für Natural reservierte Schlüsselwort `END−WORK` zum Beenden des `READ WORK FILE`-Statements verwendet werden.
`LOOP` | Ende des READ WORK FILE-Statements: Im Reporting Mode ohne Verarbeitungsschleife muss dass Natural-Statement `LOOP` zum Beenden des `READ WORK FILE`-Statements verwendet werden.

## Feldlängen

Die Länge der Felder in der Operanden-Definitionstabelle wird wie folgt bestimmt:

Format | Länge
--- | ---
A, B, I, F | Die Anzahl der Bytes im Eingabedatensatz entspricht der internen Längendefinition.
N | Die Anzahl der Bytes im Eingabedatensatz ergibt sich aus der Summe der internen Stellen vor und nach dem Komma (Dezimalpunkt). Komma und Vorzeichen belegen im Eingabedatensatz kein Byte.
P, D, T | Die Anzahl der Bytes im Eingabedatensatz ergibt sich aus der Summe der Stellen vor und nach dem Komma (Dezimalpunkt) plus einer Stelle für das Vorzeichen, geteilt durch 2 und aufgerundet.
L | 1 Byte wird benutzt. Bei Feldern des Formats C werden 2 Bytes benutzt.

#### Beispiele für Feldlängen:

Felddefinition | Eingabedatensatz
--- | ---
#FIELD1 (A10) | 10 Bytes
#FIELD2 (B15) | 15 Bytes
#FIELD3 (N1.3) | 4 Bytes
#FIELD4 (N0.7) | 7 Bytes
#FIELD5 (P1.2) | 2 Bytes
#FIELD6 (P6.0) | 4 Bytes

Siehe auch Format und Länge von Benutzervariablen im Leitfaden zur Programmierung.

## Variabler Index-Bereich

Zum Auslesen eines Arrays aus einer Arbeistdatei können Sie für das Array einen variablen Indexbereich angeben. Zum Beispiel:

    READ WORK FILE work-file-number #ARRAY (I:J)

## Verarbeitung dynamischer Variablen

Arbeitsdateityp | Verarbeitung
--- | ---
UNFORMATTED | Das Lesen einer dynamischen Variable von einer `UNFORMATTED`-Arbeitsdatei bewirkt, dass der komplette Rest der Datei in die Variable (von der aktuellen Position) gestellt wird. Wenn die Datei mehr als 1073741824 Bytes umfasst, dann werden zumindestens 1073741824 Bytes in die Variable gestellt.
FORMATTED | Das Lesen einer dynamischen Variable von einer Arbeitsdatei vom Typ `FORMATTED` bewirkt, dass der Rest des Arbeitsdateidatensatzes in die Variable gestellt wird. So wird die Länge der dynamischen Variable bei Arbeitsdateien mit variabler Datensatzlänge bei jeder Ausführung des `READ WORK FILE`-Statements so angepasst, dass sie exakt der Länge des zurzeit gelesenen Datensatzes entspricht.

## Verarbeitung von X-Arrays

Wird die `ADJUST`-Klausel nicht angegeben, werden X-Arrays genauso wie reguläre Arrays behandelt, d..h. ihre vorhandenen Ausprägungen werden gefüllt.

Wird die`ADJUST`-Klausel angegeben,wird ein mit vollständigem Bereich (*) angegebenes eindimensionales X-Array so angepasst, dass es alle Daten aus dem restlichen Datensatz für eine Arbeitsdatei vom Typ `FORMATTED` bzw. alle Daten aus dem restlichen Datensatz für eine Arbeitsdatei vom Typ `UNFORMATTED` aufnehmen kann.

## Beispiele

- Beispiel 1 - READ WORK FILE

- Beispiel 2 - READ WORK FILE Formatiert mit dynamischer Variablen

- Beispiel 3 - READ WORK FILE Unformatiert mit dynamischer Variablen

- Beispiel 4 - READ WORK FILE Formatiert mit X-array und ADJUST bei Ausprägungen

- Beispiel 5 - READ WORK FILE Unformatiert mit X-array und ADJUST bei Ausprägungen

- Beispiel 6 - READ WORK FILE mit einer mit CONST definierten numerischen Variablen als Arbeitsdateinummer

### Beispiel 1 - READ WORK FILE

    ** Example 'RWFEX1': READ WORK FILE
    ************************************************************************
    DEFINE DATA LOCAL
    1 EMPLOY-VIEW VIEW OF EMPLOYEES
      2 PERSONNEL-ID
      2 NAME
    *
    1 #RECORD
      2 #PERS-ID (A8)
      2 #NAME    (A20)
    END-DEFINE
    *
    FIND EMPLOY-VIEW WITH CITY = 'STUTTGART'
      WRITE WORK FILE 1
            PERSONNEL-ID NAME
    END-FIND
    *
    * ...
    *
    READ WORK FILE 1 RECORD #RECORD
      DISPLAY NOTITLE #PERS-ID #NAME
    END-WORK
    *
    END

#### Ausgabe des Programs RWFEX1:

    #PERS-ID        #NAME
    -------- --------------------

    11100328 BERGHAUS
    11100329 BARTHEL
    11300313 AECKERLE
    11300316 KANTE
    11500304 KLUGE
    11500308 DIETRICH
    11500318 GASSNER
    11500343 ROEHM
    11600303 BERGER
    11600320 BLAETTEL
    11500336 JASPER
    11100330 BUSH
    11500328 EGGERT

### Beispiel 2 - READ WORK FILE Formatiert mit dynamischer Variablen

    ** Example 'RWFEX2': READ WORK FILE - Formatted with dynamic variable
    ************************************************************************
    DEFINE DATA LOCAL
      1 #DYNA (A) DYNAMIC
    END-DEFINE
    *
    DEFINE WORK FILE 1 TYPE 'FORMATTED'
    *
    WRITE WORK FILE 1 VARIABLE 'text1 text2 text3 '
    WRITE WORK FILE 1 VARIABLE 'text4 text5'
    *
    READ WORK FILE 1 AND SELECT #DYNA
      DISPLAY *LENGTH(#DYNA) #DYNA (AL=40)
      /*
      /* Length: 18  Dyn.Var: 'text1 text2 text3'
      /* Length: 11  Dyn.Var: 'text4 text5'
    END-WORK
    *
    END

#### Ausgabe des Programs RWFEX2:

    Page      1                                                  11-07-15  09:21:09

      LENGTH                     #DYNA
    ----------- ----------------------------------------

             18 text1 text2 text3
             11 text4 text5

### Beispiel 3 - READ WORK FILE Unformatiert mit dynamischer Variablen

    ** Example 'RWFEX3': READ WORK FILE - Unformatted with dynamic variable
    ************************************************************************
    DEFINE DATA LOCAL
      1 #DYNA (A) DYNAMIC
    END-DEFINE
    *
    DEFINE WORK FILE 1 TYPE 'FORMATTED'
    *
    WRITE WORK FILE 1 VARIABLE 'text1 text2 text3 '
    WRITE WORK FILE 1 VARIABLE 'text4 text5'
    *
    DEFINE WORK FILE 1 TYPE 'UNFORMATTED'
    *
    READ WORK FILE 1 AND SELECT #DYNA
      DISPLAY *LENGTH(#DYNA) #DYNA (AL=40)
      /*
      /* Length: 29  Dyn.Var: 'text1 text2 text3 text4 text5'
    END-WORK
    *
    END

#### Ausgabe des Programs RWFEX3:

    Page      1                                                  11-07-15  09:31:04

      LENGTH                     #DYNA
    ----------- ----------------------------------------

             29 text1 text2 text3 text4 text5

### Beispiel 4 - READ WORK FILE Formatiert mit X-array und ADJUST bei Ausprägungen

    ** Example 'RWFEX4': READ WORK FILE - Formatted with X-array
    **                                    and ADJUST its occurrences
    ************************************************************************
    DEFINE DATA LOCAL
      1 #ARR (A6/1:*)
      1 #OCC (I4)
    END-DEFINE
    *
    DEFINE WORK FILE 1 TYPE 'FORMATTED'
    *
    WRITE WORK FILE 1 VARIABLE 'text1 text2 text3 '
    WRITE WORK FILE 1 VARIABLE 'text4 text5'
    *
    READ WORK FILE 1 AND SELECT #ARR(*) AND ADJUST OCCURRENCES
      #OCC := *OCCURRENCE(#ARR)
      DISPLAY #OCC #ARR(1:#OCC)
      /*
      /* Occurrences: 3 Array(*): 'text1', 'text2', 'text3'
      /* Occurrences: 2 Array(*): 'text4', 'text5'
    END-WORK
    *
    END

#### Ausgabe des Programs RWFEX4:

    Page      1                                                  11-07-15  09:36:13

       #OCC      #ARR
    ----------- ------

              3 text1
                text2
                text3
              2 text4
                text5

### Beispiel 5 - READ WORK FILE Unformatiert mit X-array und ADJUST bei Ausprägungen

    ** Example 'RWFEX5': READ WORK FILE - Unformatted with X-array
    **                                    and ADJUST its occurrences
    ************************************************************************
    DEFINE DATA LOCAL
      1 #ARR (A6/1:*)
      1 #OCC (I4)
    END-DEFINE
    *
    DEFINE WORK FILE 1 TYPE 'FORMATTED'
    *
    WRITE WORK FILE 1 VARIABLE 'text1 text2 text3 '
    WRITE WORK FILE 1 VARIABLE 'text4 text5'
    *
    DEFINE WORK FILE 1 TYPE 'UNFORMATTED'
    *
    READ WORK FILE 1 AND SELECT #ARR(*) AND ADJUST OCCURRENCES
      #OCC := *OCCURRENCE(#ARR)
      DISPLAY #OCC #ARR(1:#OCC)
      /*
      /*Occurrences: 5 Array(*): 'text1', 'text2', 'text3', 'text4', 'text5'
    END-WORK
    *
    END

#### Ausgabe des Programs RWFEX5:

    Page      1                                                  11-07-15  09:41:25

       #OCC      #ARR
    ----------- ------

              5 text1
                text2
                text3
                text4
                text5

### Beispiel 6 - READ WORK FILE mit einer mit CONST definierten numerischen Variablen als Arbeitsdateinummer

    ** Example 'RWFEX6': READ WORK FILE - with numeric CONST variable as
    **                                    work file number
    ** see similar example RWFEX5 with numeric constant
    ************************************************************************
    DEFINE DATA LOCAL
      1 #ARR    (A6/1:*)
      1 #OCC    (I4)
      1 #WF-1   (N4) CONST<1>
    END-DEFINE
    *
    DEFINE WORK FILE #WF-1 TYPE 'FORMATTED'
    *
    WRITE WORK FILE  #WF-1#WF-1 VARIABLE 'text1 text2 text3 '
    WRITE WORK FILE  #WF-1 VARIABLE 'text4 text5'
    *
    DEFINE WORK FILE #WF-1 TYPE 'UNFORMATTED'
    *
    READ WORK FILE #WF-1 AND SELECT #ARR(*) AND ADJUST OCCURRENCES
      #OCC := *OCCURRENCE(#ARR)
      DISPLAY #OCC #ARR(1:#OCC)
      /*
      /*Occurrences: 5 Array(*): 'text1', 'text2', 'text3', 'text4', 'text5'
    END-WORK
    *
    END

#### Ausgabe des Programs RWFEX6:

    Page      1                                                  21-12-20  17:42:43

       #OCC      #ARR
    ----------- ------

              5 text1
                text2
                text3
                text4
                text5

### On this page

- Funktion
- Syntax 1 - READ WORK FILE mit Verarbeitungsschleife
- Syntax 2 - READ WORK FILE ohne Verarbeitungsschleife
- Syntax-Beschreibung
- Feldlängen
- Variabler Index-Bereich
- Verarbeitung dynamischer Variablen
- Verarbeitung von X-Arrays
- Beispiele