Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Änderungs-Historie

Begonnen von malibum, Januar 30, 2017, 14:28:09

⏪ vorheriges - nächstes ⏩

malibum

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

dedidado

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

malibum

#2
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

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

Beaker s.a.

rsH.Fields(fld.Name) = rs.Fields(fld.Name).Value
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

malibum

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ß  ???

dedidado

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

malibum

vielen Dank!!!!!  :D :D :D

es hat nun funktioniert habe es genauso eingegeben  :)

Beaker s.a.

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.
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)