Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Transaction auf Änderungen überprüfen (https://www.delphipraxis.net/171982-transaction-auf-aenderungen-ueberpruefen.html)

Morphie 5. Dez 2012 14:41

Datenbank: Firebird • Version: 2.5 • Zugriff über: IBDAC

Transaction auf Änderungen überprüfen
 
Zuerst mal: Ich habe eine Connection, eine Transaction, diverse Queries, DataSources, DBGrids und DBEdits.

Ich möchte dem Anwender jetzt die Möglichkeit geben, Änderungen an allen Daten durchführen zu können.
Die Änderungen sollen aber noch nicht sofort in die Datenbank geschrieben werden, sondern erst per Knopfdruck.

Beim Speichern führe ich einfach ein Commit der Transaction aus und alle Daten sind gespeichert.
Führe ich das Commit nicht aus (z.B. weil ich das Fenster einfach schließe) sind die Änderungen verworfen (automatisches Rollback).

Jetzt ist es so, dass der Speichern-Button (der mit einer TAction verknüpft ist), immer aktiv ist. Er ist also auch aktiv, wenn überhaupt keine Änderung durchgeführt wurde.

Gibt es einen sauberen Weg, den Button / die Action nur zu aktivieren, wenn sich auch wirklich etwas an den Daten geändert hat (Update / Insert)? Also quasi eine "Ist die Transaction dirty?"-Abfrage
Oder muss ich jedes DataSet überwachen und ein Boolean-Feld "FDataModified" einführen?

mjustin 5. Dez 2012 14:53

AW: Transaction auf Änderungen überprüfen
 
Wenn möglich verwende ich TClientDataSet, und habe damit eine Property

http://docwiki.embarcadero.com/Libra...et.ChangeCount

In der ActionManager Eventbehandlung (OnUpdate) werden dann alle aktiven ClientDataSets geprüft, ob eines mit ChangeCount > 0 dabei ist.

DeddyH 5. Dez 2012 16:35

AW: Transaction auf Änderungen überprüfen
 
Ich habe gerade meine IBDAC-Hilfe nicht parat, aber vielleicht hilft dieser Thread weiter?

Lemmy 5. Dez 2012 20:06

AW: Transaction auf Änderungen überprüfen
 
Hi,

hast Du schon mal die Ereignisse von IBCTransaction angeschaut?

Bei mir gibts da OnStart, OnCommit und OnRollback - das sollte doch ausreichen um deinen Button zu steuern?

Grüße

Morphie 5. Dez 2012 20:28

AW: Transaction auf Änderungen überprüfen
 
werde ich mir morgen mal genauer ansehen... Danke =)

Morphie 6. Dez 2012 08:30

AW: Transaction auf Änderungen überprüfen
 
Zitat:

Zitat von DeddyH (Beitrag 1194466)
Ich habe gerade meine IBDAC-Hilfe nicht parat, aber vielleicht hilft dieser Thread weiter?

Also die Eigenschaft Active steht bei mir immer auf true. Ist ja auch klar, da die Transaktion ja bereits aktiviert wird, wenn ich mir die Daten aus der Datenbank hole...
Ich brauche aber irgendwie ein Ereignis, um zu ermitteln, ob es Änderungen gibt.

Zitat:

Zitat von Lemmy (Beitrag 1194483)
Hi,

hast Du schon mal die Ereignisse von IBCTransaction angeschaut?

Bei mir gibts da OnStart, OnCommit und OnRollback - das sollte doch ausreichen um deinen Button zu steuern?

Grüße

Hier gilt das gleiche... OnStart wird ausgeführt, sobald ich mir die Daten hole... Das mache ich im OnCreate der Form. Somit ist der Speichern-Button immer aktiv.

haentschman 6. Dez 2012 08:51

AW: Transaction auf Änderungen überprüfen
 
Guten Morgen... :hi:

unabhängig von der Frage eine Bemerkung. Transaktionen sollten so kurz wie möglich offen gehalten werden. Schon gar nicht über die Programmlaufzeit. Denkanstoß: Was passiert wenn eine Transaktion offen ist und die Putze den Stecker vom Computer rauszieht ? 8-) Der bessere Weg ist die Daten z.B. in Objekten / Listen zu halten, ein Event bei Änderungen auslösen, das Objekt in eine "Changed List" eintragen und ggf. ein Changed Flag setzen. Diese Daten können dann in einem schnellen Rutsch aktualisiert werden.

Morphie 6. Dez 2012 10:15

AW: Transaction auf Änderungen überprüfen
 
