Allerhand Befehle zum Suchen und Finden

 

find      (Beschreibung der für acon geltenden Abweichungen siehe  weiter unten )

find suchbefehl

Find

Find suchbefehl

Mit diesem Befehl werden Ergebnismengen gebildet.

Diese wird nur bei 'F', nicht bei 'f' angezeigt, sondern sie wird anschließend als aktuelle Erg.menge benutzt, wenn man mit den Befehlen   next ,  prev , oder  export set   arbeitet.

Der suchbefehl muß genauso aussehen wie bei der  Eingabe in der Befehlszeile  (Cursor dorthin setzen, F1, dann kommt Hilfe.

Dort findet man auch Hinweise zur   Von/Bis-Suche ).

Wenn suchbefehl fehlt, wird der Inhalt der iV benutzt. Wenn man diese vorher geeignet besetzt, kann man den Suchbefehl in Abhängigkeit vom aktuellen Satz gestalten.

Der erste Satz der Ergebismenge wird sofort geladen, wird also zum aktuellen Satz. (Nachfolgendes  first  ist also nicht nötig.)

Wenn suchbefehl mit einem '+' beginnt, wird die nachfolgende Zeichenkette im Volltext der aktuellen Erg.menge gesucht, wie bei der Eingabe per Hand im Suchbefehlsfeld.

Bei  F stattwird die Erg.Menge sofort angezeigt und der FLEX beendet, d.h. nachfolgende Befehle ignoriert.

Mit   if no  ...  kann man springen, wenn nichts gefunden wurde, mit  if g0  wenn mindestens ein Satz gefunden wurde.

Falls ein Syntaxfehler des Suchbefehls vorliegt, gibt es in der Variablen Err eine Meldung. Der Test kann erfolgen mit

if no var Err;mes;jump ...   [ab V35.8] (gilt auch für acon)

Tip: Wenn man das Find-Menü benutzt (Fernglas), sieht man anschließend in der Befehlszeile, wie die Find-Befehle aussehen müssen!

f1nd  mit Ziffer 1 statt Buchstabe i!     acon  (erst ab V28.8)

      Dadurch wird keine Ergebnismenge gebildet, sondern nur deren erster (oder einziger) Datensatz geladen, ohne daß also die aktuelle Erg.Menge verändert wird. Gibt es mehrere, dann der mit der niedrigsten internen Satznummer. In FLEXen kann man so vermeiden, daß eine bestehende Erg.Menge unbeabsichtigt verschwindet, wenn man einen einzigen anderen Satz zwischendurch braucht.

Mit  if no kann man checken, ob die Suche nicht gelungen ist, d.h. keine Sätze zu dem Suchbefehl existieren.

acon  (ab V32.4) : Der Datensatz wird zugleich gesperrt. Gibt man nach beliebigen Veränderungen  put, wird er zugleich entsperrt, sonst beim Laden des nächsten Satzes.

Wichtig ist dies in Umgebungen, wo mehrere Prozesse an der Datenbank laufen können, wenn man ganz sicher gehen will, daß zwischen  f1nd  und  put  kein anderer Prozeß denselben Satz verändert speichern kann, man ihn somit während dieser Zeit ganz für sich allein hat.

 

find restriktion [and suchbefehl]

[Ab V29] Die aktuelle Ergebnismenge wird der Restriktion unterworfen.  Hier ist aber nur EINE Restriktion erlaubt, keine Kombination von solchen.

NUR acon zusätzliche Besonderheit: Wenn hier kein suchbefehl, dann wird der nachfolgende Suchbefehl unter Beachtung der Restriktion ausgeführt:

z.B. mit find  PYR >1989  erreicht man, daß die nachfolgend gebildete Ergebnismenge nur aus Sätzen mit dem Erscheinungsjahr nach 1989 besteht. (PYR muß in den Indexparametern definiert sein, was bei CAT.API der Fall ist)

Hinweis:  Ein Suchbefehl kann mit einer Restriktion beginnen, gefolgt von einem mit  and  angeschlossenen normalen Suchbefehl. Dies ist bei großen Datenmengen u.U. effizienter, weil dann der Suchbefehl schon gleich mit Einschränkung ausgeführt wird.

 

