Datenfelder und Tabellen - MIDRANGE SHOP

bin.midrange.shop.com

Datenfelder und Tabellen - MIDRANGE SHOP

Datenfelder, Tabellen, und Datenstrukturen Kapitel 9 – Seite 1

9

Datenfelder, Tabellen und

Datenstrukturen

Es ist anzunehmen, dass jeder, der schon einmal für die AS/400

programmiert hat, die Arbeit mit Datenfeldern, Tabellen oder

Datenstrukturen kennt. Dabei handelt es sich um allgemeine

Mechanismen, die Daten im Speicherplatz des ausführenden

Programmes speichern. Datenfelder, Tabellen und Datenstrukturen

stellen internen Speicherplatz für die Daten in Ihrem Programm

zur Verfügung, variieren jedoch in Bezug auf Implementierung

und Funktion.

Datenfelder und Tabellen erlauben es Ihrem Programm, Datenelemente

für den einfachen Abruf in Gruppen zu organisieren.

Datenstrukturen erlauben es Ihnen, einen Speicherbereich für die

Ein I.T.P.-Fachbuch


Seite 2 – Kapitel 9

Handbuch für AS/400-Programmierer

Speicherung von einzelnen Datenelementen zu definieren. Elemente

werden als Unterfelder innerhalb der größeren Struktur

definiert.

Datenfelder und Tabellen

Datenfelder und Tabellen bieten beide Ihrem Programm internen

Speicherplatz für Datenelemente. Die Funktionen, die Sie mit

ihnen ausführen können, sind jedoch sehr unterschiedlich.

Tabellen

Die wichtigste Funktion einer Tabelle ist es, eine Anzahl von vorgegebenen

Datenelementen für das Nachschlagen zu speichern.

Eine Tabelle kann z.B. eine Liste gültiger Abkürzungen für Länder

enthalten. Eine derartige Liste ist ideal für die Speicherung in

Tabellen, weil die Tabelle damit eine feste Anzahl möglicher Elemente

hat.

Ein RPG-Programm kann z.B. in einer Tabelle nachschlagen, um

das vom Benutzer eingegebene Land auf Gültigkeit zu überprüfen.

Die Tabelle prüft, ob ein bestimmter Wert in der Tabelle enthalten

ist (Abb. 9.1).

Ein I.T.P.-Fachbuch


Datenfelder, Tabellen, und Datenstrukturen Kapitel 9 – Seite 3

Abb. 9.1: Datenelemente mit Hilfe einer Tabelle validieren

RPG erlaubt Ihnen die Definition einer zweiten Tabelle, die mit

der ersten Tabelle verknüpft wird, um so den Nutzen der Tabelle

zu vergrößern. Eine relationale Tabelle ist eine Liste von Elementen,

die jeweils mit dem entsprechenden Element in der Primärtabelle

verknüpft ist. In unserem Beispiel mit den Länderkennungen

kann z.B. eine relationale Tabelle definiert werden,

um Informationen zu speichern, die für das jeweilige Element

eindeutig sind.

Informationen, wie z.B. die Umsatzsteuer eines Landes, sind ideal

für die Speicherung in einer relationalen Tabelle. Wenn ein

Ein I.T.P.-Fachbuch


Seite 4 – Kapitel 9

Handbuch für AS/400-Programmierer

bestimmter Staat in der Primärtabelle enthalten ist, kann so der

Wert, der im dementsprechenden Element der Umsatzsteuertabelle

enthalten ist, abgerufen werden. Abb. 9.2 illustriert die Verwendung

einer primären Tabelle mit einer relationalen Tabelle.

Abb. 9.2: Mit einer Tabelle einen Wert aus einer relationalen

Tabelle abrufen

Wie werden Tabellen geladen Tabellen können bei der Kompilierung

oder vor Laufzeit geladen werden. Tabellen, die bei der

Kompilierung geladen werden, werden bei der Kompilierung mit

Daten einschließlich dem Programmquellcode geladen. Tabellen,

die vor Laufzeit geladen werden, rufen die Daten während

Ein I.T.P.-Fachbuch


Datenfelder, Tabellen, und Datenstrukturen Kapitel 9 – Seite 5

der Initialisierungsphase eines Programms aus einer Datenbankdatei

ab.

Datenfelder

Datenfelder bieten weitaus flexiblere Funktionen als Tabellen.

Das Programm kann während der Ausführung dynamisch auf

einzelne Elemente in Datenfeldern verweisen und diese manipulieren.

Eine beliebte Anwendung in einem RPG-Programm ist

z.B. der Einsatz als Speicherbereich für die Sammlung von Gesamtbeträgen.

RPG Op-Codes ermöglichen mit einer einzigen

Codezeile die Sortierung von Datenfeldern und die Berechnung

