Hallo,
Ich habe ein Hauptformular und dazu zwei Unterformulare. Dies Ufos enthalten auch wieder Unterformulare.
Wie kann ich nun Änderungen in den ganzen Formularen erkennen?
Im Hfo könnte ich das ja mit Me.Dirty realisieren, aber das geht ja nicht mit den Ufos.
Ich habe zu dem Problem diese Seite (http://www.access-entwicklerbuch.de/2007/index.php?page=buch&bookpage=Kap_04/07_02.html) gefunden, beim versuch das umzusetzen habe ich allerdings Probleme.
z.B. Wenn ich mein Hfo öffne wird die folgende Sub durchlaufen
Private Sub UnterformularAktualisieren()
Dim strSQL As String
Dim rst As DAO.Recordset
'Zusammenstellen des SQL-Strings
strSQL = "SELECT * FROM tbl_MotorGrunddaten WHERE MotorGrunddatenID = " & Nz(Me!cboMotNrSuchen, 0) & ""
'Öffnen des Recordset
Set rst = db.OpenRecordset(strSQL, dbOpenDynaset)
'Zuweisen des Recordset an das Unterformular
Set Me!frm01MotorErfassungUfoMechDat.Form.Recordset = rst
Set Me!frm02MotorErfassungUfoElDat.Form.Recordset = rst
End Sub
Und hier erhalte ich bei Set rst = db.OpenRecordset(strSQL, dbOpenDynaset) einen Laufzeitfehler 91 - Objektvariable oder With-Blockvariable nicht festgelegt.
Warum?
Kann mir jemand helfen das auf der Seite (http://www.access-entwicklerbuch.de/2007/index.php?page=buch&bookpage=Kap_04/07_02.html) beschriebene umzusetzen oder gibt es noch eine andere Möglichkeit die Änderungen zu erkennen?
-Tom-
Hi Tom,
was passiert, wenn Du einen einfacheren Ansatz probierst, um den Fehler zu vermeiden:
Set Me!frm01MotorErfassungUfoMechDat.Form.Recordset = "SELECT * FROM tbl_MotorGrunddaten WHERE MotorGrunddatenID = " & Nz(Me!cboMotNrSuchen, 0)
Ich setze voraus, dass cboMotNrSuchen ein Zahlenfeld ist.
Wobei mir der Zusammenhang zur Ausgangsfrage (wie Änderungen erkennen) noch unklar ist.
Nach meinem Verständnis würde ich eine Änderung erkennen, wenn ich einen früheren Zustand mit einem aktuellen Zustand vergleiche.
Vielleicht habe ich aber die Frage nicht verstanden.
Harald
Zitat von: bahasu am November 15, 2013, 20:45:33
Hi Tom,
was passiert, wenn Du einen einfacheren Ansatz probierst, um den Fehler zu vermeiden:
Set Me!frm01MotorErfassungUfoMechDat.Form.Recordset = "SELECT * FROM tbl_MotorGrunddaten WHERE MotorGrunddatenID = " & Nz(Me!cboMotNrSuchen, 0)
Ich setze voraus, dass cboMotNrSuchen ein Zahlenfeld ist.
Hier erhalte ich einen Laufzeitfehler 424 - Objekt erforderlich.
Zitat von: bahasu am November 15, 2013, 20:45:33
Wobei mir der Zusammenhang zur Ausgangsfrage (wie Änderungen erkennen) noch unklar ist.
Nach meinem Verständnis würde ich eine Änderung erkennen, wenn ich einen früheren Zustand mit einem aktuellen Zustand vergleiche.
Vielleicht habe ich aber die Frage nicht verstanden.
Ich öffne z.B. einen vorhanden Datensatz, wenn jetzt hier in irgendeinem Feld etwas geändert wurde möchte ich das erkennen und erst mit einem Klick auf speichern die Änderung abspeichern.
-Tom-
Hi
Mist copy & paste
Set Me!frm01MotorErfassungUfoMechDat.Form.Recordsource = "SELECT * FROM tbl_MotorGrunddaten WHERE MotorGrunddatenID = " & Nz(Me!cboMotNrSuchen, 0)
Danke für die Erklärungen.
Es gibt das Ereignis "Vor Aktualisierung" {= Form_BeforeUpdate}.
Dort könntest Du eine Bedingung einbauen:
If MsgBox("Speichern", vbYesNo) = vbNo Then Me.Undo
Harald
Zitat von: bahasu am November 15, 2013, 22:45:16
Set Me!frm01MotorErfassungUfoMechDat.Form.Recordsource = "SELECT * FROM tbl_MotorGrunddaten WHERE MotorGrunddatenID = " & Nz(Me!cboMotNrSuchen, 0)
Gleicher Fehler -> Laufzeitfehler 424 - Objekt erforderlich.
Zitat von: bahasu am November 15, 2013, 22:45:16
Es gibt das Ereignis "Vor Aktualisierung" {= Form_BeforeUpdate}.
Dort könntest Du eine Bedingung einbauen:
If MsgBox("Speichern", vbYesNo) = vbNo Then Me.Undo
Dann erhalte ich beim wechsel zwischen dem Hfo und Ufos immer diese Meldung und das kann dann nerven.
-Tom-
Hi,
kannst Du eine komprimierte und gezippte a2003-Datenbank zur Verfügung stellen?
Harald
Hallo,
1)
Set Me!frm01MotorErfassungUfoMechDat.Form.Recordsource = "SELECT * FROM tbl_MotorGrunddaten WHERE MotorGrunddatenID = " & Nz(Me!cboMotNrSuchen, 0)
2)
ZitatWie kann ich nun Änderungen in den ganzen Formularen erkennen?
.
.
Dann erhalte ich beim wechsel zwischen dem Hfo und Ufos immer diese Meldung und das kann dann n
erven.
Tja, das ist doch was Du wolltest....(und die Frage Frage ist eigentlich, WARUM Du das willst.)
Bei einem Formularwechsel wird nun mal gespeichert...
Zitat
Wie kann ich nun Änderungen in den ganzen Formularen erkennen?
"Erkennen" durch Nutzung der Dirty-Eigenschaft (des jeweiligen Formulares) oder der Beforeupdate-Ereignisse der jeweiligen Forms, bzw. der einzelnen Steuerelemente, wenn man es "genauer" (differenzierter) haben will. Diese Situation eignet sich für diejenigen Fälle, in denen eine Speicherung (nach Prüfung auf Plausibilität) verhindert werden soll. Grundsätzlich nachzufragen, ist eher hinderlich (wie Du selber merkst).
Die AfterUpdate-Ereignisse kommen dann in Frage, wenn man sicher sein muss/will, dass die Werte gespeichert wurden und mit den gespeicherten Werten direkt weitergearbeitet werden soll.
Vielleicht sollte die Ablaufsteuerung nochmal überdacht werden.
Hi Tom,
sorry, für das set...
Ich brauche wohl eine neue Brille oder ein neues Hirn. ;D
Zitat von: -Tom- am November 18, 2013, 07:37:08
Dann erhalte ich beim wechsel zwischen dem Hfo und Ufos immer diese Meldung und das kann dann nerven.
wobei ich mich frage, warum das obige Ereignis alleine beim Wechsel (d.h. ohne jegliche Datenänderung) zwischen Formularen ausgelöst werden sollte.
Harald
Hallo,
ZitatSet Me!frm01MotorErfassungUfoMechDat.Form.Recordsource = "SELECT * FROM tbl_MotorGrunddaten WHERE MotorGrunddatenID = " & Nz(Me!cboMotNrSuchen, 0)
Danke, damit ist der Fehler weg.
Zitat
"Erkennen" durch Nutzung der Dirty-Eigenschaft (des jeweiligen Formulares) oder der Beforeupdate-Ereignisse der jeweiligen Forms
Ich werde das damit nochmal testen, denn der jetzige Versuch scheitert an weiteren Fehlermeldungen.
Zitatwobei ich mich frage, warum das obige Ereignis alleine beim Wechsel (d.h. ohne jegliche Datenänderung) zwischen Formularen ausgelöst werden sollte.
Das ist natürlich richtig dass das Ereignis auch nur bei einer Änderung auftreten sollte. Wie gesagt werde das nochmal testen.
Danke für die Hilfe!
-Tom-
Hallo,
Das mit dem erkennen von Änderungen im HFo und Ufo funktioniert nun wie gewünscht.
Nur habe ich das Problem dass wenn ich einen neuen Datensatz erstelle oder von einem leeren neuen DS in einen bestehenden DS wechsle das BeforeUpdate-Ereignis greift und mir eine Änderung erkennt die es nicht gibt.
Kann es sein dass das das durch die Verknüpfung von dem Hfo mit dem Ufo kommt?
Kann ich erkennen was geändert wurde?
Wie kann ich das ganze verhindern umgehen?
-Tom-
Hi,
kannst Du eine komprimierte + gezippte Datenbank im a2003-Format zur Verfügung stellen?
Harald
Bei neuen Datensätzen:
If Not Me.NewRecord Then ...
Zur Änderungsprotokollierung gibt es übrigens eine Demo: AccSampleAuditTrail.zip (http://www.dbwiki.net/wiki/Datei:AccSampleAuditTrail.zip)
Muss es auch zwei Archive aufteilen, sonst langen mir die 200KB nicht.
Zum entpacken das .txt bei der Dateiendung entfernen!
Das ganze passirt im Hfo "frm01MotorErfassung".
-Tom-
Zitat von: ebs17 am November 28, 2013, 19:51:07
Bei neuen Datensätzen:
If Not Me.NewRecord Then ...
Zur Änderungsprotokollierung gibt es übrigens eine Demo: AccSampleAuditTrail.zip (http://www.dbwiki.net/wiki/Datei:AccSampleAuditTrail.zip)
Das habe ich versucht, aber das BeforeUpdate-Ereignis wird zuvor ausgelöst und da enthält Me.NewRecord noch eine 0.
-Tom-
Hi,
die Dateien kann ich nicht öffnen (ZIP_Ordner ist ungültig.
Harald
Zitat von: bahasu am November 28, 2013, 21:34:31
Hi,
die Dateien kann ich nicht öffnen (ZIP_Ordner ist ungültig.
Harald
Jetzt aber -> Motordatenbank (http://www.weber-computerhilfe.de/temp/Motordatenbank21_2.zip)
Tom
Hi Tom,
1. Datei ist ladbar.
2. Herzlichen Gückwünsch zu den Beziehungen (gibt reichlich)
3. Kannst Du bitte beschreiben, wie Du vorgehst: Start-Formular ? Und dann?
Die Angaben helfen, dass ich nicht den Fehler suchen muss, sondern mich auf das Finden der Ursache konzentrieren kann.
Harald
Zitat von: bahasu am November 29, 2013, 16:24:54
2. Herzlichen Gückwünsch zu den Beziehungen (gibt reichlich)
Ich wurde hier ja von diesem Forum bestens unterstützt!
Zitat von: bahasu am November 29, 2013, 16:24:54
3. Kannst Du bitte beschreiben, wie Du vorgehst: Start-Formular ? Und dann?
Die Angaben helfen, dass ich nicht den Fehler suchen muss, sondern mich auf das Finden der Ursache konzentrieren kann.
1. Motordaten erfassen/ändern
2. Über Motornummer suchen einen Motor auswählen
3. Schaltfläche "Neu" drücken -> Jetzt sollte nicht die Abfrage "Änderungen speichern?" kommen.
4. jetzt erscheint ein Neuer leerer Datensatz
5. wenn ich nun auf Beenden drücke, erscheint auch die Meldung "Änderung speichern?" was aber bei einem leeren Datensatz auch nicht passieren soll.
Tom
Hi Tom,
Die geänderte gezippte Version ist mit 297 kb zu lang. Deshalb "nur" Kommentare.
Knackpunkt waren die Zuweisungen von ... = 0 im "Neu"-Button. Nach Deaktivieren mit "'" unterblieb der Änderungshinweis.
'30.11.2013 Me.frm01MotorErfassungUfoMechDat!kontr_thermo = 0
'30.11.2013 Me.frm01MotorErfassungUfoMechDat!kontr_fremdlüfter = 0
'30.11.2013 Me.frm01MotorErfassungUfoMechDat!kontr_korrossionsschutz = 0
'30.11.2013 Me.frm01MotorErfassungUfoMechDat!kontr_kondenswasserbohrung = 0
'30.11.2013 Me.frm01MotorErfassungUfoMechDat!kontr_säureschutz = 0
'30.11.2013 Me.frm01MotorErfassungUfoMechDat!kontr_rücklaufsperre = 0
Vom Problem unabhängig hatte ich Anweisungen von "Form.allow..." gegen "Me.allow..." getauscht.
In Ereignissen BeforeUpdate ist
If Me.Dirty = True Then
nicht notwendig.
Den Verweis auf "Web Office ..." mußte ich deaktivieren.
Harald
Danke!
Tom
Hallo,
Ich habe hier noch eine Frage, wie kann ich denn vom Hfo eine Funktion im Ufo aufrufen?
Habe es so versucht:
CheckInput = Forms!frm01MotorErfassungUfoMechDatUfoGetr.MechDatenPrüfen_neu()
Aber da erhalte ich immer einen Laufzeitfehler 2450 - ... kann das angegebene Formular frm01MotorErfassungUfoMechDatUfoGetr nicht finden.
Tom
Hi,
ist die Funktion wie folgt deklariert?
Public Function MechDatenPrüfen_neu() as boolean
Harald
Die Funktion war nicht als Public deklariert, hab es geändert.
Geht trotzdem nicht.
Das komische ist doch dass er das Formular nicht findet.
Tom
Hi Tom,
was passiert bei:
CheckInput = Me.frm01MotorErfassungUfoMechDat.Form.MechDatenPrüfen_neu
Harald
Das funktioniert, aber ich möchte ja auf das Ufo (frm01MotorErfassungUfoMechDatUfoGetr) unterhalb von dem Ufo (frm01MotorErfassungUfoMechDat) zugreifen.
So funktioniert es leider nicht:
CheckInput = Me.frm01MotorErfassungUfoMechDat.frm01MotorErfassungUfoMechDatUfoGetr.Form.MechDatenPrüfen_neu
Tom
Hi,
In dem Form gibt es nicht die gesuchte Funktion.
Dort finde ich nur: "MechDatenPrüfenGetr_neu".
Harald
Zitat von: bahasu am Dezember 09, 2013, 21:36:16
In dem Form gibt es nicht die gesuchte Funktion.
Dort finde ich nur: "MechDatenPrüfenGetr_neu".
Diese soll es auch sein, war ein Tippfehler.
Tom
Hi Tom,
mit einem Test-Aufruf, der im Hauptformular plaziert ist:
MsgBox Me.frm01MotorErfassungUfoMechDat!frm0403MotorSuchenUfoElDatUfoGetr.Form.MechDatenPrüfenGetr_neu
lande ich bei der Funktion.
Die Funktion muss deklariert sein als:
Public Function MechDatenPrüfenGetr_neu() As Boolean
Harald
Hallo,
warum wird nicht eine Public-Funktion in einem Standardmodul benutzt, die von allen Stellen in der Anwendung aus aufgerufen werden kann, statt dieser Vergewaltigungen von Klassenmodul-Funktionen und Verletzung der (erwünschten) Kapselung der formularbezogenen Prozeduren?
Hi,
vermutlich wird dieser Aufruf nicht mehr notwendig sein, wenn die Überprüfung auf vollständige Datenerfassung (siehe anderer Diskussionsbeitrag) wie gewünscht funktioniert.
Wenn wie dort vorgeschlagen die Prüfung vor dem Speichern erfolgt, musss nicht mehr im nachhinein aus anderen Formularteilen geprüft werden.
Harald