View-Listen in externen Flexen erzeugen
Anando Eger
anando at aneg-dv.de
Do Apr 11 10:46:34 CEST 2002
Liebe Listenleserinnen und -leser,
flexgsteuert möchte ich dem Programmnutzer die Auswahl aus einer
Reihe von Datensätzen ermöglichen.
Die einfachste Möglichkeit, den Index zu nutzen, ist nicht
immer brauchbar, da man die Auswahl nicht begrenzen kann
und der Index-Eintrag auch nicht immer aussagekräftig genug
gehalten werden kann.
Die select-Anweisung scheint für kleine Anzahlen zu funktionieren,
ab 100 ... 150 Einträgen "fliegt" aber a99 ab und produziert
unvorhersehbares Verhalten.
(150x40 ergibt erst 6000, lt. Hrn. Eversberg darf die Steuervariable
64k groß werden...?)
Die nächstschönere Variante wären dann die View-Listen - dachte ich.
Gedacht, probiert - folgendes Ergebnis erhalten:
Ziel war es, über eine find-Anweisung eine Ergebnismenge zu bilden,
daraus Datensätze zu eliminieren, und den Rest dem Benutzer zur
Auswahl anzubieten. Der getestete Weg:
- Ergebnismenge in Schleife durchlaufen
- *.vw-Datei erstellen
- Auswahl über "View dateiname" anbieten
Ergebnis: Viewlistenanzeige- und Auswahlfunktionen verhalten sich
unter diesen Umständen fehlerhaft.
Für die Interessierten hier die Testumgebung und ein Test-Flex,
mit dem man das Verhalten in der demo2-DB nachvollziehen kann:
- a99 Versionen seit 04/01
- Standard-Installation auf c: mit DEMO-Datenbank unter demo2
- test.flx in demo2-Verzeichnis (test.flx am Ende dieser Mail)
- Startverzeichnis ist das allegro-Stammverzeichnis
A: Ausgangspunkt: Dateien leser.vw* sind nicht vorhanden.
Nach erstmaligem Programmstart und Anzeige eines beliebigen
Datensatzes wird mit "X test" die Flexdatei gestartet.
Das Programm zeigt keine Vieliste an, obwohl eine Ergebnismenge
gebildet wurde.
Im allegro-Verzeichnis gibt es ab dem Zeitpunkt eine leser.vw und
eine leser.vwn mit der Länge 0, was darauf hindeutet, dass die
Viewliste vom Programm trotz vorherigem "close"-Befehl nicht
geschlossen wurde.
B: wie A:, aber flex wird einfach erneut gestartet.
Jetzt wird eine Vieliste gezeigt, die sich aber fehlerhaft
verhält: Anzeige erfolgt nicht, Auswahl mit Enter oder OK führt
zu irregulären Ergebnissen
C: wie A: , Programm wird aber geschlossen.
Jetzt steht die Viewliste (hier_ leser.vw) im
Dateisystem mit einer richtigen Länge.
D: wie C:, dann Ausführung von "x View leser.vw"
Anzeige der Viewliste funktioniert normal.
E: wie B:, flex wird ein drittes Mal gestartet.
Verhalten wie unter B:, Liste ist jetzt jedoch von doppelter
Länge.
Fazit: offensichtlich werden die mit "open x dateiname" erstellten
Dateien vom Programm mit "close" nicht geschlossen, wass alle
folgenden Fehhler erklären würde.
Kennt jemand einen "workaround"?
Oder habe ich irgendetwas nicht beachtet/übersehen? (vielleicht
irgendeine "Magie" ...?)
Der von mir verwendete Verfahren:
--------- test.flx Anfang ------------------------------------------
Test-Flex für Viewlisten
Ermittelt in demo2-Datenbank alle Datensätze
über |:B? und bietet nur Lesersätze über
Viewliste zur Auswahl an.
close res
var "|: B?"
find
if l1 jump kein_benutzer
if l2 jump ein_benutzer
order a 0
first
delete leser.vw
delete leser.vwn
open x leser.vw
if no jump ERR_OPEN
:b_loop
nur Benutzer in Viewliste schreiben:
if #9B jump schreiben
jump loop_end
:schreiben
write #nr "|" #9B$n " - Nr:" #nr n
:loop_end
next
if no jump b_select
solange noch Sätze in Erg.-menge:
jump b_loop
:b_select
close
View leser.vw
if "" jump Abbruch
hier müsste die ausgewählte Zeile gezeigt werden:
mes
end
:kein_benutzer
mes Nichts gefunden!
end
:ein_Benutzer
mes Genau einen Benutzer gefunden.
end
:Abbruch
mes Abbruch
end
--------- test.flx Ende ------------------------------------------
Schon mal Dank für evtl. Hinweise und viele Grüße
Anando Eger
Mehr Informationen über die Mailingliste Allegro