Neuigkeiten:

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

Mobiles Hauptmenü

Protokollierung der Datensatzänderung (zB. TM-Änderungsprotokoll)

Begonnen von seppi, März 25, 2015, 10:42:25

⏪ vorheriges - nächstes ⏩

seppi

Hallo

Ich arbeite mit Ac2010 und VBA.

Ich möchte in einer Artikelverwaltung die Datensatzänderungen protokollieren. In einem Formular kann ich das mit oben erwähntem Programm TM-Änderungsprotokoll machen.

Diese Protokollierung greift aber nicht, wenn ich Daten einlese bzw. update.

Kann mir jemand eine Tipp geben, wie ich das umsetzen kann?

Danke, Seppi

Wurliwurm

Ich wüßte jetzt nicht, wie das gehen sollte. Nimm ein Datenbanksystem, da kann das (revisionssicher) eingebaut werden. Stichwort: Trigger

el_gomero

Hallo,

ab A10 gibt es die Datenmakros, die sind mit Triggern vergleichbar.


https://support.office.com/de-de/article/Erstellen-eines-Datenmakros-b1b94bca-4f17-47ad-a66d-f296ef834200
Gruß
Jürgen


Hilfe nach bestem Wissen, ohne Anspruch auf Richtigkeit und Vollständigkeit.
*feedback erwünscht*
Bitte Tipps lesen

seppi

Danke für die Anregung.

Ich habe mir ein Video von Lorenz Hölscher zum Thema Makro reingezogen. Sehr Interessant.
Ich konnte mir aber kein Makro erstellen, das ein Änderungs-Protokoll einzelner Spalten schreibt.

Kannst du/jemand mir helfen? Mit einem Beispiel oder einem Link?


DF6GL

Hallo,

vielleicht solltest Du erklären, was hier genau gemacht wird:

Zitat... wenn ich Daten einlese bzw. update.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

el_gomero

Moin,

Zitat
Ich habe mir ein Video von Lorenz Hölscher zum Thema Makro reingezogen. Sehr Interessant.
Ich konnte mir aber kein Makro erstellen, das ein Änderungs-Protokoll einzelner Spalten schreibt.

Kannst du/jemand mir helfen? Mit einem Beispiel oder einem Link?

1. habe ich von DATENMAKRO und nicht von Makro gesprochen und 2. steht oben bereits ein link  ::)
Gruß
Jürgen


Hilfe nach bestem Wissen, ohne Anspruch auf Richtigkeit und Vollständigkeit.
*feedback erwünscht*
Bitte Tipps lesen

seppi

Danke dem Beitrag
Datenmakro für Änderungen funktioniert, bis auf ....
konnte ich mein Problem lösen (hoffentlich).

Dank an alle.
Seppi


seppi

Ich stehe wieder an:

Ich möchte einen Datensatz aktualisieren und Änderungen in den Feldern tblArtikelNeu.artName und tblArtikelNeu.artRdvpr protokollieren. Protokolldatei ist tblZugriff.

Das geht auch wunderschön - wenn ich nur ein Feld ändere!

Das Problem ist, dass nur die letzte Änderung protokolliert wird:
- wenn ich artName und dann artRdvpe ändere, wird artRdvpe protoklliert
- wenn ich artRdvpe und dann artName ändere, wird artName protokolliert

Mein Datenmakro (verkürzt):
Wenn Aktualisiert("artName") Oder Aktualisiert("artRdvpe")
   Datensatz erstellen in tblZugriff
      Festlegen Feld: Name = tblZugriff.zugDatum
                            Wert = jetzt()
      Festelegen Feld .... weitere allgemeine Felder

      Wenn Aktualisiert("artName")
          Festlegen Feld: Name = tblZugriff.zugFeld
                                  Wert = "artName"
          Festlegen Feld: Name = tblZugriff.zugWertAlt
                                Wert = [alt].[artName]
          Festlegen Feld: Name = tblZugriff.zugWertNeu
                                Wert = [tblArtikelNeu].[artName]
      Wenn Aktualisiert("artRdvpe")
          Festlegen Feld: Name = tblZugriff.zugFeld
                                  Wert = "artRdvpe"
          Festlegen Feld: Name = tblZugriff.zugWertAlt
                                Wert = [alt].[artRdvpe]
          Festlegen Feld: Name = tblZugriff.zugWertNeu
                                Wert = [tblArtikelNeu].[artRdvpe]

Das geht so nicht. Wie müsste ich das angehen?

Gruss, Seppi


Könnt ihr das lesen?
<?xml version="1.0" encoding="UTF-16" standalone="no"?>
<DataMacros xmlns="http://schemas.microsoft.com/office/accessservices/2009/11/application"><DataMacro Event="AfterUpdate"><Statements><ConditionalBlock><If><Condition>Updated("artRdvpe") Or Updated("artName")</Condition><Statements><Comment>Die Felder artRdvpe und artName ... sollen protokolliert werden</Comment><CreateRecord><Data><Reference>tblZugriff</Reference></Data><Statements><Comment>Zuerst die allgemeinen Infos protokollieren, wie Tabelle, Datum, User</Comment><Action Name="SetField"><Argument Name="Field">tblZugriff.zugRecID</Argument><Argument Name="Value">[tblArtikelNeu].[artID]</Argument></Action><Action Name="SetField"><Argument Name="Field">tblZugriff.zugTabelle</Argument><Argument Name="Value">"tblArtikelNeu"</Argument></Action><Action Name="SetField"><Argument Name="Field">tblZugriff.zugDatum</Argument><Argument Name="Value">=Now()</Argument></Action><Action Name="SetField"><Argument Name="Field">tblZugriff.zugRecID</Argument><Argument Name="Value">[tblArtikelNeu].[artID]</Argument></Action><Action Name="SetField"><Argument Name="Field">tblZugriff.zugUser</Argument><Argument Name="Value">DB_Benutzer()</Argument></Action><Comment>Jetzt spezifische Felder protokollieren: Feldname und Key (ArtNummer...), Werte alt/neu</Comment><ConditionalBlock><If><Condition>Updated("tblArtikelNeu.artRdvpe")</Condition><Statements><Action Name="SetField"><Argument Name="Field">tblZugriff.zugFeld</Argument><Argument Name="Value">"artRdvpe"</Argument></Action><Action Name="SetField"><Argument Name="Field">tblZugriff.zugKey</Argument><Argument Name="Value">[tblArtikelNeu].[artLiefNrID]</Argument></Action><Action Name="SetField"><Argument Name="Field">tblZugriff.zugWertAlt</Argument><Argument Name="Value">[Old].[artRdvpe]</Argument></Action><Action Name="SetField"><Argument Name="Field">tblZugriff.zugWertNeu</Argument><Argument Name="Value">[tblArtikelNeu].[artRdvpe]</Argument></Action></Statements></If></ConditionalBlock><ConditionalBlock><If><Condition>Updated("tblArtikelNeu.artName")</Condition><Statements><Action Name="SetField"><Argument Name="Field">tblZugriff.zugFeld</Argument><Argument Name="Value">"artName"</Argument></Action><Action Name="SetField"><Argument Name="Field">tblZugriff.zugKey</Argument><Argument Name="Value">=[tblArtikelNeu].[artNummer] &amp; "Art-Nummer"</Argument></Action><Action Name="SetField"><Argument Name="Field">tblZugriff.zugWertAlt</Argument><Argument Name="Value">[Old].[artName]</Argument></Action><Action Name="SetField"><Argument Name="Field">tblZugriff.zugWertNeu</Argument><Argument Name="Value">[tblArtikelNeu].[artName]</Argument></Action></Statements></If></ConditionalBlock></Statements></CreateRecord></Statements></If></ConditionalBlock></Statements></DataMacro></DataMacros>

DF6GL

Hallo,

wozu der ganze Heckmeck?

Die Frage nach
Zitatwenn ich Daten einlese bzw. update.
hast Du noch nicht beantwortet.

Wenn dafür Aktions-Abfragen verwendet werden, kannst Du doch gleich die darin benutzten Daten in der Historien-Tabelle auch fortschreiben...


Manuell und direkt in Tabellen zu werkeln, muss "verboten" sein/werden.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

seppi

Hallo DF6GL

Auch eine Gruss vom Bodensee - Schweizerseite und nur über Ostern.

Ich vermittle Artikelstämme zwischen dem Grosshandel und den Detailisten. Der gesamt Artikelstamm ist ca. 50'000 Artikel stark. Ich möchte beim Updaten eines Artikelstamms nicht alle Artikel anschauen, sondern nur die 'wichtigsten'.

Der Artikelstamm wird gegen 50 Felder/Spalte haben. Einige Felder sind wichtiger als andere. Ich möchte protokolliert haben, wenn sich die Einkaufs-Verpackungseinheit ändert oder das Gewicht oder der Artikeltext oder der Preis (Preis-Tabelle) oder... Ich möchte aber nicht informiert werden, wenn sich der Warenbereich ändert oder der Lieferant oder der Mehrwertsteuer-Code.

Ich habe mal mit dem Änderungsprotokoll angefangen. Natürlich möchte ich auch über Neuanlagen informiert werden. Die nächste Herausforderung wird dann die Information über das Löschen sein. D.h., wenn ein Artikel vom Grosshändler nicht mehr geliefert wird, aber der Detailhändler den Artikel noch im Laden hat. 

Mein Protokoll (und Historie) soll die tblZugriff sein (Felder wie zugTabelle, zugFeld, zugKey, zugWertAlt, zugWertNeu, zugDatum, zugUser, zugRecID).

Wenn du einen besseren Weg kennst, lasse ich mich gerne belehren. So wie ich das aufgebaut habe, bzw. aufzubauen gedenke, ist es schreib-intensiv und fehleranfällig beim Programmieren.

Gruss, Seppi

DF6GL

Hallo,

ZitatIch möchte beim Updaten eines Artikelstamms nicht alle Artikel anschauen, sondern nur die 'wichtigsten'.

WIE machst Du dieses Updaten??


Was die "wichtigsten" sind, kannst Du ja selber bestimmen, bzw. weißt die ja.

Wenn davon ausgegangen werden kann, dass  eine Tabelle (Artikelstamm) mit den Werten aus einer anderen Tabelle aktualisiert wird, so kann durch Verknüpfen der beiden Tabellen und Verwendung eines Kriteriums bei den interessierenden Spalten  eine passende Abfrage erstellt werden.

Luft-SQL:

Select * from Tabelle1 inner join Tabelle2 on Tabelle1.ArtikelNr = Tabelle2.ArtikelNr
Where Tabelle1.Feld1 <> Tabelle2.Feld1 or
Tabelle1.Feld3 <> Tabelle2.Feld3 .....
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access