Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Unterformular filtern mit 2 Kriterien

Begonnen von Utopia, August 30, 2014, 03:58:12

⏪ vorheriges - nächstes ⏩

Utopia

Hallo,
och habe ein Formular(frm_Verwaltung) mit Unterformular(frm_Kunden) ind Access 2013 erstellt.

Aus Gründen der Benutzerfreundlichkeit möchte ich folgendes realisieren.

Im Formular gibt es 2 Kombinationsfelder (cbofilterOrt und cbofilterStatus) mit deren Hilfe die Daten im Unterformular eingrenzt werden sollen.

Beim Click auf eine Schaltfläche wird folgender VBA Code ausgeführt.


Private Sub BefehlFiltern_Click()
    Dim StrOrt As String, StrStatus As String
    StrOrt = Me.cbofilterOrt.Value & "'"
    StrStatus = Me.cbofilterStatus.Value & "'"
    Me.sfrm_Kundenverwaltung.Form.Filter = "U-Ort = '" & StrOrt & "'" & " AND Kd-Status = '" & StrStatus & "'"
    Me.FilterOn = True
End Sub


Ich bekomme dann Laufzeitfehler "3075"
Syntaxfehler (fehlender Operator) in Abfrageausdruck 'U-Ort ='Berlin" AND Kd-Status = 'aktiv'".

angezeigt. Offensichtlich kann der Code so falsch nicht sein, aber ich vermute das es an den Hochkommas liegt.
Bin aber nicht sicher. Das immer so verwirrend.  :o
Ich habe verschiedene Varianten ausprobiert komme aber leider nicht weiter und es ist schon so so so spät. Daher hoffe ich hier den richtigen Schups in die richtige Richtung zunekommen.

Vielen Dank im voraus.







bahasu

#1
Hi,

was passiert mit:

    Me.sfrm_Kundenverwaltung.Form.Filter = "[U-Ort] = '" & Me.cbofilterOrt.Value & "' AND [Kd-Status] = '" & Me.cbofilterStatus.Value & "'"
    Me.FilterOn = True


Gilt unter der Voraussetzung, dass beide Kombifelder vom Typ String sind.

Was mir nicht klar ist, warum einmal:
Me.sfrm_Kundenverwaltung.Form.Filter
und bei der nächsten Anweisung nur
Me.FilterOn

Warum nicht : Me.sfrm_Kundenverwaltung.Form.FilterOn

Und noch eine Bemerkung:
vermeide Sonderzeichen (wie z.B. das Minus-Zeichen) bei den
Namen. Wenn dann mit [] umrahmen: [U-Ort]
Gleiches gilt für den Status

Und noch eine Frage:
Wirst Du immer beide Kombifelder verwenden oder kann es auch mal sein, dass Du nur eins benutzt?

Harald
Servus

DF6GL

Hallo,


wenn "sfrm_Kundenverwaltung"  der Name des UFO-Steuerelementes ist (mit dem das Formular "frm_Kunden" angezeigt wird), dann sollte es schon so lauten:

    Me!sfrm_Kundenverwaltung.Form.Filter = "[U-Ort] = '" & Me!cbofilterOrt & "' AND [Kd-Status] = '" & Me!cbofilterStatus  & "'"
    Me[color=red]!sfrm_Kundenverwaltung[/color].Form.FilterOn = True



auf ".Value" kann man verzichten, wenn der Wert aus der gebundenen Spalte des Kombi gebraucht wird.


btw:  schon zig-tausendmal geraten, wie der Hinweis von Harald:

KEIN Sonder- und/oder Leerzeichen in Namen verwenden!

Und (auch, wenn da manche Meinungen auseinandergehen):
Punkt vor Objekt-Methoden/-Eigenschaften setzen
Ausrufezeichen vor eigendefinierten Namen/Objekten setzen


Utopia

Hallo nochmal.

Vielen herzlichen Dank für eure Hilfe und eure Rüffel. :D Da hab ich wohl ein paar klassische NewbieFehler gemacht. Aber ich Glaube sowas passiert jeden Anfänger. Bitte versteht das nicht als Ausrede. Ich habe erst seit 6 Wochen Office2013 und mache gerade die ersten Schritte mit Access und VBA.
Das man keine Sonderzeichen in Namen verwenden soll/kann war mir nicht bewußt. Daher habe ich zuerst alle meine Tabellen und Formulare überarbeitet.
Auch habe ich den Filter direkt ins Unterformular verlegt.
Mit dem Code funktioniert das Ganze jetzt fast so wie ich es mir vorgestellt habe.
Private Sub Filtern_Click()
    Me.Form.Filter = "[UOrt] = '" & Me!cbofilterOrt & "' AND [KdStatus] = '" & Me!cbofilterStatus & "'"
    Me.Form.FilterOn = True
