PDA

Vollständige Version anzeigen : oldvalue und NULL Wert


mille81
18.06.2012, 09:05
Hallo zusammen,

habe mir eine Funktion geschrieben, die mir eine History Tabelle füllen soll, damit man sehen kann was geändert wurde.

In diese steige ich hiermit ein:

Private Sub enddatum_AfterUpdate()
FunktionHistory "Enddatum", (Me!Enddatum.oldvalue), (Me!Enddatum), (Me!ID_VE)
End Sub

Das Problem ist, dass es ja sein kann, das das Feld Enddatum noch keinen Wert hat, oder einen Wert hat und man diesen löscht.

Dann kommt aber ein 94er Laufzeitfehler, Unzulässige Verwendung von Null.

Wie kann ich das am komfortabelsten machen, dass es trotzdem läuft?
Ich muss das AfterUpdate ja bei mehreren Feldern anwenden...

Anne Berg
18.06.2012, 09:13
Hallo,

das kommt ja wohl drauf an, welchen Typ von Parameter deine FunktionHistory erwartet und was sie damit macht.
Du wirst wohl zumindest die Deklaration der Feldwerte auf Variant ändern müssen.

mille81
18.06.2012, 09:34
Das waren Strings. Mit Variant klappt es, allerdings hab ich das Gefühl das jetzt alles etwas langsamer läuft???

Lanz Rudolf
18.06.2012, 19:59
Hallo
langsamer aber Richtig ;)
evtl.geht es auch wenn alle Betroffenen Felder (Formular u. Tabelle) als Date definiert sind, und beim Formular Feld auf isDate() geprüft wird.

Thomas Möller
18.06.2012, 20:11
Hallo!

habe mir eine Funktion geschrieben, die mir eine History Tabelle füllen soll, damit man sehen kann was geändert wurde.

Für diese Aufgabe habe ich ein Klassenmodul geschrieben. Du findest es hier:
http://www.team-moeller.de/?Downloads:TM-AenderungsProtokoll

Vielleicht kannst Du dort noch die eine oder andere Anregung entnehmen.

CU

Beaker s.a.
18.06.2012, 22:36
Hallo mille81,
Das waren Strings. Mit Variant klappt es, allerdings hab ich das Gefühl das jetzt alles etwas langsamer läuft???
Variant klappt immer (uuh, jedenfalls meistens), da es NULL sein kann.
IMO steht aber .OldValue in _AfterUpdate gar nicht mehr zur Verfügung (lasse mich aber wie immer gerne eines Besseren belehren).
Prüfe deshalb lieber noch mal ob da der gewünschte Wert übergeben wird.
gruss ekkehard

Anne Berg
18.06.2012, 22:44
Hallo,IMO steht aber .OldValue in _AfterUpdate gar nicht mehr zur Verfügungdu kannst dich leicht selbst eines Besseren belehren, indem du das einfach mal ausprobierst! :)

ebs17
19.06.2012, 09:24
Ggf. wäre noch die Überlegung anzustellen, ob man jede Feldänderung protokolliert (was derzeit der Fall ist), oder nur Änderungen eines Datensatzes.

mille81
19.06.2012, 15:05
@Thomas: Danke das schau ich mir mal an!

@Eberhard: Ist so gewollt jedes Feld, bzw. die Felder die ich ausähle zu protokollieren

Thomas Möller
19.06.2012, 17:03
Hallo Ekkehard,
IMO steht aber .OldValue in _AfterUpdate gar nicht mehr zur Verfügung (lasse mich aber wie immer gerne eines Besseren belehren).
Du brauchst Dich nicht beleheren lassen. Du hast schon recht. Das Before-Update-Ereignis zu verwenden ist aber auch nicht richtig. Das Update könnte durch den User oder durch eine Datenbankeinschränkung abgebrochen werden.
Der Trick besteht darin, den OldValue im Before-Update-Ereignis zu ermitteln und diesen dann im After-Update-Ereignis für die Speicherung in der Historie zu verwenden.

CU

ebs17
19.06.2012, 17:26
Ist so gewollt jedes Feld, bzw. die Felder die ich ausähle zu protokollieren
Letztendlich werden ja Datensätze (die aus einem Feld oder mehreren Feldern bestehen) in der gebundenen Tabelle gespeichert, nicht einzelne Felder.

Daher der Anstoß zur Überlegung, willst Du Änderungen von Datensätzen protokollieren oder auch zusätzlich (wie aktuell) beliebige Änderungen eines Feldes ohne Datensatzspeicherung.

Zur Protokollierung von Datensatzänderungen würde man dann BeforeUpdate und AfterUpdate des Formulares verwenden und dort alle zu berücksichtigenden Felder erfassen und protokollieren.

