PDA

Vollständige Version anzeigen : Gespeicherte Abfrage mit Parameter


Lanz Rudolf
20.04.2011, 15:01
Hallo
ich habe eine Abfrage die z.B. etwa so aussehen könnte:
PARAMETERS [Anfangsdatum eingeben:] DateTime, [Enddatum eingeben:] DateTime;
SELECT ID, Nachname, Vorname, Geburtsdatum
FROM TbLPD
WHERE (Geburtsdatum Between [Anfangsdatum eingeben:] And[Enddatum eingeben:])
ORDER BY ID, Nachname, Vorname, Geburtsdatum;

Klar wenn ich diese jetzt öffne werde ich aufgefortert die Parameter (Anfangsdatum/Enddatum) einzugeben :)

nun meine Frage:
ich möchte Diese über VBA öffnen etwa so:
dbs.Execute "AbfParameterTest"

ist es möglich hier auf irgend eine art die Parameter mitzugeben ?
so das die Eingabeaufforterung nicht mehr kommt!

Marsu65
20.04.2011, 15:08
Hallo Ruedi,
ich denke FAQ 6.16 (http://www.donkarl.com/FAQ/FAQ6VBA.htm#6.16) beantwortet deine Frage.

Ergänzend zu Karl kann auf die Parameters-Auflistung auch über den Index zugegriffen werden:
qdf.Parameters(0) = irgendwas
qdf.Parameters(1) = irgendwasanderes

Lanz Rudolf
20.04.2011, 15:37
Hallo
DANKE Marsu :dance:


werde ich gleich Testen hast Du das schon verwendet ?

Marsu65
20.04.2011, 15:39
hast Du das schon verwendet
Des Öfteren. Mich wundert, dass du "alter Access Hase" ;) das noch nie gebraucht hast.

Josef P.
20.04.2011, 15:47
Hallo!

Damit du bei mehrmaliger Verwendung nicht so viel Code schreiben musst, könntest du den Aufruf in eine Hilfsprozedur stecken.
Prinzip: Insert oder Update als Parameter-Abfrage (http://wiki.access-codelib.net/Insert_oder_Update_als_Parameter-Abfrage) (Am Ende der Seite ist eine Variante für eine gespeicherte Parameterabfrage.)
Für eine Select-Anweisung könnte die Hilfsprozedur ein Recordset zurückgeben.


mfg
Josef

Lanz Rudolf
21.04.2011, 07:38
Hallo
Guten Tag an alle
@Josef Danke für Deinen Beitrag
Leider konnte ich noch nicht Testen
Das kommt hoffe ich Heute :)

