Delphi - Rekordok változásának nyomonkövetése

forráskód letöltése
Adott a következő feladat: van egy adatbázis tetszőleges szerkezettel. Amennyiben változik az adatbázis bármelyik rekordjának tartalma, akkor szükséges eltárolni az eredeti tartalmat is mielőtt az új tárolásra kerül. Ha ez ismét változik, akkor ismét el kell tárolni. Tehát egy-egy rekordot többször is el kell menteni ha változik, lényeg, hogy minden egyes tartalma meglegyen, a későbbiek folyamán vissza lehessen keresni.

Ezt megoldhatnánk úgy is, hogy létrehozunk egy második adatbázist és ott tároljuk el a változott rekordokat, de mi lenne, ha az egészhez csak egy adatbázist használnánk... Adott a következő feladat: van egy adatbázis tetszőleges szerkezettel. Amennyiben változik az adatbázis bármelyik rekordjának tartalma, akkor szükséges eltárolni az eredeti tartalmat is mielőtt az új tárolásra kerül. Ha ez ismét változik, akkor ismét el kell tárolni. Tehát egy-egy rekordot többször is el kell menteni ha változik, lényeg, hogy minden egyes tartalma meglegyen, a későbbiek folyamán vissza lehessen keresni.

Ezt megoldhatnánk úgy is, hogy létrehozunk egy második adatbázist és ott tároljuk el a változott rekordokat, de mi lenne, ha az egészhez csak egy adatbázist használnánk...


Ha elindítja a mellékelt példát, akkor a felső TDBGrid-ben látja az aktuális rekordokat, míg ha lépked ezen, akkor az alsó TDBGird-be megjelennek a fent kiválasztott rekord előző verziói.

Mindez egyetlen adatbázisban van. A fenti mégis úgy viselkedik, hogy csak a legutóbbi változatok látszanak, alul pedig mindig megkapjuk a régebbi változatokat.

Az ötlet lényege az, hogy felveszünk logikai típusú mezőt is az adatbázisba. Itt tároljuk el azt az információt, hogy az adott rekord eredeti, vagy már változtatott. Ekkor egy szűrés segítségével könnyen előállíthatjuk azt az adatbázis tartalmat, amelyben csak a legutóbbi állapot látszik.

Mivel az adatbázisban az ID mező egy egyedi kulcs, így egy TQuery segítségével könnyen kilistázhatjuk azokat a rekordokat, melyek már a régebbi verziók és a Table1 komponensben aktuálisan a kijelölthöz tartoznak.

A példa egyszerűségéért most a három alapműveletnél, az új rekord hozzáadása, módosítás és törlés automatikusan megtörténik véletlen értékek felhasználásával.

Az új rekord felvételénél nincs is különösebb teendőnk.

Módosításnál első lépésként megjelöljük az aktuális rekordot, hogy már változott az értéke. Eltároljuk az ID mezőt és ezek után létrehozunk egy új rekordot, amelynél az ID mezőt az imént eltárolt értékre állítjuk. Ezek után már tetszőlegesen meg lehet változtatni a többi mező tartalmát.

Törlésnél csupán annyi a dolgunk, hogy töröljük az összes olyan rekordot az adatbázisból, amelynek az ID mezője egyezik az aktuális rekordéval. Ehhez legegyszerűbb, ha beállítunk egy szűrő feltételt, melynek hatására csak ezeket a rekordokat fogjuk látni. Ekkor már csak törölni kell mindaddig, amíg van rekord a szűrt adatbázisban.