Neuigkeiten:

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

Mobiles Hauptmenü

m:n Beziehung - Listenfeld Mehrfachauswahl- Daten hinzufügen und löschen

Begonnen von Katyte, April 28, 2015, 10:19:45

⏪ vorheriges - nächstes ⏩

Katyte

Hallo Zusammen,
ich bin immer noch am Anfang beim Arbeiten mit Access.
Habe folgende Situation:
Ich habe eine n:m-Beziehung (RegID:CCompID) mit einer Zwischentabelle dargestellt. Weiterhin habe ich ein Formular erstellt mit einem Mehrfachauswahl-Listenfeld, auf dieser Weiße lasse ich dem User der RegID mehrere CCompID zuzuweisen und in der Tabelle tblKonsolidierung abzuspeichern. Zum Beispiel steht dort dann drin:
R1 / C1
R1 / C5
R1 / C8
R2 / C1
R2 / C7
R2 / C15
R3 / C5
usw.

Das Speichern funktioniert und auch die vorhandenen Einträge in der Tabelle werden bei dem jeweiligen Datensatz schwarz markiert beim erneuten Öffnen.
Folgendes Problem habe ich:
Wie kann ich die Zeile in der Tabelle löschen, wenn ich eine Auswahl im Listenfeld per Mausklick wieder aufhebe/abwähle.
Mein bisheriger VBA-Code lautet:

Private Sub lstCorpoComp_AfterUpdate()
Dim db As DAO.Database
Dim i As Integer
Dim intCount As Integer
Dim intIndex As Integer
Dim intCComID As Long
Dim insert As String
Set db = CurrentDb
intCount = Me!lstCorpoComp.ItemsSelected.Count
For i = 0 To intCount - 1
intIndex = Me!lstCorpoComp.ItemsSelected.Item(i)
lngCComID = Me!lstCorpoComp.ItemData(intIndex)
insert = "INSERT INTO tblKonsolidierung(RegID, CComID) VALUES(" & Me!RegID & ", " & lngCComID & ")"
db.Execute insert, dbFailOnError
Next i
Set db = Nothing
End Sub

Mit diesem VBA-Code lasse ich mir die bereits eingetragenen Inhalte anzeigen:

Private Sub Form_Current()
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim i As Integer
Dim lngCComID As Long
If Not IsNull(Me!RegID) Then
Set db = CurrentDb
Set rst = db.OpenRecordset("SELECT CComID FROM tblKonsolidierung WHERE RegID = " & Me!RegID, _
dbOpenDynaset)
For i = 0 To Me!lstCorpoComp.ListCount - 1
lngCComID = Me!lstCorpoComp.ItemData(i)
rst.FindFirst "CComID = " & lngCComID
If rst.NoMatch Then
Me!lstCorpoComp.Selected(i) = False
Else
Me!lstCorpoComp.Selected(i) = True
End If
Next i
Set db = Nothing
Else
For i = 0 To Me!lstCorpoComp.ListCount - 1
Me!lstCorpoComp.Selected(i) = False
Next i
End If
End Sub


Jetzt müsste ich wohl irgendwie die Möglichkeit haben, die Select Inhalte mit dem Insert Inhalt abzugleichen, so dass nur die Insert Einträge letztendlich in der Tabelle abgelegt werden. Oder habt ihr evtl. noch eine andere Idee, wie ich diese Zuordnung erreichen kann auch ohne Listenfeld?

Hoffnungsvolle Grüße
K.


DF6GL

Hallo,

warum benutzt Du nicht ein Hauptform mit Datenherkunft zu tblReg und darin ein UFO(_Steuerelement), dessen (Endlos-) Form die Tabelle tblRegCComp als Datenherkunft besitzt und über die Schlüsselfelder verknüpft?  Die Zuordnung einer CComp-ID zu einer RegID könnte über die Auswahl in einem Kombifeld geschehen, das seine Daten aus tblCComp bezieht.


Ein Listenfeld halte ich für solche Vorgänge als für ein ungeeignetes Instrument.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Katyte

Ich muss deine Antwort erst mal nachvollziehen.
Also tblReg habe ich und tblRegCComp heißt bei mir tblKonsolidierung, wo RegID und CCompID als Fremdschlüssel eingetragen sind, das ist doch auch dein Vorschlag?
Das mit dem Kombifeld versteh ich noch nicht ganz, dabei kann ich dann jeweils einer RegID eine CCompID zuordnen, aber ich brauche eine Mehrfachauswahl...

PS: durch hinzufügen von db.Execute "DELETE FROM tblKonsolidierung WHERE RegID = " & Me!RegID, dbFailOnError funktioniert jetzt auch meine ursprüngliche Lsg, falls es doch mal einer braucht.

Im Übrigen soll die Access-DB eine Art Zwischenlösung sein, um die Beziehung und benötigte Felder heraus zu kristallisieren, von daher muss es nicht zwangsweise "perfekt" umgesetzt werden.

DF6GL

Hallo,

Zitatdabei kann ich dann jeweils einer RegID eine CCompID zuordnen, aber ich brauche eine Mehrfachauswahl...
Das versteh ich nicht..  über die Zwischentabelle (--> Unterform) kannst Du doch mehrere CCompIDs zu einer RegID zuordnen...  Jeweils eine nacheinander (d.h. Anfügen  neuer DS) . Wozu braucht es eine "Mehrfachauswahl" ?

Zitateine Art Zwischenlösung sein, um die Beziehung und benötigte Felder heraus zu kristallisieren,

Das versteh ich auch nicht...  Sowas macht man nicht MIT einer DB sondern mit Papier und Bleistift  ...   und setzt es IN einer DB um. ;)


Zitatvon daher muss es nicht zwangsweise "perfekt" umgesetzt werden.

an ein Auto (oder hier besser: Fahrrad) kann man auch viereckige Räder montieren... dann darf man sich aber nicht wundern, wenn es holpert...  ;) ;)
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Katyte

Vielleicht hast du es etwas falsch aufgefasst, ich versuche es natürlich schon, soweit wie möglich es auch bestmöglich umzusetzen, aber wenn es jetzt mit dem Listenfeld-Funktioniert, dann kann ich es ja erst mal so lassen.

Mein Formular zeigt immer ein RegID an und durch die Mehrfachauswahl werden die CComp's zugeordnet. Danach Scrolle ich weiter und habe die nächste RegID der ich CComp's zuordne etc, daher brauche ich in meinen Augen eine Mehrfachauswahl. Diese Zuordnungen werden dann eben in der Tabelle abgespeichert. 

DF6GL

Hallo,

Quick&Dirty:


Private Sub lstCorpoComp_AfterUpdate()
Dim db As DAO.Database
Dim i As Long
Dim intCount As Long
Dim intIndex As Long
Dim intCComID As Long
Dim strInsert As String
Set db = CurrentDb
intCount = Me!lstCorpoComp.ItemsSelected.Count

db.Execute "delete from tblKonsolidierung where RegID = " & Me!RegID, dbFailOnerror

For i = 0 To intCount - 1
intIndex = Me!lstCorpoComp.ItemsSelected.Item(i)
lngCComID = Me!lstCorpoComp.ItemData(intIndex)
strInsert = "INSERT INTO tblKonsolidierung(RegID, CComID) VALUES(" & Me!RegID & ", " & lngCComID & ")"
db.Execute strInsert, dbFailOnError
Next i
Set db = Nothing
End Sub
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access