Hallo
Ich bin seit Tagen an einem Problem dran, das ich derzeit trotz all der Beiträge im WWW nicht lösen kann. Habe eine Tabelle "tblTestListenf". Via Formular-Listenfeld "lstAuswahlKunde" lese ich einen oder mehrere Datensätze aus diesem Listenfeldes aus und übergebe dieses in ein Textfeld auf dem Formular. Soweit so gut. Ergebnis im Textfeld: 1 Oder 2 Oder 4 => je nach Auswahl im Listenfeld. Danach möchte ich eine Abfrage starten, welche als Auswahlkriterium auf den Inhalt des abgeüllten Textfeldes zugreift und die Daten entsprechenden auswählt.
Derzeit wende ich folgenden VBA-Code an:
Private Sub lstAuswahlKunde_AfterUpdate()
Dim strFilter As String, varElement As Variant
If Me.lstAuswahlKunde.ItemsSelected.Count = 0 Then
Beep
Exit Sub
End If
strFilter = ""
For Each varElement In Me.lstAuswahlKunde.ItemsSelected
If strFilter <> "" Then
strFilter = strFilter + " Oder "
End If
strFilter = strFilter & Me.lstAuswahlKunde.ItemData(varElement) & ""
Next
Me.txtAuswahl = strFilter
End Sub
Rufe ich nun die entsprechende Abfrage auf, welche das Kriterium aus dem Textfeld "txtAuswahl" ziehen soll, bleibt diese leer.
Hat da jemand eine Idee weshalb? Ev. gibts auch andere bessere Lösungen wie ich eine Abfrage aufgrund einer Mehrfachauswahl eines Listenfeldes starten kann.
Danke.
JOG
Hi,
vielleicht es schon zu spät für mich, aber ich vermisse eine Zuweisung des ausgesuchten Wertes zu einem Feld.
Du fragtes nach einer anderen (ob besser sei dahin gestellt) Lösung.
Das folgende verwende ich und müßte von Dir angepaßt werden.
Dim Zeile As Byte
Dim Bedingung As String
Vorauswahl_Liste_der_Klassen = ""
With Me.Vorauswahl_Klasse_Liste
For Zeile = 0 To .ListCount - 1
If .Selected(Zeile) And Nz(.Column(0, Zeile)) > "" Then Vorauswahl_Liste_der_Klassen = Vorauswahl_Liste_der_Klassen & " or Klasse = '" & .Column(0, Zeile) & "'"
next Zeile
End With
If Nz(Vorauswahl_Liste_der_Klassen) > "" Then Vorauswahl_Liste_der_Klassen = "( " & Mid(Vorauswahl_Liste_der_Klassen, 5) & ")" ' führendes " or " entfernen
Die oben angesprochene Zuweisung habe ich in meinem Beispiel rot markiert: bei mir hieß das Feld Klasse: Klasse = '" & .Column(0, Zeile) & "'"
Harald
Hallo Harald
Jetzt versteh ich nicht ganz, wie Du das mit der Zuweisung zu einem Feld meinst.
Meine Idee in der Lösung ist, die Auswahl aus dem Listenfeld "lstAuswahlKunde" in das Textfeld "txtAuswahl" mit dem Ausdruck "Me.txtAuswahl = strFilter" zu übergeben. Das funktioniert soweit.
In einem 2. Schritt würde ich dann z.B. via separatem Befehl die Abfrage starten, welche dann wiederum in der Spalte ID-Kunde das Kriterium aus dem Textfeld "txtAuswahl" des Auswahlformulars "frmTestListf" ziehen soll.
Nach der Auswahl im Listenfeld wird im Textfeld entsprechend folgender String ausgewiesen: "1 Oder 2 Oder 3 Oder 4"
Hier der SQL aus der Abfrage:
SELECT tblTestListenf.IDKunde, tblTestListenf.Kundenbezeichnung
FROM tblTestListenf
WHERE (((tblTestListenf.IDKunde)=[Formulare]![frmTestListf]![txtAuswahl])); => Kriterien aus dem Eingabeformular "frmTestListf"
Danke für die Weiterhilfe.
JOG
Hallo,
es ist nicht möglich, einen SQL-Vergleichsoperator ("Oder", der sowieso "Or" heißen müsste) als Bestandteil des Kriteriums-Wertes ( hier der Inhalt des Auswahl-Textfeldes : "1 Oder 2 Oder 4") an eine Abfrage zu übergeben...
Insofern muss der SQL-String der Abfrage in VBA eigenständig zusammengebaut werden:
Private Sub lstAuswahlKunde_AfterUpdate()
Dim strFilter As String, varElement As Variant, strSQL as String
If Me!lstAuswahlKunde.ItemsSelected.Count = 0 Then
Beep
Exit Sub
End If
strFilter = ""
For Each varElement In Me!lstAuswahlKunde.ItemsSelected
strFilter = strFilter & " OR [TabellenFeld1] = " & Me!lstAuswahlKunde.ItemData(varElement)
Next
If Len(strSQL) > 0 Then
strSQL = "Select * from tblTabelle Where " & Mid( strFilter,5)
Else
strSQL = "Select * from tblTabelle Where False " ' Wenn die Abfrage bei fehlendem Kriterium keinen DS liefern soll
'strSQL = "Select * from tblTabelle" ' Wenn die Abfrage bei fehlendem Kriterium alle DS liefern soll
End If
'Currentdb.Querydefs!Abf_DeineAbfrage.SQL = strSQL ' wenn der SQL-String in einer Abfrage gespeichert werden soll.
End Sub
Beim Zusammensetzen des SQL-Strings ist bei der Where-Conditon unbedingt auf den Datentyp des/der betroffenen Tabellenfeldes/r zu achten. Hier wird der Datentyp des Tabellenfeldes "Tabellenfeld1" als Zahl, Long angenommen.
Hallo
Vielen Dank für die Hinweise. Habe nun folgenden Code im Frm hinterlegt und die Tabellenbezeichnung und das Tabellenfeld angepasst. doch leider tut sich da rein gar nichts - keine Fehlermeldung, nichts.
Hast du ne Idee, woran das liegen könnte. Bin da am Ende mit meinem Latein.
Danke!
JOG
Private Sub lstAuswahlKunde_AfterUpdate()
Dim strFilter As String, varElement As Variant, strSQL As String
If Me.lstAuswahlKunde.ItemsSelected.Count = 0 Then
Beep
Exit Sub
End If
strFilter = ""
For Each varElement In Me.lstAuswahlKunde.ItemsSelected
strFilter = strFilter & " OR [IDKunde] = " & Me.lstAuswahlKunde.ItemData(varElement)
Next
If Len(strSQL) > 0 Then
strSQL = "Select * from tblTestListenf Where " & Mid(strFilter, 5)
Else
strSQL = "Select * from tblTestListenf Where False " ' Wenn die Abfrage bei fehlendem Kriterium keinen DS liefern soll
End If
End Sub
If Len(strSQL) > 0 Then
strSQL = "Select * from tblTestListenf Where " & Mid(strFilter, 5)
Else
strSQL = "Select * from tblTestListenf Where False "
End If
Die Länge des SQL-Strings wird vor Zuweisung eines Wertes immer 0 sein, also wirst Du folgerichtig im Else-Zweig landen.
Zur Auswertung des Listenfeldes eignet sich übrigens eine solche Kriterienkonstruktion besser:
WHERE IDKunde IN (2, 3, 7, 11)
' bzw.
WHERE Kundenname IN ('Meier', 'Schmidt', 'Lehmann', 'Müller')
Im Zusammenhang:
Private Sub lstAuswahlKunde_AfterUpdate()
Dim strFilter As String, varElement As Variant, strSQL As String
strSQL = "Select * from tblTestListenf"
With Me.lstAuswahlKunde
For Each varElement In .ItemsSelected
strFilter = strFilter & ", " & .ItemData(varElement)
Next
End With
If Len(strFilter) > 0 Then
strSQL = strSQL & " Where IDKunde IN (" & Mid(strFilter, 3) & ")"
Else
strSQL = strSQL & " Where False" ' Wenn die Abfrage bei fehlendem Kriterium keinen DS liefern soll
End If
' Jetzt müsste man diese Datenherkunft auch nutzen
Me.RecordSource = strSQL
End Sub
MfGA
ebs
Hallo
Vielen Dank für Eure Hilfe. Habe den Code in meiner endgültigen Fassung folgendermassen eingebaut:
Private Sub cmdAuswertung_Click()
Dim strFilter As String, varElement As Variant, strSQL As String
strSQL = "SELECT tblAnlagenMaschinen.InterneIDAnlage, tblWartungsArbeiten.PlanNr, tblWartungsArbeiten.IDWartungsArbeit, tblWartungsArbeiten.WartungsArbeit1, tblWartungsDaten.DatumAusgeführteArbeit FROM (tblAnlagenMaschinen INNER JOIN tblWartungsPlaene ON tblAnlagenMaschinen.InterneIDAnlage = tblWartungsPlaene.InterneIDAnlage) INNER JOIN (tblWartungsDaten INNER JOIN tblWartungsArbeiten ON tblWartungsDaten.IDWartungsArbeit = tblWartungsArbeiten.IDWartungsArbeit) ON tblWartungsPlaene.PlanNr = tblWartungsArbeiten.PlanNr"
For Each varElement In Me.LstAnlageWahl.ItemsSelected
strFilter = strFilter & "," & Me.LstAnlageWahl.ItemData(varElement)
Next
If Len(strFilter) > 0 Then
strSQL = strSQL & " tblAnlagenMaschinen.InterneIDAnlage IN (" & Mid(strFilter, 2) & ")"
Else
strSQL = strSQL & " Where False"
End If
Me.RecordSource = strSQL
CurrentDb.QueryDefs!qryWartungsPlan.SQL = strSQL
End Sub
Nun zeigt er mir jedoch folgenden Fehler an:
Syntaxfehler 3075: Fehlender Abfrageausdruck .....tblanlagen.Maschinen.InterneIDAnlage ID IN (11,13'.
Habt Ihr mir da noch einen Tip?
Besten Dank.
JOG
Im True-Zweig solltest Du auch das Schlüsselwort WHERE verwenden.
Me.RecordSource = strSQL
CurrentDb.QueryDefs!qryWartungsPlan.SQL = strSQL
Doppelte Verwendung der SQL-Anweisung oder Planlosigkeit?
MfGA
ebs
Hallo
Nun konnte ich mein "Problem" lösen und das Listenfeld mit Mehrfachauswahl für die Abfrage funktioniert nach einigem probieren und testen einwandfrei. Vielen Dank für Eure Tips und Hilfe.
JOG
Ich habe ein ähnliches Problem und habe mir gedacht ich nehme diesen Beitrag als Vorlage. Der Vorschlag von Franz (siehe unten) wollte ich einmal in ein SQL Suchstring von mir einbauen, um auch Mehrfachauswahlen aus einem Listenfeld zu ermöglichen.
"Private Sub lstAuswahlKunde_AfterUpdate()
Dim strFilter As String, varElement As Variant, strSQL as String
If Me!lstAuswahlKunde.ItemsSelected.Count = 0 Then
Beep
Exit Sub
End If
strFilter = ""
For Each varElement In Me!lstAuswahlKunde.ItemsSelected
strFilter = strFilter & " OR [TabellenFeld1] = " & Me!lstAuswahlKunde.ItemData(varElement)
Next
If Len(strSQL) > 0 Then
strSQL = "Select * from tblTabelle Where " & Mid( strFilter,5)
Else
strSQL = "Select * from tblTabelle Where False " ' Wenn die Abfrage bei fehlendem Kriterium keinen DS liefern soll
'strSQL = "Select * from tblTabelle" ' Wenn die Abfrage bei fehlendem Kriterium alle DS liefern soll
End If
'Currentdb.Querydefs!Abf_DeineAbfrage.SQL = strSQL ' wenn der SQL-String in einer Abfrage gespeichert werden soll.
End Sub"
Ich habe die Erweiterung mit der Mehrfachauswahl in meinem Code wie folgt eingebaut:
Private Sub Befehl40_Click()
Dim Krit As String, SQL As String, varElement As Variant
Krit = ""
If Not IsNull(Me!skupina1) Then
For Each varElement In Me!skupina1.ItemsSelected
Krit = Krit & " OR [ID_Skupina] = " & Me!skupina1.ItemData(varElement)
Next
End If
If Not IsNull(Me!status) Then Krit = Krit & " AND StatusKat LIKE '" & Me!status & "*'"
If Not IsNull(Me!aktiven_seznami) Then Krit = Krit & " AND Aktiv_Inaktiv = " & IIf(Me!aktiven_seznami, "True", "False")
SQL = "SELECT * FROM Skupine_ImenskiSeznam2 "
If Krit <> "" Then
Krit = Mid(Krit, 5)
SQL = SQL & "WHERE " & Krit
End If
DoCmd.OpenReport "Skupine_ImenskiSeznam", acPreview, , Krit
End Sub
Wenn ich dann in dem Listfeld "Skupina1" z.B. zwei Auswahlen treffe, scheint das Programm dies zu ignorieren, da es mir immer alle Datensätze auflistet. Als ob die Mehfachauswahlen nicht vorhanden wären. Da ich eher ein Anfänger bin, weiß ich nicht wo ich hier anfangen könnte den Fehler zu suchen. Ich verwende solche Suchabfragen sehr oft aber bis dato immer nur mit einer Einfachauswahl aus einem Kombifeld. Diese Erweiterung würde dem Ganzen viel mehr Flexibilität geben. Bin für jeden Hinweis sehr dankbar.
Ernst
Sorry, falscher Alarm. Habe jetzt meinen Anfängerfehler gefunden. Der Code müsste so beginnen:
Private Sub Befehl40_Click()
Dim Krit As String, SQL As String, varElement As Variant
Krit = ""
If Not Me!skupina1.ItemsSelected.Count = 0 Then
For Each varElement In Me!skupina1.ItemsSelected
Krit = Krit & " OR [ID_Skupina] = " & Me!skupina1.ItemData(varElement)
Next
End If
So klappt es super. Ich mag dieses Forum sehr, versuche wenn es geht "still zu sein" um nicht peinlich aufzufallen. Aber ich habe schon enorm viel gelernt hier. Danke.
Ernst
Habe mich zu früh gefreut. So richtig klappen tut es doch nicht. Wenn ich im Listfeld zwei Auswahlen treffe, scheint der Code die nachfolgenden Kriterien zu "ignorieren". Wird wahrscheinlich mit der Kombination "OR" im Listfeldkriterien und dem "AND" in den folgenden zwei Kriterien zusammenhängen. Bin mir nur nicht sicher, wie man das (falls überhaupt) lösen könnte. Sollte jemand eine Idee haben - wie gesagt bin ich für jeden Tipp dankbar.
Ernst
Hallo,
"or" und "And" verhalten sich in ihrer Gewichtung (d. h. bei der Notwendigkeit von Klammersetzung) wie Addition und Multiplikation.....
vermutlich:
Private Sub Befehl40_Click()
Dim Krit As String, Krit1 As String, varElement As Variant
Krit = ""
If Not IsNull(Me!skupina1) Then
For Each varElement In Me!skupina1.ItemsSelected
Krit = Krit & " OR [ID_Skupina] = " & Me!skupina1.ItemData(varElement)
Next
End If
Krit1= " StatusKat LIKE '" & Me!status & "*' AND Aktiv_Inaktiv = " & IIf(Me!aktiven_seznami, "True", "False")
If Krit <> "" Then
Krit = Mid(Krit, 5)
Krit1 = "(" & Krit & ") And " & Krit1
End If
DoCmd.OpenReport "Skupine_ImenskiSeznam", acPreview, , Krit1
End Sub
Hallo,
Auch dieses Thema wollte ich nochmal aufgreifen. Ich scheitere auch daran dass meine Auswahl die ich treffe nicht in die Abfrage übernommen wird. Das Auswahlfeld enthält 2 Spalten, an sich 3, wovon die erste die ID enthält aber versteckt ist. Wenn ich nichts anwähle kommt die MessageBox , aber wenn ich etwas auswähle schreibt er mir nichts in die angelegte Abfrage. Was fehlt hier noch im Code?
Danke
Private Sub Bericht_Click()
Dim strFilter As String, varElement As Variant, strSQL As String
If Me!ListeNomEtiquettes.ItemsSelected.Count = 0 Then
MsgBox "Bitte Auswahl treffen", vbInformation
Exit Sub
End If
strFilter = ""
For Each varElement In Me!ListeNomEtiquettes.ItemsSelected
strFilter = strFilter & " OR [ID] = " & Me.ListeNomEtiquettes.ItemData(varElement)
Next
If Len(strSQL) > 0 Then
strSQL = "Select * from tblUebersicht Where " & Mid(strFilter, 5)
Else
strSQL = "Select * from tblUebersicht Where False "
End If
CurrentDb.Querydefs!qry_etiquettes_case.SQL = strSQL
End Sub
Hallo,
muss so lauten:
.
.
If Len(strFlter) > 0 Then.
.