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 statt f wird 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