Discussion:
Pass-Through in VBA
(zu alt für eine Antwort)
Stefan Stolz
2005-02-11 08:09:06 UTC
Permalink
Hallo,

ich habe folgendes Problem... Ich habe diesen VBA Code beim öffnen eines
Berichtes angegeben:
-->
Dim BestNr As Integer
BestNr = InputBox("Bestellnummer eingeben", "Eingabe")
Me.RecordSource = "Eine grosse Select Abfrage;"
<--
Funktioniert wunderbar. Nur dass Access die Abfrage nicht so an den SQL
Server sendet wie sie angegeben wird.... Es macht daraus zuerst 2
Abfragen und dann geht es vom Rest jede einzelne id durch und sucht
darin nach einem LIKE '%sowieso%' was viel viel länger dauert als die
Abfrage die ich angegeben habe.
Nun habe ich gesehen, dass ich in einer Abfrage eine PASS-Through
Abfrage machen kann. Das sollte den COde so senden wie ich ihn angeben habe?
Kann man das auch irgendwie für den obenstehenden VBA Code machen dass
die Abfrage unverändert an SQL geschickt wird?
Danke
Stolzi
Christa Kurschat
2005-02-11 09:04:19 UTC
Permalink
Hallo Stefan,
Post by Stefan Stolz
Hallo,
ich habe folgendes Problem... Ich habe diesen VBA Code beim
-->
Dim BestNr As Integer
BestNr = InputBox("Bestellnummer eingeben", "Eingabe")
Me.RecordSource = "Eine grosse Select Abfrage;"
<--
Funktioniert wunderbar. Nur dass Access die Abfrage nicht so
an den SQL Server sendet wie sie angegeben wird.... Es macht
daraus zuerst 2 Abfragen und dann geht es vom Rest jede
einzelne id durch und sucht darin nach einem LIKE '%sowieso%'
was viel viel länger dauert als die Abfrage die ich angegeben
habe. Nun habe ich gesehen, dass ich in einer Abfrage eine
PASS-Through Abfrage machen kann. Das sollte den COde so
senden wie ich ihn angeben habe? Kann man das auch irgendwie
für den obenstehenden VBA Code machen dass die Abfrage
unverändert an SQL geschickt wird? Danke
Da müßtest Du den SQL-String der Pass-Through-abfrage jeweils anpassen,
damit Du nur die gefilterten DS bekommst.

könnte etwa so aussehen (ungetestet):

Dim BestNr As Integer
dim ssql as string
dim swhere as string
BestNr = InputBox("Bestellnummer eingeben", "Eingabe")
swhere = " where Bestnr = " & bestnr
ssql = "Eine grosse Select Abfrage"

currentdb.querydefs("Passthrough").sql = ssql & swhere

Me.RecordSource = "Passthrough"

Gruß
Christa
--
Access-FAQ: http://www.donkarl.com
SQL-Server-FAQ: www.sqlfaq.de
auch interessant: http://www.insidesql.de
Suchen in den Newsgroups:
http://groups.google.de/advanced_group_search?hl=de&lr=&ie=UTF-8
Stefan Stolz
2005-02-11 09:39:19 UTC
Permalink
Post by Christa Kurschat
Da müßtest Du den SQL-String der Pass-Through-abfrage jeweils anpassen,
damit Du nur die gefilterten DS bekommst.
Dim BestNr As Integer
dim ssql as string
dim swhere as string
BestNr = InputBox("Bestellnummer eingeben", "Eingabe")
swhere = " where Bestnr = " & bestnr
ssql = "Eine grosse Select Abfrage"
currentdb.querydefs("Passthrough").sql = ssql & swhere
Me.RecordSource = "Passthrough"
Er meckert "CurrentDb.QueryDefs("Passthrough").sql = ssql" mit:
"Element in der Auflistung nicht gefunden"
an.
Ich habe es so probiert, dass ich meine gesamte SQL Anfrage in ssql
gepackt habe. Also:
ssql="Select * FROM tabelle WHERE Bestnr = " & bestnr & ";"
Ansonsten genau so wie dus geschrieben hast!
Christa Kurschat
2005-02-11 10:17:14 UTC
Permalink
Hallo Stefan,
Post by Stefan Stolz
Post by Christa Kurschat
Da müßtest Du den SQL-String der Pass-Through-abfrage jeweils
anpassen, damit Du nur die gefilterten DS bekommst.
Dim BestNr As Integer
dim ssql as string
dim swhere as string
BestNr = InputBox("Bestellnummer eingeben", "Eingabe")
swhere = " where Bestnr = " & bestnr
ssql = "Eine grosse Select Abfrage"
currentdb.querydefs("Passthrough").sql = ssql & swhere
Me.RecordSource = "Passthrough"
"Element in der Auflistung nicht gefunden"
an.
Ich habe es so probiert, dass ich meine gesamte SQL Anfrage in
ssql="Select * FROM tabelle WHERE Bestnr = " & bestnr & ";"
Ansonsten genau so wie dus geschrieben hast!
Existiert die Passthrough-Abfrage?
Wenn nicht, dann mußt Du sie natürlich erstmal erstellen und den Namen dann
entsprechend an Stelle von "Passthrough" einsetzen.

