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.