Zitat von
mquadrat:
Eine Tabelle in der mit einem extra Gültigkeitsdatum gearbeitet wird, macht nur Sinn wenn man die Daten immer aus dem Kundenstamm holt und im Einzelfall nicht mehr ändert. Beispiel Zahlungsart: Wenn alle Vorgänge über die Zahlungsart gehen, die im Kundenstamm verknüpft sind kann man mit der Referenztabelle arbeiten, wird aber für einen Vorgang eine abweichende Zahlart vorgesehen so müssen die Daten beim Vorgang gespeichert werden.
Das ist nicht ganz richtig. Es muss nur klar sein, das eine einfache Historie nicht genügt.
Erforderlich ist ein Protokoll, das den Zustand der entsprechenden Stammdaten zu jedem Zeitpunkt, insbesondere der Rechnungslegung wiederspiegelt.
Eine Historie kann ich im nachhinein ändern oder es können auch schon zukünftige Änderungen erfasst werden.
Beispiel für eine Historie von Adressen eines Kunden
ID_KD, GUELTIG_AB, STRASSE
17012, "05.12.1980", "Blaustraße 1"
Der Kunde teilt uns mit, er zieht in 5 Wochen um:
ID_KD, GUELTIG_AB, STRASSE
17012, "05.12.1980", "Blaustraße 1"
17012, "06.03.2009", "Grünstraße 2"
Eine Rechnung am "02.03.2009 10:03" erstellt, wird an die "Blaustraße 1" adressiert.
Eine Wochen später teilt uns der Kunde mit, er ist doch schon 2 Wochen früher umgezogen:
ID_KD, GUELTIG_AB, STRASSE
17012, "05.12.1980", "Blaustraße 1"
17012, "20.02.2009", "Grünstraße 2"
Wenn wir uns jetzt beim Druck einer Rechnungskopie auf die Historie verlassen, erscheint auf der Rechnungskopie plötzlich "Grünstraße 2".
In einem Protokoll gibt es praktisch nur Inserts(kein Update oder Delete).
Deshalb ist es möglich die für die Rechnung gültige Straße eindeutig zu bestimmen:
ID, GEAENDERT, ID_KD, GUELTIG_AB, STRASSE
1, "05.12.1980 10:13", 17012, "05.12.1980", "Blaustraße 1"
2, "09.02.2009 13:45", 17012, "06.03.2009", "Grünstraße 2"
3, "05.03.2009 09:30", 17012, "20.02.2009", "Grünstraße 2"
Der Eintrag mit der ID=3 darf für die Rechnungskopie nicht berücksichtigt werden, da GEAENDERT > Zeitpunkt der Rechnungserstellung.
select strasse
from tabelle
order by id_kd desc, geaendert desc
where (id_kd = :id_kd) and (geaendert <= :rechnungserstellung)
rows 1
Der Einfachkeit halber kann man bei der Rechnung auch einfach die ID aus dem Protokoll speichern.
Damit ersparrt man sich auch Ärger mit ungenauem Zeitstempeln oder eventuell parallelen Transaktionen bei der Rechnungserstellung.