Supportnet / Forum / Datenbanken
Datensatzänderungen dokumentieren
Frage
Hallo,
wenn in einem Formular Änderungen an einem bereits vorhandenen Datensatz gemacht werden, dann möchte/muss ich diese Änderungen in eine externe Tabelle ablegen. Ich habe eine entsdprechende Abfrage erstellt, welche beim Ereignis "nach Aktualisierung" ausgeführt wird. Dies klappt auch, leider jedoch nicht mit größeren Textfeldern (255) oder Memofeldern. Ich arbeite mit Access 2000.
Antwort 1 von ThomasOOP
die datentypen in beiden tabellen stimmen überein ?
vieleicht wäre es sinnvoll nur in einer tabelle zu bleiben und ein flag zu setzen + den datensatz neu einzufügen
oder geht das nicht wegen der referenziellen integrität ?
vieleicht wäre es sinnvoll nur in einer tabelle zu bleiben und ein flag zu setzen + den datensatz neu einzufügen
oder geht das nicht wegen der referenziellen integrität ?
Antwort 2 von Renate
Die Datentypen stimmen überein. In der gleichen Tabelle kann ich nicht bleiben wegen der referenziellen I. Wenn die Text- bzw. Memofelder nur mit wenig Text belegt sind, dann funktioniert das auch. Sowie der Text etwas ausgiebiger wird, dann fliegt mir alles um die Ohren.
Antwort 3 von ThomasOOP
vieleicht kanns einfach die db nicht
access ist in punkto leistungsfähigkeit nicht gerade berühmt, eher berühmt berüchtigt ;-)
versuch mal folgendes
leg den datensatz ohne die memos erstmal an und dann ...
update tabelle1 a, tabelle2 b set a.feld1 = b.feld, a.feld2 ..... where a.PK ( primary key ) = zahl and b.PK = zahl
ist zwar teuflisch umständig
aber besser als nix
hoffe das ich keinen fehler in der logik habe
access ist in punkto leistungsfähigkeit nicht gerade berühmt, eher berühmt berüchtigt ;-)
versuch mal folgendes
leg den datensatz ohne die memos erstmal an und dann ...
update tabelle1 a, tabelle2 b set a.feld1 = b.feld, a.feld2 ..... where a.PK ( primary key ) = zahl and b.PK = zahl
ist zwar teuflisch umständig
aber besser als nix
hoffe das ich keinen fehler in der logik habe
Antwort 4 von Renate
Danke ThomasOOP, werde ich mal versuchen,
Antwort 5 von MickK
Hallo bekommst Du denn eine Fehlermeldung? Vielleicht kannst Du mal das SQL der Abfrage (im Abfrageentwurf unter Ansicht SQL zu finden) veröffentlichen.
Gruss
Mick
Gruss
Mick
Antwort 6 von Renate
Gerne! Hier das SQL der Abfrage "Historie_schreiben" in abgespeckter Form, wobei [Beschreibung] das Textfeld (250) ist:
INSERT INTO Historie ( [Key], Beschreibung, ErfDatum, [Historie erstellt], [von User] )
SELECT [Forms]![Bearbeitung]![Key] AS [Key], [Forms]![Bearbeitung]![Beschreibung] AS Beschreibung, [Forms]![Bearbeitung]![ErfDatum] AS ErfDatum, Now() AS [Historie erstellt], [Forms]![aktUser]![UserID] AS [von User];
Dies wird dann "vor Aktualisierung" ("nach" geht auch nicht) als folgende Ereignisprozedur aufgerufen:
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim DocName As String
DoCmd.SetWarnings False
DocName = "Historie_schreiben"
DoCmd.OpenQuery DocName, acViewNormal, acEdit
DoCmd.SetWarnings True
Exit_Form_BeforeUpdate:
Exit Sub
Err_Form_BeforeUpdate:
MsgBox Error$
Resume Exit_Form_BeforeUpdate
End Sub
Wie gesagt, steht im Textfeld nicht zu viel Text, dann funktioniert das.
Als Fehlermeldung kommt das:
Laufzeitfehler '3001' ungültiges Argument
Wenn ich dann debugge, ist "DoCmd.OpenQuery DocName, acViewNormal, acEdit" markiert. Vielleicht kann ja da was optimiert werden. Bin noch nicht so fit im Umgang mit Prozeduren. Wäre sehr dankbar für einen guten Tipp.
INSERT INTO Historie ( [Key], Beschreibung, ErfDatum, [Historie erstellt], [von User] )
SELECT [Forms]![Bearbeitung]![Key] AS [Key], [Forms]![Bearbeitung]![Beschreibung] AS Beschreibung, [Forms]![Bearbeitung]![ErfDatum] AS ErfDatum, Now() AS [Historie erstellt], [Forms]![aktUser]![UserID] AS [von User];
Dies wird dann "vor Aktualisierung" ("nach" geht auch nicht) als folgende Ereignisprozedur aufgerufen:
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim DocName As String
DoCmd.SetWarnings False
DocName = "Historie_schreiben"
DoCmd.OpenQuery DocName, acViewNormal, acEdit
DoCmd.SetWarnings True
Exit_Form_BeforeUpdate:
Exit Sub
Err_Form_BeforeUpdate:
MsgBox Error$
Resume Exit_Form_BeforeUpdate
End Sub
Wie gesagt, steht im Textfeld nicht zu viel Text, dann funktioniert das.
Als Fehlermeldung kommt das:
Laufzeitfehler '3001' ungültiges Argument
Wenn ich dann debugge, ist "DoCmd.OpenQuery DocName, acViewNormal, acEdit" markiert. Vielleicht kann ja da was optimiert werden. Bin noch nicht so fit im Umgang mit Prozeduren. Wäre sehr dankbar für einen guten Tipp.

