[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