![]() |
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? |
AW: Transaction auf Änderungen überprüfen
Wenn möglich verwende ich TClientDataSet, und habe damit eine Property
![]() In der ActionManager Eventbehandlung (OnUpdate) werden dann alle aktiven ClientDataSets geprüft, ob eines mit ChangeCount > 0 dabei ist. |
AW: Transaction auf Änderungen überprüfen
Ich habe gerade meine IBDAC-Hilfe nicht parat, aber vielleicht hilft
![]() |
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 |
AW: Transaction auf Änderungen überprüfen
werde ich mir morgen mal genauer ansehen... Danke =)
|
AW: Transaction auf Änderungen überprüfen
Zitat:
Ich brauche aber irgendwie ein Ereignis, um zu ermitteln, ob es Änderungen gibt. Zitat:
|
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. |
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 :-) |
AW: Transaction auf Änderungen überprüfen
Zitat:
Zitat:
Eine Gui ist wesentlich aufwendiger. Gruß K-H |
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. |
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) |
AW: Transaction auf Änderungen überprüfen
|
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