der Gesamtsumme von numerischen Werten.

Datenfelder sind z.B. gut geeignet für die Aufgabe, aus den einzelnen

Auftragsdatensätzen Ihrer Außendienstmitarbeiter die

Gesamtbeträge zu ermitteln (Abb. 9.3). Bei der Verarbeitung der

Datensätze durch das Programm wird das Datenfeld jedes Außendienstmitarbeiters

geprüft. Wenn kein Datenfeld gefunden

wird, wird der Außendienstmitarbeiterwert dem nächsten verfügbaren

Element hinzugefügt. Das Programm fügt dann den Betrag

seiner Umsätze dem entsprechenden Element in einem zweiten

Datenfeld hinzu. Nachdem das Programm alle Detaildatensätze

verarbeitet hat, kann der Inhalt der Datenfelder verwendet werden,

um Gesamtbeträge pro Außendienstmitarbeiter auszudrukken.

Ein I.T.P.-Fachbuch


Seite 6 – Kapitel 9

Handbuch für AS/400-Programmierer

Abb. 9.3: Datenfelder verwenden, um Gesamtbeträge zu akkumulieren

So werden Datenfelder geladen: Sie können Datenfelder bei der

Kompilierung geladen, vor Laufzeit oder während der Laufzeit.

Datenfelder, die während der Kompilierung geladen werden,

werden mit den Daten geladen, die im Quellcode des Programms

enthalten sind. Datenfelder, die vor Laufzeit laden, laden Daten

aus einer Datenbankdatei während der Initialisierungsphase einer

Programmausführung. Laufzeitdatenfelder werden innerhalb

der Programmlogik während der Ausführung geladen.

Ein I.T.P.-Fachbuch


Datenfelder, Tabellen, und Datenstrukturen Kapitel 9 – Seite 7

Beispiel

Bei Kompilierung ladende Tabelle in

ILE RPG laden

Wie Sie sich sicherlich erinnern, werden bei Kompilierung ladende

Tabellen aus dem Inhalt von Einträgen innerhalb des

Quellcodes eines Programms geladen.

Übersicht

In diesem Beispiel wird eine zur Kompilierungszeit ladende Tabelle

in Verbindung mit einer verknüpften Tabelle verwendet, um

Schülernamen und die entsprechenden Prüfungsergebnisse aufzunehmen.

Die Tabelle wird unter Angabe eines Prüfergebnisses

nach einem bestimmten Schülernamen durchsucht. Anschließend

werden Schülername und Prüfungsergebnis ausgedruckt.

Listing 9.1, das die ILE RPG Source für RPG0001R zeigt, illustriert

die Verwendung von bei Kompilierung ladenden Tabellen.

Ein I.T.P.-Fachbuch


Seite 8 – Kapitel 9

Handbuch für AS/400-Programmierer

Listing 9.1: ILE RPG mit Tabellen, die bei Kompilierung laden

g

FQPRINT 0 F 132 Printer

DTABNames S 20 Dim(5) CTDATA Perrcd(1)

DTABScore S 3 0 Dim(5) Alt(TABNames)

D*

DMyName S 20 Inz('Joe')

*

C MYNAME Lookup TABNames TABScore 90

C If *In90 = *0n

C Except Printit

C

EndIf

C*

C Eval *InLR = *0n

F FQPRINT

DTABNames C

0

S

132 Printer

20 Dim(5) CTDATA Perrcd(1) Return

DTABScore S 3 0 Dim(5) Alt(TABNames)

D* O*

DM yName S 20 Inz(‚Joe‘)

* OQPRINT

C

E

MYNAME

Printit

Lookup TABNames

1

90

CO If *In90 = *0n

C Except Printit

TABScore

TABNames 25

C*

CO EndIf

TABScore Z 30

C**CTDATA

Eval *InLR = *0n

Return

C

O* BILLY BOB 90

OQPRINT E Printit 1

OJOE TABNames 050 25

O TABScore Z 30

**CTDATA ABBEYTABNAMES

015

BILLY BOB 90

JOE ZOE 050 095

ABBEY 015

ZOE GARTH 095

GARTH 045

045

g

Beschreibung

Laufzeit-Tabellendefinitionen beginnen mit den RPG D-Spezifikationen.

Der Name der Tabelle, der mitTAB beginnen muss, die

Größe und die Attribute jedes Elements, die Maximalzahl an Elementen

in der Tabelle und die Anzahl der Elemente pro Source-

Zeile werden alle in der D-Spezifikation definiert. Abb. 9.4 zeigt

eine nähere Ansicht der D-Spezifikation für die Tabelle

TABNAMES.

DNAME++++++++++ETDsFrom+++To/L+++Idc.Keywords+++++++++++++++++++++

DTABNames S 20 Dim(5) CTDATA Perrcd(1)

