Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi [Firebild] Änderungen nach Insert gehen verloren (https://www.delphipraxis.net/95218-%5Bfirebild%5D-aenderungen-nach-insert-gehen-verloren.html)

BlueStarHH 3. Jul 2007 12:09

Datenbank: Firebird • Version: 1.5 • Zugriff über: IBX, TIBTable

[Firebild] Änderungen nach Insert gehen verloren
 
Hallo ich habe folgendes Problem: In einer Tabelle wird mit Insert ein neuer Kunde angelegt und einge Felder werden ausgefüllt. Die Daten werden mit Post gespeichert. Nun wird die Kundentabelle in den Edit-Modus versetzt und ein Feld geänder und mit Post gespeichert. Die Änderung wird in TDBEdits auch angezeigt. Wenn ich nun zu einem anderen Datensatz scrolle und wieder zum geänderten Datensatz zurück, sind die Änderungen immer noch sichtbar. Wird die Anwendung nun beendet und neu gestartet, ist der neue Kunde zwar da, aber die letzten Änderungen sind verschwunden. Dies passiert nur, wenn der Kunden mit Insert neu eingefügt wurde.
Beispielcode:

Delphi-Quellcode:
Kunden.Insert;
Kunden.FieldByName('KdNr').AsInteger := 123;
Kunden.FieldByName('Name').AsString := 'Schneider';
Kunden.Post;

Kunden.Edit;
Kunden.FieldByName('Firma').AsString := 'EineFirma'; //Diese Änderung verschwindet nach Programmende
Kunden.Post;
Kunden ist die TIBTable-Komponente. Diese ist mit einer TIBTransaction verknüpft. Die Einstellungen dieser sind:
DefaultAction:TACommitRetaining
Params: (Commited lesen)
read_committed
rec_version
nowait

Vielen Dank für eure Hilfe im Voraus!

mkinzler 3. Jul 2007 12:12

Re: [Firebild] Änderungen nach Insert gehen verloren
 
Anscheinend wird aper die Transaktion nicht comitted. Sorge mal manuell dafür.

BlueStarHH 3. Jul 2007 12:17

Re: [Firebild] Änderungen nach Insert gehen verloren
 
Liegt es wirklich am fehlenden Commit? Dann müssten ja alle Daten nicht da sein. Es fehlen aber nur die letzten Änderungen. Ich hab mal was getestet:

Delphi-Quellcode:
Kunden.Insert;
Kunden.FieldByName('KdNr').AsInteger := 123;
Kunden.FieldByName('Name').AsString := 'Schneider';
Kunden.Post;

Kunden.Edit;
Kunden.FieldByName('Firma').AsString := 'EineFirma';
Kunden.Post;

Transaction.Commit; //<--- NEU
Mit dem oberen Code ist das Resultat, das selbe: Die letzten Änderungen verschwinden!

BlueStarHH 3. Jul 2007 12:22

Re: [Firebild] Änderungen nach Insert gehen verloren
 
Ein zweiter Test:

Delphi-Quellcode:
Kunden.Insert;
Kunden.FieldByName('KdNr').AsInteger := 123;
Kunden.FieldByName('Name').AsString := 'Schneider';
Kunden.Post;

OldRecNo := Kunden.RecNo;
Transaction.Commit;
Kunden.Active := true;
Kunden.RecNo := OldRecNo;

Kunden.Edit;
Kunden.FieldByName('Firma').AsString := 'EineFirma';
Kunden.Post;
Nun sind die Änderungen zwar nach Programmende vorhanden. Es ergeben sich aber zwei neue Probleme: Das ganze sind nun zwei Transaktionen. Ich möchte aber nur eine haben, da es entwender komplett oder gar nicht eingetragen werden soll. OK, zur not könnte ich damit leben, wenn es gar nicht änders geht, aber schön ists nicht. Problem zwei: Den ausgewälten Datensatz über die RecNo wiederzufinden ist fehleranfällig, weil sich nach dem Commit die RecNo geändert haben könnte, wenn ein anderer User einen neuen Datensatz in die DB einfügt. Wie kann ich denn den vor Commit ausgewählten Datensatz nach dem Commit mit 100%iger Sicherheit wieder anspringen?

mkinzler 3. Jul 2007 12:24

Re: [Firebild] Änderungen nach Insert gehen verloren
 
Dann mußt du einen anderen Isolationslevel für die Transaktion nehmen und die se manuell Startne und committed/verwerfen.

BlueStarHH 3. Jul 2007 12:49

Re: [Firebild] Änderungen nach Insert gehen verloren
 
Zitat:

Zitat von mkinzler
Dann mußt du einen anderen Isolationslevel für die Transaktion nehmen und die se manuell Startne und committed/verwerfen.

OK, wenn ich das so mache, wie finde ich dann den Datensatz wieder, dervor dem Commit angezeigt wurde? Nach dem Commit die die Verbindung ja weg und beim Neuaufbau der Verbindung zur DB wird immer der erste Datensatz der Tabelle angezeigt.

mkinzler 3. Jul 2007 12:53

Re: [Firebild] Änderungen nach Insert gehen verloren
 
Ist das bei IBX der Fall? Normalerweise hat ja eine Transaktion nicht mit der Connection zu tun.

BlueStarHH 3. Jul 2007 12:58

Re: [Firebild] Änderungen nach Insert gehen verloren
 
Zitat:

Zitat von mkinzler
Ist das bei IBX der Fall? Normalerweise hat ja eine Transaktion nicht mit der Connection zu tun.

Ich formuliere es nochmal genauer: Die Verbindung zur Datenbank (TIBDatabse) ist nicht weg sondern die TIBTable ist nicht mehr aktiv nach einem Commit. D.h. nach einem Commit muss TIBTable.active wieder auf true gesetzt werden. Danach steht die TIBTable auf dem ersten Datensatz. Wie finde ich also den zuvor ausgewählen Datensatz? Verhalten sich andere Firebid-Komponenten anderer Hersteller nicht so? Ich dachte das wäre so gang und gäbe.

mkinzler 3. Jul 2007 13:02

Re: [Firebild] Änderungen nach Insert gehen verloren
 
Die Tranaktion dürfte eigentlich keine Wirkung auf das Aktiv-sein eines DataSets haben. Allerdings würde ich auch keine Table-Komponente nehmen.

BlueStarHH 4. Jul 2007 12:04

Re: [Firebild] Änderungen nach Insert gehen verloren
 
Zitat:

Zitat von mkinzler
Die Tranaktion dürfte eigentlich keine Wirkung auf das Aktiv-sein eines DataSets haben.

Haben sie aber leider. Das hat selbst der Entwickler der Komponenten in einer Newsgroup geschrieben...


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:14 Uhr.
Seite 1 von 2  1 2      

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