Übergeben Sie Parameter an ein Programm, indem Sie in der Funktionsdefinition den Datentyp des Parameters angeben und definieren, daß der zu übergebende Parameter nur zur Eingabe (IN), nur zur Ausgabe (OUT) oder zur Eingabe/Ausgabe (INOUT) dienen soll. Beispiel:
%function(DTW_DIRECTCALL) dc2(IN CHAR(3) p1,
INOUT INTEGER p2,
OUT DECIMAL(7,2) p3) {
%EXEC { /QSYS.LIB/NETDATA.LIB/MYPGM.PGM %}
%}
Im obigen Beispiel übergibt die Direktaufrufsprachumgebung drei Parameter, eine Zeichenvariable, eine ganze Zahl und eine gepackte Dezimalvariable an das Programm MYPGM. Sie können bis zu 50 Parameter an das aufgerufene Programm übergeben. Nur mit Datentypen angegebene Parameter werden an das Programm übergeben. Die Direktaufrufsprachumgebung setzt die dem Parameter entsprechende Zeichenfolge in die interne Darstellung des Datentyps um. Die Sprachumgebung übergibt dann Zeiger auf die interne Darstellung der Variablen an das aufgerufene Programm, und zwar in der in der Funktionsdefinition angegebenen Reihenfolge.
Da Zeiger auf die Variablen an das Programm übergeben werden, kann das Programm den Wert der Variablen ändern. Es werden jedoch nur die vom Programm geänderten OUT- oder INOUT-Variablen an das Makro zurückgemeldet, das die Sprachumgebung aufgerufen hat.
Tabelle 4 listet die von der Direktaufrufsprachumgebung unterstützten
Datentypen auf. Nicht alle Datentypen werden von jeder höheren
Programmiersprache unterstützt.
Tabelle 4. Datentypen für Direktaufruf
| Datentyp | Hinweise |
|---|---|
|
CHAR(n) CHARACTER(n) CHARACTER | Eine Zeichenfolge. Wenn n angegeben wird, muß die Zeichenfolge größer als Null sein. Wenn die Zeichenfolge nicht angegeben wird, wird davon ausgegangen, daß sie ein Zeichen ist. Da alle von der Direktaufrufsprachumgebung übergebenen Zeichenfolgen auf Null enden, ordnet die Sprachumgebung n+1 Byte zu (1 Byte für das Nullabschlußzeichen). Zeichenfolgen, die n überschreiten, werden abgeschnitten. |
| VARCHAR(n) | Eine Zeichenfolge variabler Länge, wobei n größer als Null und kleiner-gleich 32740 ist. Die Zeichenfolge endet auf Null, und die Sprachumgebung ordnet n+2+1 Byte zu (2 Byte zum Speichern der Zeichenfolgelänge, 1 Byte für das Nullabschlußzeichen). Zeichenfolgen, die n überschreiten, werden abgeschnitten. Die ersten beiden Byte der Zeichenfolge enthalten die Zeichenfolgelänge (binärer Wert). Wenn der Parameter als OUT definiert ist (nur Ausgabe), wird die Zeichenfolgelänge auf Null gesetzt, bevor die Variable an das aufgerufene Programm übergeben wird. |
|
INTEGER INT | Eine binäre Ganzzahl mit Vorzeichen, 4 Byte lang |
| SMALLINT | Eine binäre Ganzzahl mit Vorzeichen, 2 Byte lang |
| FLOAT(p,s) | Eine Gleitkommazahl einfacher Genauigkeit oder doppelter Genauigkeit. Bei einfacher Genauigkeit muß p größer als 0 und kleiner als 25 sein. Bei doppelter Genauigkeit muß p größer als 24 und kleiner als 54 sein. Die Genauigkeit (p) und die Anzahl der Kommastellen (s) werden nur beim Umsetzen von Daten in ein anzeigbares Format verwendet, z. B. in eine Zeichenfolge. |
| REAL(p,s) | Eine Gleitkommazahl einfacher Genauigkeit. p muß größer als 0 und kleiner als 25 sein. Die Genauigkeit (p) und die Anzahl der Kommastellen (s) werden nur beim Umsetzen von Daten in ein anzeigbares Format verwendet, z. B. in eine Zeichenfolge. |
|
DOUBLE (p,s) DOUBLEPRECISION(p,s) | Eine Gleitkommazahl doppelter Genauigkeit. p muß größer als 0 und kleiner als 53 sein. Die Genauigkeit (p) und die Anzahl der Kommastellen (s) werden nur beim Umsetzen von Daten in ein anzeigbares Format verwendet, z. B. in eine Zeichenfolge. |
| NUMERIC(p,s) | Eine gezonte Dezimalzahl mit Genauigkeit (p) und Anzahl der Kommastellen (s). Der Wert von p muß größer als 0 und kleiner als 32 sein. |
|
DEC(p,s) DECIMAL(p,s) | Eine gepackte Dezimalzahl mit Genauigkeit (p) und Anzahl der Kommastellen (s). Der Wert von p muß größer als 0 und kleiner als 32 sein. |
| DTWTABLE | Ein spezieller Datentyp zum Übergeben einer Net.Data-Tabelle an das aufgerufene Programm. Die Direktaufrufsprachumgebung übergibt einen Zeiger auf die Tabelle, der mit den Tabellenfunktionen der Net.Data-Sprachumgebungsschnittstelle bearbeitet werden kann. |
Numerisch definierte Parameter können das Währungssymbol und dreistellige Trennzeichen enthalten. Die Direktaufrufsprachumgebung entfernt das Währungssymbol und die dreistelligen Trennzeichen beim Umsetzen einer numerischen Variable vom Zeichenfolgeformat in das interne Format, bevor die Variable an das Programm übergeben wird. Net.Data ruft das Währungssymbol, das Dezimalformat und die dreistelligen Trennzeichen aus den Prozeßattributen des Prozesses ab, in dem Net.Data ausgeführt wird.
Wenn DTW_PAD_PGM_PARMS in der Konfigurationsdatei oder im Makro auf NO gesetzt wird, übergibt die Direktaufrufsprachumgebung Zeichenfolgewerte mit einem Nullabschlußzeichen (Wert x'00') an Ihr Programm. Daher müssen Sie Code zum Verarbeiten der Zeichenfolge schreiben (außer wenn Sie C oder C++ verwenden, die auf Null endende Zeichenfolgen erwarten).
Wenn Sie z. B. das Parameterfeld als CHAR(10) definieren, aber einen Zeichenfolgewert übergeben, der 5 Byte lang ist, stellt Net.Data das Nullabschlußzeichen hinter das fünfte Byte. Die Übergabe des Werts "12345" als Zeichenfolge in einem Feld mit CHAR(10) ergibt folgendes:
x'F1F2F3F4F500........'
Die Byte nach dem Nullabschlußzeichen sind nicht definiert (Sie können nicht davon ausgehen, daß die Byte Null oder Leerzeichen sind).
Da die Zeichenfolge auf Null endet und nicht initialisierte Byte nach dem Nullabschlußzeichen enthält, können Sie die Zeichenfolge nicht in einem RPG- oder COBOL-Programm verwenden. Wenn Sie z. B. die Zeichenfolge in einer Vergleichsoperation verwenden, gibt die Operation keine gültigen Ergebnisse aus. Das Programm erwartet nicht, daß die Zeichenfolge das Nullabschlußzeichen enthält, sondern erwartet vielmehr, daß die Zeichenfolge am Ende mit Leerzeichen aufgefüllt ist.
Sie können mit den Zeichenfolgebearbeitungsfunktionen in Ihrem Programm den Zeichenfolgewert extrahieren oder den Datentyp VARCHAR verwenden. Durch diese Methode erhalten Sie die Länge der Zeichenfolge in den ersten beiden Byte.
Wenn DTW_PAD_PGM_PARMS in der Konfigurationsdatei oder im Makro auf YES gesetzt wird, übergibt die Direktaufrufsprachumgebung Zeichenfolgewerte an Ihr Programm. Dabei sind die Werte nach rechts bis zur Genauigkeitslänge mit Leerzeichen aufgefüllt. Wenn Sie das gleiche Beispiel wie oben verwenden, DTW_PAD_PGM_PARMS jedoch auf YES setzen, ergibt die Übergabe des Werts "12345" als Zeichenfolge in einem Feld mit CHAR(10) folgendes:
x'F1F2F3F4F5404040404000'
Da die Zeichenfolge die Länge 5 hat, die kleiner ist als die angegebene Genauigkeit, werden nach dem Wert bis zur Genauigkeitslänge Leerzeichen eingefügt. In Sprachen wie RPG geschriebene Programme können jetzt den Parameter verwenden, ohne daß sie auf Null endende Zeichenfolgen handhaben müssen.
In der folgenden Liste werden Fehler beschrieben, die auftreten können, wenn über die Direktaufrufsprachumgebung Programme aufgerufen und Parameter an das Programm übergeben werden. Es werden auch Tips zum Vermeiden dieser Fehler aufgeführt.