Entwickler-Ecke
Datenbanken - Schreiben in DBGrid
rob87 - Di 18.11.08 12:31
Titel: Schreiben in DBGrid
Hallo,
ich habe folgendes kleine Problem:
Szenario: DBGrid-Formular (mit einem Query als Dataset) und paar weitere Edit-Felder...
Nun sollen beim OnExit eines Edit-Feldes, der Wert in einer bestimmten Zelle des fokusierten DBGrid-Eintrages angezeigt werden, aber dieser Inhalt soll noch
nicht per Update-SQL in die DB. Soweit klar? :?: :?: :roll:
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure TForm1.Edit1Exit(Sender: TObject); begin end; |
Ist sowas möglich. Oder muss ich da ein StringGrid nehmen??
alzaimar - Di 18.11.08 12:33
Solange Du den Datensatz mit 'Post' nicht speicherst, wird auch nichts in die DB geschrieben. Verwende doch einfach ein TDBEdit und gib den Anwender die Möglichkeit, seine Änderungen per 'Cancel' zu verwerfen. Das TDBEdit macht das 'Edit/Append' von ganz alleine.
Um eine bessere Kontrolle über das Speicherverhalten zu bekommen, verwende ein TClientDataset under bei ADO den LockType 'ltBatchOptimistic'.
rob87 - Di 18.11.08 12:58
alzaimar hat folgendes geschrieben : |
| Solange Du den Datensatz mit 'Post' nicht speicherst, wird auch nichts in die DB geschrieben. Verwende doch einfach ein TDBEdit und gib den Anwender die Möglichkeit, seine Änderungen per 'Cancel' zu verwerfen. Das TDBEdit macht das 'Edit/Append' von ganz alleine. |
Hierzu wird aber der DBNavigator benötigt, oder? Denn wenn ich so meine DBEdit-Felder z.B. aus einer Query-Komponente "rauszieh", kann ich an meinen DBEdit-Feldern nix ändern. Hab auch schon "ReadOnly" überprüft.
alzaimar hat folgendes geschrieben : |
Um eine bessere Kontrolle über das Speicherverhalten zu bekommen, verwende ein TClientDataset under bei ADO den LockType 'ltBatchOptimistic'. |
Des schau ich mir separat nochmal an, da ich am Dataset eg nix ändern wollt/sollt, wenns ned unbedingt sein muss.
alzaimar - Di 18.11.08 13:03
rob87 hat folgendes geschrieben : |
| Hierzu wird aber der DBNavigator benötigt, oder? |
Oder irgendwie (Buttonclick) Dataset.Cancel aufrufen. Ein DBNavigator ist aber besser.
rob87 hat folgendes geschrieben : |
| Denn wenn ich so meine DBEdit-Felder z.B. aus einer Query-Komponente "rauszieh", kann ich an meinen DBEdit-Feldern nix ändern. Hab auch schon "ReadOnly" überprüft. |
Was willst Du denn ändern. Probier doch einfach mal. Einfach raufschmeissen, im DBGrid einen Datensatz auswählen und dann im TDBEdit irgendwas ändern und per TAB in das Dataset übernehmen. Erst wenn Du im DBGrid die Zeile wechselst, wird das 'Post' ausgelöst... Mit ESC im Eingabefeld kannst Du die vorläufige Änderung wieder rückgängig machen...
alzaimar - Di 18.11.08 15:13
Kommt drauf an, ob die Query 'updateable' ist. Dann müsstest du aber mit Cached Updates arbeiten bzw. mit diesem LockType. Prüfe außerdem, ob die Query-Komponente eine Eigenschaft 'ReadOnly' hat, die Du ggf. auf False setzt.
Wenn das alles nicht geht, hilft nur ein TClientDataset
rob87 - Di 18.11.08 15:20
alzaimar hat folgendes geschrieben : |
Kommt drauf an, ob die Query 'updateable' ist. Dann müsstest du aber mit Cached Updates arbeiten bzw. mit diesem LockType. Prüfe außerdem, ob die Query-Komponente eine Eigenschaft 'ReadOnly' hat, die Du ggf. auf False setzt.
Wenn das alles nicht geht, hilft nur ein TClientDataset |
Ob die Query "updateable" is, weiß ich ned. Is eine TIBQuery-Komponente. Und Cached Updates bzw. LockTypes sagt mir gar nix!!
Die Query-Komponente hat keine Eigenschaft "ReadOnly". Ich verzweifle noch :cry:
alzaimar - Di 18.11.08 15:22
Also gehts wohl nicht. Spiel mal mit TClientDataset rum.
TClientDataset->TDataProvider->TIBQuery
rob87 - Di 18.11.08 15:32
alzaimar hat folgendes geschrieben : |
Also gehts wohl nicht. Spiel mal mit TClientDataset rum.
TClientDataset->TDataProvider->TIBQuery |
Ich weiß grad ned so genau, was du meinst? Versteh ned ganz.
Edit: Hab grad was interessantes herausgefunden: Ich hab mal mit meinem DBGrid einmal ein IBQuery verbunden und einmal eine IBTable. Zusätzlich hab ich noch nen DBnavigator dazugeschaltet. Und nun das Ergebnis:
- Mit ner Table-Komponente kann ich Datensätze bearbeiten, anlegen....
- Mit ner Query-Komponente kann ich nur zwischen den einzelnen Datensätzen scrollen.
Daraus folgere ich dass man mit query-komponenten keine datensätze in dbedit-feldern bearbeiten kann, oder? :cry:
WPs - Di 18.11.08 21:57
| Zitat: |
| Daraus folgere ich dass man mit query-komponenten keine datensätze in dbedit-feldern bearbeiten kann, oder |
Na,na
ich glaube weder daß Borland uns die ganzen Jahre belogen hat, noch daß ich persönlich bei editierbaren querys immer im Nirwana war.
Aber es stimmt, daß es durchaus querys gibt, die nur read-only, also nicht editierbar sind: z.B. solche über mehrere Tabellen -hast Du leider ncht angegeben-.
Also ich denke Dein Ansatz dies über ein StringGrid zu lösen wäre ok. Doch auch hier mußt Du den Satz ja nach dem-geänderten- (db)edit-Feld ändern.
Bei der Nutzung eines DB-Grids und eines DB-edit solltest Du halt im Kopf behalten, daß dies Daten-sensitive Komponenten sind. D.h. nichts anderes, daß diese zuerst einmal nur für die Sichtbarkeit der dahinterliegenden Daten sorgen.
Willst Du also in einem dbedit Feld Daten ändern und diese im DB-Grid auch ansehen, tauchen diese erst auf wenn sie geschrieben wurden.
Alzaimars Idee dies zurückzusetzen, bei Fehler etc., z.B. über einen button, wäre also die einzige Möglichkeit. Und hier trifft sich deine Arbeit wieder bei der Nutzung eines String-Grids
Dort halt 1. string[i]:=neuer Wert 2. string[i]:=alterWert
oder 1. dbedit feld ändern,verlassen -wird gepostet 2. sowas wie update feld value alter-Wert.
Eine andere Lösung kann ich nicht sehen.
Werner
rob87 - Mi 19.11.08 15:44
WPs hat folgendes geschrieben : |
| Zitat: | | Daraus folgere ich dass man mit query-komponenten keine datensätze in dbedit-feldern bearbeiten kann, oder |
Na,na
ich glaube weder daß Borland uns die ganzen Jahre belogen hat, noch daß ich persönlich bei editierbaren querys immer im Nirwana war.
Aber es stimmt, daß es durchaus querys gibt, die nur read-only, also nicht editierbar sind: z.B. solche über mehrere Tabellen -hast Du leider ncht angegeben-.
Also ich denke Dein Ansatz dies über ein StringGrid zu lösen wäre ok. Doch auch hier mußt Du den Satz ja nach dem-geänderten- (db)edit-Feld ändern.
Bei der Nutzung eines DB-Grids und eines DB-edit solltest Du halt im Kopf behalten, daß dies Daten-sensitive Komponenten sind. D.h. nichts anderes, daß diese zuerst einmal nur für die Sichtbarkeit der dahinterliegenden Daten sorgen.
Willst Du also in einem dbedit Feld Daten ändern und diese im DB-Grid auch ansehen, tauchen diese erst auf wenn sie geschrieben wurden.
Alzaimars Idee dies zurückzusetzen, bei Fehler etc., z.B. über einen button, wäre also die einzige Möglichkeit. Und hier trifft sich deine Arbeit wieder bei der Nutzung eines String-Grids
Dort halt 1. string[i]:=neuer Wert 2. string[i]:=alterWert
oder 1. dbedit feld ändern,verlassen -wird gepostet 2. sowas wie update feld value alter-Wert.
Eine andere Lösung kann ich nicht sehen.
Werner |
OK. Danke euch. Ich werd vermutlich heut nichts mehr mit dem Projekt machen (wurde prioritätsmäßíg nach hinten verschoben). Aber falls ich zu dem Thema mal wieder Ffagen haben sollte, meld ich mich.
Thread gilt somit von meiner Seite aus als beantwortet ;-)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!