Hallo,
in meiner Datenbank würde ich gerne wie folgt eine Historie für Änderungen anlegen.
In einer Tabelle sind diverse Produkte aufgeführt, die jeweils in bestimmten Ländern gesperrt sind.
Ein Datensatz besteht aus einer Produktnummer/Name/Land/Länderkürzel/Gesperrt ab/ Gesperrt bis/ Geändert von / Änderungsgrund.
Wenn nun an diesem Datensatz etwas geändert wird (egal was), soll der komplette neue Datensatz in eine neue Tabelle kopiert und abgespeichert werden.
Wie könnte ich den so etwas realisieren?
Ist dies nur mit viel VBA Aufwand möglich? (Da bin ich nicht gerade der Experte...) :o
Vielen Dank schon einmal im Voraus! :)
Lg
Malibum
wie wärs mit ner Anfügeabfrage?! und zwar im Ereignis "vor Aktualisierung" im Produkt-Formular,
dazu die Struktur der Produkttabelle kopieren, mit einem neuen PK (Autowert) versehen und fertig!
Ideal fände ich, wenn du die Protokolltabelle in einer neuen DB ablegst und entsprechend verknüpfst, denn die könnte schnell etwas größer werden. Muss nicht, könnte.
Gruß Dieter
Hallo Dieter,
danke schonmal für deine Antwort, dies könnte die Lösung des Problems sein.
Ich verstehe allerdings noch nicht ganz wie du das alles meinst...
Zitatdazu die Struktur der Produkttabelle kopieren, mit einem neuen PK (Autowert) versehen und fertig!
wäre super wenn du das etwas genauer beschreiben könntest :)
Theoretisch müsste der Datensatz vor der Aktualisierung nur in eine andere Tabelle dupliziert werden...
Gruß
Malibum
Hallo,
ich habe nach einiger Recherche folgenden Code gefunden:
ZitatPrivate Sub Form_BeforeUpdate(Cancel As Integer)
Dim rs As Recordset
Dim rsH As Recordset
Dim fld As Field
Set rsH = CurrentDb.OpenRecordset("tblAdresse_History", dbOpenDynaset)
Set rs = Me.RecordsetClone
rs.Bookmark = Me.Bookmark
rsH.AddNew
rsH!HistoryDate = Now
For Each fld In rs.Fields
rsH(fld.Name) = rs(fld.Name).Value
Next
rsH.Update
Set rs = Nothing
Set rsH = Nothing
End Sub
Diesen habe ich auch bei "vor Aktualisierung" eingefügt, allerdings kommt jedesmal der Debuger bei:
ZitatrsH(fld.Name) = rs(fld.Name).Value
Muss für "
fld.Name" der Originalfeldname hineingeschrieben werden oder nur für "fld.
Name" ?
und dies jeweils für jedes zu kopierende Feld wiederholen?!?
:o
und ja VBA ist nicht meine Welt...
Gruß
Malibum
rsH.Fields(fld.Name) = rs.Fields(fld.Name).Value
Hallo,
ZitatrsH.Fields(fld.Artikelnummer) = rs.Fields(fld.Artikelnummer).Value
Muss der jeweilige Feldname (hier Artikelnummer) an die Stelle wie oben im Code?
Bei mir geht es leider immer noch nicht...
Gruß ???
Hallo Malibum,
mit der Funktion geht es natürlich auch, viele Wege führen nach Rom ;)
Hab das eben mal auf die schnelle nachgestellt und es funktioniert.
Name durch Artikelnummer ersetzen ist falsch. fld.Name steht für Feldname und ergibt auch irgendwann "Artikelnummer", sofern das Feld in dieser Tabelle vorhanden ist.
Benutze die Zeile so wie sie >Beaker s.a.< korrigiert hat.
rsH.Fields(fld.Name) = rs.Fields(fld.Name).Value
Empfehlenswert wäre noch der Username, wenn der sich irgendwo (zentral) abgreifen lässt.
Gruß Dieter
vielen Dank!!!!! :D :D :D
es hat nun funktioniert habe es genauso eingegeben :)
Hallo,
Zitates hat nun funktioniert habe es genauso eingegeben :)
Hast du das aber nach
ZitatMuss der jeweilige Feldname (hier Artikelnummer) an die Stelle wie oben im Code?
auch verstanden?
Der Zugriff auf Tabellenfelder in einem RS erfolgt über dessen Fields-
Auflistung, so wie von mir gezeigt; - also allgemein
rs.Fields("Feldname") oder auch
rs.Fields(strVariable)Den könntest du hier natürlich auch "fest verdrahten". Macht aber ja
keinen Sinn, wenn du alle Felder ansprechen willst (Schleife). Da musst
du den Feldnamen auch aus der Name-Eigenschaft des Feldes (fld) auslesen.
gruss ekkehard
P.S. Auflistungen sind ein wichtiger Bestandteil von Access/VBA. In einer
ruhigen Minute vertiefe dich mal in das Objektmodell.