Allerhand Befehle zum Suchen und Finden

 

find      (Eigene Beschreibung für avanti 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 empty  ...  kann man springen, wenn nichts gefunden wurde, mit  if g0  wenn mindestens ein Satz gefunden wurde.

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!     avanti  (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.

 

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 avanti 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]     avanti

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.

 

find avanti    (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

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!

Sonderfall: find #0 holt den letzten Satz.

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.

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,...     avanti    (Erg.Menge aus Satznummern bilden)

find #i-j           avanti    (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.

Hinweis: In a99 muß man schreiben:  find or #i,j,k,... bzw.  find or #i-j  um dieselbe Erg.Menge zu bilden.

Achtung: Auch gelöschte Sätze sowie unbesetzte Satznummern können auf diese Weise in einer Erg.Menge enthalten sein.

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

 

find *new     NUR avanti

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

 

find rnum

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

Angezeigt wird er nicht! Dafür kann man mit disp\sho rec sorgen.

Mit if no ... checkt man, ob es keinen Satz num gibt.

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

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

 

Jeweils kann man mit  if empty ...  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 avanti

 

Weil es einige von a99/alcarta abweichende Besonderheiten gibt, folgt hier eine komplette Beschreibung für den find-Befehl in avanti.

 

find suchbefehl

                Suche in den Registern und bilde eine Ergebnismenge

 

f1nd suchbefehl

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

 

Der Befehl find ist wohl in avanti 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.

Achtung: Vor und hinter einer Klammer muß ein Leerzeichen stehen.

 

Jedem Suchbegriff muß eine Registerbezeichnung vorangestellt werden:

 

find REG Suchbegriff

 

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

 

Find liefert 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 64.000 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.

 

Sonderfall:

find |i eintrag    suche eintrag im Register i

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

 

Dieser Sonderfall funktioniert immer. Man muß dafür jedoch 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. Dann studiert man die Liste und ersieht daraus, in welchem Register z.B. die Personennamen oder Stichwörter sind.

Der Systemverwalter des "allegro"- Systems kann Registerbezeichnungen (alias-Namen) jederzeit einführen, d.h. in die Indexparameter eintragen.

 

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?

      get first

                #uxy=#40         // Var. setzen

      find PER #uyx

 

 

Restriktionen setzen

 

find RelationRestriktionsargument        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