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
Sorry fast vergessen, dass Listenfeld soll Kontrollkästchen in der Ansicht haben!
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.
Moin,
eigentlich beides aber das wichtigste ist wie kann ich die Namen (ID) in der Tabelle speichern.
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
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.
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
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
Hallo,
das Datumsfeld hat noch keinen eindeutigen Index. Das wird in dieser Konstellation zu Chaos führen....
Ok, aber das verstehe ich nicht :-[ denn der eindeutige Wert ist doch die "tblFobiZeiten!fozeitID"
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..
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!
@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
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
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.
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
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
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
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
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
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
In diesem Formular werden nur neue Datensätze angelegt und nicht bearbeitet.
Muss es dann wirklich ein Pop Up UFO sein????
ZitatMuss es dann wirklich ein Pop Up UFO sein
Nö, wenn du an den DS nichts mehr ändern musst.
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
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
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.
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
Hallo,
ich bin nicht Ekkehard 8) was aber völlig egal ist. :D
anbei ein mögliche Lösung
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
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
Hallo,
was ist Q&D?
Die Prüfroutine war nur Nebenschauplatz.
Geändert: Formular gebunden. Insert-Statements im Form_Afterupdate-Ereignis.
Hallo Franz und Ekkehard, :) :) :) :)
Ich danke euch beiden für die suuuper Hilfe,
ohne euch würde ich nicht weiterkommen.
Ekkehard danke auch für die guten Tipps zu meiner Datenbank.
Werde jetzt mal alles zusammenbasteln und schauen ob mir noch was auffällt!
Also euch ein tolles Wochenende!
Gruß
Danny
Leider ich nochmal :(
Der Nebenschauplatz mit der Prüfroutine von Ekkehard geht leider immer noch nicht :-[
Und er kann so doch keine Meldung rausgeben das das List leer ist oder??
Oder habe ich da etwas nicht richtig verstanden??
Er soll ja meckern wenn von den angezeigten Namen im Listenfeld = ,,lstPersonalAuswahl" keiner ausgewählt wurde.
Wenn sich das einer nochmal anschauen könnte :-\
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
Auch die Version der Prüfroutine von Franz verhindert auch nicht das speichern :(
Hallo,
ich habe die Prüfroutine und anderen Code nicht "geprüft", ob das geschieht, was erwartet wird.
Du musst die Prüfung in das Form_BeforeUpdate-Ereignis einbauen (weil das Form jetzt gebunden ist) und die Prüfung auf nicht markierte Einträge korrigieren
If Me!lstPersonalAuswahl.ItemsSelected.Count = 0 Then
fncPruefen = False
intFehlerzahl = intFehlerzahl + 1
End If
If Me!lstInhaltAuswahl.ItemsSelected.Count = 0 Then
fncPruefen = False
intFehlerzahl = intFehlerzahl + 1
End If
Moin Franz :) ,
das hat mir noch gefehlt! jetzt klappt es wie gewünscht!!
Danke, Danke und nochmals Danke euch beiden!
Gruß
Danny