Wenn ich dich richtig verstehe, würdest du von Datensensitiven Controls abraten, bzw. eine weitere Zwischenschicht zwischen Datenzugriff und Präsentation ziehen?
Dann wären wir wieder beim leidigen Thema "Wie binde ich dann eine Liste von Objekten einfach an meine GUI?"
Und nimmt mir Delphi da die Arbeit fürs ChangeTracking ab?

Soweit mir bekannt, ist das in Delphi nur mit viel Programmieraufwand möglich.
Der RAD-Ansatz geht meiner Meinung nach dabei flöten... Ich lasse mich aber gern eines besseren belehren :-)

p80286 6. Dez 2012 10:44

AW: Transaction auf Änderungen überprüfen
 
Zitat:

Zitat von Morphie (Beitrag 1194512)
Wenn ich dich richtig verstehe, würdest du von Datensensitiven Controls abraten, bzw. eine weitere Zwischenschicht zwischen Datenzugriff und Präsentation ziehen?

Jo

Zitat:

Zitat von Morphie (Beitrag 1194512)
Dann wären wir wieder beim leidigen Thema "Wie binde ich dann eine Liste von Objekten einfach an meine GUI?"
Und nimmt mir Delphi da die Arbeit fürs ChangeTracking ab?

Soweit mir bekannt, ist das in Delphi nur mit viel Programmieraufwand möglich.
Der RAD-Ansatz geht meiner Meinung nach dabei flöten... Ich lasse mich aber gern eines besseren belehren :-)

Mal abgesehen von den vielen Schlagworten die Du nutzt, ich hab da kein Problem, meine Daten in ein paar Records und Listen unter zu bringen. Einmal ordentlich definiert, Ruhe für die nächste Zeit.
Eine Gui ist wesentlich aufwendiger.

Gruß
K-H

haentschman 6. Dez 2012 10:49

AW: Transaction auf Änderungen überprüfen
 
Kurz nur meine, und nur meine :zwinker:, Meinung...

Ich habe früher auch mit datensensitiven Controls gearbeitet. Es war manchmal ein Krampf es vernünftig zum Laufen zu kriegen je komplexer das ganze wurde. Seit ich die Datensätze als Objekte abbilde (über eine Zwischenschicht) ist es viel einfacher und übersichtlicher. Man kann z.B. in den Objekten Informationen als Properties ablegen welche nicht in der Datenbank stehen.

Einfaches Beispiel:

Früher:
- Query -> DataSource -> DBGrid.
- Änderungen (Edit) an der Query
- zurückschreiben über ApplyUpdates
-> ging nicht bei komplexen Queries die Daten aus verschiedenen Tabellen beinhalten.
-> Transaktionssteuerung teilweise kompliziert bis unmöglich

Heute:
- Query -> DS werden zu Objekten gewandelt -> in generischer Objektlist abgelegt (Zwischenschicht)
- Listview z.B. -> Objekt Properties zur Visualisierung -> Objekt in Data abgelegt (Pointer auf das Objekt in Liste)
- über Data des Listvieweintrages kann man direkt auf das Objekt zugreifen, Properties ändern etc.
- jedes Objekt weiß dann selbst ob es geändert wurde (Property Changed z.B.)
- beim Speichern erledigt die "Zwischenschicht" den Datenbankzugriff und generiert die SQL Statements, Transaktionen etc.
--> Vorteil: Der Listview ist es egal wo die Daten herkommen... aus Datenbank, XML, CSV etc. und ist damit leicht austauschbar (Optik vieleicht)

Der RAD Ansatz geht, wie du schon sagtest, flöten... Ich habe aber das Gefühl, daß man seine Anwendung besser im Griff hat wenn man mit Objekten arbeitet. Der Aufwand ist natürlich höher. Rechnet sich aber je komplexer das wird.

Morphie 6. Dez 2012 10:54

AW: Transaction auf Änderungen überprüfen
 
Hm, ich schlaf mal ne Nacht drüber... ;-)
Aber so in etwa mache ich es in C# / WPF auch... Nur halt mit fertigen Mappern (EntityFramework)

mkinzler 6. Dez 2012 11:05

AW: Transaction auf Änderungen überprüfen
 
ORMs/Mapper gibt es auch für Delphi
http://code.google.com/p/delphi-orm/
http://tiopf.sourceforge.net/
http://code.google.com/p/g-framework/
http://www.remobjects.com/da/
http://www.tmssoftware.com/site/aurelius.asp
http://sourceforge.net/projects/larryhengensopf/
...


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz