Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: jagger am August 30, 2017, 15:30:51

Titel: Listenfeld mit Mehrfachauswahl ersten Wert von allen Markierten ermitteln
Beitrag von: jagger am August 30, 2017, 15:30:51
Hallo,
wie kann man bei einem Listenfeld mit Mehrfachauswahl (einzeln) den ersten Wert (oder den letzten), der markierten Daten auslesen?


Private Sub btnFilialenVerkn_02_Click()
Dim strFilter As String, varElement As Variant
Dim strFilterSET As String
Dim stDocName As String
Const cstrField = "AGKDNR"
Dim intRow As Integer

If Forms!mnu_Kunden!lbxFilialenVerkn.ItemsSelected.count = 0 Then
For intRow = 0 To Forms!mnu_Kunden!lbxFilialenVerkn.ListCount - 1
       Forms!mnu_Kunden!lbxFilialenVerkn.Selected(intRow) = True
Next intRow
End If

strFilterSET = 7676767 'hier soll der erste Wert von AGKDNR (cstrField) rein

strFilter = ""
For Each varElement In Forms!mnu_Kunden!lbxFilialenVerkn.ItemsSelected
If strFilter <> "" Then ' " or " Anhaengen
strFilter = strFilter + " or "
End If
strFilter = strFilter & "[" & cstrField & "] = '" & _
Forms!mnu_Kunden!lbxFilialenVerkn.ItemData(varElement) & "'"

Next

    strFilter = "Update tab_ex_Kunden " & "set [LFKDNR]= " & [strFilterSET] & " where " & strFilter
   
    Forms!mnu_Kunden!Infofeld.Caption = strFilter  'wird nur zu Testzwecken benutzt
    CurrentDb.Execute strFilter, dbFailOnError

End Sub


Den ermittelten Wert will ich meiner Variablen "strFilterSET" zuordnen,
also als "Ersatz" für "7676767".

Hat jemand eine Idee, kann mir hier bitte jemand weiterhelfen?
Kann man vielleicht die Schleife nach einem Durchlauf (nach dem ersten Wert) anhalten? Aber wie? Ich finde einfach keine Lösung, die funzt.

Mit besten Dank im Voraus
jagger

Acc 2016, W10

Titel: Re: Listenfeld mit Mehrfachauswahl ersten Wert von allen Markierten ermitteln
Beitrag von: Lachtaube am August 30, 2017, 17:16:50
In ItemsSelected.Count, steht die Anzahl der ausgewählten Zeilen und in ItemsSelected.Item(Index) wird die Zeile des Listenfelds festgehalten, die an der Position vermerkt ist. Item ist die Standard-Eigenschaft von ItemsSelected und darf deshalb beim Adressieren ausgelassen werden. Auf dein Listenfeld bezogen, könntest Du so den ersten und letzten gewählten Eintrag ermitteln:   Dim selIdx As Long

   'mit dem Listenfeld: lbxFilialenVerkn
   With Me.lbxFilialenVerkn
   
      'wenn etwas ausgewählt wurde, ist Count größer 0
      If .ItemsSelected.Count > 0 Then
           
         'die Zählung von ItemsSelected.Count beginnt bei 0
         'die von ListIndex des Listenfelds auch
         
         '1. gewählter ListIndex
         selIdx = .ItemsSelected(0)
         
         'korrespondiernder ListIndex
         MsgBox "Zeile im Listenfeld: " & selIdx
         
         'Zeilenwert aus gebundener Spalte
         MsgBox "Erster: " & .ItemData(selIdx)
         
         'letzter gewählter ListIndex
         selIdx = .ItemsSelected(.ItemsSelected.Count - 1)
         
         'korrespondiernder  ListIndex
         MsgBox "Zeile im Listenfeld: " & selIdx
         
         'Zeilenwert aus gebundener Spalte
         MsgBox "Letzter: " & .ItemData(selIdx)
         
      End If
     
   End With
Titel: Re: Listenfeld mit Mehrfachauswahl ersten Wert von allen Markierten ermitteln
Beitrag von: jagger am August 30, 2017, 17:54:47
Hey Lachtaube,

