Hallo,
ich erhalte Fehler 3065....eine Auswahlabfrage kann nicht durchgeführt werden...
und finde den Fehler einfach nicht...
Vielleicht kann sich das mal jemand anschauen
Vielen Dank :)
Zum Zusammenhang:
Ich habe 4 separate optButtons
Zu jedem optButton habe ich ein Textfeld zugeordnet
Das Textfeld hat jeweils den Standardwert ""
Hat der zugehörige optButton den Wert -1
schreibe ich einen Text in das jeweilige Textfeld
txtSerienEmail wird "SerienEmail" oder bleibt ""
txtEmail wird "Email" oder bleibt ""
txtGespraech wird "Gespräch" oder bleibt ""
txtTelefonat wird "Telefonat" oder bleibt ""
Mit den Werten dieser Textfelder filtere ich dann die Abfrage
"ProtokollNotizUF_SelectQ" (Datenquelle des Unterformulars) in der Spalte "ProtokollTyp"
Der String sSQL soll die Feldinhalte zusammenführen und die Spalte filtern
Private Sub cmdFilterProtokollTyp_Click()
Dim db As Database
Dim sSQL As String
Dim strSuchbegriff As String
Set db = CurrentDb
strSuchbegriff = "Me!txtSerienMail.Text & Me!txtMail.Text & Me!txtGespraech.Text & Me!txtTelefonat.Text"
If Len(strSuchbegriff) > 0 Then
Dim vSerienEmail As String
Dim vEmail As String
Dim vGespraech As String
Dim vTelefonat As String
vSerienEmail = Me.txtSerienEmail 'werden diese 4 Variablen gebraucht?
vEmail = Me.txtEmail 'oder kann ich mit Me. ....in sSQL gehen?
vGespraech = Me.txtGespraech '
vTelefonat = Me.txtTelefonat '
sSQL = sSQL & " SELECT * "
sSQL = sSQL & " FROM ProtokollNotizUF_SelectQ "
sSQL = sSQL & " WHERE ProtokollTypT.ProtokollTyp = vSerienEmail"
sSQL = sSQL & " Or ProtokollTypT.ProtokollTyp = vGespraech"
sSQL = sSQL & " Or ProtokollTypT.ProtokollTyp = vTelefonat"
sSQL = sSQL & " Or ProtokollTypT.ProtokollTyp = vEmail"
db.Execute sSQL, dbFailOnError 'Laufzeitfehler 3065: "Eine Auswahlabfrage kann nicht ausgeführt werden"
MsgBox "Filter wurde ausgeführt"
End If
End Sub
Hallo,
1) Der Zusammenbau des SQL-Strings ist falsch. Die (VBA-)Variablen müssen aus dem String ausgelagert werden.
2) Mit .Execute werden
Aktions-Abfragen ausgeführt, keine Auswahlabfragen (wie die Fehlermeldung selber schon sagt).
3) Wenn das (Unter-)Formular die gefilterten DS anzeigen soll, so ist der SQL-String der Datenherkunft des UFOs zuzuweisen.
4) Die Zwischenvaraiblen werden nicht gebraucht (kannst Du ja selber testen).
ZitatPrivate Sub cmdFilterProtokollTyp_Click()
Dim db As Database
Dim sSQL As String
Dim strSuchbegriff As String
Set db = CurrentDb
strSuchbegriff = "Me!txtSerienMail.Text & Me!txtMail.Text & Me!txtGespraech.Text & Me!txtTelefonat.Text"
If Len(strSuchbegriff) > 0 Then
sSQL = sSQL & " SELECT * "
sSQL = sSQL & " FROM ProtokollNotizUF_SelectQ "
sSQL = sSQL & " WHERE ProtokollTyp = '" & Me!SerienEmail 'Qualifizierer hier nicht erforderlich
sSQL = sSQL & "' Or ProtokollTyp = '" & Me!Gespraech
sSQL = sSQL & "' Or ProtokollTyp = '" & Me!Telefonat
sSQL = sSQL & "' Or ProtokollTyp = '" & Me!Email & "'"
Me!ProtokollNotizUF_SelectQ.Form.Recordsource = sSQL ' Wenn das UFO-Steuerelement ProtokollNotizUF_SelectQ heißt
MsgBox "Filter wurde ausgeführt"
End If
End Sub
Vielen Dank für die schnelle Antwort, die umfassende Erklärung ...und den jetzt sehr übersichtlichen Code :)
Leider hängt er sich in der letzten Zeile auf...
Bis zur letzten Zeile stimmen auch die Werte, wenn ich Sie mit F8 verfolge...
Alle genannten Felder sind im UF im Kopf angelegt
Müssen die Felder ins Hauptformular?
Schöne Grüße aus Lüneburg
Harry
Private Sub cmdFilterProtokollTyp_Click()
Dim sSQL As String
sSQL = sSQL & " SELECT * "
sSQL = sSQL & " FROM ProtokollNotizUF_SelectQ "
sSQL = sSQL & " WHERE ProtokollTyp = '" & Me!txtSerienEmail
sSQL = sSQL & "' Or ProtokollTyp = '" & Me!txtGespraech
sSQL = sSQL & "' Or ProtokollTyp = '" & Me!txtTelefonat
sSQL = sSQL & "' Or ProtokollTyp = '" & Me!txtEmail
Me!ProtokollNotizUF_SelectQ.Form.RecordSource = sSQL 'Hier Laufzeitfehler 2465:
'Microsoft Access kann das in Ihrem Ausdruck
'angesprochene Feld
'ProtokollNotizUF_SelectQ nicht finden
'ProtokollNotizUF_SelectQ ist die
'Datensatzquelle des UF
End Sub
Hallo,
nochmal: wenn Du die Abfrageergebnisse in einem Unterformular anzeigen willst, so muss der
Name des
UFO-Steuerelementes, das das (U-) Formular anzeigt, mit dessen Eigenschaft "Datenherkunft" (RecordSource) angegeben werden:
Me!
UFO-SteuerelementName.Form.RecordSource = sSQL
Den Namen musst Du ja selber kennen...
Die Formular-Steuerelemente (Textfelder), die an die Abfragefelder gebunden sind, gehören natürlich in den Detailbereich.
ZitatMüssen die Felder ins Hauptformular?
Welche Felder meinst Du? Die Eingabefelder für die Kriterien oder die (Anzeige-)Felder für die Ergebnisse?
Ich habe die Information jetzt wie beschrieben nach bestem Wissen eingetragen...
Die Fehlermeldung ändert sich leider nur namentlich...
Nachfolgend der aktuelle Code
Anhängend ein jpeg zur Info
Tut mir leid, dass sich das so zäh entwickelt...
Private Sub cmdFilterProtokollTyp_Click()
Dim sSQL As String
sSQL = sSQL & " SELECT * "
sSQL = sSQL & " FROM ProtokollNotizUF_SelectQ "
sSQL = sSQL & " WHERE ProtokollTyp = '" & Me!txtSerienEmail
sSQL = sSQL & "' Or ProtokollTyp = '" & Me!txtGespraech
sSQL = sSQL & "' Or ProtokollTyp = '" & Me!txtTelefonat
sSQL = sSQL & "' Or ProtokollTyp = '" & Me!txtEmail
Me!ProtokollNotizUF.Form.RecordSource = sSQL 'Hier Laufzeitfehler 2465:
'Microsoft Access kann das in Ihrem Ausdruck
'angesprochene Feld
'Jetzt ersetzt durch
'ProtokollNotizUF >>>>> in der Anlage ein jpg
'nicht finden
'ProtokollNotizUF_SelectQ ist die
'Datensatzquelle des UF
End Sub
Hallo,
und in welchen Form läuft der Code ab, bzw. wo befindet sich der Button "cmdFilterProtokollTyp" (Haupt- oder Unterformular) ?
Am besten lädst Du die DB hier hoch, komprimiert/repariert und gezippt.
ZitatLeider hängt er sich in der letzten Zeile auf...
Natürlich. Ein Fehler in der erzeugten SQL-Anweisung zeigt sich dann, wenn die Anweisung verwendet wird => Zuweisung als RecordSource
sSQL = sSQL & "' Or ProtokollTyp = '" & Me!txtEmail ? ? ?
... oder vollständig abschreiben/kopieren.
Dieser Fehler schließt weitere nicht aus.
Danke für die Antwort,
ich verstehe aber leider nicht, was Du mir sagen willst...
das steht doch genau so im Code...
Ist da was falsch?
der Button "cmdFilterProtokollTyp"
steht im Unterformular neben den optButtons und den txt-Feldern...
Der Code läuft ja auch bis zur letzten Zeile durch und bringt beim drüberhoovern auch die richtigen Aussagen zum Inhalt der txt-Felder...
Im Vorschlag von Franz hat die letzte Zeile der Zusammenstellung von sSQL folgenden Abschluss, der für die korrekte Syntax zwingend nötig ist:
& "'"
Eine Kette ist so kräftig wie das schwächste Glied.
Erst wenn Syntaxprobleme ausgeräumt sind, kann der Versuch, die SQL-Anweisung auszuführen, weitergehen. Dann ginge es um die wörtliche Meldung: Tabellenname wird nicht gefunden (Tippfehler, nicht erreichbar o.ä.).
Danke für den Hinweis...
Den Fehler habe ich gerade auch schon gefunden und nachgebessert...
Der Code bleibt dennoch in der letzten Zeile mit der gleichen Meldung hängen...
Ich komprimiere und repariere die dB jetzt, starte den Rechner neu und melde mich...
danke erstmal...
Daneben, was man immer tun sollte, bei Problemen sowieso:
Wenn man schon so eine schöne Variable sSQL hat, kann man prüfen, was die am Ende ausgibt.
=> Ausgabe ins Direktfenster mit Debug.Print
Komfortabler mit einem kleinen Add-In: SqlDebugPrint (https://www.ms-office-forum.net/forum/showthread.php?t=352915)
Hallo,
wenn
Zitatder Button "cmdFilterProtokollTyp"
steht im Unterformular neben den optButtons und den txt-Feldern...
dann:
Me.RecordSource = sSQL
Sorry für die Unterschlagung des abschließenden Hochkommas.. :( :D
Gute Nachricht...der Code läuft :)
Ich habe die ganzen Bezüge noch einmal neu aufgesetzt und benannt...
Ich habe den Verdacht, dass mir Google-Drive Ärger gemacht hat. Normalerweise schalte ich Google-Drive immer aus, wenn ich an der Datenbank arbeite. Weil ich vermeiden möchte, dass ich die Datenbank komprimiere, schließe und wieder öffne... und Google-Drive die Datei dann gerade in die Cloud lädt und sperrt...da kam es des Öftern schon zu Fehlermeldungen...
Das hatte ich heute vergessen...
Nachdem dann alles schön ordentlich eingetragen war, lief der Code und sieht jetzt wie nachfolgend aus!
In der letzten Zeile war auch noch eine winzige Optimierung hilfreich...
Herzlichen Dank für die Zeit, die Geduld, die Mühe und die wertvolle Hilfe!
Mit einem schönen Gruß aus Lüneburg
Harry
Private Sub cmdFilterProtokollTyp_Click()
Dim sSQL As String
sSQL = sSQL & " SELECT * "
sSQL = sSQL & " FROM ProtokollNotizUF_SelectQ "
sSQL = sSQL & " WHERE ProtokollTyp = '" & Me!txtSerienEmail
sSQL = sSQL & "' Or ProtokollTyp = '" & Me!txtGespraech
sSQL = sSQL & "' Or ProtokollTyp = '" & Me!txtTelefonat
sSQL = sSQL & "' Or ProtokollTyp = '" & Me!txtEmail & "'"
Me.RecordSource = sSQL
End Sub
An diesem kurzen Elend habe ich ganze 2 Tage gearbeitet...man glaubt es nicht...
Hallo Eberhard (ebs17),
ich hoffe dass Du diese Nachricht noch liest...
nachdem die dringlichsten Probleme jetzt gelöst sind, möchte ich noch einmal auf Deinen Tipp zurückkommen:
(Komfortabler mit einem kleinen Add-In: SqlDebugPrint)
In Access ist dieses Add-In nicht verfügbar (genauer: KEIN Add-In ist verfügbar...)
Ich würde es gerne einbauen...wo ist es zu beziehen?
Danke nochmal für die Unterstützung :)
Hallo,
Zitatwo ist es zu beziehen?
hat doch Eberhard bereits in #11 beschrieben. Dort ist ein Link.
Klar, Add-Ins kommen meist von Drittanbietern, um die Funktionalität aufzupeppen. Hätte Microsoft solche Funktionalitäten von Haus aus integriert, bräuchte man keine Lösungen von außerhalb.
Im gegebenen Link ist im Erstbeitrag ein Download-Link, für ein ZIP-Archiv. Entpacken und Install ausführen.
Eine kurze Installationsanweisung findest du in der ReadMe.txt (im zip-Archiv enthalten).
Danke für die Hinweise...ich habe das Add-In installiert, komme aber noch nicht klar damit (wo und wie rufe ich auf???) ...für einen Programmierer ist das sicherlich alles selbstverständlich...ich fange gerade mühsam an, mit VBA vor mich hinzubrabbeln... :)
Ich muss mir das bei Gelegenheit noch einmal in Ruhe anschauen...
Grüße aus Lüneburg
Harry
Hallo Harry,
Zitathabe das Add-In installiert,
Aber das Installationsformular nicht ordentlich gelesen.
Da wird zunächst die übliche Vorgehensweise zum Testen von SQL-Anweisungen
mit Debug.Print (siehe OH zu dieser Methode) ohne AddIn beschrieben und,
mit Beispiel, die Vereinfachung mit dem AddIn. Die Anwendung im deinem Code
ist die gleiche, - statt
Debug.Print DeinSQLString(damit kannst du dir den geparsten String nur im Direktfenster ansehen)
schreibst du
SqlDebug DeinSQLString(öffnet ein Formular mit dem geparsten String in einem Textfeld und einer
Fehlermeldung in einem zweiten)
gruss ekkehard
P.S. @Eberhard
Weil es mir schon mal aufgefallen ist; -
warum verlinkst du nicht auch deinen QueryHelper? Ich weiss gar nicht wieso
mir die Ehre dieser Exklusivität zu Teil wird.
@ekkehard:
SqlDebugPrint ist punktgenau auf das Testen ausgerichtet, ausprogrammiert und selbständig in Betrieb zu nehmen entsprechend Benutzerführung, auch für Neulinge (eigentlich).
Der QueryHelper ist im Beta-Status, also nicht bedingungslos für Unwissende nutzfähig. Der Ansatz ist zudem ein anderer: Neben der übersichtlichen Anzeige von SQL soll das Neuerstellen und Editieren von SQL-Anweisungen unterstützt werden, um bspw. sehr viel mehr auf die Entwurfsansicht verzichten zu können (die wegen der eingebauten Anfängerfreundlichkeit auch gute Anweisungen wieder verschandelt).
Im Vordergrund steht also, möglichst unterstützt sofort richtige Anweisungen zu erstellen, nicht nur zu prüfen, ob das Ergebnis ausführbar ist. Das dann auch für die Einbettung von SQL in VBA-Code.
Daneben gibt es noch eine Reihe von Baustellen und von eigenen unerfüllten Wünschen, die abgeschlossen und erledigt sein sollten, ehe ich in Sachen Empfehlung offensiver werde.
Derzeit spiele ich mit Syntax-Highlighting, IntelliSense u.ä.
@Eberhard
O.K., kann ich verstehen.