Ein I.T.P.-Fachbuch


Datenfelder, Tabellen, und Datenstrukturen Kapitel 9 – Seite 9

DNAME++++++++++ETDsFrom+++To/L+++Idc.Keywords+++++++++++++++++++++

DTABNames S 20 Dim(5) CTDATA Perrcd(1)

Abb. 9.4: Definition D-Spezifikation für Tabelle TABNAMES

Die D-Spezifikation, die TABNAMES definiert, deklariert jedes

Element mit einer Länge von 20 Zeichen. Das Schlüsselwort

DIM gibt die maximale Anzahl an Elementen in der Tabelle als 5

an.

Das Schlüsselwort CTDATA spezifiziert, dass die Tabelle mit

Daten geladen wird, die zur Laufzeit am Ende des Quellprogramms

eingebettet werden.

Das Schlüsselwort PERRCD definiert, wie viele Elemente der

Tabelle aus jeder Zeile Quelldatensätze geladen werden. Der

Standardwert ist 1; somit wird jedes Element der Tabelle aus einem

Quelldatensatz gelesen.

In diesem Beispiel wird eine verknüpfte Tabelle verwendet, um

Prüfungsergebnisse für jeden Schüler in der Tabelle Schülername

zu speichern. Abb. 9.5 zeigt die D-Spezifikation für die verknüpfte

Tabelle TABSCORE.

DNAME++++++++++ETDsFrom+++To/L+++Idc.Keywords+++++++++++++++++++++

DTABScore S 3 0 Dim(50) Alt(TABNames)

DNAME++++++++++ETDsFrom+++To/L+++Idc.Keywords+++++++++++++++++++++

DTABScore S 3 0 Dim(50) Alt(TABNames)

Abb. 9.5: D-Spezifikation für alternative Tabelle TABScore

Die D-Spezifikation, die TABSCORE definiert, deklariert jedes

Element als dreistelligen numerischen Wert mit null dezimalen

Positionen. Das Schlüsselwort ALT definiert die Tabelle als alternative

Tabelle von TABNAMES.

Ein I.T.P.-Fachbuch


Seite 10 – Kapitel 9

Handbuch für AS/400-Programmierer

Weder PERRCD noch CDTATA kann in der Definition einer alternativen

Tabelle angegeben werden. Die Daten, die für das Laden

der alternativen Tabelle verwendet werden, werden automatisch

aus dem gleichen Quelldatensatz wie die Haupttabelle geladen.

Diese Quellenteildatei enthält am Ende die Daten, mit denen die

Tabellen geladen werden. Abb. 9.6 zeigt die Tabellendaten.

**CTDATA TABNAMES

BILLY BOB 90

JOE 050

ABBEY 015

ZOE 095

**CTDATA TABNAMES

BILLY BOB 90

JOE 050

ABBEY 015

ZOE 095

GARTH 045

GARTH 045

Abb. 9.6: Daten für Tabelle TABNames und alternative Tabelle

TABScore erstellen

Den Tabellendaten wurde **CTDATA vorangestellt. Dieser Eintrag

enthält optional den Namen der Tabelle, zu der die Daten

gehören. Wenn der Tabellenname nicht angegeben wird, muss die

Reihenfolge, in der die Tabellen definiert werden, der Anordnung

der Tabellendaten am Ende des Sourceelements entsprechen.

Um eine bessere Lesbarkeit zu erreichen, ist es immer eine

gute Idee, den Tabellennamen nach dem CTDATA-Eintrag anzugeben.

Jeder Quelldatensatz, der **CTDATA folgt, beginnt bei

Position eins.

Innerhalb der Programmlogik wird eine Suche nach einem bestimmten

Namen in der Tabelle mit den Schülernamen ausgeführt.

Abb. 9.7 zeigt diese Suchoperation:

CCL0N01FACTOR1+++++OPCODE&EXTFACTOR2++++++RESULT++++++LEN++D+HILOEQ

Ein I.T.P.-Fachbuch


Datenfelder, Tabellen, und Datenstrukturen Kapitel 9 – Seite 11

CCL0N01FACTOR1+++++OPCODE&EXTFACTOR2++++++RESULT++++++LEN++D+HILOEQ

MYNAME LOOKUP TABNAMES TABSCORE 90

C

C IF *IN90 = *ON

C MYNAME LOOKUP

C EXCEPT PRINTIT

TABNAMES TABSCORE 90

C

C

ENDIF

IF *IN90 = *ON

C EXCEPT PRINTIT

C

ENDIF

Abb. 9.7: ILE RPG-Suchoperation

Der gesuchte Schülername (der im Feld MYNAME enthalten ist)

wird bei der Suchoperation als Faktor eins verwendet. Die Suche

erfolgt in der Tabelle TABNames. Wenn dabei der Schülername

gefunden wird, wird Indikator 90 aktiviert und das entsprechende

Element in Tabelle TABScore zurückgegeben. Die verknüpfte

Tabelle TABScore enthält den entsprechenden dreistelligen Testwert.

Beispiel

Zur Kompilierungszeit ladende Tabelle in

RPG/400 verwenden

Diejenigen unter Ihnen, die noch nicht mit ILE RPG in ihrer Entwicklungsumgebung

arbeiten, können Tabellen, die zur Kompilierungszeit

geladen werden, auch in RPG/400 verwenden. Listing

9.2 zeigt die Source des Programms RPG002R.

Ein I.T.P.-Fachbuch


Seite 12 – Kapitel 9

Handbuch für AS/400-Programmierer

Listing 9.2: RPG/400-Beispiel mit Tabellen, die zur Kompilierungszeit

geladen werden

FQPRINT 0 F 132 OF Printer

E TABNAM 1 5 20 TABSCO 3 0

*

C MOVEL'Joe' MYNAME 20

C MYNAME LOKUPTABNAM TABSCO 90

C *IN90 IFEQ *ON

C

EXCPTPRINT

C

ENDIF

*

C SETON LR

0 F FQPRINT

EC

132

TABNAM 1 5 20

OF Printer

TABSCO 3 RETRN 0

*

C*

MOVEL’Joe’ MYNAME 20

90

C MYNAME

C OQPRINT *IN90IFEQ E *ON 1

LOKUPTABNAM TABSCO

PRINT

C

EXCPTPRINT

C

ENDIF

*

C SETON LR

C

***

RETRN

OQPRINT E 1 PRINT

O BILLY BOB TABNAM 090 25

O TABSCOZ 30

** JOE 050

BILLY BOB 090

JOE ABBEY 050 015

ABBEY 015

ZOE ZOE 095

GARTH 045

095

O TABNAM 25

O TABSCOZ 30

GARTH 045

Übersicht

In diesem Beispiel wird eine zur Kompilierungszeit ladende Tabelle

mit einer entsprechenden verknüpften Tabelle verwendet,

um Schülernamen und die damit verknüpften Testergebnisse aufzunehmen.

Unter Verwendung des Prüfungsergebnisses eines

Schülers wird eine Suche in der Tabelle nach einem bestimmten

Schülernamen durchgeführt. Schülername und Prüfungsergebnis

werden anschließend ausgedruckt.

Beschreibung

Der wichtigste Unterschied zwischen den RPG/400- und ILE

RPG-Versionen besteht darin, dass in RPG/400 D-Spezifikatio-

Ein I.T.P.-Fachbuch


Datenfelder, Tabellen, und Datenstrukturen Kapitel 9 – Seite 13

nen fehlen. In RPG/400 werden die Tabellen mit Erweiterungstags

(E) definiert. Ebenso müssen die Tabellennamen für RPG/

400 gekürzt werden. Abb. 9.8 zeigt eine ausführliche Ansicht des

E-Spezifikationseintrags für die Tabelle TABNAM.

E FromfileToFile++Name++N/rN/tbLenPDSArrnamLenPDSComments++++

E TABNAM 1 5 20 TABSCO 3 0

E FromfileToFile++Name++N/rN/tbLenPDSArrnamLenPDSComments++++

E TABNAM 1 5 20 TABSCO 3 0

Abb. 9.8: E-Definition für Tabelle TABNAM und alternative

Tabelle TABSCO

"E“ definiert TABNAM als Primärtabelle und TABSCO als entsprechende

alternative Tabelle. Die 1 in Position 35 teilt Ihnen

mit, dass die Primärtabelle ein Element pro Quelldatensatz lädt.

Position 39 definiert die Tabelle mit einer Höchstzahl an fünf

Elementen. Jedes Element in TABNAM besteht aus einem 20-

Zeichen-Feld während jedes Element in TABSCO aus einem

dreistelligen numerischen Feld ohne dezimale Stellen besteht.

**

BILLY BOB 90

JOE 050

ABBEY 015

ZOE 095

GARTH 045

**

BILLY BOB 90

JOE 050

ABBEY 015

ZOE 095

GARTH 045

Abb. 9.9: Daten für Tabelle TABNAM und alternative Tabelle

TABSCO

Der Gruppierung der Quelldatensätze müssen zwei Sternchen

(**) vorangestellt werden. Jeder Quelldatensatz beginnt in Position

eins des Quellcodes.

Innerhalb der Programmlogik wird eine Suche nach einem bestimmten

Namen in der Tabelle mit Schülernamen ausgeführt.

Abb. 9.10 zeigt die Suchoperation.

Ein I.T.P.-Fachbuch


Seite 14 – Kapitel 9

Handbuch für AS/400-Programmierer

CL=NO1NO2NO3Factor1+++OpcdeFactor2+++ResultLenDHHiLoEqComments++++

C MOVEL'Joe' MYNAME 20

C MYNAME LOKUPTABNAM TABSCO 90

C *IN90 IFEQ *On

C

EXCPTPRINT

C

ENDIF

CL=NO1NO2NO3 Factor1+++ OpcdeFactor2+++ResultLenDHHiLoEqComments++++

C MOVEL’Joe’ MYNAME 20

C MYNAME LOKUPTABNAM TABSCO 90

C

*IN90IFEQ *On

C

EXCPTPRINT

C

ENDIF

Abb. 9.10: RPG/400 Suchoperation

Der gesuchte Schülername (der im Feld MYNAME enthalten ist)

wird bei der Suchoperation als Faktor eins verwendet. Die Suche

erfolgt in der Tabelle TABNAM. Wenn dabei der Schülername

gefunden wird, wird Indikator 90 aktiviert und das entsprechende

Element in Tabelle TABSCORE zurückgegeben. Die verknüpfte

Tabelle, TABSCO, enthält das entsprechende dreistellige Prüfungsergebnis.

Beispiel

Vor-Laufzeit-Tabellen in ILE RPG

verwenden

Wie Sie sich sicherlich erinnern, werden Tabellendaten, die vor

Laufzeit geladen werden, aus den Datensätzen einer Datenbankdatei

abgerufen. Die Einträge werden kurz vor der Ausführung

eines Programms geladen. Diese Tabellen sind eine gute Wahl

bei Anwendungen, in denen erwartet wird, dass die Tabellendaten

geändert werden. Wenn sich der Inhalt der Datei ändert, ändern

sich auch die Tabellendaten mit der nächsten Programmausführung.

Übersicht

Dieses Beispiel verwendet eine Vor-Laufzeit-Tabelle mit einer

entsprechenden verknüpften Tabelle, um Schülernamen und die

Ein I.T.P.-Fachbuch


Datenfelder, Tabellen, und Datenstrukturen Kapitel 9 – Seite 15

entsprechenden Prüfungsergebnisse aufzunehmen. Die Tabelle

wird unter Angabe eines Prüfergebnisses nach einem bestimmten

Schülernamen durchsucht. Anschließend werden Schülername

und Prüfungsergebnis ausgedruckt. Listing 9.3, das die ILE RPG

Source für RPG0003R zeigt, illustriert die Verwendung von vor

Laufzeit ladenden Tabellen.

Listing 9.3: ILE RPG mit Vor- Laufzeit-Tabellen

g

FTESTFILE IT F 22 DISK

FQPRINT 0 F 132 Printer

DTABNames S 20 Dim(50) Perrcd(1) Fromfile

D

(TestFile)

DTABScore S 3 0 Dim(50) Alt(TABNames) ExtFmt(P)

*

D*

DMyName S 20 Inz('Joe')

*

C MYNAME Lookup TABNames TABScore 90

C If *In90 = *0n

FTestFile it F 22 Disk

FQPRINT

C

DTABNames

0 F 132

S 20

Printer

Except

Perrcd(1) Fromfile

Printit

Dim(50)

D

C

DTABScore

(TestFile)

3 0 Dim(50)

EndIf

Alt(TABNames) ExtFmt(P)

S

**

D*

DM

CyName S 20 Inz(‚Joe‘)

Eval *InLR = *0n

*

CC

MYNAME Lookup

Return

TABNames TABScore 90

C If *In90 = *0n

CO*

Except Printit

C

EndIf

* OQPRINT

C

E

Eval

Printit 1

*InLR =

CO Return

*0n

TABNames 25

O*

OQPRINT O E Printit 1 TABScore Z 30

O TABNames 25

O TABScore 30 Z

Beschreibung

Die Datenbankdatei, die verwendet wird, um die vor Laufzeit zu

ladende Tabelle abzurufen, wird in den Programmdatei-F-Spezifikationen

definiert. Dieses Beispiel verwendet eine physische

Datei TESTFILE, die ein 20-Zeichen-Feld Schülername enthält,

gefolgt von dem gepackten dreistelligen numerischen Prüfungsergebnis.

Abb. 9.11. zeigt den F-Eintrag.

Ein I.T.P.-Fachbuch


Seite 16 – Kapitel 9

Handbuch für AS/400-Programmierer

FFILENAME++IPEASFRLEN+LKLEN+AIDEVICE+.KEYWORDS+++++++++++++++++++

FTestFile IT F 22

FFILENAME++IPEASFRLEN+LKLEN+AIDEVICE+.KEYWORDS+++++++++++++++++++

FTestFile IT F22 DISK

Abb. 9.11: F-Spezifikation als Quelldefinition für die Tabelle

Die Tabellendatei wird mit dem Eintrag T in Position 18 gekennzeichnet.

Der Buchstabe I (Input) in Position 18 informiert Sie

darüber, dass die Datei nur für die Dateneingabe geöffnet werden

soll.

Tabellendefinitionen für Tabellen, die vor der Laufzeit geladen

werden, sind in den RPG D-Spezifikationen enthalten. Der

Name der Tabelle (der mit TAB beginnen muss), die Größe und

Attribute jedes Elements, die Höchstzahl an Elementen in der

Tabelle und die Anzahl der Elemente pro Soucezeile werden im

Eintrag D definiert. Abb. 9.12 zeigt eine ausführliche Ansicht

des D-Eintrags für Tabelle TABNames.

DNAME++++++++++ETDsFrom+++To/L+++Idc.Keywords+++++++++++++++++++++

DTABNames S 20 Dim(50) Perrcd(1) Fromfile

D

(TestFile)

DNAME++++++++++ETDsFrom+++To/L+++Idc.Keywords+++++++++++++++++++++

DTABNames S 20 Dim(50) Perrcd(1) Fromfile

D

(TestFile)

Abb. 9.12: D-Spezifikation für Tabelle TABNames

Die D-Spezifikation - die die TABNamen definiert - deklariert

jedes Element mit einer Länge von 20 Zeichen. Das Schlüsselwort

DIM gibt die maximale Anzahl an Elementen in der Tabelle

als 5 an.

Das Schlüsselwort FROMFILE legt fest, dass die Tabelle mit den

Datensätzen der Datei TESTFILE geladen werden soll.

Das Schlüsselwort PERRCD definiert die Anzahl der Tabellenelemente,

die aus den Zeilen der Quelldatensätze geladen werden

sollen. Der Standardwert ist 1, jedes Tabellenelement wird aus

einem Datensatz der Datei gelesen.

Ein I.T.P.-Fachbuch


Datenfelder, Tabellen, und Datenstrukturen Kapitel 9 – Seite 17

Dieses Beispiel verwendet eine verknüpfte Tabelle, um Prüfungsergebnisse

für jeden Schüler in der Tabelle mit den Schülernamen

zu laden. Abb. 9.13 zeigt die D-Spezifikation für die

verknüpfte Tabelle TABScore.

DNAME++++++++++ETDsFrom+++To/L+++Idc.Keywords+++++++++++++++++++++

DTABScore S 3 0 Dim(50) Alt(TABNames) ExtFmt(P)

DNAME++++++++++ETDsFrom+++To/L+++Idc.Keywords+++++++++++++++++++++

DTABScore S 3 0 Dim(50) Alt(TABNames) ExtFmt(P)

Abb. 9.13: D-Spezifikation für alternative Tabelle TABScore

Die D-Spezifikation - die TABScore definiert - deklariert jedes

Element als dreistelligen numerischen Wert ohne Dezimalpositionen.

Das ALT-Schlüsselwort definiert die Tabelle als verknüpfte

oder alternative Tabelle für TABNames. Da die Prüfungsergebnisse

in der Datei als gepackte numerische Daten definiert

werden, wird das Schlüsselwort EXTFMT für externe

Formate verwendet, um die erforderliche Übersetzung zuzuordnen.

Mit der Angabe von P für gepackt teilen Sie dem Programm

mit, dass der Inhalt des Feldes gepackt ist.

Weder das Schlüsselwort PERRCD noch das Schlüsselwort

FROMFILE kann in der Definition einer alternativen Tabelle angegeben

werden. Die Daten, die verwendet werden, um die alternative

Tabelle zu laden, werden automatisch vom gleichen Quelldatensatz

wie die Haupttabelle geladen.

Innerhalb der Programmlogik wird eine Suche nach einem bestimmten

Schülernamen in der Tabelle mit den Schülernamen

durchgeführt. Abb. 9.14. zeigt den Suchprozess.

CL0NO1 Factor1++++++++ Opode&ExtFactor2+++++++Result+++Len++D+HiLoEq

C yName M

Lookup TABNames TABScore MOVEL’Joe’ 90 MYNAME 20

C IF*In90 = *On

C Except Printit

C Endif

Ein I.T.P.-Fachbuch


Seite 18 – Kapitel 9

Handbuch für AS/400-Programmierer

CL0NO1Factor1++++++++Opode&ExtFactor2+++++++Result+++Len++D+HiLoEq

C MyName Lookup TABNames TABScore 90

C IF *In90 = *On

C Except Printit

C Endif

Abb. 9.14: ILE RPG Suchprozess

Der gesuchte Schülername (der im Feld MYNAME enthalten ist)

wird bei der Suchoperation als Faktor eins verwendet. Die Suche

