Hallo,
EDIT: Aktuelleren Stand in den Beiträgen weiter unten.
Problem: Auswahl in Listenfeld mit Mehrfachauswahl als Kriterium für Abfragen verwenden.
Hallo,
na denn...
z. B. hier:
http://www.access-o-mania.de/forum/index.php?topic=13129.msg73506#msg73506
Hallo,
schonmal Danke für den Link. Ich habe allerdings Schwierigkeiten damit ihn auf mein
Problem zu übertragen. Ich bin noch nicht fit genug im "Programmierkram", um zu sehen, wo ich ansetzen muss.
Ich versuche noch einmal zusammenzufassen, wo ich gerade stehe. Ich will die Mehrfachauswahl in einem Listenfeld als Kriterium in einer Abfrage verwenden. Um das hinzubekommen, muss man anscheinend eine FOR-EACH-Schleife programmieren. QUELLE(http://www.kurt-aus-kienitz.de/knowhow/access/Beispiele/Formulare/KombiUndListen/ListKombiFelder.html#LbMehrfachauswahl2 (http://www.kurt-aus-kienitz.de/knowhow/access/Beispiele/Formulare/KombiUndListen/ListKombiFelder.html#LbMehrfachauswahl2))
Das bekomme ich allerdings nicht alleine hin. Das nächste Problem wäre dann die Abfrage dazu zu bringen die mit der FOR_EACH-Schleife ermittelten Werte als Kriterium zu verwenden.
Mein Vorgehen:
Ich habe heute nochmal ein neues Formular angelegt, dass das Listenfeld L_Personen enthält, welches auf die Tabelle T_Personen zugreift.
Außerdem enthält das Formular einen Schalter, der beim Klicken zwei Dinge tut:
1. Ereignisprozedur auslösen. Im Moment steht da drin:
Option Compare Database
Private Sub Befehl2_Click()
End Sub
Private Sub Befehl3_Click()
On Error GoTo Err_Befehl3_Click
Dim stDocName As String
stDocName = "A_Auswertung_gesamt"
DoCmd.OpenQuery stDocName, acNormal, acEdit
Exit_Befehl3_Click:
Exit Sub
Err_Befehl3_Click:
MsgBox Err.Description
Resume Exit_Befehl3_Click
End Sub
Einen Artikel zum Thema habe ich hier gefunden - weiß allerdings nicht, wie ich das an meine Situation anpasse:
http://www.akademie.de/office-programme/office-microsoft-access-lernen/kurse/ms-access-und-vba-lernen-kurs/das-objektmodell-von-access/listenfelder.html
2. Abfrage A_Auswertung_gesamt starten (durch Befehl 3 der Ereignisprozedur). Gegenwärtig steht noch kein Kriterium drin. Soll die im Listenfeld gewählten und in der Ereignisprozedur ausgelesenen Werte als Kriterium für Personen verwenden.
Danke
Jörg
PS: Das Starten der Abfrage habe ich nicht selbst programmiert. Ich habe mir einfach einen Schalter mit der entsprechenden Funktion erstellt. Dass ich mittlerweile finde WO der VBL-Kram steht, war der Durchbruch des Tages ;)
Ich habe in einem Thread eine Schleife gefunden, die tun soll, was ich tun will und habe sie in meine Ereignisprozedur eingebastelt. Sie läuft fehlerfrei durch, abe rich habe keine Ahnung, ob sie tut, was sie soll, weil ich nicht weiß, wie ich mir die ausgelesenen Werte anzeigen lassen oder diese als Kriterium an meine Abfrage weitergeben kann.
Ich poste hier den aktuellen Stand meiner Ereignisprpzedur und editiere diese immer, wnen ich weitergekommen bin.
Stand veraltet // Diskussion weiter unten
Option Compare Database
Private Sub Befehl2_Click()
Dim sAuswahl As String
Dim itm As Variant
For Each itm In Me!L_Personen.ItemsSelected
sAuswahl = sAuswahl & "," & Me!L_Personen.ItemData(itm)
Debug.Print Me!L_Personen.ItemData(itm)
Next itm
'Für die Ausgabe ALLER selektierter Werte
Debug.Print sAuswahl
If Len(sAuswahl) > 0 Then sAuswahl = Mid(sAuswahl, 2)
End Sub
Private Sub Befehl3_Click()
On Error GoTo Err_Befehl3_Click
Dim stDocName As String
stDocName = "A_Auswertung_gesamt"
DoCmd.OpenQuery stDocName, acNormal, acEdit
Exit_Befehl3_Click:
Exit Sub
Err_Befehl3_Click:
MsgBox Err.Description
Resume Exit_Befehl3_Click
End Sub
Private Sub L_Personen_Click()
End Sub
Hallo,
nehme an, dass es sich dabei um die selektierten Werte handelt die dich interessieren - dann in etwa so:
Private Sub Befehl2_Click()
Dim sAuswahl As String
Dim itm As Variant
For Each itm In Me!L_Personen.ItemsSelected
sAuswahl = sAuswahl & "," & Me!L_Personen.ItemData(itm)
Debug.Print Me!L_Personen.ItemData(itm)
Next itm
'Für die Ausgabe ALLER selektierter Werte
Debug.Print sAuswahl
If Len(sAuswahl) > 0 Then sAuswahl = Mid(sAuswahl, 2)
End Sub
Damit du die Ausgaben siehst musst du das Direktfenster anzeigen lassen.
Für die 2. Frage ...
kannst du mal den SQL-Code der Abfrage 'A_Auswertung_gesamt' hier posten?
Grüße
Hallo,
Danke für die Antwort!
Im Moment sieht es so aus:
Option Compare Database
Private Sub Befehl2_Click()
Dim sAuswahl As String
Dim itm As Variant
For Each itm In Me!L_Personen.ItemsSelected
sAuswahl = sAuswahl & "," & Me!L_Personen.ItemData(itm)
Debug.Print Me!L_Personen.ItemData(itm)
Next itm
'Für die Ausgabe ALLER selektierter Werte
Debug.Print sAuswahl
If Len(sAuswahl) > 0 Then sAuswahl = Mid(sAuswahl, 2)
End Sub
Private Sub Befehl3_Click()
On Error GoTo Err_Befehl3_Click
Dim stDocName As String
stDocName = "A_Auswertung_gesamt"
DoCmd.OpenQuery stDocName, acNormal, acEdit
Exit_Befehl3_Click:
Exit Sub
Err_Befehl3_Click:
MsgBox Err.Description
Resume Exit_Befehl3_Click
End Sub
Private Sub L_Personen_Click()
End Sub
Im Direktfenster (Str+G) wird allerdings noch gar nichts angezeigt, wenn ich das Ding laufen lasse/den Schalter drücke.
Ich fange an so langsam(!) ein Gefühl dafür zu bekommen, was ich überhaupt mache (meine C64 Zeit kommt zurück...das ist lange her).
Mit Dim definiere ich anscheinend Variablen. String = Text; Variant = keine Ahnung ;)
Wenn ich richtig interpretiere ist das Ziel des ganzen für jede Auswahl in L_Personen einen Wert in sAuswahl zu schreiben
und die Werte mit Komma voneinander abzutrennen. Also müsste die Ausgabe später einmal sein:
sAuswahl= Person1, Person 2, ...
SQL der Abfrage : SELECT A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr, A_Auswertung_j.Beschreibung, T_Leistungsstunden.Person, T_Leistungsstunden.Stunden, T_Leistungsstunden.Datum
FROM T_Leistungsstunden INNER JOIN A_Auswertung_j ON T_Leistungsstunden.VorgangsNr = A_Auswertung_j.VorgangsNr
ORDER BY A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr;
Hi,
also wenn eine Auswahl stattgefunden hat, sollte da schon was angezeigt werden!
Versuch mal so:
Private Sub Befehl2_Click()
Dim sAuswahl As String
Dim strSQL as String
Dim itm As Variant
For Each itm In Me!L_Personen.ItemsSelected
itm = Me!L_Personen.ItemData(itm)
Debug.Print itm
sAuswahl = sAuswahl & itm & ","
Debug.Print "gesamt: " & sAuswahl
Next itm
If Len(sAuswahl) > 0 Then
'Letztes Komma wieder abziehen
sAuswahl = Left(sAuswahl, Len(sAuswahl) - 1)
End If
'Ändern der SQL für die Abfrage
strSQL = "SELECT A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr, A_Auswertung_j.Beschreibung, T_Leistungsstunden.Person, " & _
"T_Leistungsstunden.Stunden, T_Leistungsstunden.Datum " & _
"FROM T_Leistungsstunden INNER JOIN A_Auswertung_j ON T_Leistungsstunden.VorgangsNr = A_Auswertung_j.VorgangsNr " & _
"WHERE T_Leistungsstunden.Person IN(" & sAuswahl & ") ORDER BY A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr;"
Currentdb.Querydefs!A_Auswertung_gesamt.SQL = strSQL
End Sub
Alternativ zu den Debug.Print Befehlen kannst du auch auf die Sub einen Haltepunkt setzen,
den Code dann schrittweise durchlaufen (F8) und kontrollieren was die Variablen enthalten (mit der Maus über die Variable fahren)
HTH
Peter
Hallo,
wenn ich den Schalter STR+G drücke, öffnet sich das VBA-Fenster mit dem Direktfenster unten. Drücke ich dann auf den Schalter, öffnet sich die Abfrage. Im Direktfenster wird nichts angezeigt, meine Auswahl in der Liste hat keinen Effekt auf die Abfrage (grrr ;) ).
Ich häng mal den Code als Datei an. Hier nochmal zum Anschauen:
Option Compare Database
Private Sub Befehl2_Click()
Dim sAuswahl As String
Dim strSQL As String
Dim itm As Variant
For Each itm In Me!L_Personen.ItemsSelected
itm = Me!L_Personen.ItemData(itm)
Debug.Print itm
sAuswahl = sAuswahl & itm & ","
Debug.Print "gesamt: " & sAuswahl
Next itm
If Len(sAuswahl) > 0 Then
'Letztes Komma wieder abziehen
sAuswahl = Left(sAuswahl, Len(sAuswahl) - 1)
End If
'Ändern der SQL für die Abfrage
strSQL = "SELECT A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr, A_Auswertung_j.Beschreibung, T_Leistungsstunden.Person, " & _
"T_Leistungsstunden.Stunden, T_Leistungsstunden.Datum " & _
"FROM T_Leistungsstunden INNER JOIN A_Auswertung_j ON T_Leistungsstunden.VorgangsNr = A_Auswertung_j.VorgangsNr " & _
"WHERE T_Leistungsstunden.Person IN(" & sAuswahl & ") ORDER BY A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr;"
CurrentDb.Querydefs!A_Auswertung_gesamt.SQL = strSQL
End Sub
Private Sub Befehl3_Click()
On Error GoTo Err_Befehl3_Click
Dim stDocName As String
stDocName = "A_Auswertung_gesamt"
DoCmd.OpenQuery stDocName, acNormal, acEdit
Exit_Befehl3_Click:
Exit Sub
Err_Befehl3_Click:
MsgBox Err.Description
Resume Exit_Befehl3_Click
End Sub
Private Sub L_Personen_Click()
End Sub
Gruß
Jörg
[Anhang gelöscht durch Administrator]
Ich habe gerade das Formular nochmal neu angelegt und das Listenfeld nicht unbenannt, sondern einfach auf Liste0 (und Deinen code entsprechend angepasst) gelassen.
Damit bin ich einen Stück weitergekommen:
- Zuerst habe ich Deinen Code eingefügt. Mit Str+G konnte ich dann immer die Namen sehen, die ich ausgewählt habe. Das letzte Komme war allerdings nicht weg.
- Dann habe ich den Code zum Öffnen der Abfrage eingefügt. Diese öffnete sich auch - allerdings öffnete sich auch ein Fenster, dass mich bat einen Parameterwrt einzugeben - und zwar für die Namen, die ich ausgewählt habe.
Ich bastel nochmal neu & schau als mal hier rein.
Und hier der aktuelle Code:
Option Compare Database
Private Sub Befehl2_Click()
Dim sAuswahl As String
Dim strSQL As String
Dim itm As Variant
For Each itm In Me!Liste0.ItemsSelected
itm = Me!Liste0.ItemData(itm)
Debug.Print itm
sAuswahl = sAuswahl & itm & ","
Debug.Print "gesamt: " & sAuswahl
Next itm
If Len(sAuswahl) > 0 Then
'Letztes Komma wieder abziehen
sAuswahl = Left(sAuswahl, Len(sAuswahl) - 1)
End If
'Ändern der SQL für die Abfrage
strSQL = "SELECT A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr, A_Auswertung_j.Beschreibung, T_Leistungsstunden.Person, " & _
"T_Leistungsstunden.Stunden, T_Leistungsstunden.Datum " & _
"FROM T_Leistungsstunden INNER JOIN A_Auswertung_j ON T_Leistungsstunden.VorgangsNr = A_Auswertung_j.VorgangsNr " & _
"WHERE T_Leistungsstunden.Person IN(" & sAuswahl & ") ORDER BY A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr;"
CurrentDb.Querydefs!A_Auswertung_gesamt.SQL = strSQL
'Öffnen der Abfrage
Dim stDocName As String
stDocName = "A_Auswertung_gesamt"
DoCmd.OpenQuery stDocName, acNormal, acEdit
End Sub
Jörg
Ich setze diesen Thread auf gelöst. Das Hauptproblem war das Auslesen des Listenfeldes. Das ist gelöst.
Das jetzt noch bleibende Problem ist die ausgelesenen Werte korrekt an die Abfrage zu übergeben. Dafür eröffne ich http://www.access-o-mania.de/forum/index.php?topic=13179.0 (http://www.access-o-mania.de/forum/index.php?topic=13179.0)
einen neuen Thread.
Gegenwärtig schreibt der Code das hier in die Abfragekriterien:
In ([Clemens];[Holger])
Dann verlangt er eine Eingabe (hier für Clemens und Holger --> Diese habe ich in der Liste ausgewählt).
Gruß & Tausend Dank...es geht voran
Jörg
Hallo Jörg,
ZitatIch setze diesen Thread auf gelöst
... was du dann auch machen solltest - in deinem ERSTEN Beitrag das 'gelöst' Icon anklicken - dann erscheint auch das grüne Häkchen ;)