Hallo,
ich würde gerne meine qry nach ausgewählten daten im Listenfeld filtern. Mit Kombinationsfeldern krieg ich es hin, doch möchte ich nach mehreren Elementen Filtern.
z.B. zeige mir Mitarbeiter 1,2 und 4 und nicht alle 6.
würde mich über eine Antwort freuen.
Grüße
siehe unten
'Die Mühe, Steuerelemente ordentlich zu taufen, sollte man sich schon geben. :)
Private Sub Befehl53_Click()
Dim Item As Variant
Dim Items() As String
Dim cnt As Long
Dim i As Long
With Me.filterMitarbeiter
cnt = .ItemsSelected.Count
If cnt = 0 Then Exit Sub 'Es gibt keine Arbeit
ReDim Items(cnt - 1)
For Each Item In .ItemsSelected
Items(i) = .ItemData(Item) 'das wären die Werte der gebundenen Spalte
i = i + 1
Next
End With
Me.Filter = "MitarbeiterID In (" & Join(Items, ",") & ")"
'oder für einen Text
'Me.Filter = "MitarbeiterID In ('" & Join(Items, "','") & "')"
Me.FilterOn = True
End Sub
Hallo,
Zunächst mal ist nicht klar, was du mit der "Auswahl" machen willst; -
das Formular filtern oder ...
Zum Filtern muss der String anders aufgebaut werden
Private Sub Befehl53_Click()
Dim vItem As Variant
Dim sAuswahl As String
Auswahl = ""
With Me!filterMitarbeiter
If .ItemsSelected.Count > 0 Then
For Each vItem In .ItemsSelected
sAuswahl = sAuswahl & .ItemData(vItem) & ","
Next i
'letztes Komma weg
sAuswahl = Mid(sAuswahl, 1, Len(sAuswahl) - 1)
Me.Filter = "MitarbeiterID IN (" & sAuswahl & ")"
Me.FilterOn = True
End If
End With
End Sub
gruss ekkehard
uuups, zu langsam
Hallööle
hatte die Tage nicht viel Zeit weiter zu machen. Vielen Dank erst mal für die Antworten.
Diese funktionieren bei mir auch im Endlosformular mit mehreren Elementen. Doch habe ich vergessen zu sagen, dass ich eine Abfrage filtern möchte und dies kriege ich nicht gefiltert. bzw. das Unterformular(daten der Abfrage9.
Private Sub filterAnwenden_Click()
Dim i As Variant
Dim Auswahl As String
Auswahl = "1"
For Each i In Me!filterMitarbeiter.ItemsSelected
If IsNull(Auswahl) Then
Auswahl = Me!filterMitarbeiter.Column(0, i)
Else
Auswahl = Auswahl & " Oder Wie " & Me!filterMitarbeiter.Column(0, i)
End If
Next i
Me!filterMitarbeiter = Auswahl
Me!UnterFormular.Requery
End Sub
Ich habe bei Kriterium Wie "*" & [Formulare]![Sollstunden]![filterMitarbeiter] & "*" Bei meiner Abfrage in der Spalte MitarbeiterID.
Rein theoretisch(auch wenn es nicht illlegant gelöst ist, und ich weiß dass er immer 1 mit reinnimmt) müsste es jetzt nicht funktionieren?
Habe mich erst seid ein paar Tagen mit Vba befasst würde mich über weitere Hilfe freuen!
Falls Ihr noch Fragen habt antworte ich gerne.
Grüße
Überflüssige Leerzeilen im Code entfernt. Codetags angewendet. Bitte zukünftig selbst machen. Klaus (MzKlMu)
@MP2109
1. VBA und SQL sprechen nur englisch, also
"... Oder Wie ..." = "... Or LIKE ..."
2. soll ja in "Auswahl" bzw. in "Me!filterMitarbeiter" sowas wie "1, 2, 4"
drinstehen. Das geht nicht, - einem Listenfeld kannst du keinen String als
Inhalt geben. Du brauchst also ein Feld (ungebunden) in dem du den
String festhältst. Habe ich jetzt mal "txtMAIDs" genannt.
3. für eine Abfrage muss da allerdings "(1, 2, 4)" drinstehen, und dann
lautet das Kriterium "... WHERE MitarbeiterID IN " & Forms!Sollstunden!txtMAIDs & "..."
"Sollstunden" ist dabei allerdings ein HFo. Befindet sich das Feld auf einem
UFo lautet der Bezug
Forms!NameHFo!NameUFoControl.Form!txtMAIDs
Mein Code würde dann so aussehen
Private Sub Befehl53_Click()
Dim vItem As Variant
Dim sAuswahl As String
Auswahl = "("
With Me!filterMitarbeiter
If .ItemsSelected.Count > 0 Then
For Each vItem In .ItemsSelected
sAuswahl = sAuswahl & .ItemData(vItem) & ","
Next i
'letztes Komma weg
sAuswahl = Mid(sAuswahl, 1, Len(sAuswahl) - 1)
'Klammer hinten dran
sAuswahl = sAuswahl & ")"
Me!txtMAIDs = sAuswahl
End If
End With
End Sub
Und, falls du es noch nicht kennst, suche mal in der OH nach "Debug.Print".
Das hilft beim Zusammensetzen von Strings in VBA ungemein.
Ein nettes, kleines Tool (Add-In) das diese Methode für Abfragen und
Kriterien noch ein wenig erweitert, findest du hier
http://access-codelib.net/download/addins/SqlDebugPrint.zip (http://access-codelib.net/download/addins/SqlDebugPrint.zip)
gruss ekkehard
Vielen Dank @Beaker s.a
ich verstehe den Code(habe i durch vItem und Auswahl durch sAuswahl ersetzt) und das debug.Print war auch wirklich goodtoknow, aber würde er nicht bei deinem Code als Kriterium schreiben (1,2,4) ? Das ist doch kein gültiges Kriterium. Das Kriterium müsste doch in der Form vonWie 1 Oder Wie 2 Oder Wie 4 sein oder nicht?
Habe es dann mit Private Sub Befehl53_Click()
Dim vItem As Variant
Dim sAuswahl As String
sAuswahl = ""
With Me!filterMitarbeiter
If .ItemsSelected.Count > 0 Then
For Each vItem In .ItemsSelected
sAuswahl = sAuswahl & .ItemData(vItem) & " oder wie "
Next vItem
'oder wie
sAuswahl = Mid(sAuswahl, 1, Len(sAuswahl) - 9)
Me!txtMAIDs = sAuswahl
Me!UnterFormular.Requery
End If
End With
End Sub versucht, doch leider nicht erfolgreich.
@Mp2109
Zitataber würde er nicht bei deinem Code als Kriterium schreiben (1,2,4) ?
Ja.
ZitatDas ist doch kein gültiges Kriterium
Für eine IN-Klausel schon. Wobei IN dein vermutetes Kriterium so zu
sagen abkürzt, das aber so aussehen müsste
... WHERE MitarbeiterID = 1 OR MitarbeiterID = 2 OR MitarbeiterID = 4 ...gruss ekkehard
@Beaker s.a. Achso okay verstanden!
Leider gibt es noch einen Datenkonflikt bei meinem SQL.
SELECT ArbeitszeitraumOhneWe.MitarbeiterID, ArbeitszeitraumOhneWe.Standort, ArbeitszeitraumOhneWe.Bundesland, ArbeitszeitraumOhneWe.Kostenstelle, ArbeitszeitraumOhneWe.Stunden_pro_Tag, Feiertag.Wertigkeit
FROM ArbeitszeitraumOhneWe LEFT JOIN Feiertag ON (ArbeitszeitraumOhneWe.[Datum] = Feiertag.[Datum]) AND (ArbeitszeitraumOhneWe.Bundesland = Feiertag.Bundesland2)
WHERE (((ArbeitszeitraumOhneWe.MitarbeiterID) In ("&[Formulare]![Sollstunden]![txtMAIDs]&")) AND ((Feiertag.Wertigkeit) Is Null Or (Feiertag.Wertigkeit)<1))
ORDER BY ArbeitszeitraumOhneWe.MitarbeiterID, ArbeitszeitraumOhneWe.Datum;
Vielen Dank.
Habe noch ein bisschen rumprobiert doch leider erfolglos. Hat noch wer eine Lösungsidee?
Viele Grüße
Hallo,
die Lösungsideen gibt es zuhauf, Du musst sie nur richtig umsetzen.
ZitatIn ("&[Formulare]![Sollstunden]![txtMAIDs]&"))
Wird nicht funktionieren...
Du musst den SQL-String mit VBA zusammensetzen und die IN -Bedingung einbauen.
Zitatich würde gerne meine qry nach ausgewählten daten im Listenfeld filtern
Was willst Du mit dieser qry überhaupt anstellen?
ZitatDu musst den SQL-String mit VBA zusammensetzen und die IN -Bedingung einbauen.
Da ich leider mit Vba nicht soviel am Hut habe, würde ich mich über weitere Auskunft freuen.
Ich habe eine Ansichtsmaske(Formular) für den Enduser. Dieser soll auf der Maske Filter eingeben. Diese filtern dann eine qry, aufbauend wird eine Kreuztablle erstellt, welche das Unterformular für die Ansichtsmaske ist.
ZitatDa ich leider mit Vba nicht soviel am Hut habe
Du solltest dazu Deine Einstellung ändern oder Deine Ansprüche an Deine Anwendung nicht so hoch ansiedeln oder solche ungeliebten Maßnahmen an einem bezahlten Service abgeben.
Zitatüber weitere Auskunft freuen
Vielleicht führst Du vorhandene Auskünfte (bspw. von Lachtaube) Dir ins Bewusstsein und (testweise) in Deine Programmierung.
Wenn vorhandene Hinweise für die Tonne sind (unreflektiert, vermutlich ignoriert) - woraus soll man schließen, was mit folgenden passiert?
ZitatVielleicht führst Du vorhandene Auskünfte (bspw. von Lachtaube) Dir ins Bewusstsein und (testweise) in Deine Programmierung.
Wenn vorhandene Hinweise für die Tonne sind (unreflektiert, vermutlich ignoriert) - woraus soll man schließen, was mit folgenden passiert?
Es soll jetzt nicht böse gemeint rüberkommen, aber bis jetzt wurde doch jeder Vorschlag hinweis beachtet und auch angewendet und zu einem funktionierenden Filter zusammen gstellt. Jedoch fehlt mir jetzt noch die Eingliederung der InFunktion als Kriterium, da ich normalerweise meine Kriterien nur über Die Entwurfsansicht bei qrys beziehungsweise über sql erstelle.
Kann den Vorwurf deswegen leider nicht verstehen, dass Hinweise nicht angenommen wurden bzw ignoriert.?
Viele Grüße
ZitatJedoch fehlt mir jetzt noch die Eingliederung der InFunktion als Kriterium
...
beziehungsweise über sql erstelle
O.K., wenn Dir die Struktur der SQL-Anweisung an sich klar ist (und diese wird ja letztendlich ausgeführt), muss man sich nur vor Augen halten, wie die funktionierende Anweisung aussehen muss als Ergebnis des Zusammensetzens. Die Verwendung einer Variablen für den Inhalt sowie der Test über Debug.Print wie oben bereits vorgeschlagen sind gute Mittel dazu, das Werk eigenen Tuns zu prüfen.
ZitatSELECT Irgendwas FROM Irgendwoher
WHERE Mitgliedsname IN ('Susi', 'Petra', 'Kurt')
bzw.
SELECT Irgendwas FROM Irgendwoher
WHERE MitgliedsID IN (3, 4, 17)
Das wären jetzt syntaxrichtige und somit ausführbare SQL-Anweisungen, das blau hervorgehobene sind Filter (Kriterien), falls Du Dich darauf orientierst.
In diesem Stadium sind SQL-Anweisung oder Filter nur einfacher Text und nach dessen Regeln zusammenzubauen. Erst mit der Ausführungsanweisung (Filter anwenden, SQL-Anweisung einem Objekt als Datenherkunft zuweisen) wird dieser String der DB-Maschine zugeführt und real ausgeführt.
Zitat
Dim sql As String
sql = "SELECT ArbeitszeitraumOhneWe.MitarbeiterID, ArbeitszeitraumOhneWe.Datum, ArbeitszeitraumOhneWe.Standort, ArbeitszeitraumOhneWe.Bundesland, ArbeitszeitraumOhneWe.Kostenstelle, ArbeitszeitraumOhneWe.Stunden_pro_Tag, Feiertag.Wertigkeit" & _
"FROM ArbeitszeitraumOhneWe LEFT JOIN Feiertag ON (ArbeitszeitraumOhneWe.Bundesland = Feiertag.Bundesland2 AND ArbeitszeitraumOhneWe.[Datum] = Feiertag.[Datum]" & _
"WHERE MitarbeiterID IN & Forms!Sollstunden!txtMAIDs AND ArbeitszeitraumOhneWe.Kostenstelle Like " * " & [Formulare]![f2_1_Sollstunden]![filterKostenstelle] & " * " And Feiertag.Wertigkeit Is Null Or Feiertag.Wertigkeit < 1"
End Sub
Vielen dank @ebs
Soweit ich Vba jetzt verstanden habe, muss ich Sql als String definieren
und dann unten bei sql einbinden.
Jetzt zeigt er mir als Fehlermeldung eine Typenunverträglichkeit auf. Ich denke das mein Fehler in der Sql Einbindung nicht richtig ist.
ZitatIch denke das mein Fehler in der Sql Einbindung nicht richtig ist.
Ja, und es fehlt der prüfende Schritt, später dann auch die Übergabe des Strings an die Verwendung.
Debug.Print sqlDas gibt den erzeugten Finalstring in den Direktbereich aus (erreichbar über Strg + G aus dem VBA-Editor heraus). Dort kannst Du sehen, was Du erzeugt hast, und mit Kenntnis notwendiger Syntax kannst Du Fehler erkennen und überarbeiten.
sql = " SELECT ArbeitszeitraumOhneWe.MitarbeiterID, ArbeitszeitraumOhneWe.Datum, ArbeitszeitraumOhneWe.Standort, ArbeitszeitraumOhneWe.Bundesland, ArbeitszeitraumOhneWe.Kostenstelle, ArbeitszeitraumOhneWe.Stunden_pro_Tag, Feiertag.Wertigkeit " & _
" FROM ArbeitszeitraumOhneWe LEFT JOIN Feiertag ON (ArbeitszeitraumOhneWe.Bundesland = Feiertag.Bundesland2) AND (ArbeitszeitraumOhneWe.[Datum] = Feiertag.[Datum]) " & _
" WHERE MitarbeiterID"
'& _
"IN (1,2,3) AND ((Feiertag.Wertigkeit) Is Null Or (Feiertag.Wertigkeit)<1) " & _
" ORDER BY ArbeitszeitraumOhneWe.MitarbeiterID, ArbeitszeitraumOhneWe.Datum; "
sql = sql & "in" & sAuswahl & _
" AND ((Feiertag.Wertigkeit) Is Null Or (Feiertag.Wertigkeit)<1) " & _
" ORDER BY ArbeitszeitraumOhneWe.MitarbeiterID, ArbeitszeitraumOhneWe.Datum; "
Debug.Print sql
DoCmd.RunSQL sql
Ich bin eigentlich der Meinung, dass der Sql Code richtig sein müsste jetzt. Doch mir wird beim ausführen des Buttons immer noch ein Fehler(23429 angezeigt.
Er makiert immer die Zeile DoCmd.RunSQL
Du verklebst MitarbeiterID mit IN zu MitarbeiterIDIN. Weiterhin wird Dir RunSQL garantiert keine Auswahlabfrage anzeigen.
Habe jetzt mal Dim qdf As QueryDef, sqltext
sqltext = sql
For Each qdf In CurrentDb.QueryDefs
If qdf.Name = "tmp" Then
DoCmd.Close acQuery, "tmp": DoCmd.DeleteObject acQuery, "tmp"
End If
Next
Set qdf = CurrentDb.CreateQueryDef("tmp", sqltext)
DoCmd.OpenQuery qdf.Name
Me!UnterFormular.Requery
End Sub
benutzt. Jetzt holt er mir die ausgewählten daten in eine neue Abfrage. Das heißt meine Verknüpfung mit SQL ist schon mal richtig soweit :) :) :)
Welchen Befehl müsste ich nun anstelle von DoCmd.RunSQL sql das es funktioniert?
ZitatDu verklebst MitarbeiterID mit IN
@LAchtaube hatte ich in meinem code auch schon berichtigt
@MP2109
Dein letztgezeigter Code ist überflüssig. Wenn du einen, funktionierenden,
SQL-String hast (bei dir jetzt wohl "sql"), brauchst du diesen nur der DS-
Herkunft des UFos zu übergeben.
sql = "DeinString"
'u.U. halt noch ein Debug.Print
Me.DeinUFoControl.Form.RecordSource = sql
gruss ekkehard
Also grundsätzlich habe ich eine Lösung
Private Sub filterAnwenden_Click()
Dim vItem As Variant
Dim sAuswahlMitarbeiter As String
Dim sql As String
Dim rs As DAO.Recordset
AuswahlMitarbeiter = "("
With Me!filterMitarbeiter
If .ItemsSelected.Count > 0 Then
For Each vItem In .ItemsSelected
AuswahlMitarbeiter = AuswahlMitarbeiter & .ItemData(vItem) & ","
Next vItem
'letztes Komma weg
AuswahlMitarbeiter = Mid(AuswahlMitarbeiter, 1, Len(AuswahlMitarbeiter) - 1)
'Klammer hinten dran
AuswahlMitarbeiter = AuswahlMitarbeiter & ")"
End If
End With
sql = " SELECT ArbeitszeitraumOhneWe.MitarbeiterID, ArbeitszeitraumOhneWe.Datum, ArbeitszeitraumOhneWe.Standort, ArbeitszeitraumOhneWe.Bundesland, ArbeitszeitraumOhneWe.Kostenstelle, ArbeitszeitraumOhneWe.Stunden_pro_Tag, Feiertag.Wertigkeit " & _
" FROM ArbeitszeitraumOhneWe LEFT JOIN Feiertag ON (ArbeitszeitraumOhneWe.Bundesland = Feiertag.Bundesland2) AND (ArbeitszeitraumOhneWe.[Datum] = Feiertag.[Datum]) " & _
" WHERE MitarbeiterID"
sql = sql & " IN" & AuswahlMitarbeiter & _
" AND ((Feiertag.Wertigkeit) Is Null Or (Feiertag.Wertigkeit)<1) " & _
" ORDER BY ArbeitszeitraumOhneWe.MitarbeiterID, ArbeitszeitraumOhneWe.Datum; "
Debug.Print filterMitarbeiter
Dim qdf As QueryDef, sqltext
sqltext = sql
For Each qdf In CurrentDb.QueryDefs
If qdf.Name = "ArbeitszeitraumOhneWeFT" Then
DoCmd.Close acQuery, "ArbeitszeitraumOhneWeFT": DoCmd.DeleteObject acQuery, "ArbeitszeitraumOhneWeFT"
End If
Next
Set qdf = CurrentDb.CreateQueryDef("ArbeitszeitraumOhneWeFT", sqltext)
DoCmd.Close acForm, "f1_1_Navigation"
DoCmd.OpenForm "f1_1_Navigation"
End Sub
dies funktioniert jetzt auch. Ist vielleicht nicht besonders elegant, aber es funktioniert.
@beaker wie meintest du das mit sql = "DeinString"
'u.U. halt noch ein Debug.Print
Me.DeinUFoControl.Form.RecordSource = sql
Das funktioniert bei mir nicht. Denn er filtert zwar die Mitarbeiter, doch die anderen Daten der Kreuztabelle bleiben leer(außer Mitarbeiter). Ich denke das liegt daran das die Abfrage, die ich filter nicht die Kreuztabelle ist. Es ist die Abfrage aus der ich die Kreuztabelle erstelle.
Vielen Dank erstmal an alle die mir bis zu diesem Schritt geholfen haben, das mich sehr weiter gebracht!
Grüße
@MP2109
O.K., so langsam komme ich dahinter, was du eigentlich willst.
Ich dachte die ganze Zeit, du willst ein UFo filtern.
Was du willst, ist eine gespeicherte Abfrage, die Basis für eine
Kreuztabellenabfrage ist, zu ändern; -. glaube ich jetzt jeden-
falls so verstanden zu haben.
Dann wird's doch viel einfacher, du brauchst die Abfrage nicht
erst löschen und dann wieder neu erstellen. Es reicht den SQL-
String zu ändern
...
Debug.Print filterMitarbeiter
CurrentDb.QueryDefs("ArbeitszeitraumOhneWeFT").SQL = sql
End Sub
Wenn das Form "f1_1_Navigation" auf einer der beiden Abfragen
(sql bzw. "ArbeitszeitraumOhneWeFT" basiert, brauchst du es nicht
extra zu schliessen, da reicht dann ein
'wenn's ein HFo ist
Forms.f1_1_Navigation.Requery
'bei einem UFO
Forms.NameHFO.NameUFoControl.Form.Requery
gruss ekkehard
@Beaker
Ja genau so wollte ich es eigentlich, wusste jedoch nicht den passenden VBA Befehl.
Ledier ändert sich bei CurrentDb.QueryDefs("ArbeitszeitraumOhneWeFT").SQL = sql
Forms.f1_1_Navigation.Requery
nichts .
++++
Ich habe es gerade noch ein mal ausprobiert ob es aktualisiert wenn man die Navigation wechselt und das tut es.
Heißt wohl ich muss wiederDoCmd.Close acForm, "f1_1_Navigation"
DoCmd.OpenForm "f1_1_Navigation" benutzen.
Hallo,
ZitatIch habe es gerade noch ein mal ausprobiert ob es aktualisiert wenn man die Navigation wechselt und das tut es.
Das heisst, die Abfrage wird geändert aber das Form aktualisiert nicht?
Kann IMO dann eigentlich nur an der Referenz auf das Formular liegen.
gruss ekkehard
@Beaker ja genau die Abfrage aktualisiert jedoch das UFO nicht.
Hallo,
ein Naviform hat nur ein Unterformular(Steuerelement), auf das Bezug genommen werden muss und standardmäßig den Namen "Navigationsunterformular" hat.
Insofern muss es so lauten:
Forms!f1_1_Navigation!NavigationsUnterformular.Requery
sofern das UFO nicht umbenannt wurde.
@DF6GL achso ja habe ich verstanden. Jedoch wenn ich den Vba befehl eingebe, klappt leider nicht da er sagt, dass er f1_1_Navigation nicht kennt.
ich beende hier mal, da die Lösung die ich soweit habe den Zweck erfüllt. Zwar nicht perfekt jedoch macht er was er soll. Vielen Dank allen nochmal bei der Hilfe?
Hallo,
wenn er den Formular-Namen nicht kennt, dann existiert der halt nicht und muss durch den aktuell richtigen Namen ersetzt werden.....