Hallo AccessGemeinde,
schon wieder einmal stecke ich im Dilemma:
Mein Startformular ist mit einer verknüpften Tabelle tblTag verbunden.
In dieser Tabelle gibt es eine AutoID, ein Datumsfeld und viele numerische Felder als Zählfelder.
Nun möchte ich gern, dass bei Starten der Datenbank geprüft wird ob es einen Datensatz für heute schon gibt.
Gibt es diesen, soll er angesprungen werden (Das scheint auch gut zu funktionieren)
Gibt es ihn nicht, soll ein Datensatz für "heute" erstellt werden.
With Me.Recordset
.FindFirst "[Tagdatum] = Date()"
If .NoMatch Then
DoCmd.GoToRecord , , acNewRec
End If
End With
Dieser Befehl wird mit obigem Fehler quittiert.
Im Formular ist der Standardwert Heute() eingestellt.
Über die Navigationsschaltfläche lässt sich aber ein neuer Datensatz erzeugen, Jedoch zeigt das Datumsfeld
#Name? an.
Was mache ich falsch?
Gruß dolpho
Hallo dolpho
Ich kann das nicht nachvollziehen, bei mir funktioniert es.
Allerdings muss der Standardwert im Formular nicht heute(), sondern =Datum() heissen.
Hallo Köbi,
das hatte ich heut schon mal geändert, aber das Ergebnis ist das Gleiche! :(
Die gleiche Antwort habe ich übrigens auch wenn ich die Zeilen durch
"DoCmd.GoToRecord , , acNewRec"
ersetze.
Hallo dolpho
ZitatDie gleiche Antwort habe ich übrigens auch wenn ich die Zeilen durch
"DoCmd.GoToRecord , , acNewRec"
Das ist ja das Gleiche wie im ursprünglichen Code.
Ist den die Datensatzquelle (wahrscheinlich eine Abfrage) für das Formular überhaupt aktualisierbar?
Beiliegend meine DB, welche funktioniert.
Hallo Köbi,
die Grundlage für meine Datenbank liegen in anderen Datenbanken.
34 der Tabellen sind in der BE-Datei und die eine, auf die ich hier zugreifen will, liegt in einer anderen Datenbank, die im Moment noch eigenständig funktioniert, die ich aber hier einbauen will.
Eine Abfrage ist nicht dazwischen.
Gruß dolpho
... noch etwas ist mir gerade aufgefallen:
Wenn ich mir einen Datensatz erzeuge über die Navigationsschaltfläche, dann setzt dieser das richtige Datum.
Dort kann ich dann die Daten im Datensatz bearbeiten. Öffne ich dann jedoch die Tabelle, di ja der Ursprung sein soll, dann gibt es diesen Datensatz noch nicht !?!
Der Code gehört in das Form_Load Ereignis des Formulars. Ist das so bei dir?
ZitatDort kann ich dann die Daten im Datensatz bearbeiten. Öffne ich dann jedoch die Tabelle, di ja der Ursprung sein soll, dann gibt es diesen Datensatz noch nicht !?!
Ist denn die Bearbeitung auch abgeschlossen, indem du z.B. zu einem anderen DS wechselst? Erst dann ist der DS auch in der Tabelle gespeichert.
Sonst weiss ich nicht weiter. Höchstens noch die Empfehlung, die Datenbank komprimieren und reparieren.
Hallo Köbi,
ja nach Wechsel des Datensatzes ist er da und komprimiert und repariert habe ich auch.
ohne Erfolg.
Vielleicht muss ich den Datensatz über einen anderen Weg neu erzeugen.
Dazu habe ich jedoch erst morgen wieder Zeit,
oder irgendwer hat eine bessere Lösung.
Gruß dolpho
Nachtrag:
Heute habe ich das selbe unter Office 365 ausgeführt und bekomme eine andere Fehlermeldung:
"Fehler 2499: Sie können die GeheZuDatensatz-Aktion oder
SearchForRecord-Aktion bzw. die GoToRecord-Methode oder
SearchForRecord-Methode nicht für ein Objekt ausführen,
das sich in der Entwurfsansicht befindet."
Allerdings starte ich das Formular aus einer Situation heraus, wo NICHS geöffnet ist.
Vielleicht hilft ja das irgendwie weiter
Tut mir Leid, mir hilft das nicht weiter. Bin mit meinem Latein am Ende.
Vielleicht kannst du ja eine abgespeckte Version der DB hier hochladen, nur mit ein paar fiktiven Datensätzen.
Mich würde ja interessieren, wo und wann dein Code aus dem OP ausgeführt
wird.
Zitatdass bei Starten der Datenbank
Da werden ja u.U. mehrere Ereignisse ausgelöst.
Hallo zusammen,
@Köbi, das wird Dir nichts nützen. Diese Tabelle habe ich gerade erst "dazugebastelt" Da gibt es ur die Versuchsdaten der letzten fünf Tage. Ansonsten handelt es sich hier nur um ein Startformular, mit 36 cmd... Feldern und die 14 neuen "Zählfeldern".
@Autor, das Ereignis findet gleich nach "Private Sub Form_Load()" statt.
DoCmd.GoToRecord , , acNewRecDas legt aber noch keinen Datensatz an und entspricht nicht der Aussage ...
ZitatGibt es ihn nicht, soll ein Datensatz für "heute" erstellt werden.
Wenn man ausführt, was man sagt, könnte es etwa so aussehen:
If .NoMatch Then
.AddNew
.Fields("X") = "trallala"
' weitere Felder
.Update
End IfZur Präzisierung:
Zitatdas Ereignis findet gleich nach "Private Sub Form_Load()" statt
Form_Load ist das Ereignis.
Es wird hier durch eine Ereignisprozedur genutzt.
Generell: Bei der Mischung verschiedener Programmieransätze (Objektorientierung a la Form-Objekt versus DoCmd-Zeugs) sollte man ausreichend zurückhaltend sein.
Hallo Eberhard
viele lieben Dank für die Hilfe. Das war genau das, was ich suchte!
Mit:
With Me.Recordset
.FindFirst "[Tagdatum] = Date()"
If .NoMatch Then
.AddNew
.Fields "[Tagdatum] = Date()"
.Update
End If
End With
funktioniert es.
Leider bin ich VBA-technisch doch eher ein Laie und hangel mich immer von Fall zu Fall.
Zwar besitze ich viele Bücher über Access und VBA.
Jedes geht jedoch anders an die Programmierung ran:
Einmal
einmal:
with Me.Recordset
Das nächste Mal über Dao. Recordset
oder Set rs = ......
das ist alles echt verwirrend.
Nochmals danke und liebe Grüße aus Mittelfranken
dolpho
Zitatverwirrend
... oder etwas Übersicht, wo man ist und was man tut.
Set rs = ...... erzeugt ein neues Recordsetobjekt.
With Me.RecordsetMe ist das aktuelle gebundene Formular, das also eine Datenherkunft und somit eine Recordset-Eigenschaft hat. Somit kann man direkt auf dieses Recordset verweisen und dieses unmittelbar nutzen. Letzteres ist ein Vorteil, kann aber auch nachteilig sein. Wenn man direkt schreibt, muss man wissen, was man tut.