Neuigkeiten:

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

Mobiles Hauptmenü

Mehrfachauswahl mit Listenfeld

Begonnen von MP2109, November 23, 2018, 16:02:36

⏪ vorheriges - nächstes ⏩

MP2109

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

MP2109

#1
 siehe unten

Lachtaube

'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
Grüße von der (⌒▽⌒)

Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

MP2109

#4
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)

Beaker s.a.

@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

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

MP2109

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.



Beaker s.a.

@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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

MP2109

#8
@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.

MP2109

Habe noch ein bisschen rumprobiert doch leider erfolglos. Hat noch wer eine Lösungsidee?

Viele Grüße

DF6GL

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?


Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

MP2109

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.

ebs17

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

Eberhard

MP2109

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

ebs17

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

Eberhard