find @         [ab V30.5]     acon

Der Inhalt der iV wird in eine Ergebnismenge umgewandelt. Es muß zu dem Zeitpunkt eine Liste von Satznummern in der iV stehen, getrennt durch beliebige nichtnumerische Zeichen, also z.B.  1,2,3,4  oder  5 6 7 8.

Hinter  @  kann man noch ein  +  setzen, dann wird die i dem Moment bestehende Erg.Menge um die betr. Nummern ergänzt.

Die Erg.Menge erhält den schlichten Namen  (num).

 

find acon    (ab V29)

Aktuelle Ergebnismenge expandieren, d.h. diejenigen Sätze hinzunehmen, die mit einem Satz der Erg.Menge verknüpft sind ("Schiller-Räuber"-Methode).

Mit  if no stellt man fest, daß die Ergeb.Menge unverändert geblieben ist.

 

find +zeichenfolge

Aktuelle Ergebnismenge nach der  zeichenfolge  durchsuchen. Es passiert dasselbe, wie wenn man im Find-Menü das Feld  "Volltextsuche in der Ergebnismenge" benutzt oder im Feld "Suchbefehl" die Angabe  +suchbefehl   eintippt. Hierbei wird nicht exakt gesucht: Groß-/Kleinschreibung und Umlaute können so oder so eingegeben werden. Die Zeichenfolge und der Datensatz werden vor dem Vergleich mit Hilfe der Indexparameter umgewandelt, also A in a, ä in ae und é in e - wie man es in den Registern sieht. Aber aufpassen: die Zeichenfolge muß in ASCII vorliegen!

Möglich ist hier (aber nur hier) auch das ? als Maskierungszeichen innerhalb eines Wortes:

"differen?ial" findet "differential" und "differenzial".

Möglich ist ferner die feldspezifische Suche:  find +#81,goethe  sucht, ob im Feld #81 die Zeichenfolge goethe vorkommt.

 

Besondere Fälle:

In den beiden ersten Fällen wird die Erg.Menge zuerst nach internen Satznummern geordnet! Daher ist i.d.R. anschließend die vorher eingestellte Ordnung nicht mehr vorhanden. Besonders zu beachten ist dies, wenn man Schleifen programmieren will, in denen eine Erg.Menge abgearbeitet und bestimmte Sätze daraus entfernt werden sollen. Dann empfiehlt sich, vorher den Befehl  order n  zu geben.

find /

Aktuellen Datensatz zur aktuellen Erg.Menge hinzufügen, wenn er darin noch nicht enthalten ist. In diesem Fall gilt danach if yes, sonst if no

 

find -

Aktuellen Datensatz aus der aktuellen Erg.Menge herausnehmen, wenn er darin enthalten ist. In diesem Fall gilt danach if yes, sonst if no

 

find /si  bzw.  find -si  bzw.  find *si

Erg.Menge Nummer i zur aktuellen Menge ergänzen bzw. daraus entfernen bzw. aus beiden die Schnittmenge ermitteln. Die Wirkung ist dieselbe, wie wenn man in der Erg.Mengenliste eine auswählt und dann einen

der Buttons  [Oder]  bzw.  [Nicht]  bzw.  [Und]  drückt.

Achtung: hier muß * für [Und] verwendet werden, nicht +, weil + schon (s. oben) für die Volltextsuche in der Erg.Menge definiert ist.

 

find /:name  bzw.  find -:name  bzw.  find *:name

Erg.Menge mit dem Namen name zur aktuellen Menge ergänzen bzw. daraus entfernen bzw. aus beiden die Schnittmenge ermitteln. Die Wirkung ist dieselbe, wie wenn man in der Erg.Mengenliste eine auswählt und dann einen der Buttons  [Oder]  bzw.  [Nicht]  bzw.  [Und]  drückt.

name ist der Erg.Mengenname, wie man ihn in der Liste der Erg.Mengen sieht, d.h. das, was hinter dem Doppelpunkt steht. Es genügt ein eindeutiger Anfangsteil des Namens.

Achtung: hier muß * für [Und] verwendet werden, nicht +, weil + schon (s. oben) für die Volltextsuche in der Erg.Menge definiert ist.

 

