Net.Data Verwaltung und Programmierung für OS/400


Definieren von benutzerdefinierten Funktionen

Zum Definieren eigener Funktionen in der Makrodatei verwenden Sie einen FUNCTION-Block oder einen MACRO_FUNCTION-Block.

FUNCTION-Block
Definiert eine Unterroutine, die von einem Net.Data-Makro aufgerufen wird und entweder von der Sprachumgebung verarbeitet wird oder ein externes Programm aufruft.

MACRO_FUNCTION-Block
Definiert eine Unterroutine, die von einem Net.Data-Makro aufgerufen wird und von Net.Data, d. h. nicht von einer anderen Sprachumgebung, verarbeitet werden muß. Die Anweisungen im Block müssen Quellenanweisungen der Net.Data-Makrosprache sein.

Der MACRO_FUNCTION-Block ist eine Alternative zum FUNCTION-Block, die die Leistung verbessern kann. Der MACRO_FUNCTION-Block wird nur von Net.Data verarbeitet und ruft keine Sprachumgebung auf. Einzelheiten zu diesen beiden Konstrukten finden Sie im Handbuch Net.Data Reference.

Syntax: Verwenden Sie die folgende Syntax zur Definition von Funktionen:

FUNCTION-Block:

%FUNCTION(art) function-name(usage parameter, ...) [RETURNS(return-var)] {
  executable-statements
  report-block
  ...
  report-block

  message-block
%}

MACRO_FUNCTION-Block:

%MACRO_FUNCTION function-name(usage parameter, ...)  {
  executable-statements
  report-block
  ...
  report-block
   %}

Dabei gilt folgendes:

type
Gibt eine Sprachumgebung an, die in der Initialisierungsdatei konfiguriert wird. Die Sprachumgebung ruft einen speziellen Sprachprozessor auf (der die ausführbaren Anweisungen verarbeitet) und stellt eine Standardschnittstelle zwischen Net.Data und dem Sprachprozessor bereit.

Mit Net.Data werden verschiedene Standardsprachumgebungen bereitgestellt.

function-name
Gibt den Namen des FUNCTION- oder MACRO_FUNCTION-Blocks an. Sie können den FUNCTION-Block oder MACRO_FUNCTION-Block über einen Funktionsaufruf an einer anderen Stelle in der Makrodatei ausführen. Der Funktionsaufruf verweist auf den function-name mit einem vorangestellten kommerziellen A (@). Nähere Informationen finden Sie unter Aufrufen von Funktionen.

Sie können mehrere FUNCTION- oder MACRO_FUNCTION-Blöcke mit dem gleichen Namen definieren, so daß sie gleichzeitig verarbeitet werden. Jeder der Blöcke muß eine identische Parameterliste besitzen. Wenn Net.Data eine Funktion aufruft, werden alle FUNCTION-Blöcke gleichen Namens bzw. MACRO_FUNCTION-Blöcke gleichen Namens in der Reihenfolge ausgeführt, in der sie im Net.Data-Makro definiert sind.

syntax
Gibt an, ob ein Parameter ein Eingabeparameter (IN), ein Ausgabeparameter (OUT) oder beides (INOUT) ist. Diese Angabe bestimmt, ob der Parameter an einen FUNCTION-Block bzw. einen MACRO_FUNCTION-Block übergeben, von ihm empfangen oder sowohl übergeben als auch empfangen wird. Die Verwendungsart gilt für alle nachfolgenden Parameter in der Parameterliste, bis sie durch eine andere Verwendungsart geändert wird. Die Standardart ist IN.

parameter
Der Name einer Variablen mit lokalem Geltungsbereich, die durch den Wert eines entsprechenden in einem Funktionsaufruf angegebenen Arguments ersetzt wird. Parameterverweise, z. B. $(parm1), in den ausführbaren Anweisungen oder REPORT-Blöcken werden durch den tatsächlichen Wert des Parameters ersetzt. Zudem werden die Parameter an die Sprachumgebung übergeben. Ausführbare Anweisungen, die die spezifische Syntax dieser Sprache verwenden, können darauf zugreifen oder sie als Umgebungsvariablen verwenden. Verweise auf Parametervariablen sind außerhalb des FUNCTION-Blocks bzw. MACRO_FUNCTION-Blocks ungültig.

return-var
Geben sie diesen Parameter nach dem Schlüsselwort RETURNS an, um einen speziellen OUT-Parameter zu definieren. Der Wert der Rückkehrvariablen wird dem Funktionsaufruf zugeordnet und ersetzt den Funktionsaufruf bei der Net.Data-Makroverarbeitung. Wenn Sie die Klausel RETURNS nicht angeben, hat der Funktionsaufruf einen der folgenden Werte:

