Access 2010 - Formular anhand mehrerer Kombinationsfelder filtern

Hallo Zusammen.

Ich beisse mir seit einiger Zeit an einem Problem die Zähne aus.
Umgebung:

Wir haben bei uns in der Firma eine Access-Datenbank deren Tabellen auf einem SQL-Server hinterlegt sind.

Wir nutzen ein Formular als Eingabehilfe für eine dieser Tabellen.

Diese Tabelle umfasst verschiedene Punkte wie „Kategorie“, „Verantwortlicher“ etc.

Nun ist der Wunsch aufgekommen, dieses Formular anhand dieser Felder mit einem Dropdown-Menü zu filtern. Ebenfalls nach mehreren Werten gleichzeitig filtern.

Code:

Ich habe nun einen Button definiert der folgenden Code ausführt.

Private Sub Befehl73_Click()
Dim strFilter As String

If Kombinationsfeld1.Value „“ Then
strFilter = strFilter & „[Datenfeld1] =“ & „’“ & Nz(Kombinationsfeld1.Value) & "’ AND "
End If
If Kombinationsfeld2.Value „“ Then
strFilter = strFilter & „[Datenfeld2] =“ & „’“ & Nz(Kombinationsfeld2.Value) & "’ AND "
End If
If Kombinationsfeld3.Value „“ Then
strFilter = strFilter & „[Datenfeld3] =“ & „’“ & Nz(Kombinationsfeld3.Value) & "’ AND "
End If
strFilter = Left(strFilter, Len(strFilter) - 5)
Forms![Formularname].Filter = strFilter
Forms![Formularname].FilterOn = True

End Sub

Problem:

Dieses Script **funktioniert soweit.
Ich kann das Formular anhand der Kombinationsfelder filtern.

Dies gelingt mir allerdings immer nur ein einziges Mal. Sobald ich das Formular ein zweites Mal filtern will, erhalte ich folgende Fehlermeldung.**

Laufzeitfehler ‚3146‘;

ODBC-Aufruf fehlgeschlagen.
[Microsoft][ODBC SQL Server Driver][SQL server]Unclosed quotation mark after the character string 'Wert aus Kombinationsfeld

)) Order BY „dbo“.„Tabellenname“.„ID“ '. (#105) [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near 'Wert aus Kombinationsfeld
'. (#102)

Erfolgslose Lösungsansätze

Meine Fähigkeiten in VB sind kaum vorhanden. Ich ging zuerst davon aus, dass ich den Filter deaktivieren müsste bevor ich ihn neu erstellen kann.  FilterOn = False war allerdings erfolglos.
Ein weiterer Versuch war es den String strFilter komplett zu leeren, da ich vermutete, dass er einfach zuviele Daten erhält. strFilter = „“ hatte allerdings genau 0 Einfluss auf das Problem.

Ich habe auch versucht aus der VB-Abfrage eine SQL-Abfrage zu erstellen (SELECT FROM WHERE) allerdings auch ohne Erfolg.

Ich wäre froh, wenn mir jemand einen Tipp geben könnte was ich noch versuchen kann. Aktuell funktioniert der automatische Filter nur, wenn man nach jedem Filter das Formular schliesst und nochmal neu öffnet.

Moin, Yves,

ohne tiefer einzusteigen: Ich würde strFilter beim Eintritt auf Grundzustand setzen.

Gruß Ralf

Hallo Yves
Warum denn noch ODBC? Ist langsam und unflexibel. Am einfachsten wäre es mit ADO.
Dazu findest Du über Google einige hilfreiche Tutorials. Ums lesen wirst Du wohl nicht herumkommen. Suchbegriffe: Access VBA ADO Tutorials
Wenn die ADO-Verbindung steht (wird sowohl ein Connection- wie auch ein Recordset-Objekt benötigt) kannst Du jedwelche SQL-Statements absetzen.
Sollte es dann doch unbedingt ODBC sein, gibt es einen interessanten Link:

http://www.access-im-unternehmen.de/index.php?id=300…

Hoffe, es hilft. So vom Schiff aus ohne klare Basis kann man von der Ferne aus nicht helfen.

Viel Erfolg, Henri Jendly.

Ich wäre froh wenn du mir helfen könntest WIE ich den String auf den Grundzustand setzen kann.

strFilter = „“ sollte dies meiner Meinung nach ja erreichen, aber das Ergebniss bleibt dasselbe.

Oder gebe ich hier den falschen Befehl ein? strFilter = Nothing und strFilter = NULL funktioniert beides nicht.

Meine Vorredner haben alle recht. ich würde den filter auch vollständig herausnehmen und das feld neu abfragen. me.requery sollte helfen.
wenn du nicht weiterkommst, schau mal bei andre minhorst (access-im-unternehmen), der schreibt zur zeit ein buch über access und sql-server.

grüße aus nürnberg
Jürgen

… und vielleicht noch schneller in der Umsetzung, wenn auch schlechter im Sytem:
Veginne wie folgt:

strFilter = „“
If Kombinationsfeld1.Value „“ Then
strFilter = strFilter & „[Datenfeld1] =“ & „’“ & Nz(Kombinationsfeld1.Value) & "’ AND "
End If

(weiter wie gehabt.)