Hier mal eine kleine Funktion, die ich ab und an verwende:
Function FixUpPassthrought(Queryname As String, ssql As String) As Boolean
Dim dbs As DAO.Database
Dim qdfNeu As DAO.QueryDef
Dim connectstr As String

On Error GoTo Fehler
' Eine Datenbank öffnen, aus der QueryDef-Objekte erstellt
' werden können.
Set dbs = CurrentDb

connectstr = 'hier muß der entsprechende Connectstring rein

Set qdfNeu = dbs.QueryDefs(Queryname)

With qdfNeu
.Connect = connectstr
.SQL = ssql
.ODBCTimeout = 300
.OpenRecordset
End With

ende:
Set qdfNeu = Nothing
Set dbs = Nothing

Exit Function

Fehler:
Select Case Err.Number
'Case 3012
' dbs.QueryDefs.Delete strName
' GoTo weiter
Case Else
MsgBox Err.Number & vbCrLf & Err.Description
End Select
GoTo ende

End Function


Gruß
Christa
--
Access-FAQ: http://www.donkarl.com
SQL-Server-FAQ: www.sqlfaq.de
auch interessant: http://www.insidesql.de
Suchen in den Newsgroups:
http://groups.google.de/advanced_group_search?hl=de&lr=&ie=UTF-8
Stefan Stolz
2005-02-11 10:33:45 UTC
Permalink
Post by Christa Kurschat
Existiert die Passthrough-Abfrage?
Wenn nicht, dann mußt Du sie natürlich erstmal erstellen und den Namen dann
entsprechend an Stelle von "Passthrough" einsetzen.
Oh nein! Leider habe ich noch 0 tau von Passthrough Abfragen in VBA :-(
Also bis auf den connectstr kann ich die Funktion so verwenden um die
Verbindung herzustellen, oder? Stimmt das dass ich sie dann so verwende??
-->
FixUpPassthrought("Passthrough", ssql)
Me.RecordSource = "Passthrough"
<--

Wie muss der connectstr aussehn?

Danke für deine Hilfe!!
Christa Kurschat
2005-02-11 11:50:17 UTC
Permalink
Hallo Stefan,
Post by Stefan Stolz
Post by Christa Kurschat
Existiert die Passthrough-Abfrage?
Wenn nicht, dann mußt Du sie natürlich erstmal erstellen und
den Namen dann entsprechend an Stelle von "Passthrough"
einsetzen.
Oh nein! Leider habe ich noch 0 tau von Passthrough Abfragen
in VBA :-(
Also bis auf den connectstr kann ich die Funktion so verwenden
um die Verbindung herzustellen, oder? Stimmt das dass ich sie
dann so verwende??
-->
FixUpPassthrought("Passthrough", ssql)
Me.RecordSource = "Passthrough"
<--
Ja, genau.
Post by Stefan Stolz
Wie muss der connectstr aussehn?
Am besten erstellst Du eine per Hand und schaust dort in den Eigenschaften
nach.
Den kopierst Du dann an die Stelle (in Anführungszeichen setzen).

Gruß
Christa
--
Access-FAQ: http://www.donkarl.com
SQL-Server-FAQ: www.sqlfaq.de
auch interessant: http://www.insidesql.de
Suchen in den Newsgroups:
http://groups.google.de/advanced_group_search?hl=de&lr=&ie=UTF-8
Stefan Stolz
2005-02-11 12:31:15 UTC
Permalink
Post by Christa Kurschat
Am besten erstellst Du eine per Hand und schaust dort in den Eigenschaften
nach.
Den kopierst Du dann an die Stelle (in Anführungszeichen setzen).
Musst mir nochmal helfen bitte. Ich weiss nicht genau wie du das meinst
"von Hand" erstellen. Wie und wo? In Systemsteurung-ODBC von Windows?
Habe dort geschaut, aber keine Option Eigenschaften bei meiner
Datenquelle gefunden wo der Connectstring stehen würde (habe MyODBC
installiert da es sich um MySQl handelt).

Danke für deine freundliche Hilfe
Stolzi
Stefan Stolz
2005-02-11 12:40:18 UTC
Permalink
Post by Stefan Stolz
Musst mir nochmal helfen bitte. Ich weiss nicht genau wie du das meinst
"von Hand" erstellen. Wie und wo? In Systemsteurung-ODBC von Windows?
Habe dort geschaut, aber keine Option Eigenschaften bei meiner
Datenquelle gefunden wo der Connectstring stehen würde (habe MyODBC
installiert da es sich um MySQl handelt).
Glaub ich habe da was gefunden:
http://www.berndjungbluth.de/sqlfaq/faqb2.htm#B2.4.
DRIVER={SQL
Server};SERVER=servername;DATABASE=datenbankname;UID=benutzername;PWD=kennwort
Ich probier das mal
Stefan Stolz
2005-02-11 15:16:03 UTC
Permalink
Post by Stefan Stolz
Post by Stefan Stolz
Musst mir nochmal helfen bitte. Ich weiss nicht genau wie du das
meinst "von Hand" erstellen. Wie und wo? In Systemsteurung-ODBC von
Windows? Habe dort geschaut, aber keine Option Eigenschaften bei
meiner Datenquelle gefunden wo der Connectstring stehen würde (habe
MyODBC installiert da es sich um MySQl handelt).
http://www.berndjungbluth.de/sqlfaq/faqb2.htm#B2.4.
DRIVER={SQL
Server};SERVER=servername;DATABASE=datenbankname;UID=benutzername;PWD=kennwort
Ist eigentlich alles klar ausser "Driver". Was trage ich da für
Myodbc/Mysql ein?
Bei deiner Funktion gabs noch einen Fehler:
Set qdfNeu = dbs.QueryDefs(Queryname)
meldete "Element in der Auflistung nicht gefunden". Was könnte da falsch
sein? Ich habe als ssql eine ganz einfache Select übergeben und als
Queryname "Queryname" (Ist doch egal was ich da nehme, oder?).
Christa Kurschat
2005-02-11 15:41:44 UTC
Permalink
Hallo Stefan,
Post by Stefan Stolz
Post by Stefan Stolz
Post by Stefan Stolz
Musst mir nochmal helfen bitte. Ich weiss nicht genau wie du
das meinst "von Hand" erstellen. Wie und wo? In
Systemsteurung-ODBC von Windows? Habe dort geschaut, aber
keine Option Eigenschaften bei meiner Datenquelle gefunden
wo der Connectstring stehen würde (habe MyODBC installiert
da es sich um MySQl handelt).
http://www.berndjungbluth.de/sqlfaq/faqb2.htm#B2.4.
DRIVER={SQL
Server};SERVER=servername;DATABASE=datenbankname;UID=benutzername;PWD=kennwo
rt
Post by Stefan Stolz
Ist eigentlich alles klar ausser "Driver". Was trage ich da für
Myodbc/Mysql ein?
Bin ich überfragt. Möglicherweise MySQL.
Oder mach Dir eine DSN.
Post by Stefan Stolz
Set qdfNeu = dbs.QueryDefs(Queryname)
meldete "Element in der Auflistung nicht gefunden". Was könnte
da falsch sein? Ich habe als ssql eine ganz einfache Select
übergeben und als Queryname "Queryname" (Ist doch egal was ich
da nehme, oder?).
Nein. Die Funktion geht in der Form davon aus, daß die Pass-Through-Abfrage
existiert.
Deshalb sagte ich doch, erstell erstmal eine per Hand. Dann hast Du alle
nötigen Einstellungen in den Eigenschaften, die Du übernehmen kannst.

Es gibt natürlich auch die Möglichkeit, eine komplett neue zu erstellen.
Dazu mußt Du eine Art Suchfunktion bauen, die schaut, ob die Abfrage
existiert. Wenn ja, nur den SQL-String ersetzen, wenn nein, eine neue
Abfrage mit den nötigen Einstellungen erstellen.

Gruß
Christa
--
Access-FAQ: http://www.donkarl.com
SQL-Server-FAQ: www.sqlfaq.de
auch interessant: http://www.insidesql.de
Suchen in den Newsgroups:
http://groups.google.de/advanced_group_search?hl=de&lr=&ie=UTF-8
Josef Poetzl
2005-02-11 16:11:53 UTC
Permalink
Hallo!
Post by Christa Kurschat
Post by Stefan Stolz
Post by Stefan Stolz
http://www.berndjungbluth.de/sqlfaq/faqb2.htm#B2.4.
DRIVER={SQL Server};SERVER=servername;DATABASE=datenbankname;UID=benutzername;PWD=kennwort
Ist eigentlich alles klar ausser "Driver". Was trage ich da für
Myodbc/Mysql ein?
Bin ich überfragt. Möglicherweise MySQL.
Oder mach Dir eine DSN.
DRIVER={MySQL ODBC 3.51 Driver}

Siehe http://www.connectionstrings.com/

mfg
Josef
--
EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/
Stefan Stolz
2005-02-14 08:27:34 UTC
Permalink
Post by Josef Poetzl
DRIVER={MySQL ODBC 3.51 Driver}
Siehe http://www.connectionstrings.com/
Danke!

Stefan Stolz
2005-02-14 08:27:11 UTC
Permalink
Post by Christa Kurschat
Nein. Die Funktion geht in der Form davon aus, daß die Pass-Through-Abfrage
existiert.
Deshalb sagte ich doch, erstell erstmal eine per Hand. Dann hast Du alle
nötigen Einstellungen in den Eigenschaften, die Du übernehmen kannst.
Das wars! Wollte nicht in meinen Kopf warum extra eine Abfrage
erstellen... Aber naja ;-) nun da ich das gemacht habe funktionierts.
Post by Christa Kurschat
Es gibt natürlich auch die Möglichkeit, eine komplett neue zu erstellen.
Dazu mußt Du eine Art Suchfunktion bauen, die schaut, ob die Abfrage
existiert. Wenn ja, nur den SQL-String ersetzen, wenn nein, eine neue
Abfrage mit den nötigen Einstellungen erstellen.
Ja kapiere ich. Ist aber auch noch ein wenig unlogisch finde ich.

Danke für deine Hilfe!
Christa Kurschat
2005-02-11 13:01:04 UTC
Permalink
Hallo Stefan,
Post by Stefan Stolz
Post by Christa Kurschat
Am besten erstellst Du eine per Hand und schaust dort in den
Eigenschaften nach.
Den kopierst Du dann an die Stelle (in Anführungszeichen
setzen).
Musst mir nochmal helfen bitte. Ich weiss nicht genau wie du
das meinst "von Hand" erstellen. Wie und wo? In
Systemsteurung-ODBC von Windows? Habe dort geschaut, aber
keine Option Eigenschaften bei meiner Datenquelle gefunden wo
der Connectstring stehen würde (habe MyODBC installiert da es
sich um MySQl handelt).
In Acc - neue Abfrage - die Tabellenauswahl schließen - Menüpunkt Abfrage -
SQL-Spezifisch - Pass-Through
Dann bekommst Du ein Fenster, wo Du die SQL-Anweisung eintragen kannst.
Mit Klick auf "Ausführen" öffnet sich das Auswahlfenster für die
ODBC-Datenquellen. Dort wählst Du die richtige aus. Abfrage speichern.
In den Eigenschaften der Abfrage kannst Du hinterher den Connectstring
sehen.

Gruß
Christa
--
Access-FAQ: http://www.donkarl.com
SQL-Server-FAQ: www.sqlfaq.de
auch interessant: http://www.insidesql.de
Suchen in den Newsgroups:
http://groups.google.de/advanced_group_search?hl=de&lr=&ie=UTF-8
Stefan Stolz
2005-02-11 15:04:40 UTC
Permalink
Post by Christa Kurschat
In Acc - neue Abfrage - die Tabellenauswahl schließen - Menüpunkt Abfrage -
SQL-Spezifisch - Pass-Through
Dann bekommst Du ein Fenster, wo Du die SQL-Anweisung eintragen kannst.
Mit Klick auf "Ausführen" öffnet sich das Auswahlfenster für die
ODBC-Datenquellen. Dort wählst Du die richtige aus. Abfrage speichern.
In den Eigenschaften der Abfrage kannst Du hinterher den Connectstring
sehen.
Hmm, das will bei mir (Access2000) nicht so recht... Alles haut hin, nur
wird die ODBC Quelle nicht gespeichert. Jedes Mal wenn ich die Abfrage
neu öffne wird die Quelle auch neu abgefragt :-( Daher steht auch in den
Eigenschaften nix. Hab ich was falsch gemacht? habe gespeichert und
alles so gemacht wie gesagt.
Loading...