Hallo Zusammen,
für eine Unterschriftenliste möchte ich den Inhalt eines Unterformulars durch die Mehrfachauswahl eines Listenfeldes im Hauptformular filtern bevor ich dann den Bericht öffne und drucke.
Zuerst habe ich wie folgt begonnen:
Einzelauswahl per Doppelklick im Listenfeld "lstAufgabeListeDK":
Private Sub lstAufgabeListeDK_DblClick(Cancel As Integer)
Me!UF_frmTM1_Zulassung.Form.Filter = "AufgabeTitelID = " & Me.lstAufgabeListeDK
Me!UF_frmTM1_Zulassung.Form.FilterOn = True
End SubNun habe ich das für die Mehrfachauswahl wie folgt erweitert:
Das ungebundene Listenfeld "lstAufgabeListeDK" umgestellt auf "Mehrfachauswahl - Einzeln". Auswahl funktioniert soweit.
Dann habe ich mir einen Button "btnFilter" erstellt und einen Code den ich im Forum gefunden habe entsprechend angepaßt.
Private Sub btnFilter_Click()
Dim vItem As Variant
Dim sAuswahl As String
sAuswahl = ""
With Me!lstAufgabeListeDK
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!UF_frmTM1_Zulassung!AufgabeID_A = sAuswahl
Me.UF_frmTM1_Zulassung.Requery
End If
End With
End SubNach Mehrfachauswahl im Listenfeld "lstAufgabeListeDK" und drücken den Buttons "btnFilter" läuft der Code bei der Codezeile:
ZitatMe!UF_frmTM1_Zulassung!AufgabeID_A = sAuswahl
auf einen Fehler: LZF2113 - Sie haben einen Wert eingegeben, der für dieses Feld nicht gültig ist.
Vielleicht hätte jemand eine Idee wo mein Fehler liegt.
Gruss
mad
Debug.Print sAuswahlSiehe Dir an, was Du erzeugst.
... & " oder wie "SQL und VBA sprechen auf jeden Fall englisch.
Daneben ist eine Mustersuche (LIKE) ohne Wildcards eine schlechte Lösung. Eine Prüfung auf Gleichhheit wäre überzeugender.
Hallo,
danke für die Hinweise.
Zitat... & " oder wie "
habe ich geändert in
Zitat... & " oder wie "
Ausgegeben wird mir z.B. im Direktfenster:
Zitat63 or like 80 or like 111
Wenn ich mir die gelb markierte Zeile ansehe bekomme folgendes angezeigt:
ZitatMe!UF_frmTM1_Zulassung!AufgabeID_A=85
und
ZitatsAuswahl="63 or like 80 or like 111"
wo die ...=85 herkommen weis ich aktuell nicht.
Mit Deinem letzten Hinweis,
ZitatDaneben ist eine Mustersuche (LIKE) ohne Wildcards eine schlechte Lösung. Eine Prüfung auf Gleichhheit wäre überzeugender.
stehe ich noch etwas auf dem Schlauch. Die Werte aus "AufgabeTitelID" im Listenfeld und "AufgabeID_A" im UF sind Autowert bzw. Zahl. Ist hier eine Wildcard wirklich sinnvoll?
Wie gesagt hier komme ich noch nicht weiter.
Gruss
Manfred
Es ist schön, dass Du die Sinnfrage stellst. Also halten wir uns mal daran.
Ziel des Ganzen dürfte ja sein, einen funktionierenden und sachlich richtigen Filter zu erstellen. Ein solcher (vergleiche auch notwendige Syntax) müsste so aussehen:
[WHERE] ID = 8 OR ID = 11 OR ID = 132
' bzw.
[WHERE] ID IN (8, 11, 132)ID LIKE 8 usw. macht doch keinen Sinn. Entweder meint man die 8 oder eben nicht. Die 888 sollte es wohl nicht sein.
Vergleiche das mit Deinen Bemühungen und korrigiere.
Kleine Anekdote am Rande: Sage mal Deiner Frau, Du liebst eine Frau wie sie - und gucke mal, wie sie guckt ...
Zum Querlesen: Grundlagen - SQL ist leicht (15) - Mehrfachauswahl zum Filtern umsetzen (https://www.ms-office-forum.net/forum/showthread.php?t=373473)
Hallo Eberhard,
habe mir mal das Thema
ZitatZum Querlesen: Grundlagen - SQL ist leicht (15) - Mehrfachauswahl zum Filtern umsetzen
durchgelesen und auch die Beispiel-DB angesehen.
Zuerst habe ich meine Codezeile wie folgt geändert:
sAuswahl = sAuswahl & .ItemData(vItem) & " Or AufgabeID_A= "Der Code bleibt aber wieder an der selben Stelle hängen:
ZitatMe!UF_frmTM1_Zulassung!AufgabeID_A = sAuswahl
Wenn ich mit dem Mauszeiger auf sAuswahl gehen, wird mir folgendes angezeigt:
sAuswahl="63 or AufgabeID_A=80 or AufgabeID_A=111 or Aufg"
Igendwie ist "AufgabeID_A" mit "sAuswahl" nicht gleich und deswegen wird scheinbar mein UF nicht gefiltert.
Dann habe ich es mit einem angepaßten Code "DynamicSQL - Like" versucht.
Dazu habe ich nachfolgenden Code 1:1 übernommen;
Private Function GetSelection(AnyListbox As ListBox, SelectionNumber As Long) As Variant
Dim itm As Variant
Dim vArr() As Variant
Dim j As Long
ReDim vArr(AnyListbox.ListCount - 1)
With AnyListbox
For Each itm In .ItemsSelected
vArr(j) = .ItemData(itm)
j = j + 1
Next
End With
If j > 0 Then
ReDim Preserve vArr(j - 1)
SelectionNumber = j
GetSelection = vArr
End If
End Functionund wie gesagt den Code "DynamicSQL - Like" wie folgt angepaßt:
Private Sub btnFilter_Click()
Dim vItem As Variant
Dim sAuswahl As String
Dim MyArr As Variant
Dim MyNumber As Long
MyArr = GetSelection(Me.lstAufgabeListe, MyNumber)
If MyNumber > 0 Then
sAuswahl = "AufgabeID_A=" & Join(MyArr, " OR AufgabeID_A=")
End If
Me!UF_frmTM1_Zulassung!AufgabeID_A = sAuswahl
Me.UF_frmTM1_Zulassung.Requery
End Sub
Aber auch jetzt bleibt der Code bei
ZitatMe!UF_frmTM1_Zulassung!AufgabeID_A = sAuswahl
stehen.
Auch hier wird mir die ID des DS auf den ich im UF stehe gezeigt, wenn ich mit dem Mauszeiger auf die gelb markierte Codezeile auf "AufgabeID_A=85" stehe. Meistens eben die erste Zeile.
Wenn ich auf "sAuswahl" stehe wir mir folgendes angezeigt:
ZitatsAuswahl="AufgabeID_A=63 or AufgabeID_A=80 or AufgabeID_A=111"
???????
Gruss
mad
Vielleicht hilft auch eine stark reduzierte Muster-DB.
Habe ich vergessen.
Gruss
mad
Hallo,
Du willst doch das Ufo filtern, also musst Du das auch machen.
.
.
Me!UF_frmTM1_Zulassung.Form.Filter = sAuswahl
Me.UF_frmTM1_Zulassung.Form.FilterOn = True
End Sub
Manchmal kann es auch Einfach sein, wenn man den Durchblick hat ::).
Danke euch.
Gruss
mad