Bedingte und wiederholte Verarbeitung

Dieses Dokument behandelt die folgenden Themen:

Wenn Sie die Anweisung .EP in der Anweisung .IF verwenden, wird die Formatierung immer beendet.


Bedingte Verarbeitung

.IF - Beginn der bedingten Verarbeitung

.IF bedingung

Die bedingte Verarbeitung beginnt mit der Anweisung .IF, mit der die Bedingung (siehe Eine Bedingung definieren) definiert wird.

Wenn der Vergleich das Ergebnis "wahr" liefert, wird die definierte Konsequenz (siehe Eine Konsequenz definieren) verarbeitet. Ist das Ergebnis falsch, wird die definierte Konsequenz übersprungen.

Wenn Sie die Anweisung .IF benutzen, können Sie entweder eine einfache Konsequenz (siehe unten) oder eine Blockkonsequenz (siehe die Anweisung .TH) definieren.

Die einfache Konsequenz

Eine einfache Konsequenz besteht aus einer einzigen Textzeile oder einer Anweisung, die auf die Anweisung .IF folgt. Beispiel:

.IF &Alter = 50
Herzlichen Glückwunsch

Die einfache Konsequenz beendet die bedingte Verarbeitung.

Anmerkung:
Nach einer einfachen Konsequenz sollten Sie die Anweisung .EI (End-If) nicht angeben.

Sie können in einer Bedingung auch die logischen Operatoren .AN und .OR (siehe Logische Operatoren) benutzen. Im folgenden Beispiel ist die Textzeile "Sehr geehrter Herr" die einfache Konsequenz:

.IF &Alter = 50;.AN &Geschlecht = M
Sehr geehrter Herr

Wenn die einfache Konsequenz aus einer Anweisung besteht, können Sie sie nach der Anweisung .IF in derselben Zeile angeben. Im folgenden Beispiel ist die Anweisung .NP die einfache Konsequenz:

.IF &$LC < 5;.NP

.TH - Blockkonsequenz definieren

.TH

Eine Blockkonsequenz besteht aus mehreren Textzeilen und/oder Anweisungen nach der Anweisung .IF. Sie muss mit der Anweisung .TH beginnen und mit der Anweisung .EI enden. Beispiel:

.IF &$DG = Montag
.TH
.NP
&$DA.. &$MG &$YE
.IL 1
Dies ist der Anfang einer neuen Woche.
.EI

In diesem Beispiel bilden die Anweisungen und der Text zwischen den Anweisungen .TH und .EI die Blockkonsequenz (eine neue Seite beginnen; das aktuelle Datum ausgeben; eine Leerzeile ausgeben; den Text ausgeben).

Die Anweisungen .TH und .EI bilden ein Paar, d.h. wenn Sie die Anweisung .TH verwenden, müssen Sie auch die dazugehörige .EI-Anweisung eingeben.

Anmerkung:
Bedingungen können geschachtelt werden. Die maximale Schachtelungstiefe ist 10.

.EL - Alternative definieren

.EL

Wenn Sie die Anweisung .TH angeben, können Sie auch eine Alternative dazu definieren. Wenn das Ergebnis der definierten .IF-Bedingung falsch ist, wird die Alternative ausgeführt (anstelle der Blockkonsequenz nach der Anweisung .TH).

Eine Alternative kann aus mehreren Textzeilen und/oder Anweisungen nach der Anweisung .EL bestehen. Beispiel:

.IF &Geschlecht = M
.TH
Herr
.EL
Frau
.EI

Wenn die Variable &Geschlecht in diesem Beispiel nicht den Wert M hat, wird die Alternative zwischen den Anweisungen .EL und .EI ausgeführt (d.h. im formatierten Text wird "Frau" ausgegeben).

Die für die Blockkonsequenz geltenden Regeln gelten auch für die Alternative (siehe Eine Konsequenz definieren).

Anmerkung:
Wenn Sie die Anweisung .EL benutzen, müssen Sie auch die Anweisungen .TH und .EI benutzen.

.EI - Ende der bedingten Verarbeitung

.EI

Die Anweisung .EI schließt eine Blockkonsequenz (einschließlich der Alternative) ab, die mit der Anweisung .TH eingeleitet wurde.

Anmerkung:
Auf eine .TH-Anweisung muss eine .EI-Anweisung folgen.

Die gesamte .IF-Konstruktion, d.h. sämtliche Angaben zwischen den Anweisungen .IF und .EI müssen im selben Dokument angegeben werden.

Wiederholte Verarbeitung

.WH - Schleifenkopf

.WH bedingung

Mit dieser Anweisung beginnt die wiederholte Verarbeitung. Die Anweisung .WH definiert eine Bedingung (siehe Eine Bedingung definieren). Auf die Bedingung folgt eine Konsequenz, die aus mehreren Textzeilen und/oder Anweisungen bestehen kann, die wiederholt werden sollen (siehe Eine Konsequenz definieren).

Das Ende der Schleife muss mit der Anweisung .EW definiert werden.