executable-statements
Die Gruppe der Sprachanweisungen, die an die angegebene Sprachumgebung zur Verarbeitung übergeben wird, nachdem die Variablen ersetzt und die Funktionen verarbeitet wurden. executable-statements können Net.Data-Variablenverweise und Net.Data-Funktionsaufrufe enthalten. Vor der Übergabe der ausführbaren Anweisungen an die Sprachumgebung ersetzt Net.Data diese Variablenverweise bzw. Funktionsaufrufe durch die tatsächlichen Werte.

Bei FUNCTION-Blöcken ersetzt Net.Data alle Variablenverweise durch die Variablenwerte, führt alle Funktionsaufrufe aus und ersetzt die Funktionsaufrufe mit den sich jeweils ergebenden Werten, bevor die ausführbaren Anweisungen an die Sprachumgebung übergeben werden. Jede Sprachumgebung verarbeitet die Anweisungen auf andere Weise. Weitere Informationen zur Angabe ausführbarer Anweisungen oder zum Aufrufen ausführbarer Programme finden Sie im Abschnitt Ausführbare Variablen.

Bei MACRO_FUNCTION-Blöcken sind die ausführbaren Anweisungen eine Kombination aus HTML-Anweisungen und Net.Data-Makrosprachkonstrukten. In diesem Fall spielt die Sprachumgebung keine Rolle, da Net.Data als Sprachprozessor fungiert und die ausführbaren Anweisungen auswertet und ausführt.

report-block
Definiert einen oder mehrere REPORT-Blöcke zur Behandlung der Ausgabe des FUNCTION-Blocks. Siehe REPORT-Blöcke.

message-block
Definiert den MESSAGE-Block, der alle vom FUNCTION-Block zurückgemeldeten Nachrichten verarbeitet. Siehe MESSAGE-Blöcke.

Definieren Sie Funktionen in der äußersten Net.Data-Makroebene, bevor diese im Net.Data-Makro aufgerufen werden.

Verwenden von Sonderzeichen in Funktionen

Wenn Zeichen, die der Syntax der Net.Data-Sprachkonstrukte entsprechen, im Abschnitt für die Sprachanweisungen eines FUNCTION-Blocks als Teil eines syntaktisch gültigen, eingebetteten Programmcodes (wie für REXX oder Perl) verwendet werden, können sie fälschlicherweise als Net.Data-Sprachkonstrukte interpretiert werden und so Fehler oder unvorhersehbare Ergebnisse in einem Makro verursachen.

