Situation:
-Formular mit Listenfeld mit Mehrfachauswahl
-an dieses Listenfeld ist ein Textfeld in einer Tabelle
gebunden.
Die Datenübergabe an das Feld in der Tabelle funktioniert
nur, wenn ich bei Mehrfachauswahl "Keine" eintrage. Wie
kann ich bei Mehrfachauswahl "Einzeln oder "Erweitert" die
Einträge an das Feld in der Tabelle übergeben? (Z. B.
hintereinander, mit Kommas getrennt: "Eintrag1, Eintrag3,
Eintrag7")
Vielen Dank
Michael Meister
Vielen Dank
Michael Meister
</Zitat>
Du mußt alle selektierten Werte durchlaufen:
For Each varelement In Listenfeld.ItemsSelected
'hier kannst Du was Schlaues machen, z.B.
String = varelement & ", "
Next varelement
string = left(string,len(string)-1) ' letztes Komma raus
Gruß
Christa
--
Access-FAQ: http://www.donkarl.com
KnowHow.mdb: http://www.freeaccess.de
SQL-Server-FAQ: http://www.berndjungbluth.de/sqlfaq/sqlfaq.htm
Newbie-Info: http://www.doerbandt.de/Access/Newbie.htm
>Du mußt alle selektierten Werte durchlaufen:
>
>For Each varelement In Listenfeld.ItemsSelected
>'hier kannst Du was Schlaues machen, z.B.
>String = varelement & ", "
>Next varelement
>string = left(string,len(string)-1) ' letztes Komma raus
>
Mit VBA hab ich leider kaum was am Hut. Ich habe mal
versucht deinen Codeschnipsel in das Beispiel aus der
Hilfe einzupassen (sh. am Ende). Diese Prozedur wird
ausgeführt, wenn das Listenfeld den Fokus verliert. Leider
funktioniert das nicht, die Zellen in der Tabelle bleiben
beharrlich leer...
Hat noch jemand einen Vorschlag?
Danke schon mal im Voraus
Michael
Private Sub Namen_LostFocus()
Dim frm As Form, ctl As Control
Dim varElement As Variant
Dim wert As String
Set frm = Forms!Formular2
Set ctl = frm!Namen
For Each varElement In ctl.ItemsSelected
wert = varElement & ", "
Debug.Print ctl.ItemData(varElement)
Next varElement
wert = Left(wert, Len(wert) - 1) ' letztes Komma raus
End Sub
>Du mußt alle selektierten Werte durchlaufen:
>
>For Each varelement In Listenfeld.ItemsSelected
>'hier kannst Du was Schlaues machen, z.B.
>String = varelement & ", "
>Next varelement
>string = left(string,len(string)-1) ' letztes Komma raus
>
Mit VBA hab ich leider kaum was am Hut. Ich habe mal
versucht deinen Codeschnipsel in das Beispiel aus der
Hilfe einzupassen (sh. am Ende). Diese Prozedur wird
ausgeführt, wenn das Listenfeld den Fokus verliert. Leider
funktioniert das nicht, die Zellen in der Tabelle bleiben
beharrlich leer...
Hat noch jemand einen Vorschlag?
Danke schon mal im Voraus
Michael
</Zitat>
Kommentare im Code.
>Private Sub Namen_LostFocus()
> Dim frm As Form, ctl As Control
> Dim varElement As Variant
> Dim wert As String
>
> Set frm = Forms!Formular2
deklarieren und Zuweisen des Forms kannst Du sparen, wenn Du im
Formular selber bist.
> Set ctl = frm!Namen
set ctl = me!namen
> For Each varElement In ctl.ItemsSelected
> wert = varElement & ", "
> Debug.Print ctl.ItemData(varElement)
> Next varElement
> wert = Left(wert, Len(wert) - 1) ' letztes Komma raus
>
'hier muß dem Tabellenfeld der Inhalt der Variablen Wert zugewiesen
werden
'1.Variante: Feld ist in der Datenherkunft des Forms enthalten
me!FeldinTabelle = wert
'2. Variante: Feld ist nicht in der Datenherkunft enthalten (Code
ungetestet)
Dim rs as dao.recordset
set rs = currentdb.openrecordset ("select * from DeineTabelle where
...") 'richtigen DS suchen
with rs
.movefirst
.edit
!DeinFeld = wert
.update
.close
set rs = nothing
>End Sub
dein Code hat fast funktioniert, man musste nur noch den
alten Wert mit dem neuen verknüpfen (sh. Code am Ende).
Ein entscheidendes Problem habe ich dabei aber noch: In
der aktuellen Variante ist im Formular immer die letzte
getroffene Auswahl bei jedem Datensatz markiert und nicht
die in der Tabelle gespeicherte.
Wie bringt man dem Listenfeld nun bei, dass es für jeden
Datensatz die Daten aus der Tabelle holt und erst bei
Änderungen diese an die Tabelle zurückgibt?
Set ctl = Me!Namen
For Each varElement In ctl.ItemsSelected
wert = wert & "," & varElement 'alt plus neu
Debug.Print ctl.ItemData(varElement)
Next varElement
wert = Right(wert, Len(wert) - 1) ' erstes Komma raus
dein Code hat fast funktioniert, man musste nur noch den
alten Wert mit dem neuen verknüpfen (sh. Code am Ende).
Ein entscheidendes Problem habe ich dabei aber noch: In
der aktuellen Variante ist im Formular immer die letzte
getroffene Auswahl bei jedem Datensatz markiert und nicht
die in der Tabelle gespeicherte.
Wie bringt man dem Listenfeld nun bei, dass es für jeden
Datensatz die Daten aus der Tabelle holt und erst bei
Änderungen diese an die Tabelle zurückgibt?
</Zitat>
Sind die Einträge füe alle Datensätze gleich und Du willst nur die
Auswahl aufheben? Dann:
Im Ereignis "Beim Anzeigen" des Formulars eintragen:
Me!DeinListenfeld.requery
Holt die Datenherkunft neu und hebt damit die Auswahl auf.
Mach den Code in des Ereignis "Nach Aktualisierung". Dann passiert
die Änderung nur, wenn tatsächlich was ausgewählt wurde. Die
Änderungen werden erst bei Datensatzwechsel in die Tabelle
geschrieben.
das mit dem Aktualisieren funktioniert so nicht:
>-----Originalnachricht-----
>Sind die Einträge füe alle Datensätze gleich und Du
willst nur die
>Auswahl aufheben? Dann:
>Im Ereignis "Beim Anzeigen" des Formulars eintragen:
>Me!DeinListenfeld.requery
>Holt die Datenherkunft neu und hebt damit die Auswahl auf.
Nein; ich habe beim nächsten Datensatz immer die Auswahl
vom vorherigen. Ändere ich die Auswahl, werden die
Einträge in der Tabelle zwar gespeichert, aber nur die
jeweilige Nummer des Eintrags, nicht der Text des Eintrags.
So sieht der Eintrag in der Tabelle aus:
NamenTab ID
0 1
0,1 2
1,5 3
1,4 4
1,3,4 5
1,3,4,5 6
1,2,3,4,5 7
0,1,2,3,4,5 8
Kann es sein, dass er die Werte im Formular mit den Werten
im Listenfeld deshalb nicht aktualisieren kann, weil er
Zahlen speichert (s.o.), das Listenfeld aber nur Text
will??
>Mach den Code in des Ereignis "Nach Aktualisierung". Dann
passiert
>die Änderung nur, wenn tatsächlich was ausgewählt wurde.
Die
>Änderungen werden erst bei Datensatzwechsel in die Tabelle
>geschrieben.
Wenigstens das funktioniert.
Danke und Gruß
Michael
Zur Info mein Code:
Private Sub Form_AfterUpdate()
Me!Namen.Requery
End Sub
Private Sub Namen_AfterUpdate()
Dim ctl As Control
Dim varElement As Variant
Dim wert As Variant
Set ctl = Me!Namen
For Each varElement In ctl.ItemsSelected
wert = wert & "," & varElement 'alt plus neu
Debug.Print ctl.ItemData(varElement)
Next varElement
wert = Right(wert, Len(wert) - 1) ' erstes Komma raus
Me!NamenTab = wert
End Sub
"Michael Meister" <michael...@bahn.de> schrieb im Newsbeitrag
news:17adf01c22e50$5fe771a0$36ef2ecf@tkmsftngxa12...
Liebe Christa,
</Zitat>
hast Du ev. mehrere Spalten in Deinem Listenfeld? Dann kannst Du mit
Column(n) darauf zugreifen.
Beispiel:
In Deinem Listenfeld hast Du folgende Einträge:
1 Eintrag1
2 Eintrag2
3 Eintrag3
Ohne Angabe der Spalte nimmt er 1,2,3. Um die Werte aus der 2.
Spalte zu erhalten, mußt Du:
wert = wert & "," & varElement.column(1) 'alt plus neu
nehmen (die numerierung fängt bei 0 an - 0=1.Spalte, 1=2.Spalte).
Zum requery: Du hast es im AfterUpdate des Forms gemacht, ich meinte
bei OnCurrent.
Ansonsten mußt Du mal ein bißchen experimentieren.