Discussion:
Parameterabfrage hinter Formular per VBA füllen
(zu alt für eine Antwort)
Johannes Curio
2008-03-27 21:18:00 UTC
Permalink
Hallo allerseits,

Ich habe folgendes Problem: ich möchte ein Formular, hinter der eine
Parameterabfrage steht, von mehreren Formularen aus aufrufen und jedes Mal
mit anderen Parameterwerten.

Beispiel: Ein Formular, wo man über eine Parameterabfrage sich bestimme
Kunden anzeigen lassen kann.
Wenn ich das Kundenformular von Formular xyz aufrufe, dann möchte ich nur
alle Kunden mit Nachnamensanfangsbuchstaben B sehen und wenn ich es von
Formular abc aufrufe, dann möchte ich nur alle Kunden mit
Nachnamensanfangsbuchstaben J sehen.

Wie löse ich das? Mein Problem: Scheinbar kann man bei DoCmd.OpenForm die
Parameterabfrage nicht abfangen.

Danke Euch
Johannes
Gunter Avenius
2008-03-27 21:21:43 UTC
Permalink
Hallo Johannes,
Post by Johannes Curio
Ich habe folgendes Problem: ich möchte ein Formular, hinter der eine
Parameterabfrage steht, von mehreren Formularen aus aufrufen und jedes Mal
mit anderen Parameterwerten.
Beispiel: Ein Formular, wo man über eine Parameterabfrage sich bestimme
Kunden anzeigen lassen kann.
Wenn ich das Kundenformular von Formular xyz aufrufe, dann möchte ich nur
alle Kunden mit Nachnamensanfangsbuchstaben B sehen und wenn ich es von
Formular abc aufrufe, dann möchte ich nur alle Kunden mit
Nachnamensanfangsbuchstaben J sehen.
Wie löse ich das? Mein Problem: Scheinbar kann man bei DoCmd.OpenForm die
Parameterabfrage nicht abfangen.
www.donkarl.com?FAQ6.16 geht darauf ein.

Gruß
Gunter
--
__________________________________________________________
Access FAQ: http://www.donkarl.com
home: http://www.avenius.com - http://www.AccessRibbon.de
http://www.ribboncreator.de

SQL Server-Entwickler-Konferenz: www.donkarl.com/?SEK
Sa/So 12./13.04.2008 und Sa/So 19./20.04.2008
Johannes Curio
2008-03-27 21:36:00 UTC
Permalink
Hi Gunter,

danke für den Tipp, aber hatte ich schon ausprobiert. DonKarl ruft die
Abfrage direkt auf. Meine Abfrage steckt aber hinter einem Formular.

Wenn ich also
Dim qry As Query
Set qry = CurrentDb.QueryDefs("qry_Nachnamensuchen")
qry.Parameters("anf") = "M"
DoCmd.OpenForm "frm_qry_Nachnamensuchen"
versuche, dann entstehen 2 Abfragen im Arbeitsspeicher, die nichts
miteinandern zu tun haben.

Es wäre klasse, wenn es eine Lösung gäbe, denn meine Parameterabfrage
füttert ein Listbox und ich möchte das Ganze nicht 10 mal redundant
erstellen, nur weil sich der Parameter ändert.

Johannes
Post by Gunter Avenius
Hallo Johannes,
Post by Johannes Curio
Ich habe folgendes Problem: ich möchte ein Formular, hinter der eine
Parameterabfrage steht, von mehreren Formularen aus aufrufen und jedes Mal
mit anderen Parameterwerten.
Beispiel: Ein Formular, wo man über eine Parameterabfrage sich bestimme
Kunden anzeigen lassen kann.
Wenn ich das Kundenformular von Formular xyz aufrufe, dann möchte ich nur
alle Kunden mit Nachnamensanfangsbuchstaben B sehen und wenn ich es von
Formular abc aufrufe, dann möchte ich nur alle Kunden mit
Nachnamensanfangsbuchstaben J sehen.
Wie löse ich das? Mein Problem: Scheinbar kann man bei DoCmd.OpenForm die
Parameterabfrage nicht abfangen.
www.donkarl.com?FAQ6.16 geht darauf ein.
Gruß
Gunter
--
__________________________________________________________
Access FAQ: http://www.donkarl.com
home: http://www.avenius.com - http://www.AccessRibbon.de
http://www.ribboncreator.de
SQL Server-Entwickler-Konferenz: www.donkarl.com/?SEK
Sa/So 12./13.04.2008 und Sa/So 19./20.04.2008
Karl Donaubauer
2008-03-27 21:35:13 UTC
Permalink
Hallo, Johannes!
Post by Johannes Curio
Ich habe folgendes Problem: ich möchte ein Formular, hinter der eine
Parameterabfrage steht, von mehreren Formularen aus aufrufen und jedes Mal
mit anderen Parameterwerten.
Beispiel: Ein Formular, wo man über eine Parameterabfrage sich bestimme
Kunden anzeigen lassen kann.
Wenn ich das Kundenformular von Formular xyz aufrufe, dann möchte ich nur
alle Kunden mit Nachnamensanfangsbuchstaben B sehen und wenn ich es von
Formular abc aufrufe, dann möchte ich nur alle Kunden mit
Nachnamensanfangsbuchstaben J sehen.
Wie löse ich das? Mein Problem: Scheinbar kann man bei DoCmd.OpenForm
die Parameterabfrage nicht abfangen.
Die beste Lösung besteht darin, sich an die Standards zu halten.
Dann tritt das Problem gar nicht erst auf.
D.h. du nimmst keine Parameterabfrage als Datenherkunft des
Formulares - die sind eben dazu gedacht per Parameterfensterl
nach einem ebensolchen zu fragen - sondern eine ohne Parameter.