das sieht super aus. Kann ich gut einbauen.
Da wäre ich bestimmt auch selber drauf gekommen.
...so in 5 bis 6 Monaten oder Jahren!. :o

Nachmals vielen Dank!
LG
jagger
Titel: Re: Listenfeld mit Mehrfachauswahl ersten Wert von allen Markierten ermitteln
Beitrag von: Beaker s.a. am August 30, 2017, 18:22:55
Mit intensivem Studium der Online-Hilfe (Steuerelement-Typ -> Eigenschaften und Methoden) kann sich diese Zeit auch drastisch verkürzen  ;)
Titel: Re: Listenfeld mit Mehrfachauswahl ersten Wert von allen Markierten ermitteln
Beitrag von: jagger am August 30, 2017, 18:42:27
@Beaker s.a.,
Du hast ja recht.
Ich habe den großen Gockel befragt und bin sicherlich auch öfter mal in der Online-Hilfe gelandet. Aber: Wald, Bäume... :-[

Zum Glück gibt es ja dieses Forum!
Vielleicht haben ja auch andere noch dieses Problem und finden jetzt hier im Forum die Lösung. So kann ja auch mal ein neues Mitglied hängen bleiben. ;-)

LG
jagger
Titel: Re: Listenfeld mit Mehrfachauswahl ersten Wert von allen Markierten ermitteln
Beitrag von: jagger am August 30, 2017, 19:25:07
@Lachtaube,

eine beliebige Spalte (vom ersten oder letzten Wert) kann man so aber nicht ausgeben, oder?

LG
jagger
Titel: Re: Listenfeld mit Mehrfachauswahl ersten Wert von allen Markierten ermitteln
Beitrag von: DF6GL am August 30, 2017, 21:14:43
Hallo,


eine bestimmte Spalte  kann so "ausgegeben" werden:

dim x
x= Me!lbxFilialenVerkn.Column (2,selIdx)   '  dritte(!) Spalte des Listenfeldes..  <edit>
Titel: Re: Listenfeld mit Mehrfachauswahl ersten Wert von allen Markierten ermitteln
Beitrag von: jagger am August 31, 2017, 16:09:30
Hallo DF6GL,

irgendwie klappt das so nicht.
Je nachdem welche Zeilen ausgewählt wurden, bringt er immer andere Werte.
Mal aus der ersten Spalte, mal aus der 4. oder 5. Manchmal auch Werte aus einer Zeile, die gar nicht aus gewählt wurde. Ich kann allerdings kein Schema erkennen.
Kann es sein, dass das bei Mehrfachauswahl nicht funktioniert?
:-[


Dim strFilter As String, varElement As Variant
Dim strFilterSET As String
Dim KDSET As String
Dim stDocName As String
Const cstrField = "AGKDNR"
Dim intRow As Integer
Dim selIdx As Long

With Me.lbxFilialenVerkn 'mit dem Listenfeld: lbxFilialenVerk
  If .ItemsSelected.count > 0 Then 'wenn etwas ausgewählt wurde, ist Count größer 0
         'die Zählung von ItemsSelected.Count beginnt bei 0
         'die von ListIndex des Listenfelds auch
     
         '1. gewählter ListIndex
         selIdx = .ItemsSelected(0)
         
         'korrespondiernder ListIndex
         Rem MsgBox "Zeile im Listenfeld: " & selIdx
         
         'Zeilenwert aus gebundener Spalte
         Rem MsgBox "Erster: " & .ItemData(selIdx)
         
strFilterSET = .ItemData(selIdx)

   KDSET = Me!lbxFilialenVerkn.Column(selIdx, 2)
   MsgBox "Wert ist " & KDSET
   End If
     
End With


LG
jagger
Titel: Re: Listenfeld mit Mehrfachauswahl ersten Wert von allen Markierten ermitteln
Beitrag von: Lachtaube am August 31, 2017, 16:25:37
Die Spaltenposition - 1 muss das erste Argument sein, danach folgt die Zeile (selIdx). In Excel ist es genau umgekehrt - gut zu merken :) .
Titel: Re: Listenfeld mit Mehrfachauswahl ersten Wert von allen Markierten ermitteln
Beitrag von: Beaker s.a. am August 31, 2017, 16:45:44
Hallo Jo,
Wenn ich nichts übersehen habe, dürfte dein Code kein unerwartetes
Ergebnis liefern, sondern immer den Wert, der im ersten, ausgewählten
Eintrag in der dritten Spalte steht.
Wenn du aus mehreren Einträgen einen Filter zusammensetzen willst,
musst du eine Schleife über die Auflistung .ItemsSelected laufen lassen
und den Filter Stück für Stück zusammensetzen, - Prinzip
strFilterSET = strFilterSET & neuer Teil
Frage dich doch mal, wozu die übrigen Variablen deklariert werden, die
du gar nicht verwendest.
gruss ekkehard
Titel: Re: Listenfeld mit Mehrfachauswahl ersten Wert von allen Markierten ermitteln
Beitrag von: jagger am August 31, 2017, 19:33:40
@Lachtaube,
das ist die Lösung! Es ist bei Access genau anders herum.
So funktioniert er super:

 
If .ItemsSelected.count > 0 Then
         selIdx = .ItemsSelected(0)       
