![]() |
Änderungen im DBGrid nicht in die Datenbank übernehmen
Guten Tach
wenn ich in einem DBGrid, das über eine DataSource und eine AdoQuery gefüllt wird, etwas ändere dann soll diese Änderung nicht in die Datenbank übernommen werden... Quasi nur als Anzeige... (Datenbank wird mit einer eigenen Methode gefüllt in der die Daten noch bearbeitet werden) Hat jemand nen Plan ? |
Hallo Maa83,
die DBGrids sind natürlich dafür da, eine direkte Anbindung der Daten an die Datenbank vorzunehmen, genauer an die datenhaltenden Komponenten (Tables, Queries), die dann wiederum die Verbindung zur Datenbank übernehmen, das kann man auch nicht einfach abschalten. Die naheliegendste und allgemeinste Lösung besteht natürlich darin, einfach keine datensensitiven Controls zu verwenden, sondern stattdessen einfach TEdit, TStringgrid usw zu verwenden, und die Daten aus dem Dataset (TAdoQuery) hier reinzukopieren. Will man auf jeden Fall bei den datensensitiven Steuerelementen bleiben, so kann man die Daten selbst und die Anzeige der Daten mithilfe der Ereignisse der Feldkomponenten (Doppelclick auf die TADoQuery - komponente) beeinflussen. Weiterhin bietet sich die Möglichkeit an, Daten über InMemoryDatasets zu behandeln, also von der AdoQuery dorthin kopieren und zurück, oder über entsprechende Providerkomponenten ein Clientdataset zu befüllen, das dann auch die Möglichkeit bietet, zu einem selbst gewählten Zeitpunkt das zurückschreiben der Daten und ein eventuelles manipulieren der Daten vorzunehmen. Gruß Wolfgang |
ok danke erstmal
ich habs jetzt soweit das ich das posten abfange aber wie bekomme ich den Wert den ich in das dbGrid eingebe (während der Eingabe vor dem Post) Wenn man die Zelle abfragt bekommt man den alten Wert und nicht den gerade geschriebenen |
Hallo Maa83 8)
Dies ist ganz einfach... (Leider liegst Woki etwas daneben :D ) Du bedienst das Ganze in dem BeforePost – Ereignis Deiner DataSet (z.B. TQuery, TTable etc...). Angenommen Deine „Extra“ Prozedur für die Aktualisierung (z.B. mit einem INSERT INTO Konstrukt) der Tabelle heißt: PROCEDURE MeinBoforePost; Dann in dem Ereignis BoforePost Deiner DataSet (also dieser die per DataSource mit dem Grid verbunden ist) soll z.B. stehen: BEGIN MeinBeforePost; Abort; END; Und das war’s... :shock: Gruß Paul Jr. |
ich reagiere ja auch im BoforePost Ereignis
aber wie bekomme ich den Wert den ich gerade eingebe? |
Ach so... jetzt sehe ich die zweite Frage von Dir... :oops:
(...) aber wie bekomme ich den Wert den ich in das dbGrid eingebe (während der Eingabe vor dem Post) Wenn man die Zelle abfragt bekommt man den alten Wert und nicht den gerade geschriebenen (...) benutze hier z.B. Query- Live oder vielleicht den OnChange-Ereignis Deines Feldes (Tfield)..dieser Ereignis siehst Du wenn du in dem Felder-Editor deiner TDataSet (also z.B. mit einem Doppelklick auf Deine TdataSet- Komponente und dann das Feld auswählen) das Feld auswählst... Gruß Paul Jr. |
Sind meine Vorschläge nicht OK... dann musst Du die Hinweise von Woki beachten..., da so gesehen liegt ER doch NICHT daneben :lol: ... sorry Woki...
...Es seitdem du möchtest mit Transaktionen arbeiten.. :mrgreen: Gruß Paul Jr. |
Hallo,
ich denke nicht, daß ich danebenliege. Natürlich kann man in Beforepost Daten verändern, bevor sie in die Datenbank geschrieben werden, aber das gilt immer nur für einen Datensatz einer Datasetkomponente, und so war die Frage nicht formuliert. Weiterhin, das manipulieren des Records in Beforepost mit anschließendem abort hinterläßt das Dataset im Editmode, und verhindert das Editieren irgendeines anderen Datensatzes. Abort kann also die Lösung nicht sein, wen nman jemals weiterarbeiten will. Versuche jetzt hier wieder rauszukommen. z.B. mit Dataset.cancel; Dataset.refresh (um die hintenrum geänderten Daten zu bekommen) oder Dataset.cancel; Dataset.close (um die hintenrum geänderten Daten zu bekommen) Dataset.open Viel Spaß. Also für diesen Anwendungsfall, wenn es reicht Daten in Beforepost zu manipulieren, und dann zu posten fein, dazu ist es da, um ein Post für EINEN Datensatz zu verzögern auch, aber darüber hninaus... Für die verschiedenen Werte, Wert in Datenbank, Neuer Wert etc gibt es die Fieldeigenschaften TField.Value TField.NewValue TField.OldValue Beschreibung in Delphi Hilfe recht ausfühlich Gruß Wolfgang P.S. Für die Adokomponenten gilt: Besser auf TAdoQuery und TAdoTable verzichten, und TAdodataset mit den entsprechenden Einstellungen verwenden, und noch besser gleich auf TBetterAdodataset ausweichen, das spart viel Ärger. |
Klar Woki, ... hast Du Recht... habe das Cancel vergessen... so oder so... ist dieser vorgeschlagene Konstrukt von Maa83 sehr ungewöhnlich... und so gesehen... auch nicht empfehlenswert...
Also bleibt Cool Woki 8) ... weiter so... Gruß Paul Jr. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:04 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-2025 by Thomas Breitkreuz