Seite 1 von 1

[Gelöst] Listenfeld mit Parameter-Abfrage befüllen

Verfasst: Sa 28. Nov 2015, 07:35
von OfficeUser
Hallo Zusammen

ich habe mich hier neu angemeldet, weil weder das Handbuch noch die Internetsuche zu erfolgreichen Ergebnissen geführt haben und ich hoffe hier hilfreiche Antworten zu erhalten.

Mein erstes Problem ist wie oben beschrieben, das befüllen eines Listenfeldes mit einer Parameter-Abfrage. Dabei habe ich mich genau an das Handbuch gehalten, trotzdem produziert der Formularaufruf nur Fehlermeldungen.

So sieht die Abfrage derzeit aus:

Code: Alles auswählen

SELECT "Geraete"."Modell" || ', ' || "Geraete"."Serien-Nr", "Geraete"."Person-ID", "Geraete"."ID" FROM "Geraete" WHERE "Gerate"."Person-ID" LIKE '%' || :qPersID || '%' ORDER BY "Geraete"."Modell"
Die Abfrage wird in einem Unterformular ausgeführt, in welchem sich das Listenfeld befindet. In einem ersten Formular wurde die Person gewählt und in einer Tabelle "Filter" dessen ID gespeichert. Danach wird über ein Button das neue Formular aufgerufen, in welchem das Gerät über das Listenfeld gewählt werden soll.

Rufe ich die Abfrage direkt über Abfragen auf und gebe eine gültige "qPersID" an, wird eine korrekte Tabelle ausgegeben. Rufe ich hingegen das Formular mit dem Listenfeld auf erscheint der Fehler:

Code: Alles auswählen

SQL-Status: S1000
Fehler-Code: -38

Assert failed: S0000 Direct execute with param count > 0java.lang.Exception
	at org.hsqldb.Trace.getStackTrace(Unknown Source)
	at org.hsqldb.Trace.doAssert(Unknown Source)
	at org.hsqldb.DatabaseCommandInterpreter.executePart(Unknown Source)
	at org.hsqldb.DatabaseCommandInterpreter.execute(Unknown Source)
	at org.hsqldb.Session.sqlExecuteDirectNoPreChecks(Unknown Source)
	at org.hsqldb.Session.execute(Unknown Source)
	at org.hsqldb.jdbc.jdbcStatement.fetchResult(Unknown Source)
	at org.hsqldb.jdbc.jdbcStatement.executeQuery(Unknown Source)
Falls ich meine Frage unzureichend geschildert habe bitte ich um Verzeihung, ich bin nicht nur hier neu, sondern beschäftige mich auch erst 1 Woche mit BASE. ;)

Lieben Gruß
Klaus

Re: Listenfeld mit Parameter-Abfrage befüllen

Verfasst: Sa 28. Nov 2015, 09:10
von RobertG
Hallo Klaus,

das Befüllen eines Listenfeldes mit Paramater-Abfragen geht nicht. Siehe Handbuch "Verwendung von Parametern in Abfragen", letzter Absatz:
Manchmal wäre es wünschenswert, Listenfelder in Abhängigkeit von Einstellungen des Hauptformulars zu ändern. So könnte beispielsweise ausgeschlossen werden, dass in einer Bibliothek Medien an Personen entliehen werden, die zur Zeit keine Medien ausleihen dürfen. Leider ist aber
eine derartige Listenfelderstellung in Abhängigkeit von der Person über Parameter nicht möglich.
Deine Abfrage stellt aber auch keine Listenfeldabfrage dar. Eine Listenfeldabfrage benötigt höchstens 2 Felder - eins, das im Formular angezeigt wird, ein anderes, das in der zugrundeliegenden Datenquelle abgespeichert wird. In sofern tappe ich da etwas im Dunkeln.

Wenn Du bereits eine Filtertabelle hast, so kannst Du das Listenfeld auf die Filtereingabe beziehen. Aber auch dann musst Du das Listenfeld nach der Abspeicherung des Filterwertes erst einmal aktualisieren. So ein Listenfeld wird direkt beim Öffnen des Formulars erstellt, nicht beim Wechsel vom Hauptformular zum Unterformular.

Gruß

Robert

Re: Listenfeld mit Parameter-Abfrage befüllen

Verfasst: Sa 28. Nov 2015, 09:39
von F3K Total
Moin,
ich empfehle dir deine .odb Datei, wenn nötig verfremdet, als .zip gepackt weil dieses Forum .odb nicht zuläßt, hier hochzuladen.
Siehe beim Editieren eines Threads unten, Reiter Dateianhänge.
Dann kann dir bestimmt geholfen werden.
Gruß R

Re: Listenfeld mit Parameter-Abfrage befüllen

Verfasst: Sa 28. Nov 2015, 09:50
von OfficeUser
Hallo Robert

erstmal danke für deine Antwort, auch wenn ich diese nicht wirklich nachvollziehen kann.

1. Das Listenfeld soll nur 1x befüllt werden beim Aufruf des Formulars.

2. Die Werte stammen alle samt aus einer Tabelle (Geräte) und nur der Suchwert (Parameter) sollte aus der zweiten Tabelle (Filter) genommen werden.