strFilterSET = .ItemData(selIdx)
KDSET = Me!lbxFilialenVerkn.Column(2, selIdx)
MsgBox "Wert ist " & KDSET
End If
End With


Vielen Dank an alle Tippgeber!
LG
jagger
Titel: Re: Listenfeld mit Mehrfachauswahl ersten Wert von allen Markierten ermitteln
Beitrag von: Beaker s.a. am September 01, 2017, 14:23:46
Zitatdas ist die Lösung
die schon in #6 von Franz geposted wurde
Titel: Re: Listenfeld mit Mehrfachauswahl ersten Wert von allen Markierten ermitteln
Beitrag von: jagger am Oktober 28, 2017, 14:15:35
Stimmt, nach der Änderung vom 01.09. ;)
Titel: Re: Listenfeld mit Mehrfachauswahl ersten Wert von allen Markierten ermitteln
Beitrag von: Beaker s.a. am Oktober 28, 2017, 15:58:10
Stellt sich jedoch die Frage, warum du ein Listfeld mit Mehrfachauswahl
brauchst, wenn du dann nur eine Zeile für einen Filterausdruck verwendest.
Mit einer Einfachauswahl kannst du doch auf das ganze Item-Gewurschtel
verzichten
strFilterSET = .Value
KDSET = .Column(2)

gruss ekkehard
Titel: Re: Listenfeld mit Mehrfachauswahl ersten Wert von allen Markierten ermitteln
Beitrag von: jagger am Oktober 28, 2017, 16:49:46
Hallo Ekkehard,

es geht darum, Kundendaten (z.B. Kressner), die mehrere Filialen haben, zu verknüpfen.
Man gibt den Suchbegriff ein, im Listenfeld werden die Suchergebnisse angezeigt.
Dann markiert man im Listenfeld die Filialen, die zu dem Kunden gehören und klickt auf den Button "verknüpfen". Jetzt haben alle Datensätze die gleiche "AGFLNR" (so heisst das Feld). Über dieses Feld (läuft nur im Hintergrund mit) sind nun alle Standorte (Filialen) verknüpft. Jetzt kann man von jedem Datensatz des Kunden (pro Standort ein Datensatz) sich alle Filialen von diesem Kunden anzeigen lassen.
Das funktioniert super!

LG
jagger
Titel: Re: Listenfeld mit Mehrfachauswahl ersten Wert von allen Markierten ermitteln
Beitrag von: ebs17 am Oktober 29, 2017, 12:55:58
Zitatwie kann man bei einem Listenfeld mit Mehrfachauswahl (einzeln) den ersten Wert (oder den letzten), der markierten Daten auslesen?
Es ist ein Zeichen von "Konsequenz", bei einer Mehrfachauswahl nur genau eine benötigte ID auszulesen. Immerhin benötigt man bei Mehrfachauswahl zwingend eine Auswertung per VBA, während man bei Einfachauswahl schlicht den Rückgabewert des Listenfeldes nutzen könnte.