[Allegro] Trick 77:
Bernhard Eversberg
ev at biblio.tu-bs.de
Fr Sep 12 09:02:32 CEST 2014
Trick 77 : RAK = Register-Abschnitts-Kopie
------------------------------------------ 2014-09-12
Aufgabe: Schnell mal eben einen Registerabschnitt kopieren von einem
Index (z.B. .adx) in einen anderen (z.B. .aex). Für diese bislang
unbekannte Aktion schlagen wir das verwaiste Akronym RAK vor.
Warum? Konkreter Anlaß war die Beobachtung, daß die Expansion einer
Suche nicht klappt, wenn das ALL-Register benutzt wird. Z.B. würde
man mit find all &schiller die Räuber nicht erwischen, wenn sie
(d.h. das Wort "raeuber") in Unterdatensätzen vorkommen, die den
Namen "Schiller" nicht enthalten.
Das kommt, weil das ALL-Register im Index .aex liegt, das Expansions-
Register aber in .adx: Das sind dort die Eintraege, die mit | beginnen
im Register 10.
Ob und wann diese Unzulänglichkeit behebbar sein wird, das steht noch
abzuwarten. Immerhin sind fast 4 Jahre verstrichen, seitdem das ALL-
Register entwickelt wurde, und erst jetzt fiel das Problem auf.
Was aber, so die Idee zum Trick, wenn das Expansionsregister einfach
irgendwie in .aex rüberkopiert werden könnte? Dann möcht's doch
gehen!? Ja, das tut es!
Das ist zwar nett, aber natürlich wird der Einwand sofort kommen:
Alsbald nach solchem Kopieren können sich schon wieder Einträge ändern!
Neue kommen hinzu, andere verschwinden. Und schon ist die Expansion
unzuverlässig - das ist schlimmer, als wenn's sie gar nicht gibt.
Richtig. Der Trick ist ein Behelf, mehr nicht. Aber was jahrelang gar
nicht auffiel, mag wohl damit erst einmal ein paar Wochen hingehen,
wenn man den Vorgang angemessen häufig wiederholt, vielleicht täglich
oder alle paar Stunden.
Das konkrete Beispiel soll deshalb mehr zur Veranschaulichung der
Methode dienen, nicht als wirkliche Lösung dieses speziellen Problems.
(FLEXperten seien angespornt, die Sache noch zu erweitern um eine
Routine, die zuerst aus .aex die bereits vorhandene Kopie des
Abschnitts wieder löscht, bevor der aktuelle Stand hineinkopiert wird.
Denn sonst bleiben Einträge stehen, die nicht mehr stimmen. Schön
wär's, man könnte das auch mit acon machen - das geht aber nicht,
weil acon den Modus f3 von qrix nicht kennt. Man müßte f1 nehmen
und die Prozedur etwas umständlicher umschreiben.)
Es folgt nun der FLEX trix.flx, der den Transfer des Expansions-
registers aus .adx nach .aex leistet. Man startet ihn in a99 mit
dem Aufruf X trix.
-----------------------------------------------------------------------
trix.flx : "transfer index" : SR-Register von .adx in .aex kopieren
2014-09-12
Verallgemeinerbar: Registerabschnitt in einen anderen Index kopieren
(wozu auch immer)
SR-Eintraege aus .adx in Datei trix.dat schreiben
open x trix.dat
Modus 3 fuer qrix einstellen und Separator --- für Von/Bis-Suche
qri f3
qri d---
Den Abschnitt in die Datei schreiben
Qri |: |0---|z
close x
Datei trix.dat dann zeilenweise einlesen und in .aex einfuegen.
Die Dateizeilen haben die Form ih||iu, wobei ih die Nummer des
Datensatzes ist, in dem "Schiller" steht, iu diejenige eines
Untersatzes, in dem "Räuber" steht.
open trix.dat
zur Sicherheit
set tbl lock
:srloop
Zeile lesen
get
Dateiende
if cancel jump ende
ins $q
Zeile zerlegen : aus ih||iu soll ih ~e:|iu werden
var $q (e"|")
ins $n
var $q (b"|")
ins $q
Zeile erstellen und einfuegen
var $n " ~e:" $q
ixadd
Schleife
jump srloop
:ende
flush index
close index
set tbl fre
close
del trix.dat
mes Done
Mehr Informationen über die Mailingliste Allegro