Juli 14, 2020, 21:54:35

Neuigkeiten:

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


Listenfeld mit Mehrfachauswahl und Kontrollkästchen speichern.

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

⏪ vorheriges - nächstes ⏩

Brallu

OK Danke,
ich werde da mal Rumprobieren und wenn ich nicht weiterkomme leider nochmal fragen??

Ich danke dir für deine Mühen!!

Gruß und schönen Restsonntag

Danny

Beaker s.a.

Juni 01, 2020, 12:54:56 #16 Letzte Bearbeitung: Juni 01, 2020, 13:06:20 von Beaker s.a.
Hallo Danny,
Anbei deine DB mit der gewünschten Funktionalität.
Vorgenommene Änderungen:
- Abfrage gelöscht, das HFo hat als DS_Herkunft eine Abfrage auf die Zeiten
(mehr braucht es nicht)
- Mehrfelderindex über die beiden FK gelegt (s.Tabellenentwurf -> Indices)
- Code für den Button im Klick-Ereignis geschrieben; - ansehen und
Kommentare beachten

Ich habe dir noch ein zweites (allgemeines) Beispiel dazu gepackt. Dort
siehst du neben der Liste ein UFo, in dem die Zwischentabelle die DS-
Herkunft ist. Dieses Beispiel ist auch noch dahingehend erweitert, dass
nach Auswahl und Speichern die Liste reduziert bzw. beim Löschen im
UFo erweitert wird.

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

Moin Ekkehard,
Ich danke dir für die viele Mühe und die Variante kann ich in einem anderen Formular tatsächlich gut gebrauchen!!!!

Aber hier klappt das so leider nicht und ich will an den n:m Beziehungstabellen festhalten.

Also brauche ich immer noch Unterstützung von Dir/euch!

Ich habe ein Beispiel hier angefügt und habe dazu ein paar Fragen.

1. Sollte ich die Listenfelder wie im Beispiel in Unterformularen verwenden oder an das Hauptformular binden???


2. Wie bekomme ich es hin das ich das Listenfeld prüfen kann ob mindestens ein Name ausgewählt wurde? Dies brauche ich für die Prüfung ob alle relevanten Felder ausgefüllt wurden. (Siehe im Beispiel die fncPrüfung)
So wie ich es hier versucht habe klappt das leider nicht  :(
    'prüfen ob Teilnehmer ausgewählt wurden
    If IsNull(Me!frmFobiUfoPers!lstPersonalAuswahl) Then
        strFehlerText = strFehlerText & intFehlerzahl & ". Es wurde kein Teilnehmer gewählt" & vbCrLf
        intFehlerzahl = intFehlerzahl + 1
        fncPruefen = False
    End If


3. Und das wichtigste die Speicherung des gesamten Datensatzes!!
Ich denke der Ansatz mit dem Wert Datum ist hier nicht so zielführend.
(Ich habe Aufgrund meiner geringen Programmierkenntnisse aber auch nicht den besten Überblick wie es am besten Progrmmiert werden sollte).

Die Bindung für alle Daten hier im Formular ist die fozeitID.
Unter der fozeitID in der Tabelle tblFobiZeiten ist alles von dem Datum, Uhrzeit, Inhalte, Teilnehmer und im Original noch mehr Zusatzdaten angefügt und somit eindeutig.
bisher habe ich immer mit
DoCmd.RunCommand acCmdSaveRecord alles gespeichert aber den Wert aus den Listenfeldern mit Mehrfachauswahl verstehe ich auch nicht so richtig.

Also wenn du/ihr nochmals auf mein Beispiel schauen könntet würde ich mich riesig freuen.
Ich habe das Beispiel so abgespeckt das nur die wichtigsten Felder für die Frage übergeblieben sind. Also bitte bei einigen Tabellen nicht wundern warum da nur 2 oder 2 Felder drinstehen.

Gruß und danke fürs lesen!!

Danny

Beaker s.a.

Hallo Danny,
Nachdem du nun dein ganzes DM gezeigt hast, musst da nochmal ran
bevor es mit Formularen weitergeht. Da sind noch Nachschlagefelder in
zwei oder drei Tabellen, - die müssen zu Textfeldern gemacht werden.
Ausserdem musst du deine Abfragen entschlacken, da sind z.T. nicht
benötigte Tabelle drin.
Das Problem mit deinem Form ist, dass du Pflichtfelder in UFos hast.
Das Verhalten von Access ist nun folgendes:
beim Wechsel von HFo zu einem UFo wird versucht den DS im HFo zu
speichern. An dieser Stelle kannst du aber nur die Pflichtfelder im HFo
prüfen (wie du es ja versuchst *)); - im UFo konntest du ja noch gar
nichts eingeben. Wenn du dann im UFo landest (Prüfung hat nicht
abgebrochen) verhält es sich beim Wechsel von UFo zu HFo (durch
Buttonklick) oder zu dem 2. UFo (durch wechseln mit der Maus)
genauso, Access will den DS im aktuellen UFo speichern, - du musst
also die Prüfung für die Felder im UFo dort implementieren.
Ich sehe zwei Möglichkeiten
1. den Speicher-Button entfernen, den Focus über die Reihenfolge
der Steuerelemente auf das erste UFo erzwingen, dort wie gesagt die
Pflichtfelder getrennt prüfen
2. ein nur teilweise gebundenes Formular (MIT Speicherbutton), gleiche
DS-Herkunft wie jetzt, die anderen relevanten Daten in ungebundenen
Text-/Kombi-/Listfelder, Buttonklick löst eine Reihe von INSERT-Abfragen
in der dem DM (Beziehungen) entsprechenden Reihenfolge aus.
Ich hatte mal das gleiche Problem (Pflicht-DS) in UFo, da hatte ich das
so gemacht. Suche ich raus. Dauert aber, denn jetzt bin ich weg.