erfolgt in der Tabelle TABNames. Wenn dabei der Schülername

gefunden wird, wird Indikator 90 aktiviert und das entsprechende

Element in Tabelle TABScore zurückgegeben. Die verknüpfte

Tabelle, TABSCcore, enthält das dreistellige Prüfungsergebnis.

Beispiel

Vor-Laufzeit-Tabelle in RPG verwenden

Diejenigen unter Ihnen, die noch nicht mit ILE RPG in ihrer Entwicklungsumgebung

arbeiten, können Tabellen, die zur Laufzeit

geladen werden, auch in RPG/400 verwenden. Listing 9.4 zeigt

die Source des Programms RPG004R.

Übersicht

Dieses Beispiel verwendet eine Vor-Laufzeit-Tabelle mit einer

entsprechenden verknüpften Tabelle, um Schülernamen und die

damit verknüpften Prüfungsergebnisse aufzunehmen. Die Tabelle

wird unter Angabe eines Prüfergebnisses nach einem bestimmten

Schülernamen durchsucht. Anschließend werden

Schülername und Prüfungsergebnis ausgedruckt.

Ein I.T.P.-Fachbuch


Datenfelder, Tabellen, und Datenstrukturen Kapitel 9 – Seite 19

Listing 9.4 RPG/400 unter Verwendung von vor Laufzeit

ladenden Tabellen

FTESTFILEIT F 22 EDISK

FQRPRINT 0 F 132 0F PRINTER

E TESTFILE TABNAM 1 5 20 TABSCO 3P0

*

C MOVEL ' JOE ' MYNAME 20

C MYNAME LOKUPTABNAM TABSCO 90

C *IN90 IFEQ *ON

C

EXCPTPRINT

C

ENDIF

FTESTFILEIT F 22 EDISK

FQRPRINT 0 F 132 0F PRINTER

E * TESTFILE TABNAM 1 5 20 TABSCO 3P0

*

C MOVEL ‚ JOE ‚ MYNAME 20

C MYNAME LOKUPTABNAM TABSCO 90

C

C

*IN90 IFEQ *ON

RETRN

C

EXCPTPRINT

C*

ENDIF

*

OQPRINT

C

E 1 PRINT

SETON LR

C

RETRN

*

OQPRINT E 1PRINT

O TABNAM 25

O TABSCOZ 30

C SETON LR

O TABNAM 25

O TABSCOZ 30

Beschreibung

Der wichtigste Unterschied zwischen den beiden Versionen für

RPG/400 und ILE RPG besteht darin, dass in RPG/400 keine

D-Spezifikationen enthalten sind. In RPG/400 werden Tabellen,

die vor Laufzeit geladen werden, mit einer Kombination von

F- und E-Spezifikationen geladen.

Die Tabellennamen müssen außerdem für RPG/400 gekürzt werden.

Abb. 9.15 zeigt die F-Spezifikationen, die die Eingabedatei

TESTFILE definieren.

FFilenameIPEAF....RlenLK1aIOvKlocEDevice+.....Kexit++Entry+A....U

FTESTFILEIT F 22 EDISK

FFilenameIPEAF....RlenLK1aIOvKlocEDevice+.....Kexit++Entry+A....U

FTESTFILEIT F 22 EDISK

Abb. 9.15: F-Spezifikationen für die Eingabedatei TESTFILE

Ein I.T.P.-Fachbuch


Seite 20 – Kapitel 9

Handbuch für AS/400-Programmierer

Die Tabellendatei wird mit einem T-Eintrag in Position 16 gekennzeichnet.

Die Datei wird für die Eingabe geöffnet, wie an

dem Eintrag 1 in Position 15 der F-Spezifikation erkennbar ist.

Ein E in Position 39 zeigt die Existenz einer E-Spezifikation an,

die die Tabellen, die die Eingabedateien verwenden, definiert.

Die Tabellen, die der Eingabedatei entsprechen, werden in den E-

Spezifikationen des Programms definiert. Abb. 9.16 zeigt eine

ausführliche Ansicht der E-Spezifikation für die Tabelle TAB-

NAM und die alternative Tabelle TABSCO.

E FromfileToFile++Name++N/rN/tbLenPOSArrnamLenPDSComments++++

E TESTFILE TABNAM 1 5 20 TABSCO 3P0

E FromfileToFile++Name++N/rN/tbLenPOSArrnamLenPDSComments++++

E TESTFILE TABNAM 1 5 20 TABSCO 3P0

Abb. 9.16: E-Spezifikationen für Tabelle TABNAM und alternative

Tabelle TABSCO

Der Name der Eingabedatei wird in Position 11 der E-Spezifikation

angezeigt. Die E-Spezifikation definiert TABNAM als die

