[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