Net.Data ermöglicht Ihnen, bedingte Logik und Schleifen in Ihr Net.Data-Makro mit Hilfe von IF- und WHILE-Blöcken zu integrieren.
IF- und WHILE-Blöcke verwenden eine Bedingungsliste, mit der Sie mindestens eine Bedingung testen können. Anschließend können Sie auf der Grundlage des Ergebnisses des Bedingungstests einen Block von Anweisungen ausführen. Die Bedingungsliste enthält logische Operatoren, wie = und <=, und Terme, die sich aus Zeichenfolgen in Anführungszeichen, Variablen, Variablenverweisen und Funktionsaufrufen zusammensetzen. Zeichenfolgen in Anführungszeichen können zudem Variablenverweise und Funktionsaufrufe enthalten. Sie können die Bedingungsliste verschachteln.
In den folgenden Abschnitten wird die Verwendung der bedingten Logik und von Schleifen beschrieben:
Mit Hilfe des IF-Blocks können Sie in einem Net.Data-Makro eine bedingte Verarbeitung durchführen. Der IF-Block ist den IF-Anweisungen der meisten höheren Programmiersprachen ähnlich, weil er die Möglichkeit bietet, mindestens eine Bedingung zu testen und anschließend auf der Grundlage des Ergebnisses des Bedingungstests einen Block von Anweisungen auszuführen.
Sie können IF-Blöcke fast überall in einem Makro verwenden und verschachteln. Die Syntax eines IF-Blocks wird im Kapitel über die Sprachkonstrukte im Handbuch Net.Data Reference dargestellt.
Regeln für IF-Block: Die Syntaxregeln für einen IF-Block werden durch die Position des Blocks im Makro bestimmt. Die Elemente, die im Block der ausführbaren Anweisungen eines IF-Blocks zulässig sind, hängen von der Position des IF-Blocks selbst ab.
%HTML block ... %IF block ... %INCLUDE ... %WHILE ... %ENDIF %}
%IF ... %DEFINE ... %FUNCTION ... %ENDIF
Im folgenden Beispiel muss der verschachtelte IF-Block den Regeln folgen, die innerhalb eines HTML-Blocks gelten.
%IF ... %HTML { ... %IF ... %ENDIF %} ... %ENDIF
Ausnahme: Geben Sie keinen ROW-Block in einem IF-Block an.
Zeichenfolgevergleiche für IF-Blöcke
Net.Data verarbeitet die Bedingungsliste des IF-Blocks auf eine von zwei Arten, je nach dem Inhalt der Ausdrücke, aus denen die Bedingungen bestehen. Die Standardaktion besteht darin, alle Ausdrücke als Zeichenfolgen zu behandeln und Zeichenfolgevergleiche wie in den Bedingungen angegeben durchzuführen. Wenn jedoch zwei Zeichenfolgen, die ganze Zahlen darstellen, verglichen werden, ist der Vergleich numerisch. Net.Data geht davon aus, dass eine Zeichenfolge numerisch ist, wenn sie nur Ziffern enthält, denen optional ein Zeichen '+' oder '-' vorangestellt sein kann. Die Zeichenfolge darf keine Nichtziffernzeichen außer '+' bzw. '-' enthalten. Net.Data unterstützt keinen numerischen Vergleich von nicht ganzzahligen Zahlen.
+1234567890 -47 000812 92000
- 20 (enthält Leerzeichen) 234,000 (enthält ein Komma) 57.987 (enthält einen Punkt)
Net.Data wertet die IF-Bedingung zum Zeitpunkt der Ausführung des Blocks aus. Dieser Zeitpunkt muss nicht mit dem Zeitpunkt, zu dem der Block ursprünglich von Net.Data gelesen wurde, übereinstimmen. Wenn Sie zum Beispiel einen IF-Block in einem REPORT-Block angeben, wertet Net.Data die Bedingungsliste des IF-Blocks nicht beim Lesen der FUNCTION-Blockdefinition mit dem REPORT-Block aus, sondern erst beim Aufrufen und Ausführen der Funktion. Dies gilt sowohl für den Abschnitt mit der Bedingungsliste des IF-Blocks als auch für den Block der auszuführenden Anweisungen.
Beispiel für IF-Block: Ein Makro mit IF-Blöcken in anderen Blöcken
%{ This macro is called from another macro, passing the operating system and version variables in the form data. %} %IF (platform == "AS400") %IF (version == "V3R2") %INCLUDE "as400v3r2_def.hti" %ELIF (version == "V3R7") %INCLUDE "as400v3r7_def.hti" %ELIF (version == "V4R1") %INCLUDE "as400v4r1_def.hti" %ENDIF %ELSE %INCLUDE "default_def.hti" %ENDIF %MACRO_FUNCTION numericCompare(IN term1, term2, OUT result) { %IF (term1 < term2) @dtw_assign(result, "-1") %ELIF (term1 > term2) @dtw_assign(result, "1") %ELSE @dtw_assign(result, "0") %ENDIF %} %HTML(report){ %WHILE (a < "10") { outer while loop #$(a)<br /> %IF (@dtw_rdivrem(a,"2") == "0") this is an even number loop<br /> %ENDIF @DTW_ADD(a, "1", a) %} %}
Mit Hilfe des WHILE-Blocks können Schleifen in einem Net.Data-Makro durchgeführt werden. Wie der IF-Block bietet der WHILE-Block die Möglichkeit, mindestens eine Bedingung zu testen und anschließend auf der Grundlage des Ergebnisses des Bedingungstests einen Block von Anweisungen auszuführen. Im Gegensatz zum IF-Block kann der Anweisungsblock auf der Grundlage des Ergebnisses des Bedingungstests beliebig oft ausgeführt werden.
Sie können WHILE-Blöcke innerhalb von HTML-Blöcken, REPORT-Blöcken, ROW-Blöcken, MACRO_FUNCTION-Blöcken und IF-Blöcken angeben, und Sie können sie verschachteln. Die Syntax eines WHILE-Blocks wird im Kapitel über die Sprachkonstrukte im Handbuch Net.Data Reference gezeigt.
Net.Data verarbeitet den WHILE-Block genau so wie den IF-Block, jedoch wird die Bedingung nach jeder Ausführung des Blocks erneut ausgewertet. Und wie bei jedem bedingten Schleifenkonstrukt kann die Verarbeitung zu einer Endlosschleife führen, wenn die Bedingung nicht korrekt codiert wurde.
Beispiel: Ein Makro mit einem WHILE-Block
%DEFINE loopCounter = "1"
%HTML(build_table) {
%WHILE (loopCounter <= "100") {
%{ generate table tag and column headings %}
%IF (loopCounter == "1")
<table border>
<tr>
<th>Item #
<th>Description
%ENDIF
%{ generate individual rows %}
<tr>
<td>$(loopCounter)
<td>@getDescription(loopCounter)
%{ generate end table tag %}
%IF (loopCounter == "100")
%ENDIF
%{ increment loop counter %}
@DTW_ADD(loopCounter, "1", loopCounter)
%}
%}