gruss ekkehard

*) Die Prüfung muss bei Form_BeforeUpdate durchgeführt werden.
mit dem Button
Private Sub cmdSpeichern()
    If Me.Dirty Then Me.Dirty = False
'löst das folgende Ereignis aus
End Sub
Private Sub Form_BeforeUpdate(Cancel As Integer)
    Cancel = fncPruefen
'!! beachte den geänderten Prozedurkopf
'Public Function fncPruefen() As Boolean
End Sub
--
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

Moin Ekkehard,
suuper das du dir die Zeit genommen hast mal drüber zu schauen.  :)
Ich habe jetzt mal die UFOs rausgenommen und die Nachschlagefelder entfernt.

Ich hätte gerne den Button erhalten, damit die Eingabe bewust beendet wird.

Also wenn du magst schau bitte mal drüber ob die Version so besser zu händeln wäre!?

Gruß

Danny

Beaker s.a.

Hallo Danny,
Ja, sieht, jedenfalls für mich, besser aus.
Die Formulargestaltung würde ich allerdings etwas anders angehen. Das
Problem mit den Pflicht-DS im UFo besteht ja nur bei neuen DS.
Um die bestehenden DS zu bearbeiten/ergänzen brauchst du ja die UFos.
Ich würde also das alte Form, mit den UFos aber ohne den Button (kommt
gleich wieder) behalten. Das neue (hier bleibt der Button) öffnest du als
PopUp wenn du im alten einen neuen DS anlegst. Dazu kannst du einen
Button anlegen (in frmFobiHauptAlt)
Private Sub cmdNeuerDS_Click()
    If Me.Dirty Then Exit Sub
    DoCmd.OpenForm "frmFobiHauptNeu", acNormal, , , acFormAdd, acDialog
End Sub

oder wenn du die eingebaute Navigation benutzt oder sonst wie zu einem
neuen DS gelangst
Private Sub Form_Current()
    If Me.NewRecord Then
        DoCmd.OpenForm "frmFobiHauptNeu", acNormal, , , acFormAdd, acDialog
    End If
End Sub

Die gesamte Prüfung kommt dann in dieses PopUp-Form, und das in der
gezeigten Weise, - Button  :) speichert DS, dies triggert das BeforeUpdate-
Event, welches wiederum die Prüfung anstösst. Die kannst du i.Ü. auch als
Private deklarieren (Zugriff erfolgt nur aus diesem Formular).
Nachdem die Prüfung keine Fehler ergeben hat speicherst du
1. den gebundenen DS (tblFobiZeiten), das geht auch im PopUp wie bereits
gezeigt einfach mit Me.Dirty = False.
2. den neuen DS in tblFobiZeitUndPersonal (FKs liegen beide vor im Formular)
3. den neuen DS in tblFobiInhalte (FKs wie vor)

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

In diesem Formular werden nur neue Datensätze angelegt und nicht bearbeitet.
Muss es dann wirklich ein Pop Up UFO sein????

Beaker s.a.

ZitatMuss es dann wirklich ein Pop Up UFO sein

Nö, wenn du an den DS nichts mehr ändern musst.
--
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

Nö brauche ich hier nicht!
Dann soll ich aber trotzdem die Ufos wieder einbauen oder?
Und wie speicher ich dann den ganzen Datensatz?
Ach und das Problem mit dem prüfen hätte ich ja dann noch.
Das hier erkennt im Ufo nicht ob ein Wertim Listenfeld ist oder nicht und sagt immer das List ist leer!

prüfen ob Teilnehmer ausgewählt wurden
    If IsNull(Me!frmFobiUfoPers!lstPersonalAuswahl) Then
        strFehlerText = strFehlerText & intFehlerzahl & ". Es wurde kein Teilnehmer gewählt" & vbCrLf
        intFehlerzahl = intFehlerzahl + 1
        fncPruefen = False
    End If

Brallu

So hallo nochmal,
ich verstehe den Aufbau der Listenfelder mit Mehrfachauswahl immer noch nicht und kann mir nicht helfen  :( .
Ich habe jetzt als dritte Version ein Formular mit ungebundenen Text-/Kombi-/Listfeldern und dem Speicherbutton erstellt.
Das Formular ist noch an die "qryFrmFobiHaupt" gebunden.
(ob hier die Tabellen "tblFobiZeitUndFobiInhalt" und "tblFobiZeitUndPersonal" eingefügt werden müssen weis ich nicht.
Jetzt soll ja beim Speichern Klick der gesamte Datensatz gespeichert werden.
(Habe noch nie mit ungebundenen Formularen gearbeitet)
Also alles außer die Listenfelder in die Tabelle "tblFobiZeiten"
und die Listenfelder in die n:m Tabellen "tblFobiZeitUndFobiInhalt" und "tblFobiZeitUndPersonal"
Und das kriege ich nicht hin.
Ich hoffe Du/Ihr könnt mir nochmal helfen.

gruß
Danny



DF6GL

Hallo,

ZitatJetzt soll ja beim Speichern Klick der gesamte Datensatz gespeichert werden.


Versteh ich das richtig:   die in "lstPersonalAuswahl" und "lstInhaltAuswahl" markierten Einträge sollen (deren ID-Wert) in "tblPersonal" und "tblFobiInhalte" beim Klick auf "Speichern" abgelegt (hinzugefügt?) werden?

Oder sind "tblFobiZeitundPersonal" und "tblFobiZeitundFobiInhalt"  gemeint?


Das Formular selber speichert davon unabhängig seine Daten in "tblFobiZeiten". 

Was verspricht Du Dir von diesen Vorgang,  bzw. was willst Du damit erreichen?

Vermutlich soll dann auch "foZeitID" in diese beiden Tabellen gespeichert werden (zusammen als neuer DS).

Wenn das so sein soll, dann benötigst Du Anfügeanfragen, die die Daten in diese Tabellen schreiben oder zwei Recordsets auf "tblFobiZeitundPersonal" und "tblFobiZeitundFobiInhalt", die das bewerkstelligen.

Zudem wäre für sinnvoll , das Beziehungsfenster etwas besser zu ordnen, damit die Zusamenhänge transparenter werden.


Brallu

Moin Ekkehard  :-[ ,
sorry das ich mich nicht klar ausdrücke! (bin echt kein Profi)

So nochmal was soll passieren!
Mit ungebundenen Feldern sollte das ungewollte automatische Speichern verhindert werden.
Aber es geht auch das gebundene Formular. Habe ja jetzt 3 verschiedene Dateien hier drin:

1 Gebunden mit Ufos (der Listenfelder)
2 Gebunden ohne Ufos (der Listenfelder)
3 Ungebunden ohne Ufos (der Listenfelder)

Ich weiß nicht welche Version zum Erfolg führt!!! Deshalb die verschiedenen Versuche.

Die Felder zu 1. kann man ja leicht über das gebundene FRM speichern, aber ich habe keine Vorstellung
wie zusätzlich das Speichern der Mehrfachauswahl-Listenfelder erfolgen kann und wie das programmiert werden muss.

So nochmal was soll passieren!
Ich lege eine Fortbildung an mit Datum und Zeiten und speicher dazu die Teilnehmer und die Inhalte.

Nach drücken des Buttons "cmdSpeichern"

Alle folgenden Werte sind unter einer neuen ID = fozeitID
in der Tabelle tblFobiZeiten zu speichern

1.   Sollen die Werte aus den Feldern (Text-/Kombifeldern) gespeichert werden in:

txtDatumVon      =   tblFobiZeiten.fozeitStartTag   
txtUhrzeitVon      =   tblFobiZeiten.fozeitStartZeit
txtUhrzeitBis      =   tblFobiZeiten.fozeitEndZeit
txtFozeitPauseZeit   =   tblFobiZeiten.fozeitPauseZeit
cboOrt         =   tblFobiZeiten.fozeitOrt_F_ID
cboArt         =   tblFobiZeiten.fozeitArt_F_ID

2. Und der Inhalt der beiden Listenfelder soll in die beiden n:m Tabellen zu genau diesem Datensatz ID =  fozeitID gespeichert werden.

a)   Die Werte aus dem Listenfeld  = ,,lstPersonalAuswahl" in die Tabelle ,,tblFobiZeitUndPersonal"

In der Tabelle gibt es die Felder
zupFozeit_F_ID    = der Verbinder zur fozeitID
und
zupPersID_F_ID    = der Verbinder zur tblPersonal.persID

Das Listenfeld hat als Datensatzherkunft die Felder

persID      der Wert soll zur    tblFobiZeitUndPersonal .zupPersID_F_ID
persNameAnzeigen

b)   Die Werte aus dem Listenfeld  = ,,lstInhaltAuswahl" in die Tabelle ,,tblFobiZeitUndFobiInhalt"

In der Tabelle gibt es die Felder
iuzFozeit_F_ID    = der Verbinder zur fozeitID
und
iuzFoin_F_ID    = der Verbinder zur tblFobiInhalte.foinID

Das Listenfeld ,,lstInhaltAuswahl" hat als Datensatzherkunft die Felder

foinID      der Wert soll zur    tblFobiZeitUndFobiInhalt. iuzFoin_F_ID


Also sollen alle Werte nur in diese 3 Tabellen.

Ich hoffe ich konnte das jetzt besser erklären und es gibt eine Lösung für mein Problem.


Danke und Gruß

Danny

DF6GL

Hallo,


ich bin nicht Ekkehard   8)  was aber völlig egal ist. :D

anbei ein mögliche Lösung

Beaker s.a.

Hallo Danny,
Ich habe das alles längst verstanden, und denke das auch zum Ausdruck
gebracht zu haben mit meinen Beschreibungen zu möglichen Vorgehens-
weisen (#18 + #20). Aus diesen beiden Threads geht doch alles hervor.
Das brauchst du doch nur auf das teilweise ungebundene Formular anwenden.
Für die Schritte 2 und 3 in #20 musst du mit VBA die entsprechenden
Anfügeabfragen entweder mit den Kombis (nur ein DS möglich) oder, wie
schon mal gezeigt (glaube ich) mit einer Schleife durch die ausgewählten
Einträge in den Listfeldern zusammensetzen.

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.

Beaker s.a.

Hallo Danny,
Franz hat dir die Lösung gezeigt. Allerdings ein bisschen Quick&Dirty; -
nicht böse gemeint Franz.
Deine Prüfroutine würde ich allerdings etwas umgestalten
Public Function fncPruefen() As Boolean
Dim strFehlerText As String
Dim intFehlerzahl As Integer
Dim i As Long

intFehlerzahl = 1
fncPruefen = True
     
      'prüfen ob Stunden berechnet wurden leer
  If IsNull(Me!txtDatumVon) Then
        strFehlerText = strFehlerText & intFehlerzahl & ". Zeit wurde nicht berechnent" & vbCrLf
        intFehlerzahl = intFehlerzahl + 1
    End If
   
    'prüfen ob der Fortbildungsort ausgewählt wurde
    If IsNull(Me!cboOrt) Then
        strFehlerText = strFehlerText & intFehlerzahl & ". Es wurde kein Fortbildungsort gewählt" & vbCrLf
        intFehlerzahl = intFehlerzahl + 1
    End If
   
    'prüfen ob der Fortbildungsart ausgewählt wurde
    If IsNull(Me!cboArt) Then
        strFehlerText = strFehlerText & intFehlerzahl & ". Es wurde keine Fortbildungsart gewählt" & vbCrLf
        intFehlerzahl = intFehlerzahl + 1
    End If
   
    If intFehlerzahl > 1 Then
        If intFehlerzahl = 2 Then strFehlerText = Mid(strFehlerText, 3) '10 = Anzahl der Prüfpunkte
       
        Select Case MsgBox("Es gibt noch " & intFehlerzahl - 1 & " Fehler" & vbCrLf & vbCrLf & strFehlerText _
        & vbCrLf & vbCrLf & "mit OK zurück, Abbrechen verwirft den begonnenen Datensatz", vbOKCancel, "Achtung!")
            Case vbCancel
                Me.Undo
        End Select
       
        fncPruefen = False
        Exit Function
    End If
     
    'prüfen ob Teilnehmer ausgewählt wurden            Wenn aktiviert findet er nichts
   
'   For i = 0 To Me!lstPersonalAuswahl.ListCount - 1
'        If Me!lstPersonalAuswahl.Selected(i) = True Then fncPruefen = True
'    Next i
' geht auch ohne Schleife
    fncPruefen = (Me!lstPersonalAuswahl.ItemsSelected.Count <> 0)
   
    'prüfen ob die Tätigkeiten  ausgewählt wurde        Wenn aktiviert findet er nichts

'     For i = 0 To Me!lstInhaltAuswahl.ListCount - 1
'        If Me!lstInhaltAuswahl.Selected(i) = True Then fncPruefen = True
'     Next i
'wie oben
    fncPruefen = (Me!lstInhaltAuswahl.ItemsSelected.Count <> 0)

End Function


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.