find #nnn oder f1nd #nnn   acon

Damit kann man einen einzelnen Satz mit seiner internen Nummer nnn laden. Dadurch entsteht keine 1-elementige Erg.Menge, d.h. eine zu diesem Zeitpunkt bestehende Erg.Menge wird dadurch nicht berührt!

Aber: Hinter # kann mehr als eine Nummer stehen, durch Komma gegrennt, s.u.

Sonderfall: find #0 holt den letzten Satz, aber nur in a99.

Die Nummer muß sonst größer als 0 sein, denn der erste Satz hat die Nummer 1.

Mit  if cancel  prüfen, ob die Nummer zu groß war, mit  if no , ob unbesetzt; in dem Fall bleibt der aktuelle Satz erhalten und es wird kein anderer geladen.

Zusammen mit   next  #  kann man  den nächsten holen (dabei werden unbesetzte Nummern übersprungen), dann mit  if cancel  prüfen, ob keiner mehr gekommen ist.

Eine noch andere Variante ist   choose  ...(der FLEX wird dabei nicht beendet)

 

find #i,j,k,...     acon    (Erg.Menge aus Satznummern bilden)

find #i-j           nur a99    (Erg.Menge soll aus Satznummern i bis j bestehen)

Damit kann man mehrere Sätze mit ihren internen Nummern i,j,k,... zu einer Erg.Menge machen bzw. eine Nummernfolge zu einer Erg.Menge zusammenfassen.

Aber: In a99 muß man schreiben:  find or #i,j,k,... bzw.  find or #i-j  um dieselbe Erg.Menge zu bilden. In acon werden die Nummern zur bestehenden Erg.Menge hinzugefügt. Handelt es sich um eine große Anzahl von Nummern, so etwa mehr als 100, dann wird statt dessen der Befehl find @  (s.o.) empfohlen.

Achtung: Auch gelöschte Sätze können auf diese Weise in einer Erg.Menge enthalten sein, unbesetzte Nummern jedoch nur in acon, in a99 nicht.

Sonderfall in a99 : find or #m, wenn in a99 eine Erg.Menge aus einem einzelnen Satz mit der internen Nummer m zu bilden ist.

 

find *new     NUR acon

Die momentan bestehende Ergebnismenge wird beseitigt. In a99 ist dafür zu schreiben: close res.

 

f1nd rnum     acon     [ab V32.8]    ACHTUNG:   f1nd,  nicht  find

Aus der momentan vorliegenden Erg.Menge wird der Satz mit der lfd. Nummer num geladen. Der erste hat die Nummer 1.

Angezeigt wird er nicht! Dazu ergänzt man  disp\sho rec .

Steht z.B.  num  in  #urn, schreibt man   var "r" #urn\f1nd

Mit if no ... checkt man, ob es keinen Satz num gibt (weil  num<1 oder zu groß).

Tip: Will man nach einigen Aktionen mit Sicherheit zum momentanen Satz in der Erg.Menge zurückkehren, empfiehlt sich diese Sequenz:

var "r" r

ins #urr

... beliebige Aktionen (aber keine neue Erg.Menge bilden! Nur f1nd ist erlaubt) ...

var #urr

find

Sonderfälle:

find s3           Älteste Erg.Menge öffnen

var q\var (b"/")\ins #uqQ\var "s" #uqQ\find           Momentan letzte Erg.Menge öffnen

 

find snum

find :name

Die Erg.Menge Nummer num bzw. mit der Bezeichnung name wird aktiviert. Die erste hat die Nummer 1 und ist die Boomark-Liste, 2 ist die Liste der vorher angezeigten Sätze. Nummer 0 ist die letzte Erg.Menge. Deren tatsächliche Nummer erhält man mit var q.

Angezeigt wird die Liste nicht! Dafür kann man mit   sho list  sorgen.

Mit if no ... checkt man, ob es keine Erg.Menge num gibt.

Tip: Will man nach einigen Aktionen mit Sicherheit zum momentanen Satz in der momentanen Erg.Menge zurückkehren, empfiehlt sich diese Sequenz:

var "r" r

ins #urr

var q

