Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Fehler 3065 durch SQL (Filter)

Begonnen von Umbauwfb, Februar 01, 2022, 12:15:48

⏪ vorheriges - nächstes ⏩

Umbauwfb

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

DF6GL

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

Umbauwfb

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

DF6GL

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?


Umbauwfb

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



DF6GL

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.

ebs17

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.
Mit freundlichem Glück Auf!

Eberhard

Umbauwfb

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?

Umbauwfb

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...

ebs17

#9
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.ä.).
Mit freundlichem Glück Auf!

Eberhard

Umbauwfb

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...

ebs17

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
Mit freundlichem Glück Auf!

Eberhard

DF6GL

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

Umbauwfb

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...

Umbauwfb

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 :)