3. Steht im Handbuch (S. 255) auch unter "Verwenden von Parametern in Abfragen" folgendes Beispiel:
SELECT
"Ausleihe"."ID",
"Leser"."Nachname"||', '||"Leser"."Vorname",
"Ausleihe"."MedienID",
"Ausleihe"."Ausleihdatum"
FROM "Ausleihe", "Leser"
WHERE "Ausleihe"."Rückgabedatum" IS NULL
AND "Leser"."ID" = "Ausleihe"."LeserID"
AND "Leser"."Nachname" LIKE '%' || :Lesername || '%'
ORDER BY "Leser"."Nachname"||', '||"Leser"."Vorname" ASC;
Diese Abfrage ist noch deutlich komfortabler als die vorhergehende. Jetzt muss nicht eine Nummer des Lesers bekannt sein. Es reicht die Eingabe eines Teils des Nachnamen des Lesers und alle Medien von Lesern, auf die diese Beschreibung zutrifft, werden angezeigt.

Jetzt stellt sich mir die Frage ob bzw. wie ich das Problem lösen kann. Muss ich eine temporäre Tabelle erstellen vor Aufruf des Formulars welche schon alle Geräte einer Person erhält?

Für weiter Vorschläge wäre ich sehr dankbar.


Lieben Gruß
Klaus

Re: Listenfeld mit Parameter-Abfrage befüllen

Verfasst: Sa 28. Nov 2015, 11:13
von RobertG
Hallo Klaus,
OfficeUser hat geschrieben: Die Werte stammen alle samt aus einer Tabelle (Geräte) und nur der Suchwert (Parameter) sollte aus der zweiten Tabelle (Filter) genommen werden.
Dann beziehe doch den Wert aus der Tabelle "Filter" und nicht über einen Parameter:

Code: Alles auswählen

SELECT "Geraete"."Modell" || ', ' || "Geraete"."Serien-Nr", "Geraete"."Person-ID", "Geraete"."ID" FROM "Geraete" WHERE "Gerate"."Person-ID" = (SELECT "Person-ID" FROM "Filter") ORDER BY "Geraete"."Modell"
Ich weiß jetzt natürlich nicht, wie die Tabelle "Filter" bei Dir aufgebaut ist. Gegebenenfalls musst Du die Unterabfrage auf einen einzelnen Datensatz eingrenzen (SELECT "Person-ID" FROM "Filter" WHERE "ID" = 1).

Mach' doch einfach das, was F3K Total geschrieben hat: Lade die Datei als *.zip-Datei hier hoch - müsste lediglich ein paar Beispieldaten enthalten.

Gruß

Robert

Re: Listenfeld mit Parameter-Abfrage befüllen

Verfasst: Sa 28. Nov 2015, 14:54
von OfficeUser
Hallo Robert

deine Lösung klappt hervorragend. :D

Sorry, für das späte Feedback, jedoch war ich noch damit beschäftigt eine Muster-Datenbank zu erstellen, weil das Entfremden der aktuellen Datenbank noch aufwendiger gewesen wäre. ;)


Bitte denkt beim Download daran, die Datenbank ist noch nicht fertig. Außerdem enthält sie Makros!
Muster.odb.zip
(20.03 KiB) 180-mal heruntergeladen

Danke an alle Helfer und Grüße an alle anderen.
Klaus

Re: Listenfeld mit Parameter-Abfrage befüllen

Verfasst: Sa 28. Nov 2015, 16:08
von F3K Total
Hi,
ich habe dir mal alles in ein Formulardokument gepackt. Strukturell ist ein Unterformular hinzugekommen, schau es dir mit dem Formularnavigator an.
Gruß R

Re: Listenfeld mit Parameter-Abfrage befüllen

Verfasst: Sa 28. Nov 2015, 16:51
von OfficeUser
Hallo R

danke für den Lösungsansatz, jedoch bleibe ich bei dem weiteren Formular. Denn sowohl aus dem ersten, als auch aus dem zweiten Formular gibt es weitere Verzweigungen, welche auf die Filtertabelle zurückgreifen.

Mal sehen, wenn ich es schaffe und weitere Fragen anstehen baue ich die Muster-Datenbank parallel mit auf. ;)


Lieben Gruß
Klaus

Re: Listenfeld mit Parameter-Abfrage befüllen

Verfasst: So 29. Nov 2015, 06:52
von F3K Total
Moin Klaus,
wenn du bei deiner Version bleiben möchtest, hier noch ein Tipp zum Öffnen/Schließen Makro, momentan nutzt du es nicht so wie gedacht.
Wenn du im Formular-Entwurfsmodus auf die Eigenschaften der Schaltfläche -> Reiter Allgemein wechselst, findest du weiter unten den Eintrag Zusatzinformation. Genau diese wird mit der Code Zeile

Code: Alles auswählen

stTag = oEvent.Source.Model.Tag
ausgelesen.
D.h. wenn du in die Zusatzinformation GeraetAuswahl,PersonAuswahl einträgst, nimmt sich das Makro die Namen der betroffenen Formulare aus der Schaltfläche.
So kannst Du mit einem einzigen Makro hundert verschiedene Formulare mit unterschiedlichen Schaltflächen Öffnen/Schließen

Code: Alles auswählen

Sub Wechsel_von_Person_zu_Geraet (oEvent AS OBJECT)
	DIM stTag AS String
	DIM aForm()
	stTag = oEvent.Source.Model.Tag
	aForm() = Split(stTag, ",")
	ThisDatabaseDocument.FormDocuments.getByName( Trim(aForm(0)) ).open
	ThisDatabaseDocument.FormDocuments.getByName( Trim(aForm(1)) ).close
End Sub
Gruß R

Re: Listenfeld mit Parameter-Abfrage befüllen

Verfasst: So 29. Nov 2015, 07:42
von OfficeUser
Hallo R

vielen Danke für diesen Tipp, welcher wirklich eine Erleichterung darstellt. :D


Lieben Gruß
Klaus