Solange die angegebene Bedingung wahr ist, wird die definierte Konsequenz ausgeführt. Wenn die Bedingung falsch ist, wird die Schleife beendet. Die Verarbeitung fährt nach der Anweisung .EW fort.

Es folgt ein einfaches Beispiel einer Schleife:

.SV zähler=0
.WH &zähler <= 3;.** 3fache Wiederholung
.SV zähler=&zähler+1;.** Die Variable &zähler erhöhen
Durchlauf &zähler
.EW
&zähler war der letzte Durchlauf.

Die formatierte Ausgabe sieht folgendermaßen aus:

Durchlauf 1
Durchlauf 2
Durchlauf 3
3 war der letzte Durchlauf.

Das Ergebnis der Bedingung muss sich von "wahr" in "falsch" ändern. Wenn das Ergebnis immer "wahr" wäre, würde Con-form die Schleife endlos wiederholen. Wenn die Bedingung schon beim ersten Mal das Ergebnis "falsch" liefert, wird die Schleife gar nicht durchlaufen, sondern sie wird übersprungen.

Anmerkung:
Schleifen können nicht geschachtelt werden.

Eine Liste von Variablen mit ähnlichen Namen verarbeiten

Mit der Anweisung .WH können Sie mehrere Variablen verarbeiten, deren Namen ähnlich sind und mit einer laufenden Nummer enden. Definieren Sie dazu eine zusätzliche numerische Variable und erhöhen Sie deren Wert in der Schleife. Kombinieren Sie dann die Variablennamen mit der numerischen Variablen wie im folgenden Beispiel:

.SV name1=John
.SV name2=Paul
.SV name3=Ringo
.SV name4=George
.SV zahl=1;.** Dies ist die zusätzliche numerische Variable.
.WH &zahl <= 4
.** Den Anfang der Variablen &name mit der Variablen &zahl kombinieren:
&name&zahl
.SV zahl=&zahl+1;.** Die Variable &zahl erhöhen.
.EW

Die formatierte Ausgabe sieht folgendermaßen aus:

John
Paul
Ringo
George

.WX - Schleife verlassen

.WX

Mit dieser Anweisung wird eine Schleife verlassen, bevor ihr Ende erreicht ist. Die Verarbeitung fährt nach der Anweisung .EW fort. Im folgenden Beispiel beendet das Auftreten des Namens "Paul" die Ausführung der Schleife:

.SV name1=John
.SV name2=Paul
.SV name3=Ringo
.SV name4=George
.SV zahl=1
.WH &zahl <= 4
&name&zahl
.IF &name&zahl = Paul
.WX
.SV zahl=&zahl+1;
.EW
.SL 1
&name&zahl war der letzte Name in der Schleife.

Die formatierte Ausgabe sieht folgendermaßen aus:

John
Paul

Paul war der letzte Name in der Schleife.

.EW - Schleifenende

.EW

Diese Anweisung muss in Verbindung mit der Anweisung .WH benutzt werden. Sie definiert das Ende der Schleife.

Mit einer .IF-Anweisung ist es nicht möglich, die Verarbeitung von .EW bedingt zu unterdrücken.

Eine Bedingung definieren

Nach den Anweisungen .IF und .WH muss in derselben Zeile eine Bedingung stehen. Eine Bedingung besteht aus zwei Werten, die mit einem Vergleichsoperator verknüpft werden.

Wenn Sie nach der Anweisung .IF oder .WH mehrere Bedingungen definieren möchten, müssen Sie die einzelnen Bedingungen mit den logischen Operatoren .AN oder .OR verknüpfen (siehe Logische Operatoren).

Vergleichsoperatoren

Um eine Bedingung anzugeben, verknüpfen Sie zwei Werte mit einem der folgenden Vergleichsoperatoren:

Operator Bedeutung
= EQ gleich
<> NE nicht gleich
< LT kleiner als
<= LE kleiner als oder gleich
> GT größer als
>= GE größer als oder gleich
?   Teilzeichenkette
*   Untermenge

Die meisten Vergleichsoperatoren können - wie in der Tabelle gezeigt - auf zwei verschiedene Arten angegeben werden. Um z.B. zwei Werte auf Gleichheit zu prüfen, können Sie entweder das Gleichheitszeichen (=) oder die Abkürzung EQ verwenden, d.h. die beiden folgenden Anweisungen sind identisch:

.IF &Alter = 50
.IF &Alter EQ 50

Vor und nach dem Vergleichsoperator muss jeweils mindestens ein Leerzeichen stehen.

Der erste Wert (links vom Vergleichsoperator) muss eine Variable sein.

Der zweite Wert (rechts vom Vergleichsoperator) kann eine Variable oder eine Konstante sein (z.B. eine Zahl oder ein Name).

In einigen Fällen ist es nicht nötig, den zweiten Wert anzugeben. Wenn Sie eine Konsequenz z.B. nur dann verarbeiten möchten, wenn eine Variable einen Wert hat (d.h. wenn der Wert nicht leer ist), können Sie angeben:

