Net.Data stellt integrierte Funktionen zur Verwendung in Ihren Anwendungen bereit, wie Funktionen zur Wort- und Zeichenfolgebearbeitung und Funktionen, mit denen Tabellenvariablenfunktionen abgerufen und festgelegt werden. Sie können auch Funktionen zur Verwendung mit Ihrer Anwendung definieren, z. B. zum Aufrufen eines externen Programms oder einer gespeicherten Prozedur.
In diesen Abschnitten werden die folgenden Themen beschrieben:
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, ...) { 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 dass sie gleichzeitig verarbeitet werden. Jeder der Blöcke musseine 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 dass 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, dass 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 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. Wenn der MESSAGE-Block jedoch in einem FUNCTION-Block definiert ist, ist sein Geltungsbereich für diesen FUNCTION-Block lokal (mit Ausnahme von integrierten Net.Data-Funktionen, deren Fehler durch globale MESSAGE-Blöcke bearbeitet werden).
Net.Data verwendet die folgenden Regeln zur Verarbeitung des Werts der Variablen RETURN_CODE oder SQL_STATE 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.cmd %} %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
Verwenden Sie eine Net.Data-Funktionsaufrufanweisung, um benutzerdefinierte oder integrierte Funktionen aufzurufen. Verwenden Sie das kommerzielle A (@), gefolgt von einem Funktionsnamen bzw. Makrofunktionsnamen:
@function_name([ argument,... ])
Zeichenfolgen in Anführungszeichen als Argumente können Variablenverweise und Funktionsaufrufe enthalten.
Beispiel 1: Funktionsaufruf mit einem Zeichenfolgeargument
@myFunction("abc")
Beispiel 2: Funktionsaufruf mit einer Variablen und Funktionsaufrufargumenten
@myFunction(myvar, @DTW_rADD("2","3"))
Beispiel 3: Funktionsaufruf mit einem Zeichenfolgeargument, das einen Variablenverweis und einen Funktionsaufruf enthält
@myFunction("abc$(myvar)def@DTW_rADD("2","3")ghi")
Net.Data verfügt über zahlreiche integrierte Funktionen, die die Entwicklung von Webseiten vereinfachen. Diese Funktionen sind von Net.Data bereits definiert, d. h. Sie brauchen sie nicht mehr zu definieren. Sie können diese Funktionen so wie andere Funktionen aufrufen.
Abbildung 23 zeigt die Interaktion zwischen den integrierten Net.Data-Funktionen und dem Makro.
Abbildung 23. In Net.Data integrierte Funktionen
Es gibt drei Methoden, mit denen integrierte Funktionen ihre Ergebnisse zurückgeben können. Dies hängt vom Präfix ab.
Einige integrierte Funktionen unterstützen nicht jede Art. Wenn Sie ermitteln möchten, um welche Art es sich bei einer bestimmten integrierten Funktion handelt, ziehen Sie das Kapitel zu den integrierten Net.Data-Funktionen im Handbuch Net.Data Reference zu Rate.
In den folgenden Abschnitten wird eine allgemeine Übersicht über die integrierten Net.Data-Funktionen gegeben. Mit diesen Funktionen können Sie allgemeine und mathematische Funktionen sowie Zeichenfolge-, Wort- bzw. Tabellenbearbeitungsfunktionen ausführen. Für einige dieser Funktionen müssen Variablen definiert werden, bevor sie verwendet werden können, oder sie müssen in einem spezifischen Kontext verwendet werden. Beschreibungen der einzelnen Funktionen mit Syntax und Beispielen finden Sie im Handbuch Net.Data Reference.
Mit Hilfe dieser Gruppe von Funktionen können Sie Webseiten durch Ändern von Daten oder Zugreifen auf Systemservices entwickeln. Damit können Sie E-Mail senden, HTTP-Cookies verarbeiten, HTML-Escape-Codes generieren und andere nützliche Informationen vom System abrufen.
Sie verwenden zum Beispiel die Funktion DTW_EXIT, um festzulegen, dass Net.Data ein Makro verlassen soll, ohne die restlichen Anweisungen des Makros zu verarbeiten, wenn eine bestimmte Bedingung eintritt:
%HTML(sort_page) { <html> <head> <title>This is the page title</title> </head> <body> <center> <h3>This is the Main Heading</h3> <!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!> <! Joe Smith sees a very short page !> <!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!> %IF (customer == "Joe Smith") </body> </html> @DTW_EXIT() %ENDIF ... </body> </html> %}
Eine weitere nützliche Funktion ist die Funktion DTW_URLESCSEQ, die Zeichen, die in einer URL-Adresse nicht zulässig sind, durch die entsprechenden Escape-Werte ersetzt. Wenn beispielsweise die Eingabevariable string1 den Inhalt "Guys & Dolls" hat, ordnet DTW_URLESCSEQ die Ausgabevariable dem Wert "Guys%20%26%20Dolls" zu.
Diese Funktionen führen mathematische Operationen aus, über die Sie numerische Daten berechnen und ändern können. Neben den mathematischen Standardoperationen können auch Modulus-Divisionen ausgeführt, eine Ergebnisgenauigkeit angegeben und Exponentialschreibweise verwendet werden.
Zum Beispiel potenziert die Funktion DTW_POWER den Wert des ersten Parameters mit dem Wert des zweiten Parameters und gibt das Ergebnis zurück. Siehe dazu das folgende Beispiel:
@DTW_POWER("2", "-3", result)
DTW_POWER gibt ".125" in der Variablen result zurück.
Diese Funktionen können zum Bearbeiten von Zeichen in Zeichenfolgen verwendet werden. So können Sie zum Beispiel eine Zeichenfolge von Klein- in Großschreibung (oder umgekehrt) umsetzen, Zeichen einfügen oder löschen, einen Zeichenfolgewert einer anderen Variablen zuordnen und noch andere nützliche Funktionen ausführen.
Zum Beispiel können Sie DTW_ASSIGN verwenden, um einen Wert zuzuordnen oder den Wert einer Variablen zu ändern. Im folgenden Beispiel wird der Variablen RC der Wert Null zugeordnet.
@DTW_ASSIGN(RC, "0")
Weitere Zeichenfolgefunktionen sind DTW_CONCAT zum Verknüpfen von Zeichenfolgen und DTW_INSERT zum Einfügen von Zeichenfolgen an einer bestimmten Position sowie viele andere Funktionen zum Bearbeiten von Zeichenfolgen.
Diese Funktionen können zum Bearbeiten von Wörtern in Zeichenfolgen verwendet werden. Die meisten dieser Funktionen arbeiten auf ähnliche Weise wie Zeichenfolgefunktionen, jedoch bezogen auf ganze Wörter. Hiermit können Sie zum Beispiel die Anzahl der Wörter in einer Zeichenfolge zählen, Wörter entfernen oder nach einem Wort in einer Zeichenfolge suchen.
Verwenden Sie beispielsweise DTW_DELW0RD, um eine bestimmte Anzahl von Wörtern aus einer Zeichenfolge zu löschen:
@DTW_DELWORD("Now is the time", "2", "2", result)
DTW_DELWORD gibt die Zeichenfolge "Now time" zurück.
Weitere Wortfunktionen sind DTW_WORDLENGTH (gibt die Anzahl der Zeichen in einem Wort zurück) und DTW_WORDPOS (gibt die Position eines Worts in einer Zeichenfolge zurück).
Diese Funktionen können zum Generieren von Berichten oder Formularen mit Hilfe der Daten in einer Net.Data-Tabellenvariable verwendet werden. Mit diesen Funktionen können Sie auch Net.Data-Tabellen erstellen sowie Werte in diesen Tabellen bearbeiten und abrufen. Tabellenvariablen enthalten eine Gruppe von Werten und ihre zugehörigen Spaltennamen. Sie bieten eine bequeme Möglichkeit, ganze Wertegruppen an eine Funktion weiterzugeben.
Zum Beispiel fügt DTW_TB_APPENDROW eine Zeile an die Tabelle an. Im folgenden Beispiel fügt Net.Data zehn Zeilen an die Tabelle myTable an:
@DTW_TB_APPENDROW(myTable, "10")
Außerdem gibt DTW_TB_DUMPH den Inhalt einer Makrotabellenvariablen zurück, die in die Befehle <pre></pre> eingeschlossen ist, wobei jede Zeile der Tabelle in einer anderen Zeile angezeigt wird. DTW_TB_CHECKBOX gibt mindestens einen HTML-Markierungsfeldeingabefehl aus einer Makrotabellenvariablen zurück.
Die FFI-Schnittstelle (Flat File Interface - Schnittstelle für unstrukturierte Textdateien) kann zum Öffnen, Lesen und Bearbeiten von Daten aus unstrukturierten Textdateiquellen (Textdateien) sowie zum Speichern von Daten in unstrukturierte Textdateien verwendet werden.
Zum Beispiel schreibt DTWF_APPEND den Inhalt einer Tabellenvariablen an das Ende einer Datei, und DTWF_DELETE löscht Sätze aus einer Datei.
Außerdem unterstützen die FFI-Funktionen Dateisperren mit DTWF_CLOSE und DTWF_OPEN. DTWF_OPEN sperrt eine Datei, damit sie eine andere Anforderung weder lesen noch aktualisieren kann. DTWF_CLOSE gibt die Datei frei, wenn Net.Data sie nicht länger benötigt, damit andere Anforderungen auf die Datei zugreifen können.
Mit Hilfe der Java-Applet-Funktionen können Sie <applet>- und <parm>-Befehle auf der Grundlage von Net.Data-Variablen auf einfache Weise für Ihre Webseite generieren.
Wenn Sie beispielsweise über das Applet myApplet verfügen und einige Parameter an das Applet übergeben wollen (einschließlich einer Tabellenvariablen), könnten Sie Folgendes angeben:
%define REMOTE_USER = %ENVVAR %define myTable = %TABLE(all) ... %HTML(report){ ... @DTWA_myApplet(REMOTE_USER, myTable) ... %}
Hierdurch wird Net.Data angewiesen, für jeden Wert in der Tabelle und für den Wert der Umgebungsvariablen REMOTE_USER einen Befehl <applet> und <parm> zu generieren.
Außerdem können Sie eine einzelne Spalte der Tabelle übergeben. Beispiel:
@DTWA_myApplet(REMOTE_USER, DTW_COLUMN(mycol)myTable)
Dieses Beispiel übergibt die Spalte mycol der Net.Data-Tabellenvariablen myTable.
Die Funktionen für Webregistrierungsdatenbanken können zum Verwalten der registrierungsdatenbanken und der darin enthaltenen Einträge verwendet werden. Eine Webregistrierungsdatenbank ist eine Datei mit einem von Net.Data verwalteten Schlüssel, die das einfache Hinzufügen, Abrufen und Löschen von Einträgen ermöglicht.
Zum Beispiel fügt DTWR_ADDENTRY Einträge hinzu, während DTWR_DELENTRY Einträge löscht. DTWR_LISTSUB gibt Informationen zu den registrierungsdatenbankeinträgen in einem OUT-Tabellenparameter zurück, und DTWR_UPDATEENTRY ersetzt vorhandene Werte für einen angegebenen registrierungsdatenbankeintrag durch einen neuen Wert.