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