Sie werden Ihr Programm jetzt durch ein CALLNAT-Statement erweitern, mit dem
ein Subprogramm aufgerufen wird. In dem Subprogramm bilden die Mitarbeiter, die vom
Hauptprogramm gefunden wurden, die Grundlage für eine FIND-Anfrage in der
VEHICLES-Datei. Diese Datei ist ebenfalls Bestandteil der Demodatenbank. In
der Ausgabe werden dann Fahrzeuginformationen aus dem Subprogramm und
Mitarbeiterinformationen aus dem Hauptprogramm zu sehen sein.
Das neue Subprogramm benötigt eine weitere Local Data Area und eine Parameter Data Area.
Wenn Sie mit den Übungen in diesem Abschnitt fertig sind, wird Ihre Beispielanwendung aus den folgenden Modulen bestehen:

Parameter Data Area mit Hilfe einer bestehenden Local Data Area erstellen
Eine zweite Local Data Area mit einem anderen View erstellen
Sie werden jetzt weitere Felder in die Local Data Area einfügen, die Sie zuvor erstellt haben. Diese Felder werden von dem Subprogramm benutzt, das Sie später erstellen werden.
Weitere Felder in die Local Data Area einfügen
Kehren Sie zur Local Data Area zurück.
E LDA01
Definieren Sie die folgenden Felder unter #NAME-END:
| Level (Spalte L) | Name | Format (Spalte F) | Länge |
|---|---|---|---|
| 1 | #PERS-ID |
A | 8 |
| 1 | #MAKE |
A | 20 |
| 1 | #MODEL |
A | 20 |
Die Local Data Area sollte nun folgendermaßen aussehen:
Local LDA01 Library TUTORIAL DBID 11177 FNR 8
Command > +
I T L Name F Length Miscellaneous
All -- -------------------------------- - ---------- ------------------------->
1 #NAME-START A 20
1 #NAME-END A 20
1 #PERS-ID A 8
1 #MAKE A 20
1 #MODEL A 20
----------------------------------------------------------------- S 5 L 1 |
Speichern Sie die Local Data Area mit STOW.
Eine Parameter Data Area (PDA) wird zur Angabe der Datenparameter benutzt, die zwischen Ihrem Natural-Programm und dem Subprogramm (das Sie später noch erstellen werden) ausgetauscht werden sollen. Die Parameter Data Area wird im Subprogramm referenziert.
Mit kleinen Änderungen kann Ihre Local Data Area zur Erstellung der Parameter Data Area benutzt werden: Sie werden zwei Datenfelder in der Local Data Area löschen und die so veränderte Local Data Area als Parameter Data Area speichern. Die ursprüngliche Local Data Area wird hierdurch nicht verändert.
Parameter Data Area erstellen
Löschen Sie die Felder #NAME-START und #NAME-END in der
Local Data Area.
Geben Sie Folgendes in der Kommandozeile des Data-Area-Editors ein.
SA PDA01
Die aktuelle Data Area wird unter dem neuen Namen PDA01 gespeichert.
Die bestehende Local Data Area wird noch immer im Editor angezeigt.
Laden Sie die neu erstellte Data Area mit dem folgenden Kommando in den Editor:
E PDA01
Geben Sie das folgende Kommando ein, um die Local Data Area in eine Parameter Data Area zu ändern:
SET TYPE A
wobei "A" für Parameter Data Area steht.
Der Objekttyp ändert sich in "Parameter". Dies wird oben links im Bildschirm angezeigt. Die Parameter Data Area sollte nun folgendermaßen aussehen:
Parameter PDA01 Library TUTORIAL DBID 11177 FNR 8
Command > +
I T L Name F Length Miscellaneous
All -- -------------------------------- - ---------- ------------------------->
1 #PERS-ID A 8
1 #MAKE A 20
1 #MODEL A 20
----------------------------------------------------------------- S 3 L 1 |
Speichern Sie die Parameter Data Area mit STOW.
Sie werden jetzt eine zweite Local Data Area erstellen und Felder aus dem DDM für die
Datenbankdatei VEHICLES importieren.
Diese Local Data Area wird dann in Ihrem Subprogramm referenziert.
Local Data Area erstellen
Geben Sie das folgende Kommando in der Kommandozeile des Data-Area-Editors ein.
CLEAR
Der Data-Area-Editor ist jetzt leer.
Geben Sie das Folgendes in der Kommandozeile ein, um den Typ der Data Area zu ändern:
SET TYPE L
wobei "L" für Local Data Area steht.
Geben Sie Folgendes in der ersten Zeile des Editierbereiches ein, beginnend in der Spalte T:
.V(VEHICLES)
Drücken Sie EINGABE.
Der VEHICLES-View erscheint.
SYSGDA 4461: Mark fields to incorporate into data area.
Local Library TUTORIAL DBID 11177 FNR 8
View VEHICLES
I T L Name F Length Miscellaneous
- - -- -------------------------------- - ---------- -------------------------
2 REG-NUM A 15 /* CAR'S REGISTR. NUMBE
2 CHASSIS-NUM I 4 /* MANUFACTURER NUMBER
2 PERSONNEL-ID A 8 /* IDENT. OF CAR USER
G 2 CAR-DETAILS /* DESCRIPTION OF THE C
3 MAKE A 20
3 MODEL A 20
3 COLOR A 10
3 COLOUR A 10
2 YEAR N 4.0 /* MANUFACTURING YEAR
2 CLASS A 1 /* P=PRIVAT
2 LEASE-PUR A 1 /* L=LEASED
2 DATE-ACQ N 8.0 /* DATE THE CAR WAS ACQ
2 CURR-CODE A 3 /* CURRENCY OF CAR COST
M 2 MAINT-COST P 7.0 (1:60)/* MAINTENANCE COST
2 MODEL-YEAR-MAKE A 24 /* YEAR + CAR MAKE /* SP
- - -- -------------------------------- - ---------- ------------------------- |
Markieren Sie die folgenden Felder, indem Sie ein beliebiges Zeichen in der Spalte I eingeben:
PERSONNEL-ID
CAR-DETAILS
MAKE
MODEL
Nachdem Sie alle erforderlichen Felder markiert haben, drücken Sie EINGABE, um zum Data-Area-Editor zurückzukehren.
Die Local Data Area sollte nun folgendermaßen aussehen:
Local Library TUTORIAL DBID 11177 FNR 8
Command > +
I T L Name F Length Miscellaneous
All -- -------------------------------- - ---------- ------------------------->
V 1 VEHICLES-VIEW VEHICLES
2 PERSONNEL-ID A 8 /* IDENT. OF CAR USER
G 2 CAR-DETAILS /* DESCRIPTION OF THE CAR
3 MAKE A 20
3 MODEL A 20
----------------------------------------------------------------- S 5 L 1 |
Geben Sie Folgendes in der Kommandozeile ein, um die neue Local Data Area zu speichern:
SA LDA02
Speichern Sie die neue Local Data Area mit STOW.
Sie werden jetzt ein Subprogramm erstellen, das mit Hilfe einer Parameter Data Area und
einer Local Data Area Informationen aus der VEHICLES-Datei abruft. Das
Programm PGM01 übergibt das Personalkennzeichen (PERSONNEL-ID)
an das Subprogramm. Das Subprogramm benutzt dieses Kennzeichen für die Suche in der
VEHICLES-Datei.
Subprogramm erstellen
Geben Sie das folgende Kommando in der Kommandozeile des Data-Area-Editors ein.
E N
wobei "N" für Subprogramm steht.
Ein leerer Programm-Editor wird aufgerufen. Der Objekttyp ist auf Subprogramm gesetzt.
Geben Sie Folgendes ein:
DEFINE DATA PARAMETER USING PDA01 LOCAL USING LDA02 END-DEFINE * FD1. FIND (1) VEHICLES-VIEW WITH PERSONNEL-ID = #PERS-ID MOVE MAKE (FD1.) TO #MAKE MOVE MODEL (FD1.) TO #MODEL ESCAPE BOTTOM END-FIND * END
Dieses Subprogramm gibt die folgenden Informationen an ein bestimmtes Personalkennzeichen zurück: die Marke und das Modell des Firmenfahrzeuges eines Mitarbeiters.
Auf Grund des Suchkriteriums #PERS-ID wählt das
FIND-Statement eine Reihe von Datensätzen (hier: einen Datensatz) aus
der Datenbank aus.
Das Feld #PERS-ID des Subprogramms erhält den Wert von
PERSONNEL-ID, der vom Programm PGM01 übergeben wurde.
Das Subprogramm benutzt diesen Wert für die Suche in der
VEHICLES-Datei.
Speichern Sie das Subprogramm mit STOW.
STOW SPGM01
Ein Subprogramm wird mit einem CALLNAT-Statement aus dem Hauptprogramm
aufgerufen. Ein Subprogramm kann nur mit einem CALLNAT-Statement aufgerufen
werden; es kann selbst nicht ausgeführt werden. Ein Subprogramm kann nicht auf die Global
Data Area zugreifen, die von dem aufrufenden Objekt benutzt wird.
Die Daten werden vom Hauptprogramm an das Subprogramm mit Hilfe von Parametern übergeben,
die im Subprogramm mit einem DEFINE DATA PARAMETER-Statement referenziert
werden.
Die Variablen, die in der Parameter Data Area des Subprogramms definiert sind, müssen
nicht unbedingt dieselben Namen haben wie die Variablen im CALLNAT-Statement.
Sie müssen nur in der Reihenfolge, im Format und in der Länge übereinstimmen.
Sie werden jetzt Ihr Hauptprogramm ändern, damit es das eben von Ihnen erstellte Subprogramm benutzen kann.
Subprogramm in Ihrem Hauptprogramm benutzen
Kehren Sie zum Programm-Editor zurück, indem Sie Folgendes in der Kommandozeile eingeben.
E PGM01
Geben Sie Folgendes direkt über dem DISPLAY-Statement ein:
RESET #MAKE #MODEL CALLNAT 'SPGM01' PERSONNEL-ID #MAKE #MODEL
Das RESET-Statement setzt die Werte für #MAKE und
#MODEL auf Nullwerte.
Löschen Sie die Zeile, die das DISPLAY-Statement enthält, und
ersetzen Sie sie mit Folgendem:
WRITE TITLE
/ '*** PERSONS WITH 20 OR MORE DAYS LEAVE DUE ***'
/ '*** ARE MARKED WITH AN ASTERISK ***'//
*
DISPLAY 1X '//N A M E' NAME
1X '//DEPT' DEPT
1X '/LV/DUE' LEAVE-DUE
' ' #MARK
1X '//MAKE' #MAKE
1X '//MODEL' #MODEL
Der mit dem WRITE TITLE-Statement definierte Text wird bei der Ausgabe
oben auf jeder Seite angezeigt. Das WRITE TITLE-Statement setzt den
Standardseitentitel außer Kraft: die Informationen, die bisher oben auf jeder Seite
angezeigt wurden (Seitenzahl, Datum und Uhrzeit) werden nicht mehr angezeigt. Jeder
Schrägstrich (/) sorgt dafür, dass die nachfolgenden Informationen in einer neuen
Zeile angezeigt werden.
Da das Subprogramm jetzt zusätzliche Fahrzeuginformationen ausgibt, muss die Größe
der Spalten in der Ausgabe angepasst werden. Die Spalten erhalten kürzere
Überschriften. Die Spalte, in der der Stern angezeigt wird (#MARK),
bekommt überhaupt keine Überschrift. Zwischen den einzelnen Spalten wird je ein
Leerzeichen eingefügt (1X). Jeder Schrägstrich in einer
Spaltenüberschrift lässt die nachfolgenden Informationen in derselben Spalte in
einer neuen Zeile erscheinen.
Ihr Programm sollte nun folgendermaßen aussehen:
DEFINE DATA
GLOBAL USING GDA01
LOCAL USING LDA01
END-DEFINE
*
RP1. REPEAT
*
INPUT USING MAP 'MAP01'
*
IF #NAME-START = '.' THEN
ESCAPE BOTTOM (RP1.)
END-IF
*
IF #NAME-END = ' ' THEN
MOVE #NAME-START TO #NAME-END
END-IF
*
RD1. READ EMPLOYEES-VIEW BY NAME
STARTING FROM #NAME-START
ENDING AT #NAME-END
*
IF LEAVE-DUE >= 20 THEN
PERFORM MARK-SPECIAL-EMPLOYEES
ELSE
RESET #MARK
END-IF
*
RESET #MAKE #MODEL
CALLNAT 'SPGM01' PERSONNEL-ID #MAKE #MODEL
*
WRITE TITLE
/ '*** PERSONS WITH 20 OR MORE DAYS LEAVE DUE ***'
/ '*** ARE MARKED WITH AN ASTERISK ***'//
*
DISPLAY 1X '//N A M E' NAME
1X '//DEPT' DEPT
1X '/LV/DUE' LEAVE-DUE
' ' #MARK
1X '//MAKE' #MAKE
1X '//MODEL' #MODEL
*
END-READ
*
IF *COUNTER (RD1.) = 0 THEN
REINPUT 'No employees meet your criteria.'
END-IF
*
END-REPEAT
*
END
Führen Sie das Programm mit RUN aus.
Geben Sie "JONES" als Startname ein und drücken Sie EINGABE.
Die daraufhin erscheinende Liste sollte der folgenden Ausgabe ähneln:
MORE
*** PERSONS WITH 20 OR MORE DAYS LEAVE DUE ***
*** ARE MARKED WITH AN ASTERISK ***
LV
N A M E DEPT DUE MAKE MODEL
-------------------- ------ --- - -------------------- --------------------
JONES SALE30 25 * CHRYSLER IMPERIAL
JONES MGMT10 34 * CHRYSLER PLYMOUTH
JONES TECH10 11 GENERAL MOTORS CHEVROLET
JONES MGMT10 18 FORD ESCORT
JONES TECH10 21 * GENERAL MOTORS BUICK
JONES SALE00 30 * GENERAL MOTORS PONTIAC
JONES SALE20 14 GENERAL MOTORS OLDSMOBILE
JONES COMP12 26 * DATSUN SUNNY
JONES TECH02 25 * FORD ESCORT 1.3
Geben Sie EDIT in der MORE-Zeile ein, um
zum Programm-Editor zurückzukehren.
Speichern Sie das Programm mit STOW.
Sie haben das Tutorial jetzt erfolgreich abgeschlossen.