Dann kannst du ganz normal mit der WHERE-Bedingung der
OpenForm-Methode arbeiten.
--
HTH
Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: http://www.donkarl.com
2. SQL Server-Entwickler-Konferenz: www.donkarl.com/?SEK
Nürnberg 12./13.4. + 19./20.4.2008
Johannes Curio
2008-03-27 22:11:00 UTC
Permalink
Hi Karl,
Danke für die Antwort.
Ich habe in einem Unterformular 2 Listboxen, welche sich gegenseitig Daten
austauschen, d.h. obere Listbox zeigt alle Artikel, unten nur die
ausgewählten für den ausgewählten Kunden. da ich wegen "Select ... nicht in
(Select ...)" mir das rumfingern am SQL-Befehl sparen wollte, kam mir die
Idee mit der Parameterabfrage, besonders vor dem Hintergrund, dass
gespeicherte Abfragen performanter seien als SQL-Befehl.
Gerade vor diesem Performance-Hintergrund wäre eine Lösung interessant. Oder
wird der Performance-Grund durch die Parameter-Abfrage sowieso ausgehöhlt?
Gruß
Johannes
Post by Karl Donaubauer
Hallo, Johannes!
Post by Johannes Curio
Ich habe folgendes Problem: ich möchte ein Formular, hinter der eine
Parameterabfrage steht, von mehreren Formularen aus aufrufen und jedes Mal
mit anderen Parameterwerten.
Beispiel: Ein Formular, wo man über eine Parameterabfrage sich bestimme
Kunden anzeigen lassen kann.
Wenn ich das Kundenformular von Formular xyz aufrufe, dann möchte ich nur
alle Kunden mit Nachnamensanfangsbuchstaben B sehen und wenn ich es von
Formular abc aufrufe, dann möchte ich nur alle Kunden mit
Nachnamensanfangsbuchstaben J sehen.
Wie löse ich das? Mein Problem: Scheinbar kann man bei DoCmd.OpenForm
die Parameterabfrage nicht abfangen.
Die beste Lösung besteht darin, sich an die Standards zu halten.
Dann tritt das Problem gar nicht erst auf.
D.h. du nimmst keine Parameterabfrage als Datenherkunft des
Formulares - die sind eben dazu gedacht per Parameterfensterl
nach einem ebensolchen zu fragen - sondern eine ohne Parameter.
Dann kannst du ganz normal mit der WHERE-Bedingung der
OpenForm-Methode arbeiten.
--
HTH
Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: http://www.donkarl.com
2. SQL Server-Entwickler-Konferenz: www.donkarl.com/?SEK
Nürnberg 12./13.4. + 19./20.4.2008
Karl Donaubauer
2008-03-27 22:33:45 UTC
Permalink
Post by Johannes Curio
Post by Karl Donaubauer
Post by Johannes Curio
...
Beispiel: Ein Formular, wo man über eine Parameterabfrage sich bestimme
Kunden anzeigen lassen kann.
Wenn ich das Kundenformular von Formular xyz aufrufe, dann möchte ich
nur alle Kunden mit Nachnamensanfangsbuchstaben B sehen und wenn ich es
von Formular abc aufrufe, dann möchte ich nur alle Kunden mit
Nachnamensanfangsbuchstaben J sehen.
Wie löse ich das? Mein Problem: Scheinbar kann man bei DoCmd.OpenForm
die Parameterabfrage nicht abfangen.
Die beste Lösung besteht darin, sich an die Standards zu halten.
Dann tritt das Problem gar nicht erst auf.
D.h. du nimmst keine Parameterabfrage als Datenherkunft des
Formulares - die sind eben dazu gedacht per Parameterfensterl
nach einem ebensolchen zu fragen - sondern eine ohne Parameter.
Dann kannst du ganz normal mit der WHERE-Bedingung der
OpenForm-Methode arbeiten.
...
Ich habe in einem Unterformular 2 Listboxen, welche sich gegenseitig Daten
austauschen, d.h. obere Listbox zeigt alle Artikel, unten nur die
ausgewählten für den ausgewählten Kunden. da ich wegen "Select ... nicht
in (Select ...)" mir das rumfingern am SQL-Befehl sparen wollte, kam mir
die Idee mit der Parameterabfrage,
Hmm, ich verstehe weder deine Select...-Andeutungen, noch die
Begründung für die Parameterabfrage, noch den Zusammenhang
mit OpenForm.
Post by Johannes Curio
besonders vor dem Hintergrund, dass
gespeicherte Abfragen performanter seien als SQL-Befehl.
Gerade vor diesem Performance-Hintergrund wäre eine Lösung interessant.
Oder wird der Performance-Grund durch die Parameter-Abfrage sowieso
ausgehöhlt?
Joo, die Optimierungsversuche von JET sind bei Parameterabfragen
- eben wegen des unbekannten Parameterwertes - nicht sehr zuverlässig
und können auch komplett danebengehen. Die Empfehlung im guten
alten JET-Performance-Whitepaper lautet daher, statt Parameterabfragen
möglichst den SQL-String per VBA zu basteln.
--
HTH
Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: http://www.donkarl.com
2. SQL Server-Entwickler-Konferenz: www.donkarl.com/?SEK
Nürnberg 12./13.4. + 19./20.4.2008
Johannes Curio
2008-03-27 22:59:01 UTC
Permalink
Danke, dann werde ich mal das Basteln anfangen ...
Post by Karl Donaubauer
Post by Johannes Curio
Post by Karl Donaubauer
Post by Johannes Curio
...
Beispiel: Ein Formular, wo man über eine Parameterabfrage sich bestimme
Kunden anzeigen lassen kann.
Wenn ich das Kundenformular von Formular xyz aufrufe, dann möchte ich
nur alle Kunden mit Nachnamensanfangsbuchstaben B sehen und wenn ich es
von Formular abc aufrufe, dann möchte ich nur alle Kunden mit
Nachnamensanfangsbuchstaben J sehen.
Wie löse ich das? Mein Problem: Scheinbar kann man bei DoCmd.OpenForm
die Parameterabfrage nicht abfangen.
Die beste Lösung besteht darin, sich an die Standards zu halten.
Dann tritt das Problem gar nicht erst auf.
D.h. du nimmst keine Parameterabfrage als Datenherkunft des
Formulares - die sind eben dazu gedacht per Parameterfensterl
nach einem ebensolchen zu fragen - sondern eine ohne Parameter.
Dann kannst du ganz normal mit der WHERE-Bedingung der
OpenForm-Methode arbeiten.
...
Ich habe in einem Unterformular 2 Listboxen, welche sich gegenseitig Daten
austauschen, d.h. obere Listbox zeigt alle Artikel, unten nur die
ausgewählten für den ausgewählten Kunden. da ich wegen "Select ... nicht
in (Select ...)" mir das rumfingern am SQL-Befehl sparen wollte, kam mir
die Idee mit der Parameterabfrage,
Hmm, ich verstehe weder deine Select...-Andeutungen, noch die
Begründung für die Parameterabfrage, noch den Zusammenhang
mit OpenForm.
Post by Johannes Curio
besonders vor dem Hintergrund, dass
gespeicherte Abfragen performanter seien als SQL-Befehl.
Gerade vor diesem Performance-Hintergrund wäre eine Lösung interessant.
Oder wird der Performance-Grund durch die Parameter-Abfrage sowieso
ausgehöhlt?
Joo, die Optimierungsversuche von JET sind bei Parameterabfragen
- eben wegen des unbekannten Parameterwertes - nicht sehr zuverlässig
und können auch komplett danebengehen. Die Empfehlung im guten
alten JET-Performance-Whitepaper lautet daher, statt Parameterabfragen
möglichst den SQL-String per VBA zu basteln.
--
HTH
Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: http://www.donkarl.com
2. SQL Server-Entwickler-Konferenz: www.donkarl.com/?SEK
Nürnberg 12./13.4. + 19./20.4.2008
Josef Poetzl
2008-03-27 23:27:42 UTC
Permalink
Hallo Karl!
Post by Karl Donaubauer
Joo, die Optimierungsversuche von JET sind bei Parameterabfragen
- eben wegen des unbekannten Parameterwertes - nicht sehr zuverlässig
und können auch komplett danebengehen.
Hast du ein Beispiel für so ein Verhalten. Ich kann es mir derzeit
nicht vorstellen, wie etwas schief gehen soll.

Bedeutet das, dass der Jet-Abfrage-Optimierer den Ausführungsplan
abhängig von Werten und nicht von "Index-/Tabellen-Analysen" macht?
Ich hätte angenommen, dass es dem Optimierer egal ist, welcher Wert
genutzt wird, da die Index-Verwendung doch eher vom zu filternden Feld
(und dessen Wert-Verteilung) und nicht vom Filterwert abhängig sein
sollte.

ich stelle mir gerade so einen Abfrageaufbau vor:
| Parameters P1 long, P2 string;
| Select
| ...
| FROM
| ...
| WHERE
| X.FeldA = [P1]
| AND
| Y.Feld1 = [P2]

Bei so einer Parameter-Abfrage würde ich nicht erwarten, dass diese
einen anderen Ausführungsplan als eine Abfrage mit fixen Werten statt
den Parametern liefert.


mfg
Josef
--
EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/
Karl Donaubauer
2008-03-27 23:46:39 UTC
Permalink
Hallo, Josef!
Post by Josef Poetzl
Post by Karl Donaubauer
Joo, die Optimierungsversuche von JET sind bei Parameterabfragen
- eben wegen des unbekannten Parameterwertes - nicht sehr zuverlässig
und können auch komplett danebengehen.
Hast du ein Beispiel für so ein Verhalten. Ich kann es mir derzeit
nicht vorstellen, wie etwas schief gehen soll.
Bedeutet das, dass der Jet-Abfrage-Optimierer den Ausführungsplan
abhängig von Werten und nicht von "Index-/Tabellen-Analysen" macht?
...
Ich hab kein Beispiel, aber das Zitat rausgesucht, das ich im Hinterkopf
hatte. Kevin Collins (Mr. JET bei MS) schrieb 1997 im JET 3.5
Performance Whitepaper auf Seite 18f:

*****
Check Parameterized Queries for Optimal Performance

Parameterized queries can only be implemented by using a stored query.
Since stored queries have a precompiled query plan, parameterized
queries that contain parameters on indexed columns may not execute
efficiently. Since the query engine does not know the values to be
passed in a parameter in advance, it can only guess as to the most
efficient query plan. Based on customer performance scenarios that
we have examined, we have discovered that in some instances
substantial performance gains can be achieved by replacing a stored
parameterized query with a temporary query.
This means creating the SQL string in code and passing it to the DAO
OpenRecordset or Execute methods of the Database object.
*****

Beispiel bringt er dort keines.

Naja, es ist nicht die Empfehlung, sie immer zu ersetzen, sondern
nur "in some instances". Ich lese es aber als Empfehlung, den
diesbez. Optimierungsversuchen von JET zu misstrauen.
--
Servus
Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: http://www.donkarl.com
2. SQL Server-Entwickler-Konferenz: www.donkarl.com/?SEK
Nürnberg 12./13.4. + 19./20.4.2008
Josef Poetzl
2008-03-28 12:41:46 UTC
Permalink
Hallo!
Post by Karl Donaubauer
Ich hab kein Beispiel, aber das Zitat rausgesucht, das ich im Hinterkopf
hatte.
Danke!

[...]
Post by Karl Donaubauer
... Ich lese es aber als Empfehlung, den
diesbez. Optimierungsversuchen von JET zu misstrauen.
Ganz nach dem Motto: Vertrauen ist gut, Kontrolle (per Jet-Showplan)
ist besser. :-)

mfg
Josef
--
EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/
Loading...