Lanz Rudolf
21.04.2011, 08:52
Hallo
Habe jetzt getestet (solang ich nicht zu stake Schmerzen habe :( )
im Anhang meine Kleine MDB
die Variante Von Marus läuft (ATs)
bei der Variante nach Josef (aDS) bekomme ich den Fehler:
Eine Auswahlabfrage kann NICHT ausgeführt werden
und steht auf :
qdf.Execute dbFailOnError
hier der Code

Option Compare Database
Option Explicit
Public Function ATs()
Dim dbs As DAO.Database
Dim rs1 As DAO.Recordset
Dim qdf As DAO.QueryDef
Set dbs = CurrentDb()
Set qdf = dbs.QueryDefs("AbfParameterTest")
qdf.Parameters!AD = "01.01.1982"
qdf.Parameters!ED = "01.01.2000"
Set rs1 = qdf.OpenRecordset(dbOpenDynaset)
' qdf.Execute
rs1.MoveLast
rs1.MoveFirst
Do While Not rs1.EOF
Debug.Print rs1!Nachname, rs1!Vorname, rs1!Geburtsdatum
rs1.MoveNext
Loop
qdf.Close: Set qdf = Nothing
rs1.Close: Set rs1 = Nothing
Set dbs = Nothing
End Function
Public Function ExecuteParamQdf(ByVal QueryDefName As String, ParamArray QueryParams() As Variant) As Long
Dim qdf As DAO.QueryDef
Dim i As Long
Debug.Print QueryDefName
Set qdf = CurrentDb.QueryDefs(QueryDefName)
' Parameter Setzen ---------------------------
Debug.Print LBound(QueryParams); " "; UBound(QueryParams)
For i = 0 To UBound(QueryParams) - 1 Step 2
Debug.Print i; ""; QueryParams(i); " "; QueryParams(i + 1)
qdf.Parameters(QueryParams(i)) = QueryParams(i + 1)
Next
' Prüfen --------------------
For i = 0 To UBound(QueryParams) - 1 Step 2
Debug.Print qdf.Parameters(QueryParams(i))
Next
' Ausführen ------------------
qdf.Execute dbFailOnError
ExecuteParamQdf = qdf.RecordsAffected
qdf.Close: Set qdf = Nothing
End Function
Public Function aDS()
aDS = ExecuteParamQdf("AbfParameterTest", _
"AD", "01.01.1982", _
"ED", "01.01.2000")
End Function

Die gespeicherte Abfrage(SQL)
PARAMETERS AD DateTime, ED DateTime;
SELECT TbLPD.ID, TbLPD.Nachname, TbLPD.Vorname, TbLPD.Geburtsdatum
FROM TbLPD
WHERE (((TbLPD.Geburtsdatum) Between [AD] And [ED]));
Habe auch so getestet:
PARAMETERS AD DateTime, ED DateTime;
SELECT TbLPD.ID, TbLPD.Nachname, TbLPD.Vorname, TbLPD.Geburtsdatum
FROM TbLPD
WHERE (((TbLPD.Geburtsdatum) Between AD And ED));
das Resultat der debug.Print's :
AD für AnfangsDatum und ED für EndDatum
?ads
AbfParameterTest
0 3
0 AD 01.01.1982
2 ED 01.01.2000
01.01.1982
01.01.2000
eigendlich alles im grünen Bereich ;)

Doch WAS mache ich FALSCH ?

Josef P.
21.04.2011, 09:04
Hallo!

bei der Variante nach Josef (aDS) bekomme ich den Fehler:
Eine Auswahlabfrage kann NICHT ausgeführt werden
und steht auf :
qdf.Execute dbFailOnError

Was auch vollkommen richtig ist.
<code>Currentdb.Execute "select * from Tabelle"</code>
würde auch nicht funktionieren. ;)


Public Function OpenRecordsetParamQdf( _
ByVal QueryDefName As String, _
ParamArray QueryParams() As Variant) As DAO.Recordset
Dim qdf As DAO.QueryDef

Set qdf = CurrentDb.QueryDefs(QueryDefName)

Dim i As Long
For i = 0 To UBound(QueryParams) - 1 Step 2
qdf.Parameters(QueryParams(i)) = QueryParams(i + 1)
Next
Set OpenRecordsetParamQdf = qdf.OpenRecordset()
qdf.Close

End Function

Public Function aDS()

dim rst as dao.recordset
set rst = OpenRecordsetParamQdf("AbfParameterTest", _
"AD", "01.01.1982", _
"ED", "01.01.2000")
...
rst.close

End Function

mfg
Josef

Lanz Rudolf
21.04.2011, 09:22
Hallo
Sorry Josef aber ich habe es nicht Verstanden :(


Hallo
OK ich Verstehe aber nur Langsam ;)

Toast78
21.04.2011, 09:43
Eine SELECT-Abfrage kann nicht ausgeführt werden.

Ach so, du hast schon verstanden

Josef P.
21.04.2011, 10:19
Hallo!

Mir fällt gerade etwas auf:
Public Function aDS()

dim rst as dao.recordset
set rst = OpenRecordsetParamQdf("AbfParameterTest", _
"AD", "01.01.1982", _
"ED", "01.01.2000")
...
rst.close

End Function
Das die beiden Parameter in der Abfrage als DateTime deklariert sind, würde ich auch in VBA den Date-Typ verwenden.

set rst = OpenRecordsetParamQdf("AbfParameterTest", _
"AD",#1/1/1982#, _
"ED", #1/1/2000#)

mfg
Josef