ins #urq

  Aktionen (einschl. Bildung neuer Erg.Mengen)

var "s" #urq(b"/")

find

var #urr

find

Tip: Wenn man ganz sicher gehen will, daß nicht inzwischen die Grenze von 50 Erg.Mengen erreicht und die älteste gelöscht wird (wodurch sich die anderen alle verschieben: ein- oder mehrmals den Befehl

close res

geben, dann wird jeweils die letzte gelöscht.

                Tip: Mit  set Rname  kann man der aktuellen Erg.Menge einen Namen geben.

 

find _xyz_

find ,xyz,

Volltext-Suche im aktuellen Datensatz

Sonderfälle! Der aktuelle Satz (nur dieser!) wird untersucht. Enthält er die Zeichenkette xyz, ist anschließend die Bedingung YES erfüllt, sonst NO, d.h. mit "if yes ..." bzw. "if no ..." kann man darauf reagieren.

Das Besondere ist, im Vergleich zum Befehl   if %xyz% ... , daß vor dem Vergleich die Umcodierung der Indexparameter angewendet wird, und zwar sowohl auf xyz wie auf den Text des Satzes. Das ist insbes. bei Unicode-Daten wichtig: man findet dann kyrill. Daten durch Eingabe der Transliteration.

Man verwendet normalerweise _ als Begrenzer, aber wenn _ innerhalb xyz vorkommt, dann das Komma .

Auch hier kann _xyz_ bzw.  ,xyz, wegbleiben, dann wird der Inhalt der iV genommen.

Achtung: Eine Ergebnismenge entsteht nicht, die aktuelle Erg.Menge bleibt unberührt!

Hinweis: Statt der Indexparameter können die Exportparameter zum Einsatz kommen, und zwar wahlweise die p- oder die q-Tabelle. Siehe dazu den Befehl   set xm 

 

Zu den beiden nächsten Befehlen gibt es einen ausführlichen Text, der das Konzept der

 Online- und Offline-Daten  erklärt:

 

find edit

Sonderfall! Die bearbeiteten, aber noch nicht gespeicherten  Sätze der momentanen Sitzung werden als Erg.Menge zusammengefaßt. (Wie Menüpunkt "Extras | IN ARBEIT befindl. Sätze")

find new

Sonderfall! Die neuen Datensätze, noch nicht gespeicherten Sätze der momentanen Sitzung werden als Ergebnismenge zusammengefaßt. (Wie Menüpunkt "Extras | Neu, noch nicht gespeichert")

 

find $nnn

Sonderfall! Die letzten nnn Bytes der LOG-Datei werden ausgewertet und die darin steckenden korrigierten Datensätze als Erg.Menge zusammengefaßt. Die neuen Sätze kann man nicht auf diese Weise gewinnen, dazu muß man das Register des Erfassungsdatums heranziehen. Eingebettet in  super.rtf  unter "Zuletzt bearbeitete Sätze". Interessant ist das für den Supervisor in einem Netz. (Die LOG-Datei bezieht sich nicht auf die aktuelle Sitzung, sondern ist das Änderungsprotokoll der gesamten Datenbank.)

Folgende 5 Zeilen holen den letzten Satz aus der LOG-Datei, damit man diesen dann sofort bearbeiten kann:

find $3000   Eine Erg.Menge aus den letzten 3000 Byte der LOG-Datei machen

last         Den letzten Satz laden und anzeigen

show rec

display

close res    Die Erg.Menge wieder beseitigen

 

Jeweils kann man mit  if no ...  checken, ob es keine solchen Sätze gibt.

 Achtung: Die Wörter new und edit müssen ausgeschrieben werden! (Zur Sicherheit gegen Verwechlung mit anderen find-Befehlen.)

Die Offline-Datei selbst bekommt man angezeigt mit dem Befehl  show offline .

 

==================================================================

 

Version acon

 

Es folgt eine Beschreibung der für  acon  geltenden Abweichungen beim find-Befehl.

 

find suchbefehl

                Suche in den Registern und bilde eine Ergebnismenge

 

f1nd suchbefehl  (Ziffer 1 statt Buchstabe i )

                Suche und lade nur den ersten gefundeten Satz, ohne die Erg.Menge zu verändern

 

Der Befehl find ist wohl in acon der wichtigste von allen, weil man mit ihm die Daten selektiert, mit denen man arbeiten will.

Verschachtelte Klammerung mit den arithmetischen Operatoren AND, OR, NOT ist möglich.

Jedem Suchbegriff muß eine interne oder symbolische Registerbezeichnung (z.B. |1 oder PER ) vorangestellt werden:

 

find REG Suchbegriff

 

Achtung: Wenn ein Suchbegriff aus mehreren Wörtern beseht und darin eins der Wörter   and, or, not  vorkommt, dann den Suchbegriff in "..." einschließen. Wenn man Suchbefehle automatisch erzeugt (z.B. mit var-Befehlen), kann es sinnvoll sein, dies grundsätzlich zu machen.

 

Evtl. besteht die Ergebnismenge aus nur einem Satz, oder keinem!

 

Der Befehl  find  liefert einen Fehler (zu checken mit if no ... oder if error ...), wenn nichts gefunden wird, die Ergebnismenge zu groß ist oder ein formaler Fehler im Befehl auftritt.

 

Die maximale Größe der Ergebnismenge ist in der Grundeinstellung (set maxres) auf 4000000 (4 Mio.) Satznummern beschränkt.

 

Der Zugriff auf die Register 1 bis 10 ist frei. Die Suche im Register 11 erfordert die Berechtigungsstufe 3 des Benutzers (eingestellt in avanti.conf). Nur dort sollten folglich schützenswerte Daten (z.B. Ausleih,- Bestellinformationen) recherchierbar sein.

 

Beispiel: ('?' ist Trunkierungssymbol)

 

find PER beethoven? and ( TIT klavier? or TIT piano? )

if error jump nix

 

Es werden Sätze mit "beethoven?" als Person und "klavier?" oder "piano?" als Titelstichwort gesucht.

Wenn es nichts gibt, erfolgt Sprung zum Label :nix

 

Die bequemeren Befehle wie "find PER goethe?" kann  man nur verwenden, wenn für die betreffende Datenbank in der .cPI solche Bezeichnungen wie "PER" definiert sind. Das erfährt man mit dem Befehl help.

 

Stets anwendbar:

find |i eintrag    suche eintrag im Register i

( i = 1...9, : für 10 und ; für 11 )

 

Diese Schreibweise funktioniert immer. Man muß dafür nur wissen, welche Register die Datenbank hat. Der Befehl  help liefert dazu die Übersicht. (D.h. man muß zuerst einen Auftrag abgeben, in dem nur "help" steht. Aus der dann erscheinenden Liste ersieht man, in welchem Register z.B. die Personennamen oder Stichwörter stehen.

Der Systemverwalter kann Registerbezeichnungen (symbolische Namen) jederzeit einführen, d.h. in die Indexparameter eintragen.

 

Kombinationen [ab V35.6, nicht in a99!]

 

Es gibt interne 2 Ergebnislisten, jede kann bis zu 4.000.000 Nummern fassen. Genutzt wird normalerweise nur die Liste 1. Bei Bedarf kann man die zweite mit  find set2  einschalten und hernach beide mit logischen Operatoren kombinieren.

Neu sind ab V35.6 die Befehle

 

find seti   ( i=1,2) : Liste 1 bzw. 2 einschalten

 

find Op        (Op=OR,AND,NOT)  Liste 1 mit 2 kombinieren

                           Ergebnisse sind dann in Liste 1; Liste 2 bleibt unveraendert

 

Die Liste 2 kann man natürlich auch nutzen, um zwischendurch mal eine andere Erg.Menge anzulegen und abzuarbeiten und dann zur ersten zurückzukehren. Achtung:  find set1  bzw.  find set2  schalten nicht nur zur betr. Liste um, sondern mit "next" wird dann auch weitergemacht an der vorher in der betr. Liste erreichten Position. Dafür braucht man also nicht selber zu sorgen (mit var r ... usw.)

 

Folgendes Beispiel zeigt das Schema, das man nur zu kopieren und zu modifizieren braucht:

 

find set1                 // Liste 1 einschalten

find all shakespeare?     // Erg.Menge bilden

order n                   // nach Satznummern ordnen

 

find set2                 // Liste 2 einschalten

find all goethe?          // Erg.Menge bilden

order n                   // nach Satznummern ordnen

find OR                   // beide Listen verODERn

order n                   // und wieder nach Satznummern ordnen

                          // hier gehen auch AND und NOT

find set1                 // Liste 1 wieder einschalten

   // Ergebnis der Kombination steht in Liste 1

   // Liste 1 verarbeiten.

 

Die mittleren fünf Zeilen kann man beliebig wiederholen mit jeweils anderem Suchbefehl. Stets wird das Ergebnis mit der in Liste 1  vorher entstandenen Erg.Menge wieder per ODER verknüpft, d.h. die Menge 1 ist immer das Resultat aller vorangegangenen Operationen. (Bis man nach einem find set1  einen neuen find-Befehl gibt.) Nach einem Kombinierbefehl ist Menge 1, also die kombinierte Menge wieder die aktive, d.h.  find set1  dann nicht nötig.

 

Weitere Besonderheiten bei acon

Als Argument für den Suchbegriff kann man dem find-Befehl auch den Inhalt einer Anwendervariablen (#uyx) aus dem Hintergrundspeicher übergeben:

 

Beispiele:

1.            #uyx="PER goethe?"    // Var. setzen

                find #uyx

 

Ein Trunkierungssymbol muß also auch mit in der Variablen drinstehen.

 

2.            find TIT faust?

      first

                #uxy=#40         // Var. setzen

      find PER #uyx

 

Ferner kann man den Suchbefehl auch komplett mit  var ...  in der iV zusammensetzen und dann  find  ohne Argument geben:

3.            var ...

                find

 

 

Restriktionen setzen

 

find Relation Restriktionsargument        wobei  Relation  eines der Zeichen  < = >  ist, oder  !=  für "ungleich"

                Das Argument kann auch auch in "..." eingeschlossen sein.

 

Wenn Restriktionen definiert sind (s. Handbuch 10.2.9) können diese in Suchbefehlen wie folgt verwendet werden:

(Wenn es eine R-Zeile gibt, in der ERJ definiert ist).

 

find normaler Suchbegriff and ERJ >1990

 

Wenn man aber vor irgendeinem anderen find den Befehl gibt

 

find ERJ >1990

 

bewirkt dies, daß die Restriktion  ERJ >1990 für nachfolgende find-Befehle im selben Auftrag (!) fest eingestellt wird. Damit kann man z.B. verhindern, daß eine Suche fehlschlägt, weil es zuviele Einträge gibt.

 

So eingestellte Restriktionen wirken sich auch auf Registeranzeigen aus!

 

Hinweis: Die Restriktion liefert selbst KEINE Ergebnismenge! Also im Beispiel nicht die Menge der Titel mit Erscheinungsjahr >1990. Diese könnte nur über ein geeignetes Register gebildet werden, nicht über eine Restriktion.

 

Sonderfall:

find *new

Mit diesem Sonderbefehl erreicht man, daß eine  bestehende Ergebnismenge und eine evtl. eingestellte Restriktion aufgehoben werden. Ein nachfolgender find Befehl bewirkt also den Aufbau einer neuen Ergebnismenge (ohne Restriktion, wenn man keine neue einstellt).

 

find #<Satznummer1>,...,<SatznummerN>

 

fügt eine Folge von internen Satznummern, getrennt durch Kommas, der aktuellen  Ergebnismenge hinzu (ohne Indexzugriff). Zwischen dem Zeichen # und der ersten Satznummer muß kein Leerzeichen stehen. Die Satznummern, schlicht durch Komma getrennt, kann  man sofort als Ergebnismenge verarbeiten lassen. Man nutzt diesen Befehl, wenn man vorher mit dem qrix-Befehl oder mit list i eine Nummern-Ergebnismenge erzeugt hat, und diese Satznummern für einen Folgeauftrag aus einer (per Qrix geschriebenen) Datei entnehmen kann.

Die Übergabe der Satznummern kann auch innerhalb eines algebraischen Ausdrucks erfolgen.

Beispiel:

find PER faust and # 23,1492,298