Access-o-Mania

Access-Forum (Deutsch/German) => Access-Hilfe => Thema gestartet von: malibum am Januar 30, 2017, 14:28:09

Titel: Änderungs-Historie
Beitrag von: malibum am Januar 30, 2017, 14:28:09
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
Titel: Re: Änderungs-Historie
Beitrag von: dedidado am Februar 01, 2017, 09:45:34
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
Titel: Re: Änderungs-Historie
Beitrag von: malibum am Februar 01, 2017, 15:51:10
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
Titel: Re: Änderungs-Historie
Beitrag von: malibum am Februar 01, 2017, 17:48:07
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
Titel: Re: Änderungs-Historie
Beitrag von: Beaker s.a. am Februar 01, 2017, 17:54:59
rsH.Fields(fld.Name) = rs.Fields(fld.Name).Value
Titel: Re: Änderungs-Historie
Beitrag von: malibum am Februar 02, 2017, 10:42:24
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ß  ???
Titel: Re: Änderungs-Historie
Beitrag von: dedidado am Februar 02, 2017, 13:45:43
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
Titel: Re: Änderungs-Historie
Beitrag von: malibum am Februar 02, 2017, 13:53:40
vielen Dank!!!!!  :D :D :D

es hat nun funktioniert habe es genauso eingegeben  :)
Titel: Re: Änderungs-Historie
Beitrag von: Beaker s.a. am Februar 02, 2017, 14:45:08
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.