Neuigkeiten:

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

Mobiles Hauptmenü

Abfragekriterium via Mehrfachauswahl Listenfeld

Begonnen von JOG, September 14, 2012, 22:56:09

⏪ vorheriges - nächstes ⏩

JOG

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

bahasu

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
Servus

JOG

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

DF6GL

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.

JOG

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

ebs17

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

Eberhard

JOG

#6
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

ebs17

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

Eberhard

JOG

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

EBlajs

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

EBlajs

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

EBlajs

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

DF6GL

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


wuffwuff2003

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