Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi oldValue ändert sich nicht (https://www.delphipraxis.net/144558-oldvalue-aendert-sich-nicht.html)

HolgerCW 10. Dez 2009 16:40

Datenbank: ORACLE • Version: 10 • Zugriff über: BDE

oldValue ändert sich nicht
 
Hallo zusammen,

ich editiere eine Tabelle direkt in einem TDBGrid welches mit einer TTable verbunden ist.

Folgendes tue ich:

1. TTable.Open; -> Im Programm
2. Zellenwert in Spalte A ist 'Test'. -> Im Programm
3. Nun ändere ich den Zellenwert auf 'Test2'. -> Als Anwender

Wenn ich in dem Ereignis BeforePost das OldValue der Spalte A abfrage bleibt der Wert immer 'Test'.

Wie bekomme ich es hin, das der OldValue-Wert nach dem ändern des Zellenwertes automatisch diesen annimmt ?

Gruss

Holger

mirage228 10. Dez 2009 16:44

Re: oldValue ändert sich nicht
 
BeforePost ist imho auch nicht "nach dem Ändern" ;) - Evneutell OnAfterPost (oder so ähnlich)?

Mithrandir 10. Dez 2009 16:45

Re: oldValue ändert sich nicht
 
Ich kenn die TTable nicht, aber hat BeforePost vielleicht einen Boolean-Wert, den man entsprechend ändern muss, damit das Post ausgeführt wird? Manchmal muss auch ein bestimmter Wert (true bspw.) zurückgegeben werden.

Ist jetzt einfach mal so ins Blaue geschossen...

HolgerCW 10. Dez 2009 16:53

Re: oldValue ändert sich nicht
 
Habe vergessen zu sagen:

Wenn ich nun den Wert 'Test2' wieder in 'Test' ändere ist OldValue immer noch 'Test'. Somit kann ich nicht OldValue <> NewValue abfragen.

Es muss irgendeine Möglichkeit geben das der Wert nach dem ändern als oldValue übernommen wird.

Gruss

Holger

nahpets 11. Dez 2009 08:12

Re: oldValue ändert sich nicht
 
Hallo,

im BeforePost ist oldValue immer das, was vor dem Speichern in der Tabelle stand. Liegt bei dem Namen auch irgendwie nahe.
Wenn Du nun im BeforePost einen Wert änderst, ist er erst nach dem Post in der Datenbank. Du kannst die Änderungen daher erst nach dem Verlassen von BeforePost kontrollieren, also z. B. in AfterPost.

Willst Du die Änderungen aber bereits im BeforePost in die Datenbank schreiben, musst Du im BeforePost ein Post aufrufen. Dies könnte die unangenehme Nebenwirkung haben, dass dann zuerst wieder BeforePost aufgerufen wird, dass dann das Post aufruft, dass dann das BeforePost aufruft, dass dann...

Ausgehend von Deiner bisherigen Beschreibung, geht das, was Du da vorhast, nicht. Beschreibe Deine Wünsche bitte mal etwas genauer, eventuell läßt sich ja dann eine passende Lösung finden.

HolgerCW 11. Dez 2009 08:36

Re: oldValue ändert sich nicht
 
Danke schon mal für den Hinweis.

Ich möchte aber nicht IM BeforePost einen Wert ändern, sondern durch das Editieren des TDBGrid. Dadurch wird das BeforePost aufgerufen. In dem BeforePost möchte ich nur überprüfen ob sich ein Wert geändert hat.

Nur kann ich das nicht, da der OldValue-Wert immer gleich bleibt.

Ich muss wohl irgendwie im BeforePost oder AfterPost ncoh was machen, das der neue Wert auch endgültig übernommen wird.

Mache ich nämlich während des Editierens einen Refresh auf die TTable erscheinen wieder die Ursprungswerte (OldValues)

Gruss

Holger

nahpets 11. Dez 2009 09:03

Re: oldValue ändert sich nicht
 
Hallo,

da liegt glaub' ich ein Verständnisproblem vor:

oldValue bleibt bis zum Abschluss des Speichervorganges der alte Wert, also der, der vor dem Ändern im TDBGrid, in der Datenbank stand.
BeforePost wird aufgerufen, wenn die Speichervorgang angefordert wurde. Das kann z. B. im TDBGrid beim Wechseln der Zeile passieren oder, wenn man den DBNavigator benutzt, dort der Button für's Speichern betätigt wird...
Änderungen kannst Du nur dadurch erfahren, dass Du oldValue und newValue vergleichst. newValue müsste der im TDBGrid eingegebene Wert sein.

In BeforPost muss Du nur dann was machen, wenn Du die Eingabe z. B. kontrollieren willst oder Berechnungen durchführst, die in andere Spalten oder Tabellen übernommen werden, oder bei fehlerhafter Eingabe den Speichervorgang abbrechen willst...

Können Werte so, wie im TDBGrid eingegeben, gespeichert werden, sind BeforePost und AfterPost nicht erforderlich.

HolgerCW 11. Dez 2009 09:17

Re: oldValue ändert sich nicht
 
... und hier liegt der Fehler:

Zitat:

oldValue bleibt bis zum Abschluss des Speichervorganges der alte Wert
Wie löse ich den Speichervorgang aus ?

Zitat:

BeforePost wird aufgerufen, wenn die Speichervorgang angefordert wurde. Das kann z. B. im TDBGrid beim Wechseln der Zeile passieren.
Genau deshalb vergleiche ich dort OldValue mit NewValue, nach dem Wechseln der Zeile.

Es wird halt beim wechseln der Zeile der Wert nciht gespeichert, somit bleibt OldValue immer gleich. Wie löse ich somit beim Wechseln der Zeile auch den Speichervorgang aus ?

Wird nicht eigentlich durch das Wechseln der Zeile ein Post durchgeführt ? Nur finde ich halt komisch, das wenn ich danach die TTable schliesse und wieder öffne, die ursprünglichen Werte wieder erscheinen.

Kann das an dem CachedUpdates-Modus der TTable liegen ?

Gruss

Holger

mikhal 11. Dez 2009 09:43

Re: oldValue ändert sich nicht
 
Ich weiß jetzt nicht, wie das Zusammenspiel BDE->Oracle funktioniert, aber normalerweise musst du bei der Oracle-Datenbank ein Commit übergeben, damit die Werte auch tatsächlich in die Tabelle geschrieben werden.

Schau mal in den Eigenschaften der Connection und der TTable/TQuery, ob es dort eine Eigenschaft AutoCommit gibt und ob die gesetzt ist. Darüberhinaus könnte auch die Standard-Reaktion beim Scrollen im Grid auf RollBack gesetzt sein, dann wird grundsätzlich keine Änderung gespeichert. Ggf. musst du vor dem Scrollen testen, ob der Status des DataSets dsEdit oder dsInsert ist und dann vor dem Scrollen ein Post an die Datenbank senden, damit die Änderungen in der Tabelle auch eingetragen werden (Post sollte bei der BDE ein Commit an die Datenbank senden).

Grüße
Mikhal
[edit]...dicke Finger... [/edit]

HolgerCW 11. Dez 2009 09:57

Re: oldValue ändert sich nicht
 
Das war der Hinweis den ich brauchte.

Ich mache nun im Ereignis AfterPost auf die Tabelle folgendes und es klappt:

Delphi-Quellcode:
Table1.CommitUpdates;
Ich hatte vorher mit Table1.ApplyUpdates es ausprobiert. Das klappte aber nicht.

Vielen dank.

Gruss

Holger


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:48 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