Primärtabelle und TABSCO als die entsprechende alternative

Tabelle. Die Primärtabelle lädt ein Element pro Dateidatensatz,

wie von dem Wert 1 in Position 35 angegeben. Position 39 definiert

die Tabelle mit einem Höchstwert an fünf Elementen. Jedes

Element in TABNAM ist ein Feld mit einer Länge von 20 Zeichen.

Innerhalb der Programmlogik wird eine Suche nach einem bestimmten

Schülernamen in der Tabelle mit den Schülernamen

durchgeführt. Abb. 9.17 zeigt den Suchprozess.

CL0NO1NO2No3Factor1++++++++OpcdeFactor2++++ResultLenDHHIloEqComments

C MOVEL’Joe’ MYNAME 20

C LOKUPTABNAM MYNAME TABSCO 90

C *IN90 IFEQ *ON

C

EXCPTPRINT

C

ENDIF

Ein I.T.P.-Fachbuch


Datenfelder, Tabellen, und Datenstrukturen Kapitel 9 – Seite 21

CL0NO1NO2No3Factor1++++++++OpcdeFactor2++++ResultLenDHHIloEqComments

C MOVEL'Joe' MYNAME 20

C MYNAME LOKUPTABNAM TABSCO 90

C *IN90 IFEQ *ON

C

EXCPTPRINT

C

ENDIF

Abb. 9.17: ILE RPG-Suchprozess

Der gesuchte Schülername, der im Feld MYNAME enthalten ist,

wird bei der Suchoperation als Faktor eins verwendet. Die Suche

erfolgt in der Tabelle TABNames. Wenn dabei der Schülername

gefunden wird, wird Indikator 90 aktiviert und das entsprechende

Element in Tabelle TABScore zurückgegeben. Die verknüpfte

Tabelle, TABSCcore, enthält das dreistellige Prüfungsergebnis.

Beispiel

Kompilierungszeit-Datenfelder mit

Gesamtsummen in ILE RPG

Wie Tabellen werden Datenfelder, die bei Kompilierung geladen

werden, aus Einträgen im Programmquellcode geladen.

Übersicht

In diesem Beispiel werden zwei Kompilierungszeit-Datenfelder

für die Aufnahme von Schülernamen und die damit verknüpften

Prüfungsergebnisse verwendet. Unter Angabe der Prüfungsergebnisse

des Schülers wird eine Suche nach einem bestimmten

Schülernamen ausgeführt. Nachdem die Daten geladen wurden,

wird eine Gesamtsumme der Prüfungsergebnisse des Datenfelds

gebildet. Anschließend werden Schülername, das Prüfungsergebnis

und die Gesamtsumme aller Prüfungsergebnisse ausge-

Ein I.T.P.-Fachbuch


Seite 22 – Kapitel 9

Handbuch für AS/400-Programmierer

druckt. Listing 9.5 zeigt die ILE RPG Source für RPG005R und

illustriert die Verwendung von zur Kompilierungszeit ladenden

Datenfeldern.

Listing 9.5: ILE RPG mit Kompilierungszeit-Datenfeldern

FQPRINT 0 F 132 Printer

Dname S 20 Dim(5) CTDATA Perrcd(1)

DtestDScore S 3 0 DDim(5) CTDATA Perrcd(1)

D*

DmyName S 20 Inz('Joe')

DX S 3 0

DtotScores S 3 0

*

C Eval X=1

C MyName Lookup Name(X) 90

C If *In90 = *On

*

C Xfoot TestScore TotScores

*

C Except Printit

C

Endif

*

C Eval *InLR = *On

FQPRINT 0 132F

Printer

Dname S 20 Dim(5) CTDATA Perrcd(1)

DtestDScore S 3 0 DDim(5) CTDATA Perrcd(1)

D*

DmyName C

S 20 Inz(‚Joe‘) Return

DX S 3 0

DtotScores *

S 3 0

*

COQPRINT EvalE X=1 Printit 1

C MyName Lookup Name(X) 90

C If *In90 = *On

*

C Xfoot TestScore TotScores

*

C Except Printit

C

Endif

*

C Eval

C**CTDATA Name Return

*InLR = *On

*

OQPRINT Billy Bob E Printit 1

0 Name(X) 25

0 Joe

TestScore(X) Z 30

0 38 ‚Total:‘

0Abbey

TotScores Z 42

**CTDATA Name

Billy ZoeBob

Joe

Abbey Garth

Zoe

Garth **CTDATA TestScore

**CTDATA TestScore

085 085

065

090

055

099

065

0 Name(X) 25

0 TestScore(X) Z 30

0 38 'Total:'

0 TotScores Z 42

055

099

Ein I.T.P.-Fachbuch

Weitere Magazine dieses Users
Ähnliche Magazine