Verwenden Sie zum Definieren eigener Funktionen im Makro einen FUNCTION-Block oder einen MACRO_FUNCTION-Block:
Syntax: Verwenden Sie die folgende Syntax zur Definition von Funktionen:
FUNCTION-Block:
%FUNCTION(type) function-name([usage] [datatype] parameter, ...) [RETURNS(return-var)] {
executable-statements
[report-block]
...
[report-block]
[message-block]
%}
MACRO_FUNCTION-Block:
%MACRO_FUNCTION function-name([usage] parameter, ...) [RETURNS(return-var)] {
executable-statements
report-block
...
report-block
%}
Dabei gilt folgendes:
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 die Funktion aufruft, werden alle gleichnamigen FUNCTION-Blöcke bzw. gleichnamigen MACRO_FUNCTION-Blöcke in der Reihenfolge ausgeführt, in der sie im Net.Data-Makro definiert sind.
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 in Ausführbare Variablen.
Bei MACRO_FUNCTION-Blöcken sind die ausführbaren Anweisungen eine Kombination aus Text und Net.Data-Makrosprachkonstrukten. In diesem Fall spielt die Sprachumgebung keine Rolle, weil Net.Data als Programmiersprachenprozessor fungiert und die ausführbaren Anweisungen verarbeitet.
Definieren Sie Funktionen außerhalb eines anderen Blocks und bevor diese im Net.Data-Makro aufgerufen werden.
Wenn Zeichen, die der Syntax der Net.Data-Sprachkonstrukte entsprechen, in 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:
%FUNCTION(DTW_PERL) func() {
%EXEC{ func.prl %}
%}
%define percent_openbrace = "%{"
%FUNCTION(DTW_PERL) func() {
...
for $num_words (sort by number keys $(percent_openbrace) $Rtitles{$num} } {
&make_links($Rtitles{$num}{$num_words});
}
...
%}
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. Beim Verarbeiten einer Nachricht setzt Net.Data die Sprachumgebungsvariable RETURN_CODE für jeden Funktionsaufruf auf einen FUNCTION-Block. RETURN_CODE wird bei einem Funktionsaufruf nicht auf einen MACRO_FUNCTION-Block gesetzt.
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:
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:
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