Zum Beispiel könnte eine Perl-Funktion die Begrenzungszeichen für COMMENT-Blöcke (%{) verwenden. Bei der Ausführung des Makros werden die Zeichen %{ als Anfang eines COMMENT-Blocks interpretiert. Net.Data sucht dann nach dem Ende des COMMENT-Blocks, das von Net.Data am Ende des FUNCTION-Blocks erwartet wird. Net.Data sucht dann nach dem Ende des FUNCTION-Blocks und gibt, wenn das Ende nicht gefunden wird, einen Fehler aus.

Mit einer der folgenden Methoden können Sie die Begrenzungszeichen für COMMENT-Blöcke sowie alle anderen Net.Data-Sonderzeichen als Teil Ihres eingebetteten Programmcodes verwenden, ohne daß sie von Net.Data als Sonderzeichen interpretiert werden:

Die folgende Perl-Funktion zum Beispiel enthält als Teil ihrer Perl-Sprachanweisungen Zeichen, die eine COMMENT-Blockbegrenzung, %{, darstellen:

%function(DTW_PERL) func() {
  ...
  for $num_words (sort bynumber keys %{ $Rtitles{$num} }) {
  &make_links($Rtitles{$num}{$num_words});
  }
  ...
 %}

Um sicherzustellen, daß Net.Data die Zeichen %{ als Perl-Quellencode und nicht als eine COMMENT-Blockbegrenzung von Net.Data interpretiert, sollte die Funktion auf eine der folgenden Weisen umgeschrieben werden:

MESSAGE-Blöcke

Anhand des MESSAGE-Blocks können Sie die weitere Vorgehensweise festlegen, nachdem ein Funktionsaufruf erfolgreich ausgeführt wurde bzw. fehlgeschlagen ist, und Informationen für den Aufrufenden der Funktion anzeigen. Net.Data verwendet den folgenden MESSAGE-Blockprozeß:

  1. Net.Data setzt die Variable RETURN_CODE, eine Sprachumgebungsvariable, für jeden Funktionsaufruf an einen FUNCTION-Block. RETURN_CODE wird nicht bei einem Funktionsaufruf an einen MACRO_FUNCTION-Block gesetzt.

  2. Wenn eine Sprachumgebung einen Rückkehrcodewert an Net.Data zurückgibt, setzt Net.Data den Wert von RETURN_CODE auf den Wert des Rückkehrcodes.

  3. Nach Beendigung des Funktionsaufrufs bestimmt der MESSAGE-Block anhand des Werts von RETURN_CODE die weitere Vorgehensweise.

Ein MESSAGE-Block besteht aus einer Reihe von Nachrichtenanweisungen, von denen jede einen Rückkehrcodewert, einen Nachrichtentext und eine durchzuführende Aktion definiert. Die Syntax eines MESSAGE-Blocks wird im Kapitel über die Sprachkonstrukte im Handbuch Net.Data Reference gezeigt.

Ein MESSAGE-Block kann für einen globalen oder lokalen Bereich gelten. Wenn der MESSAGE-Block in einem FUNCTION-Block definiert ist, ist sein Geltungsbereich für diesen FUNCTION-Block lokal. Wenn er in der äußeren Makroebene angegeben wird, hat der MESSAGE-Block einen globalen Geltungsbereich und ist für alle im Net.Data-Makro ausgeführten Funktionsaufrufe aktiv. Wenn Sie mehrere globale MESSAGE-Blöcke definieren, ist der zuletzt definierte Block aktiv.

Net.Data verwendet die folgenden Regeln zur Verarbeitung des Werts der Variablen RETURN_CODE von einem Funktionsaufruf:

  1. Ein lokaler MESSAGE-Block wird auf eine exakte Übereinstimmung hin überprüft, und die Verarbeitung wird je nach Angabe beendet (exit) oder fortgesetzt (continue).

  2. Wenn RETURN_CODE ungleich 0 ist, wird ein lokaler MESSAGE-Block auf +default bzw. -default hin überprüft, und die Verarbeitung wird abhängig vom Vorzeichen von RETURN_CODE je nach Angabe beendet oder fortgesetzt.

  3. Wenn RETURN_CODE ungleich 0 ist, wird ein lokaler MESSAGE-Block auf default hin überprüft, und die Verarbeitung je nach Angabe beendet oder fortgesetzt.

  4. Ein globaler MESSAGE-Block wird auf eine exakte Übereinstimmung hin überprüft, und die Verarbeitung wird je nach Angabe beendet oder fortgesetzt.

  5. Wenn RETURN_CODE ungleich 0 ist, wird ein globaler MESSAGE-Block auf +default bzw. -default hin überprüft, und die Verarbeitung wird abhängig vom Vorzeichen von RETURN_CODE je nach Angabe beendet oder fortgesetzt.

  6. Wenn RETURN_CODE ungleich 0 ist, wird ein globaler MESSAGE-Block auf default hin überprüft, und die Verarbeitung je nach Angabe beendet oder fortgesetzt.

  7. Wenn RETURN_CODE ungleich 0 ist, gibt Net.Data die interne Standardnachricht aus und beendet die Verarbeitung.

Das folgende Beispiel zeigt einen Teil eines Net.Data-Makros mit einem globalen MESSAGE-Block und einem MESSAGE-Block für eine Funktion:

%{ global message block %}
%MESSAGE {
     -100     : "Return code -100 message"   : exit
      100     : "Return code 100 message"    : continue
   +default : {
This is a long message that spans more
than one line. You can use HTML tags, including
links and forms, in this message. %}   : continue
%}

%{ local message block inside a FUNCTION block %}
%FUNCTION(DTW_REXX) my_function() {
  %EXEC { my_command.mbr %}
%MESSAGE {
     -100     : "Return code -100 message"   : exit
      100     : "Return code 100 message"    : continue
     -default : {
This is a long message that spans more
than one line. You can use HTML tags, including
links and forms, in this message. %}   : exit
  %}

Wenn my_function() mit einem RETURN_CODE-Wert von 50 beendet wird, verarbeitet Net.Data den Fehler in folgender Reihenfolge:

  1. Es wird überprüft, ob es eine exakte Übereinstimmung im lokalen MESSAGE-Block vorhanden ist.

  2. Es wird überprüft, ob +default im lokalen MESSAGE-Block vorhanden ist.

  3. Es wird überprüft, ob default im lokalen MESSAGE-Block vorhanden ist.

  4. Es wird überprüft, ob eine exakte Übereinstimmung im globalen MESSAGE-Block vorhanden ist.

  5. Es wird überprüft, ob +default im globalen MESSAGE-Block vorhanden ist.

Wird eine Übereinstimmung gefunden, sendet Net.Data den Nachrichtentext an den Web-Browser und überprüft die angeforderte Aktion.

Wenn Sie continue angeben, setzt Net.Data die Verarbeitung des Net.Data-Makros fort, nachdem der Nachrichtentext angezeigt wurde. Angenommen, ein Makro ruft my_functions() fünf Mal auf und bei der Verarbeitung mit dem MESSAGE-Block aus obigem Beispiel wird der Fehler 100 gefunden. In diesem Fall könnte die Ausgabe des Programms folgendermaßen aussehen:

.
.
.
11 May 1997                  $245.45
13 May 1997                  $623.23
19 May 1997                  $ 83.02
   return code 100 message
22 May 1997                  $ 42.67

Total:                            $994.37


[ Seitenanfang | Vorherige Seite | Nächste Seite | Inhaltsverzeichnis | Index ]