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 ...