Juli 10, 2020, 15:27:59

Neuigkeiten:

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


Listenfeld mit Mehrfachauswahl und Kontrollkästchen speichern.

Begonnen von Brallu, Mai 30, 2020, 11:44:44

⏪ vorheriges - nächstes ⏩

Brallu

Hallo Gemeinde :) ,
ich habe folgendes Problem.
In einem Formular soll ein neuer Datensatz erstellt werden.
Also an einem Tag haben folgende Mitarbeiter teilgenommen. (Das Beispiel ist nur auf das wesentliche beschränkt)
Hier gibt es ein Listenfeld in dem die Teilnehmer ausgewählt werden können. Die Mehrfachauswahl habe ich eingestellt.
Wenn ich speichern drücke soll der Tag (fozeitStartTag) in "tblFobiZeiten" und die ID (persID) der Namen in einer n:m Tabelle unter (zupPersID_F_ID) "tblFobiZeitUndPersonal" zu dem Datum gespeichert werden.
Im Internet habe ich leider nichts gefunden wo das einmal einfach erklärt wird. Also hoffe ich das mir einer von euch helfen kann.
Die Beispieldatei und zwei Bilder habe ich beigefügt!!
Danke fürs Lesen!!!

Gruß
Danny


Brallu

Sorry fast vergessen, dass Listenfeld soll Kontrollkästchen in der Ansicht haben!

DF6GL

Hallo,

was ist nun das Problem?
Die Kontrollkästchen im Listenfeld oder das Speichern der markierten Listenfeld-Einträge in die Tabelle?

btw:: Kontrollkästchen im Listenfeld anzuzeigen geht nicht mit dem Standard-Access-Listenfeld.

Brallu

Moin,
eigentlich beides aber das wichtigste ist wie kann ich die Namen (ID)  in der Tabelle speichern.

DF6GL

Hallo,

indem Du das Listenfeld durchläufst und die einzelnen Werte abspeicherst..

Wie gesagt, Kontrollkästchen sind im Access-Listenfeld nicht möglich (wozu auch?).


Die Tabelle "tblFobiZeiten" ist ersatzlos überflüssig. Anstelle wird ein Datumsfeld ("zupDatum") in Tabelle tblFobiZeitUndPersonal  eingebaut.


ZitatPrivate Sub btnspeichern_Click()
Dim itm
Dim db As Database
Set db = CurrentDb

For Each itm In Me!lstTeilnehmer.ItemsSelected

   db.Execute "Insert into tblFobiZeitUndPersonal   (zupDatum, zupPersID_F_ID)  Values (" & Format(Nz(Me!txtDatum, Date), "\#yyyy-mm-dd\#") & "," & Me!lstTeilnehmer.ItemData(itm) & ")"

Next

Set db = Nothing
End Sub

Brallu

Hallo Franz,
danke für deine Antwort!
ZitatDie Tabelle "tblFobiZeiten" ist ersatzlos überflüssig. Anstelle wird ein Datumsfeld ("zupDatum") in Tabelle tblFobiZeitUndPersonal  eingebaut.

Ich brauche diese Tabelle da hier noch einiges mehr mit erfasst wird und es noch 2 weitere n:m Beziehungen gibt.
Das Datenmodell passt schon.
Wie müsste dein Code denn aussehen wenn ich:
1. das Datum aus (txtDatumVon) in die Tabelle tblFobiZeiten!fozeitStartTag
und
2. die IDs der Namen (lstPersonalAuswahl) in die Tabelle tblFobiZeitUndPersonal!zupPersID_F_ID
schreiben will??
Das mit den Kontrollkästchen ist nicht wichtig!
Will den Aufbau nur einmal verstehen.

DF6GL

Hallo,


ZitatDas Datenmodell passt schon.


Da bin ich mir nicht sicher. Aber das ist hier nicht das Thema..

1.
eigentlich solltest Du das jetzt selber können...

db.Execute "insert into tblFobiZeiten (fozeitStartTag) Values(" & Format(Nz(Me!txtDatum, Date), "\#yyyy-mm-dd\#") & ")"


2.

db.Execute "Insert into tblFobiZeitUndPersonal   (zupFozeit_F_ID, zupPersID_F_ID)  Values (" & _
  Dlookup("fozeitID","tblFobiZeiten","fozeitStartTag= " & Format(Nz(Me!txtDatum, Date), "\#yyyy-mm-dd\#") ) & _
  "," & Me!lstTeilnehmer.ItemData(itm) & ")"



btw:  "fozeitStartTag"  sollte einen eindeutigen Index besitzen

Brallu

Hallo Franz,
das klappt jetzt richtig gut!
Ich danke dir  :)
Ich habe jetzt das fertige Beispiel mit Code hier angehängt. Fals noch einer so wenig Plan hat wie ich.

Gruß an den Bodensee von der Ostsee

Danny

DF6GL

Hallo,

das Datumsfeld hat noch keinen eindeutigen Index.  Das wird  in dieser Konstellation zu Chaos führen....

Brallu

