[Allegro] Trick 50: Datensatz umtopfen

Bernhard Eversberg ev at biblio.tu-bs.de
Mo Jul 30 12:09:24 CEST 2007


Trick 50: Datensatz umtopfen

Aufgabe: Einen Datensatz in eine andere Datei überführen.
          (Gemeint ist: in eine andere Datendatei innerhalb derselben
          Datenbank, nicht in eine andere Datenbank!)

Warum: Im Prinzip (für das Funktionieren der Software) hat es keine
        Bedeutung, in welcher Datei sich ein Satz befindet! Man muß
        sich also deswegen eigentlich keinen Kopf machen. Es gibt
        aber Systemverwalter, die gerne hübsch ordentlich ihre Daten-
        sätze auf eine Anzahl von Dateien aufteilen. Dann müssen
        Vorkehrungen getroffen werden, damit ein Satz bei seiner
        Erfassung gleich in die richtige Datei gespeichert wird.
        Versehentlich entwischt dann schon mal einer in die falsche
        Datei, und man ärgert sich - obwohl's, wie gesagt, egal ist.

        Es kann aber ein Vorteil sein, wenn Sätze bestimmter Typen in
        separaten Dateien sind, z.B. kann eine Volltextsuche dann
        schneller sein, wenn sie auf nur eine, die richtige, Datei
        begrenzt wird. Oder man kann besondere Sätze, die nur
        temporär gebraucht werden, leicht wieder alle loswerden.

Wo sieht man, in welcher Datei ein Satz steckt? Im zweiten Statusfeld
unten rechts stehen 3 Zahlen. Liest man da z.B. 938/1 L225, so
bedeutet das: Satz 938 ist gerade zu sehen, er steckt in Datei 1 und
ist 225 Byte lang.
Tip: Im FLEX kann man dieselben Angaben als Sondervariablen abrufen:
      i    interne Nummer des Satzes
      j    Dateinummer
      jb   Länge des Satzes in Byte


Lösung:
-------
Direkt (physisch) in eine ander Datei verschieben kann man den Satz
nicht. Er muß kopiert und als neuer Satz gespeichert werden, den alten
dagegen muß man löschen.
(Die Dateinummer kann eine Zahl von 1 bis 255 sein.)
Sagen wir, ein Satz ist in der Datei mit der Nummer 17 gespeichert,
also in  cat_17.ald  beim Standardmodell. Er soll aber in die Datei 50.

Das geht so: (man staunt doch, wieviele Schritte nötig sind, wenn alles
stimmen soll... Wenn man nicht mit A.CFG arbeitet, sind einige Feld-
nummern sinngemäß zu ändern.)

   Momentane Nummer f. NEUE Sätze ist die Sondervar. N
var N
ins $unn
   Statt dessen Nummer 50 einstellen (mit ".."!)
var "50"
input
var #00
ins $u00
var #99n
ins $u99n
   den aktuellen Satz löschen
erase
   ihn kopieren
copy
   und als neuen Satz speichern - kommt in Datei 50
   aber zuerst die alte #00 wieder einsetzen
var $u00
ins #00
put
   Jetzt die alte #99n auch wieder einsetzen, nochmal speichern
var $u99n
ins #99n
put
   Nummer für neue Sätze wieder zurückstellen
var $unn
input
   kopierten Satz anzeigen
sho rec
disp


Hinweise:
Man braucht im FLEX nur die Nummer der Zieldatei (die 50 also).
Die Sache mit #99n (Datum der Erfassung des Satzes) wird nur
gemacht, weil sonst die #99n auf das aktuelle Datum gesetzt wird, denn
der Satz gilt für das System als neuer Satz und kriegt automatisch
in der #99n das aktuelle Datum. Deshalb wird der Satz nach dem
Speichern nochmal um die alte #99n bereichert und erneut gespeichert,
dann bleibt sie nämlich erhalten, es gibt aber eine neue #99e. Das
kann man NICHT verhindern, d.h. die alte ist dann weg.

Die #00 wird gleichfalls beim Kopieren gelöscht und dann beim
Speichern erneuert. Wenn man sie aber vor dem Speichern neu belegt,
wird keine neue Nummer vergeben.

Seine INTERNE Nummer kann der Satz nicht behalten, er bekommt eine
neue - die alte bleibt beim gelöschten Satz. Dies macht aber nichts
aus, denn die interne Nummer hat nur interne Bedeutung, der Anwender
kann nichts damit anfangen. Die interne Nummer steht nicht in einer
Kategorie! Die #00 ist etwas anderes, sie bleibt beim Kopieren
zwar nicht automatisch erhalten, wenn man sie aber wieder in die
#00 einsetzt (wie oben zu sehen), dann wird keine neue vergeben.

Die ganze Prozedur kann man auch in die normale Schleife zum
Abarbeiten einer Ergebnismenge einbauen, um gleich in einem Zuge
eine größere Zahl von Sätzen umzutopfen.





Mehr Informationen über die Mailingliste Allegro