Trick 43: Zweiten
Datensatz laden oder anlegen und nutzen
Aufgabe: In einem FLEX wird
irgendein Satz bearbeitet, und man
will schnell mal nebenbei einen anderen Satz heranziehen, um
daraus irgendwas zu entnehmen oder irgendwas damit zu tun,
dann aber zum ersteren zurück, mit dem man noch nicht fertig
gewesen war.
Warum: Sowas kommt halt immer
öfter mal vor! Z.B. ein Stammsatz, ein
Lesersatz, ein Auftraggeber-, Kontingent-, Medientypsatz und
was dergleichen mehr so alles auftritt beim Erwerbungs- und
Ausleihgeschäft.
Lösung: Zu Fuß macht man
es so, und dieses Rezept findet sich auch
in so manchem mitgelieferten FLEX
immer noch:
REZEPT 1
var
i // Nummer des
aktuellen Satzes
ins
#uaI // in der
Variablen #uaI sichern
f1nd
... // einen anderen Satz laden
...
// damit irgendwas tun
var "#" #uaI // den
vorherigen Satz zurückholen
find
...
// und damit weitermachen
Problem: Wenn es sich um einen
neuen, noch nicht gespeicherten Satz
handelt! Dann ist die Variable i
nämlich 0 ...
Zum Glück geht es aber auch
anders und sicherer: (siehe in h xset )
REZEPT 2
switch obj 2 //
umschalten auf Satzobjekt 2
f1nd
// anderen Satz holen
...
// damit irgendwas tun
switch obj 1 //
Satzobj. 1 wieder einschalten
Auf diese Weise bleibt der erste
Satz ("Objekt 1") unberührt liegen,
während das, was zwischendurch
gemacht wird, an einem getrennten
"Objekt 2" stattfindet.
Bei avanti war das übrigens
schon lange so.
M.a.W.: Wenn man "switch obj" nie
benutzt, arbeitet man automatisch
immer mit "Objekt 1", und "Objekt
2" liegt ungenutzt herum.
Im Abschnitt "damit irgendwas tun"
können durchaus mehrere find-
oder f1nd-Befehle vorkommen, nicht
aber weitere "set obj ...", denn
es gibt nur die Objekte 1 und 2,
und Nummer 1 ist die ganze Zeit
derjenige Satz, zu dem man
letztlich dann zurückgehen will.
Die ältere Methode dagegen
würde es gestatten, daß man einfach mehrere
Variablen #u... mit mehreren
Satznummern belegt und diese Sätze dann
nach Bedarf wieder aktiviert. Falls
man nicht die Übersicht verliert...
Die Umschaltung gilt bis zum
nächsten switch, wenn keiner kommt also
bis zum Sitzungsende, d.h.
über den konkreten FLEX hinaus. Man arbeitet
also, wurde "switch obj 1"
vergessen, anschließend die ganze Zeit mit
dem Objekt 2. Was jedoch keinen
Schaden stiftet.
Gewiefte Programmierer bohren
sofort nach:
Warum gibt dann nicht gleich ein
ganzes Array von Sätzen, zwischen
denen man nach Belieben umschalten
kann? Nun, das Array gibt es! Das
ist der Reservespeicher. Was fehlt,
ist nur eine FLEX-Methodik,
zwischen diesen nach Belieben
herumzuspringen, wie man es ja
manuell schon kann! Es wird ins
Auge gefaßt, dies zu realisieren.
(SEHR groß kann der Bedarf
wohl nicht sein, er hätte sich dann
längst artikuliert...)
Anwendungsbeispiel
Situation: Man hat eine
Ergebnismenge von Bestelldatensätzen und
will dazu schnell mal eben eine
Titelliste, in der man die wichtigsten
Titel- aber auch Bestellangaben
sieht. Das kann man nun machen,
ohne irgendwelche Parameter zu
schreiben!
Das könnte so aussehen (und
wird Bestandteil von ORDER werden):
Mit **** ist markiert, wo man
variieren und erweitern könnte. Es ist
auch mehrfaches Umschalten zwischen
Bestell- und Titelsatz möglich,
aber zu beenden ist der Vorgang
mit set obj 1!
O-TLISTE.FLX : Titelliste
der Bestellungen
20070529 ausgehend v. einer
Bestellungs-Erg.Menge
Erster Satz d. Bestellmenge
first
if not #9DA jump sorry
open x liste.txt
Titel der Erg.Menge
wri n U n n
:loop
TitelID aus Bestellsatz
entnehmen
var "|9 " #9DA$T
set obj 2
Titelsatz dazu laden
f1nd
V14-Verkn. aufloesen
if v14 export Ref
**** Titeldaten ausgeben
wri #20(e" : ") " / " #40 ". - "
#76 n
zurueck zum Bestellsatz
set obj 1
**** Bestelldaten
wri " A:" #9DB$A "
L:" #9DB$j " D:" #9DB$d " : " #9DB$c " " #9DB$p n n
naechster Bestellsatz
next
if yes jump loop
close x
Datei schliessen und
anzeigen
h liste.txt
end
:sorry
var "Sorry, die aktuelle
Ergebnismenge besteht nicht aus Bestelldaten"
mes
end