Net.Data generiert HTML- oder XML-Dokumente, die eine Client-Anwendung, z. B. ein Web-Browser, verwenden soll, dynamisch. Die folgenden Abschnitte beschreiben die verschiedenen Konstrukte, mit denen Sie Dokumente mit Net.Data-Makros formatieren können. Informationen zur spezifischen Syntax finden Sie im Kapitel über die Sprachkonstrukte im Handbuch Net.Data Reference.
Die Client-Anwendung ruft Net.Data auf, indem sie den Makronamen und den Namen eines Makroeingangspunkts angibt. Der Eingangspunkt für das Makro kann ein HTML- oder ein XML-Block sein. Diese Blöcke enthalten die Net.Data-Sprach- und -Textdarstellungsanweisungen, die die resultierende Seite generieren.
Da der Eingangspunktblock die Ausführung des Makros steuert, muss mindestens ein Eingangspunkt in einem Makro enthalten sein. Es können mehrere HTML- oder XML-Blöcke vorhanden sein. Es wird jedoch nur einer pro Client-Anforderung ausgeführt. Und mit jeder Anforderung wird ein einzelnes Dokument an den Client geliefert. Wenn Sie eine Anwendung erstellen möchten, die aus mehreren Client-Dokumenten besteht, können Sie Net.Data mehrfach aufrufen, um verschiedene HTML- oder XML-Blöcke in verschiedenen Makros mit normalen Navigationsverfahren, wie z. B. Verbindungen (Links) und Formularen, zu verarbeiten.
Jede Textdarstellungsanweisung kann in einem HTML- oder XML-Block erscheinen, solange die Anweisungen für den Client gültig sind. HTML-Blöcke können beispielsweise HTML oder JavaScript enthalten. JavaScript wird nicht von Net.Data ausgeführt, sondern mit dem Rest der Ausgabe zur Ausführung und Anzeige an den Client gesendet. In einen HTML- oder XML-Block können Sie auch Funktionsaufrufe, Variablenverweise und INCLUDE-Anweisungen einfügen. Das folgende Beispiel zeigt eine gängige Verwendung eines HTML-Blocks in einem Net.Data-Makro:
%HTML(input){ <h1>Hardware Query Form</h1> <hr/> <form method="post" action="report"> <dl> </dt>What hardware do you want to list? <dd><input type="radio" name="hdware" value="MON" checked />Monitors</ddl> <dd><input type="radio" name="hdware" value="PNT" />Pointing devices</ddl> <dd><input type="radio" name="hdware" value="PRT" />Printers</ddl> <dd><input type="radio" name="hdware" value="SCN" />Scanners</ddl> </dl> <hr /> <input type="submit" value="Submit" /> </form> %} %FUNCTION(DTW_SQL) myQuery(){ SELECT MODNO, COST, DESCRIP FROM EQPTABLE WHERE TYPE='$(hardware)' %REPORT{ <b>Here is the list you requested:</b><br /> %ROW{ <hr /> $(N1): $(V1) $(N2): $(V2) </p> $(V3) %} %} %} %HTML(report){ @myQuery() %}
Sie können das Net.Data-Makro über eine HTML-Verbindung aufrufen.
<a href="http://www.ibm.com/cgi-bin/db2www/equiplst.dtw/input"> List of hardware</a>
Wenn der Anwendungsbenutzer diese Verbindung (Link) anklickt, ruft der Web-Browser Net.Data auf, und Net.Data analysiert das Makro. Wenn Net.Data mit der Verarbeitung des im Aufruf angegebenen HTML-Blocks, in diesem Fall input, beginnt, fängt Net.Data an, den Text innerhalb des Blocks zu verarbeiten. Alles, was Net.Data nicht als Net.Data-Makrosprachkonstrukt erkennt, wird zum Anzeigen an den Browser gesendet.
Wenn der Benutzer eine Auswahl getroffen und den Knopf zur Übergabe (Submit) angeklickt hat, fordert der Client die im Aktionsattribut des HTML-Formulars angegebene Aktion an. Diese Aktion gibt einen Aufruf des HTML-Blocks output des Makros an. Net.Data verarbeitet dann den HTML-Block output wie den HTML-Block input.
Anschließend verarbeitet Net.Data den Funktionsaufruf myQuery(), der wiederum den Block FUNCTION der SQL-Sprachumgebung aufruft. Nachdem der Variablenverweis $(hdware) in der SQL-Anweisung durch den vom Eingabeformular zurückgegebenen Wert ersetzt wurde, führt Net.Data die Abfrage aus. An dieser Stelle nimmt Net.Data die Verarbeitung des Berichts wieder auf, der die Ergebnisse der Abfrage gemäß den im REPORT-Block definierten Textdarstellungsanweisungen anzeigt.
Nachdem Net.Data die Verarbeitung des REPORT-Blocks abgeschlossen hat, kehrt es zum HTML-Block output zurück und beendet die Verarbeitung.
Das Sprachkonstrukt des REPORT-Blocks dient zum Formatieren und Anzeigen der Datenausgabe eines FUNCTION-Blocks. Diese Ausgabe besteht in der Regel aus Tabellendaten, obwohl jede gültige Kombination aus Text, Makrovariablenverweisen und Funktionsaufrufen angegeben werden kann. Optional kann im REPORT-Block ein Tabellenname angegeben werden. Mit Ausnahme der SQL- und ODBC-Sprachumgebungen gilt Folgendes: Wenn kein Tabellenname angegeben wird, verwendet Net.Data die Tabellendaten aus der ersten Ausgabetabelle in der FUNCTION-Parameterliste.
Der REPORT-Block besteht aus drei Teilen, die jeweils optional sind:
Beispiel:
%REPORT{ <h2>Query Results</h2> <p>Select a name for details. <table border=1> <tr> <td>Name</td> <td>Location</td></tr> %ROW{ <tr> <td> <a href="/cgi-bin/db2www/name.dtw/details?name=$(V1)&loc=$(V2)">$(V1)</a> </td> <td>$(V2)</td> </tr> %} </table> %}
Halten Sie die folgenden Richtlinien ein, wenn Sie REPORT-Blöcke erstellen:
SHIPDATE | RECDATE | SHIPNO | ------------------------------------- 25/05/1997 | 30/05/1997 | 1495194B | ------------------------------------- 25/05/1997 | 28/05/1997 | 2942821G | -------------------------------------
%REPORT{%}
Das folgende Beispiel zeigt, wie Sie Berichtsformate mit Hilfe spezieller Variablen und HTML-Befehle anpassen können. Es werden die Namen, Telefonnummern und Faxnummern aus der Tabelle CustomerTbl angezeigt:
%DEFINE SET_TOTAL_ROWS="YES" ... %FUNCTION(DTW_SQL) custlist() { SELECT Name, Phone, Fax FROM CustomerTbl %REPORT{ <i>Phone Query Results:</i> <br /> ===================== <br /> %ROW{ Name: <b>$(V1)</b> <br /> Phone: $(V2) <br /> Fax: $(V3) <br /> ------------------------------ <br /> %} Total records retrieved: $(TOTAL_ROWS) %} %}
Der hieraus erstellte Bericht sieht im Web-Browser wie folgt aus:
Phone Query Results: ==================== Name: Doen, David Phone: 422-245-1293 Fax: 422-245-7383 ------------------------------ Name: Ramirez, Paolo Phone: 955-768-3489 Fax: 955-768-3974 ------------------------------ Name: Wu, Jianli Phone: 525-472-1234 Fax: 525-472-1234 ------------------------------ Total records retrieved: 3
Der Bericht wurde von Net.Data wie folgt generiert:
Sie können mehrere REPORT-Blöcke in einem einzelnen FUNCTION- oder MACRO FUNCTION-Block angeben, um mehrere Berichte mit einem Funktionsaufruf zu generieren.
In der Regel werden mehrere REPORT-Blöcke in der Sprachumgebung DTW_SQL mit einer Funktion verwendet, die eine gespeicherte Prozedur aufruft, die mehrere Ergebnismengen zurückgibt (siehe Gespeicherte Prozeduren). Mehrere REPORT-Blöcke können jedoch in jeder Sprachumgebung verwendet werden, um mehrere Berichte zu erstellen.
Stellen Sie zur Verwendung mehrerer REPORT-Blöcke für jede Ergebnismenge einen Ergebnismengennamen in die Anweisung CALL der gespeicherten Prozedur. Wenn mehr Ergebnismengen von der gespeicherten Prozedur zurückgegeben werden als Sie REPORT-Blöcke angegeben haben und wenn die Angabe der integrierten Net.Data-Funktion DTW_DEFAULT_REPORT = "MULTIPLE" ist, werden Standardberichte für jede Tabelle definiert, die keinem REPORT-Block zugeordnet ist. Wenn keine REPORT-Blöcke angegeben sind und DTW_DEFAULT_REPORT = "YES" ist, wird nur ein Standardbericht generiert. Beachten Sie, dass der Wert "YES" für DTW_DEFAULT_REPORT nur in der SQL-Sprachumgebung dem Wert "MULTIPLE" entspricht.
Die folgenden Beispiele zeigen, wie Sie mehrere REPORT-Blöcke verwenden können.
Gehen Sie wie folgt vor, um mehrere Berichte mit den Standardberichtsformaten anzuzeigen:
Beispiel 1: Sprachumgebung DTW_SQL
%DEFINE DTW_DEFAULT_REPORT = "MULTIPLE" %FUNCTION(dtw_sql) myStoredProc () { CALL myproc (table1, table2) %}
In diesem Beispiel gibt die gespeicherte Prozedur myproc zwei Ergebnismengen zurück, die in table1 und table2 gestellt werden. Weil keine REPORT-Blöcke angegeben sind, werden Standardberichte für beide Tabellen angezeigt, zuerst für table1 und dann für table2.
Beispiel 2: MACRO_FUNCTION-Block. In diesem Beispiel werden zwei Tabellen an den MACRO_FUNCTION-Block übergeben. Wenn DTW_DEFAULT_REPORT="MULTIPLE" angegeben wird, generiert Net.Data Berichte für beide Tabellen.
%DEFINE DTW_DEFAULT_REPORT = "MULTIPLE" %MACRO_FUNCTION multReport (INOUT tablename1, tablename2) { %}
In diesem Beispiel werden zwei Tabellen an die MACRO_FUNCTION-Funktion multReport übergeben. Net.Data zeigt wiederum Standardberichte für die zwei Tabellen in der Reihenfolge an, in der sie in der Parameterliste des MACRO FUNCTION-Blocks erscheinen: zuerst für table1 und dann für table2.
Beispiel 3: Sprachumgebung DTW_REXX
%DEFINE DTW_DEFAULT_REPORT = "YES" %FUNCTION (dtw_rexx) multReport (INOUT table1, table2) { SAY 'Generating multiple default reports...<br />' %}
In diesem Beispiel werden zwei Tabellen an die REXX-Funktion multReport übergeben. Da DTW_DEFAULT_REPORT="YES" angegeben ist, zeigt Net.Data nur für die erste Tabelle einen Standardbericht an.
Gehen Sie wie folgt vor, um mehrere Berichte durch Angabe von REPORT-Blöcken zur Anzeigeverarbeitung anzuzeigen:
Beispiel 1: Benannte REPORT-Blöcke
%FUNCTION(dtw_sql) myStoredProc () { CALL myproc (table1, table2) %REPORT(table2) { ... %ROW { .... %} ... %} %REPORT(table1) { ... %row { .... %} ... %} %}
In diesem Beispiel wurden REPORT-Blöcke für beide der in der Parameterliste des FUNCTION-Blocks angegebenen Tabellen angegeben. Die Tabellen werden in der Reihenfolge angezeigt, in der sie in den REPORT-Blöcken angegeben sind: table2 zuerst und dann table1. Durch Angabe eines Tabellennamens in den REPORT-Blöcken und in der Anweisung CALL können Sie die Reihenfolge steuern, in der die Berichte angezeigt werden.
Beispiel 2: Nicht benannte REPORT-Blöcke
%FUNCTION(dtw_sql) myStoredProc () { CALL myproc %REPORT { ... %ROW { .... %} ... %} %REPORT { ... %ROW { .... %} ... %} %}
In diesem Beispiel wurden REPORT-Blöcke für zwei von myproc zurückgegebene Ergebnismengen angegeben. Da keine Tabellennamen in den REPORT-Blöcken angegeben sind, werden die REPORT-Blöcke für die ersten beiden Ergebnismengen in der Reihenfolge ausgeführt, in der sie von der gespeicherten Prozedur zurückgegeben werden.
Gehen Sie wie folgt vor, um mehrere Berichte mit einer Kombination aus Standardberichten und REPORT-Blöcken anzuzeigen:
Beispiel: Eine Kombination aus Standardberichten und REPORT-Blöcken
%DEFINE DTW_DEFAULT_REPORT = "MULTIPLE" %FUNCTION(dtw_system) editTables (INOUT table1, table2, table3) { %REPORT(table2) { ... %ROW { .... %} ... %} %}
In diesem Beispiel ist nur ein REPORT-Block angegeben. Da der Block table2 angibt und table2 die zweite in der Anweisung CALL aufgelistete Ergebnismenge ist, wird die zweite Ergebnismenge zum Anzeigen des Berichts verwendet. Da weniger REPORT-Blöcke angegeben sind als Ergebnismengen von der gespeicherten Prozedur übergeben werden, werden Standardberichte für die restlichen Ergebnismengen in der folgenden Reihenfolge angezeigt: zuerst ein Standardbericht für die erste Ergebnismenge table1 und dann ein Standardbericht für die dritte Ergebnismenge table3. Es ist eine Ausgabetabelle angegeben, table1, die zur späteren Verarbeitung im Makro verwendet werden kann.
Beachten Sie die folgenden Richtlinien und Einschränkungen für die Angabe mehrerer REPORT-Blöcke in einem FUNCTION- oder MACRO_FUNCTION-Block.
Richtlinien:
Einschränkungen: