Hallo Zusammen,
vielen Dank für eure Hilfe. Durch eure Antworten zu meiner vorangegangenen Anfrage ("Neu hinzugekommene Datensätze bzw. entfallene Datensätze finden" - http://www.access-o-mania.de/forum/index.php?topic=22728.0 ) kann ich jetzt aus Abbildern von Datenbeständen, die zu verschieden Zeitpunkten erstellt wurden
- die von der älteren zur aktuelleren Version neu hinzugekommenen Datensätze herausfiltern,
- die von der älteren zur aktuelleren Version entfallenen Datensätze herausfiltern,
- einen neuen Gesamtdatenbestand erzeugen, der die entfallenen Datensätze noch enthält. Diese entfallenen Datensätze werden im Gesamtdatenbestand aber als "gelöscht" markiert.
Eine weitere Problemstellung muss ich aber noch lösen:
Innerhalb von Datensätzen, die sowohl im "alten" als auch im "aktuellen" Abbild des Datenbestandes enthalten sind, kann es in einem oder mehreren der Felder zu Veränderungen kommen.
- alt: "leer" --> neu: "Wert X"
- alt: "Wert X --> neu: "Wert Y"
- alt: "Wert X --> neu: "leer"
Genau diese Datensätze mit Veränderungen innerhalb von Feldern von einer Version zur nächsten möchte ich herausfiltern und dazu auch angezeigt bekommen, in welchem Feld sich Inhalte verändert haben. Möglicherweise ist dazu auch zu berücksichtigen, dass die Datensätze Textfelder und Zahlenfelder [Formate: Datum und Integer (long integer) enthalten?
Alternative A (Vielleicht ist dieses eine naive Vorstellung? ;) ) :
Gibt es eine "einfache" SQL-Abfrage, die solche Datensätze mit Veränderungen in den Feldern herausfiltert und dazu möglichst einfach/deutlich die Information liefert, in welchem Feld sich die Veränderung ergeben hat?
- Angabe Datensatz-ID, möglichst Nachname, Vorname, Adresse und dazu Feldname mit der Veränderung?
- Angabe Datensatz-ID, möglichst Angabe Nachname, Vorname, Adresse und dazu alle Felder, wobei jedoch alle unveränderten Felder leer bleiben und nur die Felder mit Veränderungen den neuen Feldinhalt darstellen? (Bei Löschungen von Feldinhalten sollte dort dann jedoch "NULL" und/oder "LZ / LEERE ZEICHENKETTE" stehen ...)
Alternative B
Ich fürchte jedoch, dass die "einfache" Alternative nicht zum Tragen kommt. :( Ist meine Vermutung richtig, dass eine SQL-Abfrage aller Datensätze mit Veränderungen in den Datenfeldern explizit alle zu vergleichenden Felder enthalten muss und darüber hinaus auch noch Feldformate und die Fälle "NULL" [ggfs. auch den Zahlenwert "0"] und "" d.h. "leere Zeichenkette" berücksichtigen muss? Wie sollte dann die Grundstruktur einer solchen Abfrage aussehen?
Viele Grüße
Thommy
Hallo zusammen,
für die umständliche Alternative habe ich wohl ein Vorgehen gefunden und werde es morgen mal posten. Aber vielleicht geht es ja auch noch einfacher ... ?
Gruß
Thommy
Hallo zusammen,
wie angekündigt, ist hier meine Lösung für die beschriebene Problemstellung anhand eines fiktiven Datenbeispiels. Vielleicht hilft dieser Ansatz anderen Interessierten auch weiter.
Alter Datenbestand (Tab_alt) :
ID Nachname Vorname Einsatz
11 Meier Tina 02.12.2017
12 Müller Martin
13 Lehmann Torsten 09.12.2017
14 Schulze Hermann
15 Schmidt Marc 02.12.2017
16 Becker Mia
Neuer Datenbestand (Tab_neu):
ID Nachname Vorname Einsatz
11 Meier Tina
13 Lehmann Torsten 02.12.2017
14 Schulze Hermann
15 Schmidt Marc 09.12.2017
16 Zimmermann Mia 02.12.2017
17 Glaser Simon
In den Datensätzen, die in beiden Datenbeständen vorkommen (11, 13, 14, 15, 16), gibt es folgende Veränderungen:
- eine Namensänderung (16) [z.B. durch Heirat/Scheidung]
- zwei Datumsänderungen(13, 15)
- ein weggefallenes Datum (11)
- ein hinzugekommenes Datum (16)
Mit folgendem Code erhalte ich alle Veränderungen innerhalb der Datensätze, die in beiden Datenbeständen vorkommen. (Zu neuen/weggefallenen Datensätzen s. meinen anderen Post, auf den ich im ersten Beitrag dieses Threads verwiesen habe):
SELECT Tab_alt.ID,
IIF (Tab_alt.Nachname <> Tab_neu.Nachname, "alt: " & Tab_alt.Nachname & " neu: " & Tab_neu.Nachname, "") AS Nachname,
IIF (
(Tab_alt.Einsatz <> Tab_neu.Einsatz)
OR
(Tab_alt.Einsatz IS NULL AND Tab_neu.Einsatz IS NOT NULL )
OR
(Tab_alt.Einsatz IS NOT NULL AND Tab_neu.Einsatz IS NULL), "alt: " & Tab_alt.Einsatz & " neu: " & Tab_neu.Einsatz, "") AS Einsatz
FROM Tab_neu INNER JOIN Tab_alt ON Tab_neu.ID = Tab_alt.ID
WHERE ( (Tab_alt.Nachname <> Tab_neu.Nachname)
OR ( (Tab_alt.Einsatz <> Tab_neu.Einsatz) OR (Tab_alt.Einsatz IS NULL AND Tab_neu.Einsatz IS NOT NULL ) OR (Tab_alt.Einsatz IS NOT NULL AND Tab_neu.Einsatz IS NULL) ) )
;
Ich vermute mal, dass es keine "elegantere" und vor allem wesentlich kürzere Alternative gibt? ...
Viele Grüße
Thommy