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
//.. Eintragen von Edit1.Text in eine bestimmte Zelle des fokusierten DBGrid-Datensatzes. 
//   ABER!! Es soll eben ned der Datensatz sofort per Update-SQL in die DB geschrieben werden??
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

user profile iconalzaimar hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconalzaimar hat folgendes geschrieben Zum zitierten Posting springen:

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

user profile iconrob87 hat folgendes geschrieben Zum zitierten Posting springen:
Hierzu wird aber der DBNavigator benötigt, oder?
Oder irgendwie (Buttonclick) Dataset.Cancel aufrufen. Ein DBNavigator ist aber besser.
user profile iconrob87 hat folgendes geschrieben Zum zitierten Posting springen:
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...


rob87 - Di 18.11.08 13:06

user profile iconalzaimar hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconrob87 hat folgendes geschrieben Zum zitierten Posting springen:
Hierzu wird aber der DBNavigator benötigt, oder?
Oder irgendwie (Buttonclick) Dataset.Cancel aufrufen. Ein DBNavigator ist aber besser.
user profile iconrob87 hat folgendes geschrieben Zum zitierten Posting springen:
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...


Ok. Des test ich. Aber erst nach der Mittagspause :wink: In diesem Sinne: Mahlzeit!


rob87 - Di 18.11.08 14:05

user profile iconrob87 hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconalzaimar hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconrob87 hat folgendes geschrieben Zum zitierten Posting springen:
Hierzu wird aber der DBNavigator benötigt, oder?
Oder irgendwie (Buttonclick) Dataset.Cancel aufrufen. Ein DBNavigator ist aber besser.
user profile iconrob87 hat folgendes geschrieben Zum zitierten Posting springen:
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...


Ok. Des test ich. Aber erst nach der Mittagspause :wink: In diesem Sinne: Mahlzeit!


Also irgendwie funzt des ned. Hab mir ein DBGrid raufgezogen und über ne DS an ein Query gebunden und mir die DBEdit-Felder geholt. Aber Bearbeiten kann ich die ned. Kann des sein, dass ich da ne Table brauch und des mit nem Query ned geht?


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

user profile iconalzaimar hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconalzaimar hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconWPs hat folgendes geschrieben Zum zitierten Posting springen:
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 ;-)