[Allegro] Trick 67: Schnellzaehlung: Wieviele Indexeintraege unter xyz?

Bernhard Eversberg ev at biblio.tu-bs.de
Fr Feb 1 08:20:31 CET 2008


Trick 67:  Schnellzählung
            "Wieviele Einträge sind im Index unter xyz?"

Aufgabe: Hurtig mal prüfen, wieviele Einträge es z.B. im Register 3
          unter xyz gibt. Anspruchsvolle wollen noch mehr:
          Wieviele Einträge gibt es, die mit xyz beginnen?

Warum: Man will vielleicht in einem FLEX prüfen, ob es im Index unter
        irgendeinem Kriterium überhaupt schon etwas gibt, und wenn ja,
        wieviele Zeilen. Das kann z.B. die Anzahl der Ausleihen eines
        Lesers sein, oder die Anzahl von Heften zu einer Zeitschrift.
        Oder: Hat dieser Satz verknüpfte Untersätze und wieviele?
              (Die erste Frage ist auch mit  if main  beantwortbar!)
        Solche Einträge haben immer eine bestimmte Struktur, sind also
        in Index an einer Stelle versammelt. Mit bloßem Auge sieht ja
        jeder sofort, wieviele Treffer es da gibt - kann FLEX das auch?

Lösung:
Das geht mit dem Befehl "qrix". Den gibt es schon lange, aber man
findet nicht so leicht raus, daß der solche Sachen kann. Wie soll man
auch wo nach dieser Funktion suchen? (Sagen Sie uns, wie und wo Sie
gesucht und es nicht gefunden haben! Wir richten das dann.)

Geben Sie mal bei der DemoBank ein:

x qrix 1 per shak\mes

Es erscheint die Mitteilung   "74  shakespeare, william"
Und jetzt:

x qrix 1 per shak?\mes

Dann kommt die Meldung   "274  shak"

Dasselbe sehen Sie mit bloßem Auge im Personenregister, wenn Sie
zu der Stelle  shak  gehen bzw. dann mal  shak?  eintippen.

Das Rezept ist also ganz klar:

qrix 1 abc xyz

liefert in der internen Variablen genau die Registerzeile, die man
haben will. abc ist der symbolische Name des Registers, xyz ist die
Stelle bzw. der Anfang davon, wenn man mit ? trunkiert.
Die 1 hinter dem "qrix" ist die Anzahl Zeilen, die man haben will!
Mit einer Zahl >1 kriegt man entsprechend viele Zeilen in die iV,
getrennt durch den Code 20. Das braucht man weniger oft.
Läßt man aber die Zahl ganz weg, gibt's gleich 20 Zeilen!

Nun aber die Frage: Wenn xyz im Register gar nicht auftritt?
Dann kriegt man die Zeile, die genau an der Stelle steht, wo xyz
stehen müßte und nicht steht.
Und wie kann man diesen Sachverhalt im FLEX prüfen, d.h. daß es
die gesuchten Einträge nicht gibt?
Sagen wir, Zeilen mit "shakesp" werden gesucht, und man will prüfen,
ob welche vorkommen, bevor man weitermacht im FLEX.
Hier ist das Strickmuster:

qrix 1 per shakesp
var (f" " b" " f" ")
if not ="shakesp" jump nix
   ....
:nix
mes es gibt keine Zeilen an der Stelle!

Die komische Zeile  var (f" " b" " f" ") beseitigt am Anfang der
Zeichenfolge, die sich in der iV befindet, die Leerzeichen, dann die
Zahl, dann die evtl. noch folgenden Leerzeichen vor dem Text. Übrig
bleibt der Text! Und der läßt sich dann mit  ="shakesp"  vergleichen,
also mit dem, was man haben wollte...
-----------------------------------------------------------------------
Und nun noch die Frage: Wieviele verkn. Untersätze?
var p
if "" mes Kein Prim.Schl.!;end
var "1 |9 " p "+?"
qrix
eval
ins #uvk
var "Es gibt " #uvk " verkn. Untersätze"
mes

Hier werden also die Angaben für qrix per var-Befehl zusammengestellt,
die Zahl aus der dann in iV befindlichen Indexzeile per eval ermittelt.
-----------------------------------------------------------------------
Übrigens: Statt des symbolischen Namens geht auch die übliche
Bezeichnung |1 für Register 1 usw., also z.B.

x qrix 1 |3 shak?\mes

um im Register 3 die Stelle "shak" abzuprüfen.





Mehr Informationen über die Mailingliste Allegro