Ok, aber das verstehe ich nicht  :-[ denn der eindeutige Wert ist doch die "tblFobiZeiten!fozeitID"

DF6GL

Hallo,

es ist möglich, das selbe Datum mehrmals in die Tabelle zu speichern und das mit unterschiedlichen ID-Werten.  D. H. ein bestimmtes Datum wird durch mehrere ID-Werte definiert, was
Zitat"denn der eindeutige Wert ist doch die "tblFobiZeiten!fozeitID"  "
ad absurdum führt

Wie gesagt: in dieser Konstellation..

Brallu

Ja das soll es ja auch und es gibt noch viele andere Daten zu diesem Datensatz. Uhrzeiten und Inhalte usw.
Und es kann an diesem Tag auch mehrere Fortbildungen geben!

Noch eine Frage ich habe den Datensatz in der Orginaldatenbank mit DoCmd.RunCommand acCmdSaveRecord gespeichert. Wenn ich mit deinem Code Speicher muss ich alle Speicherpunkte die es noch gibt einzeln aufführen oder kann ich DoCmd.RunCommand acCmdSaveRecord unten dranhängen?

Private Sub cmdSpeichern_Click()
Dim itm
Dim db As Database
Set db = CurrentDb


For Each itm In Me!lstPersonalAuswahl.ItemsSelected

db.Execute "insert into tblFobiZeiten (fozeitStartTag) Values(" & Format(Nz(Me!txtDatumVon, Date), "\#yyyy-mm-dd\#") & ")"

db.Execute "Insert into tblFobiZeitUndPersonal   (zupFozeit_F_ID, zupPersID_F_ID)  Values (" & _
  DLookup("fozeitID", "tblFobiZeiten", "fozeitStartTag= " & Format(Nz(Me!txtDatumVon, Date), "\#yyyy-mm-dd\#")) & _
  "," & Me!lstPersonalAuswahl.ItemData(itm) & ")"
Next

Set db = Nothing
End Sub


Verstehe noch nicht in welcher Reihenfolge ich das hier ergänzen soll!

Beaker s.a.

@Brallu
Mit "INSERT INTO" angefügte DS brauchst du nicht noch einmal explizit
zu speichern, das hat die Anweisung schon erledigt.
I.Ü. brauchst du auch beim Speichern eines DS in einem Form nicht das
DoCmd-Objekt zu bemühen, ein einfaches
Me.Dirty = False
recht dazu völlig aus.
gruss ekkehard

--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

Brallu

hallo Ekkehard,
in meinem richtigen Formular habe ich einen Code der prüft ob die einzelnem Felder gefüllt wurden.
Also mit Public Function fncPruefen() stelle ich das fest.
Dann erst soll gespeichert werden!
Vorher also:
Private Sub cmdSpeichern_Click()
If fncPruefen = True Then
        DoCmd.RunCommand acCmdSaveRecord
        Me.Requery
End If
End Sub


Und jetzt???:

Private Sub cmdSpeichern_Click()
Dim itm
Dim db As Database
Set db = CurrentDb

If fncPruefen = True Then
Me.Dirty = False
For Each itm In Me!lstPersonalAuswahl.ItemsSelected
db.Execute "insert into tblFobiZeiten (fozeitStartTag) Values(" & Format(Nz(Me!txtDatumVon, Date), "\#yyyy-mm-dd\#") & ")"
db.Execute "Insert into tblFobiZeitUndPersonal   (zupFozeit_F_ID, zupPersID_F_ID)  Values (" & _
  DLookup("fozeitID", "tblFobiZeiten", "fozeitStartTag= " & Format(Nz(Me!txtDatumVon, Date), "\#yyyy-mm-dd\#")) & _
  "," & Me!lstPersonalAuswahl.ItemData(itm) & ")"
Next

Set db = Nothing
Me.Requery
End Sub


Habe ich das richtig verstanden oder bin ich auf dem Holzweg???
Es soll ja alles als ein Datensatz gespeichert werden.

Gruß
Danny

DF6GL

Mai 31, 2020, 18:36:26 #14 Letzte Bearbeitung: Mai 31, 2020, 18:53:42 von DF6GL
Hallo,

ich denke, Du bist auf dem Holzweg...

gebundene Formulare speichern (standardmäßig) immer, wenn der DS verlassen/gewechselt wird, eben auch beim Schließen des Forms, wobei als Folge das Speichern unterbunden wird.

Plausibilitäts-Prüfungen werden in der Regel im "Form_BeforeUpdate"-Ereignis erledigt und das Argument "Cancel" auf True gesetzt, wenn die Prüfung nicht erfolgreich war.

ZitatEs soll ja alles als ein Datensatz gespeichert werden


Diese Aussage musst Du präzisieren. Normalerweise ist die Datenherkunft eines Forms auf eine Tabelle eingestellt. Mit HFO/UFO-Konstruktionen lasst sich eine 1:n-Beziehung darstellen und auch vernünftig datenmäßig manipulieren.

Für jede Tabelle existiert (in der Regel) mindestens ein separates Form, wobei das je nach Verwendung ein Einzel- (--> HFO) oder Endlosform sein kann.

Diese Formulare spiegeln in ihrer Gesamtheit den Tabellenaufbau wieder und stellen die Basis für die Datenbehandlung dar.

Weitere spezielle Formulare können dann für Arbeitsabläufe, besondere Datenmanipulationen oder Auswertungen dienen.


Bei
ZitatUnd jetzt???:


musst Du Dir einen vernünftigen Arbeitsablauf, soll heißen ein Bedienkonzept überlegen.

Der vorgeschlagene "Insert"-Code ist ja nur auf den anfänglich geposteten DB-Ausschnitt bezogen und kann mit der insgesamten DB-Funktionalität kollidieren.