Viel Erfolg und viel Durchhaltevermögen!
tronicrot

… und vielleicht noch schneller in der Umsetzung, wenn auch
schlechter im Sytem:
Veginne wie folgt:

strFilter = „“
If Kombinationsfeld1.Value „“ Then
strFilter = strFilter & „[Datenfeld1] =“ & „’“ &
Nz(Kombinationsfeld1.Value) & "’ AND "
End If

Eventuell bin ich grade blind. Aber ich sehe nicht worin sich dein Post von meinem bisherigen Script unterscheidet, ausser, dass bei mir strFilter = „“ 1-2 Zeilen weiter oben steht.

Kannst du mich eventuell mit dem Holzhammer auf den Unterschied stossen?

Private Sub Befehl73_Click()
Dim strFilter As String
If Kombinationsfeld1.Value „“ Then
strFilter = strFilter & „[Datenfeld1] =“ & „’“ &
Nz(Kombinationsfeld1.Value) & "’ AND "
End If
If Kombinationsfeld2.Value „“ Then
strFilter = strFilter & „[Datenfeld2] =“ & „’“ &
Nz(Kombinationsfeld2.Value) & "’ AND "
End If
If Kombinationsfeld3.Value „“ Then
strFilter = strFilter & „[Datenfeld3] =“ & „’“ &
Nz(Kombinationsfeld3.Value) & "’ AND "
End If
strFilter = Left(strFilter, Len(strFilter) - 5)
Forms![Formularname].Filter = strFilter
Forms![Formularname].FilterOn = True
End Sub

Dies gelingt mir allerdings immer nur ein einziges Mal. Sobald
ich das Formular ein zweites Mal filtern will, erhalte ich
folgende Fehlermeldung.

Laufzeitfehler ‚3146‘;

ODBC-Aufruf fehlgeschlagen.
[Microsoft][ODBC SQL Server Driver][SQL server]Unclosed
quotation mark after the character string 'Wert aus
Kombinationsfeld
)) Order BY „dbo“.„Tabellenname“.„ID“ '. (#105)
[Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect
syntax near 'Wert aus Kombinationsfeld
'. (#102)

Hallo Yves,

in welcher Codezeile tritte der Fehler auf? Schon beim ersten If?
Mein Englisch sagt mir der Fehler besagt da ist ein syntaxfehler oder fehlendes Gänsefüßchen bei „Wert aus Kombinationsfeld“.

Setze im VB-Editor den Cursor in den Code, dann drücke laufend F8, also Zeile für Zeile abarbeiten. Bei jedem Stopp kannste die Maus über Variabele ninbewegen und es wird dir der Wert angezeigt. Kannst auch mehrmals
Msgbox strFilter
o.ä., in den Code einbauen…

Ich ging zuerst
davon aus, dass ich den Filter deaktivieren müsste bevor ich
ihn neu erstellen kann.  FilterOn = False war allerdings
erfolglos.

In die Richtung dachte ich auch sofort als du sagtest, einmal gings, danach nicht wieder ohne Neustart.
Kennt Acc 2010 „FilterMode“?

Ein weiterer Versuch war es den String strFilter komplett zu
leeren, da ich vermutete, dass er einfach zuviele Daten
erhält. strFilter = „“ hatte allerdings genau 0 Einfluss auf
das Problem.

Du hast strFilter as String deklariert, da passen schon so 64 KB rein *glaub*

Ich habe auch versucht aus der VB-Abfrage eine SQL-Abfrage zu
erstellen (SELECT FROM WHERE) allerdings auch ohne Erfolg.

K.A., kenne acc nich.

Ich wäre froh, wenn mir jemand einen Tipp geben könnte was ich
noch versuchen kann.

Google mal nach
Incorrect syntax near
bzw. der anderen Meldung

Aktuell funktioniert der automatische
Filter nur, wenn man nach jedem Filter das Formular schliesst
und nochmal neu öffnet.

Das bestärkt mich darin wie o.g. hat das was mit dem Filtermodus zu tun.

Gruß
Reinhard

Danke für die Rückfragen.

Der Fehler tritt erst in der letzten Zeile auf. Also in
Forms![Formularname].FilterOn = True

Es muss daher ein logischer Fehler sein und kein technischer.

Ob Acc 2010 Filtermode kennt, kann ich dir leider nicht beantworten. Ich weiss nur, dass ich es selber nicht kenne ^-^`

Generell gegoogelt hab ich nach dem Problem, aber wirklich Auskunft konnte ich nirgendwo finden.

Ist es möglich, dass sich der SQL-Server selbst meinen Filter merkt?

Hallo Yves,

Der Fehler tritt erst in der letzten Zeile auf. Also in
Forms![Formularname].FilterOn = True

Probiere es mal so:


Forms![Formularname].FilterOn = False
Forms![Formularname].Filter = strFilter
Forms![Formularname].FilterOn = True

Gruß
Reinhard

Habe ich versucht und leider ohne Erfolg.
Dieselbe Fehlermeldung.

In einem normalen Access-Formular müsste es vermutlich funktionieren also denke ich, dass der Fehler irgendwo bei der SQL-Tabelle zu suchen ist, respektive zwischen Access und SQL_Server