.IF &straße NE;.TH;.BR
&straße
.EI

Eine Konstante in Apostrophe einschließen

Wenn eine Konstante Leerzeichen oder Kommas enthält, muss sie in Apostrophe eingeschlossen werden, z.B.:

.IF &firma <> 'Software AG'

Wenn die Konstante selbst ein Apostroph enthält, muss es doppelt angegeben werden, z.B.:

.IF &frage <> 'Wie geht''s?'

Ein Parameter, der nicht in Apostrophe eingeschlossen werden muss, darf das Apostroph enthalten, z.B.:

.IF &text = geht's

Eine Konstante kann beliebig viele Apostrophe enthalten, solange das erste Zeichen kein Apostroph ist.

Teilzeichenkette (?)

Der Operator ? wird benutzt, um festzustellen, ob die links vom Operator angegebene Zeichenkette in der rechts vom Operator angegebenen enthalten ist.

Im folgenden Beispiel ist die linke Zeichenkette in der rechten enthalten. Das Ergebnis der Bedingung ist also wahr.

.IF ding ? Bedingungen

Im folgenden Beispiel ist die linke Zeichenkette nicht in der rechten enthalten. Das Ergebnis der Bedingung ist also falsch.

.IF dinge ? Bedingungen

Anmerkung:
Der erste Wert (links vom Operator) muss nicht unbedingt eine Variable, sondern kann auch eine Konstante sein.

Untermenge (*)

Der Operator * wird benutzt, um festzustellen, ob jedes Zeichen, das in der linken Zeichenkette vorkommt, auch in der rechten Zeichenkette vorkommt.

In den folgenden Beispielen sind jeweils die Zeichen der linken Zeichenkette in der rechten Zeichenkette erhalten, d.h. die Ergebnisse dieser Bedingungen sind wahr.

.IF e * Blumentopf
.IF blut * Blumentopf
.IF ttt * Blumentopf

Im folgenden Beispiel sind nicht alle Zeichen der linken Zeichenkette in der rechten Zeichenkette enthalten. Das Ergebnis der Bedingung ist also falsch.

.IF abc * baden

Anmerkung:
Der erste Wert (links vom Operator) muss nicht unbedingt eine Variable, sondern kann auch eine Konstante sein.

Eine Konsequenz definieren

Eine Konsequenz kann eine Anweisung und/oder Text sein. Sie wird verarbeitet, wenn das Ergebnis einer Bedingung wahr ist.

Wenn die Konsequenz eine Anweisung ist, können Sie sie in derselben Zeile angeben wie die Anweisung .IF oder .WH bzw. in derselben Zeile wie der letzte logische Operator (.AN oder .OR). Davor müssen Sie das Anweisungstrennzeichen eingeben (anfänglich das Semikolon). Beispiel:

.IF &Alter > 60;.TH

Wenn die Konsequenz aus Text besteht, muss er in einer neuen Zeile beginnen. Beispiel:

.IF &Alter = 50
Herzlichen Glückwunsch

Anmerkung:
Die obigen Regeln gelten auch für eine Alternative, die mit der Anweisung .EL definiert wird.

Logische Operatoren

In den Anweisungen .IF und .WH können die logischen Operatoren .AN und .OR benutzt werden. Diese Operatoren werden wie getrennte Anweisungen behandelt. Sie müssen deshalb durch das Anweisungstrennzeichen (anfänglich das Semikolon) von der vorhergehenden Bedingung getrennt werden. Beispiel:

.IF &Alter = 50;.AN &Geschlecht = M

Wenn in derselben Zeile mehrere logische Operatoren stehen, werden sie von links nach rechts verarbeitet. Die Anweisung .AN oder .OR kann aber auch in eine neue Zeile geschrieben werden. Beispiel:

.IF &Alter = 50
.AN &Geschlecht = M

.AN - Und

.AN bedingung

Wenn Sie den logischen Operator .AN verwenden, müssen alle Bedingungen wahr sein, damit die Konsequenz ausgeführt wird. Beispiel:

.SV Alter=65
.SV Geschlecht=M
.IF &Alter GE 65;.AN &Geschlecht = F
Liebe Großmutter

Da in diesem Beispiel nur die erste Bedingung wahr ist, wird der Text "Liebe Großmutter" nicht ausgegeben.

.OR - Oder

.OR bedingung

Wenn Sie den logischen Operator .OR benutzen, muss mindestens eine der Bedingungen wahr sein, damit die Konsequenz ausgeführt wird. Beispiel:

.SV Alter=65
.SV Geschlecht=M
.IF &Alter GE 65;.OR &Geschlecht = F
Liebe Großmutter

In diesem Beispiel ist nur die erste Bedingung wahr. Der Text "Liebe Großmutter" wird ausgegeben, da bei der Oder-Verknüpfung nur eine der Bedingungen zutreffen muss, um die Konsequenz auszuführen.