Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Benötige Hilfe um Mehrfachauswahl (Listenfeld) an Abfrage zu übergeben

Begonnen von joerg_w, Oktober 05, 2010, 18:47:13

⏪ vorheriges - nächstes ⏩

joerg_w

Hallo,

EDIT: Aktuelleren Stand in den Beiträgen weiter unten.

Problem: Auswahl in Listenfeld mit Mehrfachauswahl als Kriterium für Abfragen verwenden.


joerg_w

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)

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 ;)



joerg_w

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

database

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

joerg_w

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;

database

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

joerg_w

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]

joerg_w

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


joerg_w

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

database

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 ;)