End Sub

Da ich mir schon einige Tage mit dem Problem beschäftigt habe, bin ich sehr dankbar das es jetzt funktioniert und ich mit meinem Projekt weiterkomme.

ZitatWirst Du immer beide Kombifelder verwenden oder kann es auch mal sein, dass Du nur eins benutzt?

Da hatte ich bisher noch gar nicht dran gedacht. Es wäre sicherlich vorteilhaft die Daten aller Orte/Außenstellen oder alle KundenStatuse zu sehen, gerade für die Suchfunktionen.

Daher hätte ich noch 2 Fragen.

Wie könnte ich das denn realisieren das jeweils eins der beiden Felder leer bleiben kann?

Wäre es möglich auf den Button zu verzichten und den Code über die Eigenschaft "Nach Aktualisierung" beider Kombinationsfelder auszuführen?
Falls nicht, kann man per erneutem Click auf die Schaltfälche alle Filter wieder deaktivieren?
Oder muss ein zweiter Button her?

Vielen Grüße








bahasu

Hi,

anbei ein ungetesteter Code, den Du in den VBA-Teil des Formulars einträgst:

private sub Filter_Setzen
Dim Bedingung as String

Bedingung = ""

if nz(Me!cbofilterOrt,"") > "" then Bedingung = " and [UOrt] = '" & Me!cbofilterOrt

if nz(Me!cbofilterStatus,"") > "" then Bedingung = Bedingung & " and [KdStatus] = '" & Me!cbofilterStatus & "'"

'and entfernen
Bedingung = mid (Bedingung, 6)

if Bedingung > "" then
  Me.Filter = Bedingung
  Me.FilterOn = true
else
  Me.Filter=""
  Me.FilterOn = false
end if

end sub


Die obige sub rufst Du auf mit:
   call Filter_SetzenDiese Anweisung trägst Du in die beiden "Nach Aktualisierung"-Ereignisse der beiden Kombifelder ein.
Damit sollte ein Extrabutton zum Filtersetzen überflüssig sein.
U.U musst Du beim Filtersetzen noch auf das Unterformular verweisen.
In der Art wie Franz es beschrieben hatte.
Hoffe, es hilft.

Harald


Servus

Utopia

Das mit dem call Filter_setzen hat leider nicht funktioniert.
Da hat Access den Fehler. "Objekt: 'call Filter_setzen'  kann nicht gefunden werden" ausgeworfen.
Daher habe ich das Ganze wie folgt umgesetzt.


Private Sub cbofilterOrt_AfterUpdate()
Dim Bedingung As String

Bedingung = ""

If Nz(Me!cbofilterOrt, "") > "" Then Bedingung = " and [UOrt] = '" & Me!cbofilterOrt & [color=red]"'"[/color]

If Nz(Me!cbofilterStatus, "") > "" Then Bedingung = Bedingung & " and [KdStatus] = '" & Me!cbofilterStatus & "'"

'and entfernen
Bedingung = Mid(Bedingung, 6)

If Bedingung > "" Then
  Me.Filter = Bedingung
  Me.FilterOn = True
Else
  Me.Filter = ""
  Me.FilterOn = False
End If

End Sub

Private Sub cbofilterStatus_AfterUpdate()
Dim Bedingung As String

Bedingung = ""

If Nz(Me!cbofilterOrt, "") > "" Then Bedingung = " and [UOrt] = '" & Me!cbofilterOrt & [color=red]"'"[/color]

If Nz(Me!cbofilterStatus, "") > "" Then Bedingung = Bedingung & " and [KdStatus] = '" & Me!cbofilterStatus & "'"

'and entfernen
Bedingung = Mid(Bedingung, 6)

If Bedingung > "" Then
  Me.Filter = Bedingung
  Me.FilterOn = True
Else
  Me.Filter = ""
  Me.FilterOn = False
End If
End Sub


Erst bekam ich einen Laufzeitfehler. Danach habe ich so aus dem Bauch heraus die rot markierte Stellen eingefügt. Ich weiss zwar nicht warum aber es funktioniert und vorerst habe ich keine weiteren Bugs gefunden.

MaggieMay

Hallo,
ZitatDa hat Access den Fehler. "Objekt: 'call Filter_setzen'  kann nicht gefunden werden" ausgeworfen.
wo hattest du die Prozedur denn eingefügt? Und wie bzw. woher wurde sie aufgerufen?
Möglicherweise hast du die Hinweise von bahasu nicht beachtet?
Freundliche Grüße
MaggieMay