Beaker s.a.
19.06.2012, 22:19
Hallo,
@Anne
Nicht böse sein. Um diese Uhrzeit hab' ich Access
meist parallel gar nicht mehr offen, ich bin dann
einfach zu faul, meine Behauptung zu überprüfen :(

@Thomas
Danke.
Ich wollte aber den TS nur darauf hinweisen, dass er
durch Verwendung von Variant u.U. mit falschen Werten
rechnen muss.

gruss ekkehard

Anne Berg
19.06.2012, 22:23
Hi.Hallo Ekkehard,
IMO steht aber .OldValue in _AfterUpdate gar nicht mehr zur Verfügung (lasse mich aber wie immer gerne eines Besseren belehren).

Du brauchst Dich nicht beleheren lassen. Du hast schon recht.

Sorry, aber wieso macht sich eigentlich keiner von euch die Mühe, das zu überprüfen, anstatt hier weiterhin bloße Vermutungen zu verbreiten?!

Die Eigenschaft OldValue eines gebundenen Steuerelements ist definitiv auch im AfterUpdate-Ereignis noch verfügbar.

PS:
Die Antwort von Ekkehard habe ich erst nachträglich gelesen, da waren wir wohl beide gleichzeitig am Schreiben...

ebs17
19.06.2012, 22:57
Sorry, aber wieso macht sich eigentlich keiner von euch die Mühe, das zu überprüfen, anstatt hier weiterhin bloße Vermutungen zu verbreiten?!
Bei "keiner" fühle ich mich nicht angesprochen.
Die Eigenschaft OldValue eines gebundenen Steuerelements ist definitiv auch im AfterUpdate-Ereignis noch verfügbar.
Welches AfterUpdate-Ereignis meinst Du, und welches ist von Belang?

Natürlich ist die Eigenschaft OldValue generell verfügbar. Im Form_AfterUpdate ist aber der zurückgegebene Wert identisch mit dem Wert aus der Value-Eigenschaft, also ist der alte Wert verloren.

Bei den Control-Ereignissen gibt es natürlich den Unterschied, aber wie gesagt: Gespeichert wird nicht ein einzelnes Feld, sondern der Datensatz.

Also stellt sich immer noch die Frage: Möchte man Datensatzänderungen protokollieren, oder zusätzlich auch Vielfachänderungen von einzelnen Steuerelementen?

Anne Berg
19.06.2012, 23:24
@ebs17:Bei "keiner" fühle ich mich nicht angesprochen.das brauchst du auch nicht, denn in dem Beitrag bezog ich mich ausschließlich auf die dort zitierten Äußerungen von Ekkehard (Beaker s.a) und Thomas Möller.Welches AfterUpdate-Ereignis meinst Du, und welches ist von Belang?Auch hier gibt es für mich keinen Zweifel daran, dass es hier ausschließlich um das im ersten Beitrag des Threadstarters erwähnte AfterUpdate-Ereignis eines Steuerelements geht.

Warum verschwendest du also deine Energien auf derartige Wortklaubereien, anstatt dich auf konstruktive Beiträge zu konzentrieren, die allen Beteiligten und Mitlesern zugute kommen.

ebs17
20.06.2012, 10:59
Die Unterscheidung zwischen Control- und Form-Ereignissen und deren Benennung halte ich durchaus für deutlich mehr als Wortklauberei.

Thomas Möller
20.06.2012, 20:03
Hallo Anne,

Auch hier gibt es für mich keinen Zweifel daran, dass es hier ausschließlich um das im ersten Beitrag des Threadstarters erwähnte AfterUpdate-Ereignis eines Steuerelements geht.

meinen Aussagen beziehen sich auf das After-Update-Ereignis des Formulars. Ich persönlich sehe dieses Thema wie Eberhard: Eine Historisierung macht für mich nur auf Datensatzebene Sinn. Das Festhalten aller jemals im Steuerelement eingetragenen Werte halte ich nicht für zielführend, da so unter Umständen Eiinträge historisiert werden, die nie als Datensatz gespeichert wurden.

Was Deine Kritik angeht muss ich Dir Recht geben. Ich hätte deutlich herausstellen sollen, dass sich meine Aussage auf das Ereignis des Formulars und nicht des Steuerelements bezieht.

CU

Anne Berg
20.06.2012, 21:11
Hallo Thomas,Eine Historisierung macht für mich nur auf Datensatzebene Sinn.dem schließe ich mich gern an, nur hatte ich wohl bzgl. OldValue Scheuklappen aufgesetzt und mich diesbezüglich an der ursprünglichen Frage aufgehängt. So gesehen ist die Aussage "OldValue geht nicht im AfterUpdate-Ereignis" einfach falsch. Aber inzwischen sind wir ja auf einer Linie, denke ich. ;)

ebs17
21.06.2012, 12:46
Aber inzwischen sind wir ja auf einer Linie
Wenn Du akzeptieren könntest, dass es außerhalb des Scheuklappensichtbereiches bzw. außerhalb einer persönlichen Wahrnehmung auch Konstruktives geben kann, sicherlich.