Autor Beitrag
rob87
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 461

Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
BeitragVerfasst: Di 18.11.08 12:31 
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:


ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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'.

_________________
Na denn, dann. Bis dann, denn.
rob87 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 461

Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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...

_________________
Na denn, dann. Bis dann, denn.
rob87 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 461

Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 461

Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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

_________________
Na denn, dann. Bis dann, denn.
rob87 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 461

Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Di 18.11.08 15:22 
Also gehts wohl nicht. Spiel mal mit TClientDataset rum.

TClientDataset->TDataProvider->TIBQuery

_________________
Na denn, dann. Bis dann, denn.
rob87 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 461

Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
BeitragVerfasst: 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
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 461

Win Me, Win XP Home, Win XP Prof
Delphi 2007 Enterprise
BeitragVerfasst: 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 ;-)