if-Befehle : Bedingungsprüfungen
Das allgemeine Schema der Bedingungsprüfungen ist
if bedingung command avanti
Wenn die bedingung erfüllt ist, wird command ausgeführt.
Es kann sich bei command auch um einen weiteren if-Befehl handeln, d.h. man kann mehrere Bedingungen hintereinander prüfen.
Ab V25.2 kann command aus mehreren Befehlen bestehen, die alle auf derselben Zeile stehen und durch ; getrennt sein müssen. Das gilt für alle nachfolgend beschriebenen Fälle, ab V29.5 auch für avanti. Aber Vorsicht: Schiefgehen kann das, wenn einer der Befehle ein perform oder ein write oder var mit Manipulationen ist; dann lieber mit jump zu einem eigenen Abschnitt springen oder ein Unterprogramm machen und dieses mit perform ablaufen lassen. (Wobei leider in einem Unterprogramm kein weiteres perform stehen kann.)
Hinweise: Unbedingt auf die Schreibweise achten! Z.B.muß es if Help heißen - d.h. if help geht nicht!
Die Bedingungswörter können, soweit es eindeutig ist, alle bis auf das erste Zeichen verkürzt werden, d.h. if H geht auch.
Jede Bedingung kann durch vorgesetztes not in ihr Gegenteil verkehrt werden:
if not bedingung command avanti
Wenn die bedingung nicht erfüllt ist, wird command ausgeführt.
command kann jeweils auch ein weiterer if-Befehl sein!
Nun zu den einzelnen Bedingungen. Dabei handelt es sich um festgelegte Ausdrücke, bis auf den ersten Fall.
Mit avanti sind diejenigen markiert, die auch für das Konsolprogramm acon gelten, denn dieses bearbeitet für avanti die Jobs.
Prüfung des Vorhandenseins von Datenfeldern und Variablen
if #nnn command avanti
if #nnn$a command avanti ab V28.8
Wenn #nnn bzw. Unterfeld a in #nnn existiert (besetzt ist), wird command ausgeführt,
if #nn. command avanti
if #n.. command avanti
Wenn ein Feld #nnx bzw. ein #nxx existiert (x beliebig), wird command ausgeführt; auch hier kann man $a anhängen
if $abc command [ab V26] avanti
Wenn die Variable $abc belegt ist, wird command ausgeführt.
Prüfung des Ergebnisses eines vorangegangenen Befehls
Die nächsten drei Befehle können in vielen Fällen benutzt werden, um das Ergebnis des vorangegangenen Befehls zu checken.
In den Befehlsbeschreibungen ist jeweils vermerkt, wie yes/no/cancel in dem Zusammenhang zu verstehen sind.
if yes command [gleichwertig: if ok...] avanti
Ging z.B. eine yesno -Frage voran und wurde sie mit "Ja" beantwortet, dann wird command ausgeführt.
if no command avanti oder gleichwertig:
if error command avanti
Ging z.B. eine yesno -Frage voran und wurde sie mit "Nein" beantwortet, dann wird command ausgeführt.
Hinweis: avanti kennt eine Anzahl von besonderen Fehlerprüfungen .
if cancel command
Ging z.B. eine yesno -Frage voran und wurde sie mit "Abbrechen" beantwortet, dann wird command ausgeführt.
Diese Bedingung tritt auch in anderen Situationen auf, etwa beim Lesen aus Dateien oder bei Nutzereingaben mit ask oder form.
Prüfungen auf Gleichheit/Ungleichheit oder Vorkommen von Zeichen(folgen)
if z>N command avanti
if z=N command
if z<N command
Wenn der interne Zähler größer bzw. gleich bzw. kleiner als die Zahl N ist, wird command ausgeführt. N und iz werden für den Vergleich als Dezimalzahlen behandelt!
if Z>N command avanti
if Z=N command
if Z<N command
Wenn die interne Zahl größer bzw. gleich bzw. kleiner als N ist, wird command ausgeführt. N und iZ werden als Dezimalzahl behandelt.
if >N command avanti
if =N command
if <N command
Wenn die iV als Zahl größer bzw. gleich bzw. kleiner als N ist, wird command ausgeführt.
Mit der iZ hat das nichts zu tun. Will man diese prüfen, dann zuerst in die iV kopieren mit var Z - oder siehe oben!
if >"abc" command avanti
if <"abc" command
Wenn die iV als Zeichenfolge alphanumerisch größer bzw. kleiner als "abc" ist, wird command ausgeführt.
Achtung : hier als Begrenzer nur " erlaubt, nicht ' .
if >#nnn command avanti: Leider etwas anders, siehe unten
if <#nnn command
Wenn die iV größer bzw. kleiner als der Inhalt von #nnn ist, wird command ausgeführt.
Wenn der Inhalt von #nnn in "..." eingeschlossen ist (d.h. die Anführungszeichen müssen mit in #nnn stehen), wird alphanumerisch verglichen, sonst numerisch.
if "xyz" command oder if 'xyz' command avanti
if "~xyz" command oder if '~xyz' command avanti
Wenn die iV mit xyz anfängt, wird command ausgeführt. Soll der Inhalt einer Kategorie oder eines Unterfelds abgeprüft werden, bringt man diesen Inhalt zunächst mit var ... in die iV und wendet darauf dann if "xyz" an. Hat man ~ gesetzt, erfolgt der Vergleich ohne Berücksichtigung von Groß- und Kleinschreibung.
Hinweise: Maskierung einzelner Zeichen gibt es hierbei nicht.
Vor dem " bzw. ' kann ein '=' stehen, das macht keinen Unterschied.
Wichtiger Sonderfall: Mit if "" ... kann man prüfen, ob die iV leer ist
(z.B. nach ask oder nach var #nnn oder var $name )
Beispiel: Wenn die in der INI-Datei eingestellte Sprache Englisch ist, mache unter der Sprungmarke :engl weiter
var L
if "~eng" jump engl
if =#nnn command (vgl. oben den Befehl if #nnn ... : nicht dasselbe!)
if =$abc command (vgl. oben den Befehl if $abc ... : nicht dasselbe!)
avanti : Leider etwas anders, siehe unten
Wenn die iV mit dem Anfang des Inhalts von #nnn bzw. $abc übereinstimmt, wird command ausgeführt.
Beginnt der Inhalt von #nnn mit ~, wird ohne Rücksicht auf Groß-/Kleinschreibung verglichen, siehe oben.
#nnn kann eine Kategorie oder eine #u-Variable sein, $abc irgendeine freie Variable.
Achtung : bei der Variante if "xyz" ist es etwas anders: dort muß die iV mit "xyz" beginnen (die iV kann aber länger sein), hier muß #nnn mit dem Inhalt der iV beginnen (aber #nnn kann länger sein).
if %abc% command avanti
if %~abc% command avanti
Wenn die iV die Zeichenfolge abc enthält, wird command ausgeführt.
Ist ~ gesetzt, findet der Vergleich ohne Rücksicht auf Groß-/Klein statt.
Sonderfall: (Wenn der Inhalt der iV mit fetch eingelesen wurde)
Hinweis: Eine Möglichkeit der Maskierung gibt es hier nicht, aber beim nächsten Befehl:
Tip: Besser ist in diesem und im nächsten Fall die Suchfunktion srx mit RegEx-Suchtechnik. Sie ermöglicht u.a. auch das Suchen nach nicht druckbaren Sonderzeichen sowie variable Maskierung.
if _abc_ command avanti
Wenn der aktuelle, gesamte Datensatz die exakte Zeichenfolge abc enthält, wird command ausgeführt.
Mit ? kann man einzelne Zeichen maskieren. Wenn in der Zeichenfolge ein Unterstrich auftritt, kann man if ,..., schreiben.
Hinweis: Besser ist find _xyz_ , weil dabei die Groß-Kleinschreibung nicht exakt stimmen muß.
if *#nnn_abc_ command avanti
Wenn Kategorie #nnn im aktuellen Datensatz die exakte Zeichenfolge abc enthält, wird command ausgeführt.
Hier kann #nnn keine #u-Variable sein.
if space command (ab V29)
Wenn das erste Zeichen der iV ein Spatium oder sonstiges "Whitespace"-Zeichen ist, wird command ausgeführt.
Prüfungen der Satzstruktur
if main command avanti
Ist der aktuelle Satz der Hauptsatz einer verknüpften Familie? (D.h. gibt es verknüpfte Untersätze dazu?)
if fam command avanti
Ist der Satz ein Mitglied einer verkn. Familie (Haupt- oder Untersatz)? ...
if sub command avanti
Ist der Satz ein verknüpfter Untersatz? ...
if hierarchy command avanti
Ist es ein hierarchischer Satz? ... Siehe dazu auch next sub und prev sub
if hs command
Ist der Balken in einem hierarchischen Untersatz? ... [funktioniert nur, wenn gerade links die Satzanzeige aktiv ist]
Andere Bedingungsprüfungen
if Artic command avanti
Wenn der Inhalt der iV mit Artikel beginnt, wird command ausgeführt. Die Artikel sind in der CFG definiert.
Groß-/Kleinschreibung ist dabei nicht relevant, d.h. 'der' ist identisch mit 'Der' und 'DER' usw.
Mit if ARtic (also großem R) wird darüber hinaus das Wort dann mit Nichtsortierzeichen markiert.
Tip: Mit if ARtic set bewirkt man, daß die Nichtsortierzeichen gesetzt werden, sonst aber nichts passiert.
if b command avanti
Wenn der Inhalt der iV eine ISBN oder ISSN ist und die Prüfziffer nicht stimmt, wird
command ausgeführt. Mehr dazu unter dem Sonderbefehl hyphen .
Anwendung nach diesem Muster:
...
if not b jump ok
mes "Pr.Ziff. falsch"
end
:ok
...
if deleted command avanti
... ein gelöschter Satz? ...
if Deleted command nur avanti
... ein gelöschter Satz, der mit fetch rec eingelesen wurde?
if diff command
Wenn der aktuelle Satz vorher verändert wurde (Hintergrund gelb!) wird command ausgeführt, z.B. put .
if empty command avanti
Wenn die aktuelle Erg.menge leer ist, wird command ausgeführt.
if gN command avanti
if lN command avanti
Wenn die aktuelle Erg.menge größer bzw. kleiner als N (>= 0) ist, wird command ausgeführt.
Spezialfall: if g0 : Ist bei dem vorangehenden find-Befehl etwas herausgekommen? Für das Gegenteil kann man auch schreiben:
if Help command
Wenn momentan ein Hilfetext in der Anzeige steht, wird command ausgeführt.
if Lock command avanti
... ein gesperrter Satz? ... (Freigabe mit set rec free)
if New command
... ein neuer Satz? ...
if off command
Wenn es eine Offline-Datei gibt, dann command
if res command avanti
Wenn die Datenbank über Restriktionen verfügt (.RES-Datei), wird command ausgeführt.
if Stop command avanti
Wenn der Inhalt der iV ein Stoppwort ist, wird command ausgeführt. Die Stoppwörter sind in der Index-Parameterdatei definiert. Die Schreibweise braucht nicht exakt zu stimmen, d.h. groß/klein ist irrelevant.
if tbl command avanti
Wenn die TBL-Datei gesperrt ist, wird command ausgeführt.
if usr command
Wenn die Datenbank gerade (durch andere User oder in anderen Fenstern) in Benutzung ist, wird command ausgeführt.
Ob die Nutzung durch a99/alcarta/acon oder die alten Programme PRESTO/APAC etc. erfolgt, spielt dabei keine Rolle.
if v14 command avanti
Wenn die Datenbank mit V14-Verknüpfungen arbeitet, wird command ausgeführt.
Die Werte i5 und i6 der Indexparameter erhält man mit var V14, z.B. _9 oder _:
Sonderfall: Tastaturprüfung
Wenn man prüfen will, ob die Taste [Esc] gedrückt wurde, z.B. innerhalb einer Schleife (um den Abbruch zu ermöglichen), geht das mit dem keychk -Befehl, den man VOR einen if-Befehl zu setzen hat:
keychk
if yes jump ...
ACHTUNG:
NUR für avanti gilt:
if #nnn = #kkk command Statt = kann auch < oder > stehen
Vergleiche Inhalt von #mmm mit Inhalt von #kkk
Bei Gleichheit bzw. größer/kleiner: command ausführen
#mmm und/oder #kkk können Anwendervariablen sein (#u-Variablen).
Wenn #kkk nicht besetzt ist, gilt die Bedingung (korrekt) als nicht erfüllt.
Wenn #nnn nicht besetzt ist, klappt die Prüfung nicht. Man stellt also am besten sicher, daß die erste Variable auf jeden Fall besetzt ist.
Statt #kkk kann auch eine Zahl stehen, dann wird ein Zahlenvergleich
durchgeführt, sonst Stringvergleich.
Unterfelder können nicht angegeben werden, dazu muß man erst Anwendervariablen erzeugen, z.B.
var #123$a // $a aus #123 in #uv1 kopieren
ins #uv1
var #234$b // $b aus #234 in #uv2 kopieren
ins #uv2
if #uv1 = #uv2 ...