Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Delphi]Change log van een TClientDataSet presenteren

Pagina: 1
Acties:

  • pelleke
  • Registratie: Maart 2003
  • Laatst online: 08-11-2024

pelleke

Aut viam inveniam aut faciam

Topicstarter
Hallo!

Ik wil van een TClientDataSet de Change Log (als in Delta) aan de gebruiker presenteren, en wel zodanig dat de gedeletede records, de gewijzigde records en de verwijderde records getoond worden. Hier heb ik twee problemen mee:

1. Ik weet niet hoe ik de verwijderde records zichtbaar moet maken
2. Ik wil van alle gewijzigde records 1 vermelding zien van de uiteindelijk nieuwe veldwaarden. (gecombineerd met eventueel ongewijzigde.)

Ik heb het geprobeerd met twee workarounds te werken:
1.
code:
1
cdsDelta.Data:=cds.Delta;

2.
code:
1
2
3
4
5
6
7
    cdsDelta.XMLData:=cds.XMLData;
    cdsDelta.First;
    while not cdsDelta.EOF do
    begin
      if cdsDelta.UpdateStatus = usUnmodified then cdsDelta.Delete
      else cdsEdit.Next;
    end;


Bij de eerste optie werkt alles prima, maar krijg ik twee rijen voor een usModified record. Deze moeten dan samengevoegd worden.

Bij de tweede optie werken de usInserted en usModified allebei perfect, maar nu heb ik geen enkele manier om usDeleted items te laten zien.

Wie weet wat ik hieraan moet doen?

  • Vincenz0
  • Registratie: Augustus 2006
  • Laatst online: 25-09 14:06

Vincenz0

Coder

Ik denk dat je het beter op een andere manier kan oplossen;

Ik ga er van uit dat je een database zoals oracle gebruikt?

Ik heb dit opgelost door in elke tabel een kolom DELETED toe voegen met een bool type, als ik iets moest verwijderen uit de database werd de row geupdate met DELETED='1', die laat ik dus niet standaard in mijn selects zien. Als je die wel juist wilt zien zeg je dus:
SQL:
1
SELECT * FROM tabel WHERE DELETED='1';


hiernaast werk ik met een veld CHANGED met een TDateTime, hierin houd je dus de laatste wijziging bij van je regel. ik heb daarnaast ook een CREATED veld met de datum en tijd van waneer hij is aangemaakt, zo kun je dus een select maken van:
SQL:
1
SELECT * FROM tabel WHERE CHANGED <> CREATED;


Dit is een veel betere oplossing dan naar je client dataset te kijken, zeker als je meerdere users hebt die van de applicatie gebruik maken

Coding 4 Fun!


Verwijderd

Vincenz0 schreef op woensdag 12 maart 2008 @ 14:36:
Ik denk dat je het beter op een andere manier kan oplossen;

Ik ga er van uit dat je een database zoals oracle gebruikt?
Da's heel erg afhankelijk van de manier waarop je die ClientDataset gebruikt: uiteindelijk hangt er natuurlijk wel een vorm van database achter (of 't nou iets als Oracle is, of een setje csv-files), maar ClientDataset was oorspronkelijk onderdeel van Borland's (dure) MIDAS implementatie, en moest ook geschikt zijn voor offline gebruik (dus zonder de echte DB bij de hand, en later synchroniseren).

ClientDataset heeft me overigens nooit kunnen bekoren, eerst niet vanwege de prijs voor MIDAS die erachter hing (zouden klanten niet blij van worden), en later omdat 't nauwelijks meer bood dan m'n eigen kbmMemTable afgeleide die ook prima overweg kan met bv. XML-, csv- of tab delimited files/streams.

ClientDataset heeft bij mijn weten geen transactielog mechanisme, dus dat zul je client side moeten implementeren. Een extra DELETED kolom is dan wel een goed begin, maar dan houd je bij synchronisatie nog steeds een probleem: wat als je een record hebt gedelete, terwijl vlak daarvoor een collega datzelfde record heeft ge-update?
Dat zijn de leuke dilemma's bij datasets die je ook offline kunt gebruiken... ;)