Edit von Records eines DBGrids und Aktualisieren des Grids
Edit von Records eines DBGrids und Aktualisieren des Grids
Hallo zusammen,
ich habe eine Frage zum Bearbeiten von Datensätzen eines DBGrids.
Gegeben ist folgendes Szenario: ich habe ein DBGrid, das mir eine Liste von Datensätzen anzeigt. Diese kommen aus SQLQuery1. Beim Doppelklick auf eine Zeile wird mit "Show" (nicht "ShowModal") ein Dialogfenster geöffnet, in dem der aktuelle Datensatz bearbeitet werden kann. In diesem neuen Fenster wird der Datensatz mittels SQLQuery2 eingelesen, die den Primärschlüssel des Datensatzes als Parameter erhält. Beim Klicken auf OK werden die Updates mit "CommitRetaining" an die Datenbank geschickt und das Fenster geschlossen. Nun hat aber SQLQuery1 noch den alten Inhalt und das Grid zeigt somit den Datensatz so an, wie er vor der Bearbeitung war.
Wie kann ich nun auf elegante Weise und ohne zu enge Kopplung der Objekte dem DBGrid bzw. SQLQuery1 mitteilen, dass sich die Datensätze geändert haben und sie neu eingelesen werden sollen? Mit "ShowModal" könnte ich das Ergebnis des Dialogs abfragen und dann SQLQuery1 neu öffnen, was den aktuellen Zustand einlesen würde. Damit wäre das Problem gelöst.
Irgendwo habe ich allerdings gelesen, dass die Verwendung von "ShowModal" verpönt ist, weil es den Anwender blockiert.
Da ich wahrscheinlich nicht der Erste bin, der mit diesem Problem konfrontiert ist, meine Frage an Euch: wie löst Ihr dieses Problem?
Vielen Dank für Eure Hilfe!
Ralf (DL5EU)
ich habe eine Frage zum Bearbeiten von Datensätzen eines DBGrids.
Gegeben ist folgendes Szenario: ich habe ein DBGrid, das mir eine Liste von Datensätzen anzeigt. Diese kommen aus SQLQuery1. Beim Doppelklick auf eine Zeile wird mit "Show" (nicht "ShowModal") ein Dialogfenster geöffnet, in dem der aktuelle Datensatz bearbeitet werden kann. In diesem neuen Fenster wird der Datensatz mittels SQLQuery2 eingelesen, die den Primärschlüssel des Datensatzes als Parameter erhält. Beim Klicken auf OK werden die Updates mit "CommitRetaining" an die Datenbank geschickt und das Fenster geschlossen. Nun hat aber SQLQuery1 noch den alten Inhalt und das Grid zeigt somit den Datensatz so an, wie er vor der Bearbeitung war.
Wie kann ich nun auf elegante Weise und ohne zu enge Kopplung der Objekte dem DBGrid bzw. SQLQuery1 mitteilen, dass sich die Datensätze geändert haben und sie neu eingelesen werden sollen? Mit "ShowModal" könnte ich das Ergebnis des Dialogs abfragen und dann SQLQuery1 neu öffnen, was den aktuellen Zustand einlesen würde. Damit wäre das Problem gelöst.
Irgendwo habe ich allerdings gelesen, dass die Verwendung von "ShowModal" verpönt ist, weil es den Anwender blockiert.
Da ich wahrscheinlich nicht der Erste bin, der mit diesem Problem konfrontiert ist, meine Frage an Euch: wie löst Ihr dieses Problem?
Vielen Dank für Eure Hilfe!
Ralf (DL5EU)
- m.fuchs
- Lazarusforum e. V.
- Beiträge: 2805
- Registriert: Fr 22. Sep 2006, 19:32
- OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
- CPU-Target: x86, x64, arm
- Wohnort: Berlin
- Kontaktdaten:
Re: Edit von Records eines DBGrids und Aktualisieren des Gri
Hm, diese Ansicht kenne ich jetzt so nicht, würde ich auch nicht so vertreten. Es ist richtig, für den Anwender kann es von Nachteil sein, wenn ein Fenster modal geöffnet wird. Wenn er zum Beispiel für die Dateneingabe gerne mal einen Blick in das andere Fenster werfen möchte (und mit dem anderen Fenster dazu interagieren muss). Wenn das in deinem Programm nicht unbedingt der Falls sein muss, hielte ich ein modales Öffnen für legitim.dl5eu hat geschrieben:Wie kann ich nun auf elegante Weise und ohne zu enge Kopplung der Objekte dem DBGrid bzw. SQLQuery1 mitteilen, dass sich die Datensätze geändert haben und sie neu eingelesen werden sollen? Mit "ShowModal" könnte ich das Ergebnis des Dialogs abfragen und dann SQLQuery1 neu öffnen, was den aktuellen Zustand einlesen würde. Damit wäre das Problem gelöst.
Irgendwo habe ich allerdings gelesen, dass die Verwendung von "ShowModal" verpönt ist, weil es den Anwender blockiert.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
Re: Edit von Records eines DBGrids und Aktualisieren des Gri
ShowModal ist eine Lösung.
Unschön: könntest auch einen zirkulären Zugriff machen.
Ich selber nutze bei so einer Struktur meist eine Abfrage á la
Unschön: könntest auch einen zirkulären Zugriff machen.
Ich selber nutze bei so einer Struktur meist eine Abfrage á la
Code: Alles auswählen
procedure TForm1.FormActivate(Sender: TObject);
begin
if Form2.Visible then begin
Form2.Close;
DBGridQuery.Refresh;
end;
end;
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Beiträge: 152
- Registriert: Mo 3. Feb 2014, 14:07
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
Re: Edit von Records eines DBGrids und Aktualisieren des Gri
Eine weitere Möglichkeit wäre im ein zu machen.
Code: Alles auswählen
SQLQuery2.AfterPost
Code: Alles auswählen
SQLQuery1.Refresh
.
Re: Edit von Records eines DBGrids und Aktualisieren des Gri
Hallo baumina,
Die Lösung von Michl gefällt mir besser, da sich alles in einer Form abspielt. Allerdings hat sie den Nachteil, dass das Grid auch dann refreshed wird, wenn sich nichts geändert hat. Vielleicht fällt mir ja noch etwas ein
Grüße,
Ralf
womit ich dann aber eine enge Kopplung der beiden Queries hätte, was ich, wenn möglich, gerne vermeiden möchte.baumina hat geschrieben:Eine weitere Möglichkeit wäre imeinCode: Alles auswählen
SQLQuery2.AfterPost
zu machen.Code: Alles auswählen
SQLQuery1.Refresh
Die Lösung von Michl gefällt mir besser, da sich alles in einer Form abspielt. Allerdings hat sie den Nachteil, dass das Grid auch dann refreshed wird, wenn sich nichts geändert hat. Vielleicht fällt mir ja noch etwas ein

Grüße,
Ralf
-
- Beiträge: 152
- Registriert: Mo 3. Feb 2014, 14:07
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
Re: Edit von Records eines DBGrids und Aktualisieren des Gri
Dann setz halt in dem einen Formular im AfterPost eine Variable (z.B. PleaseDoRefresh), die du im anderen Formular wieder abfragst.
.
Re: Edit von Records eines DBGrids und Aktualisieren des Gri
Hallo baumina,
Bisher habe ich allerdings die Forms nach dem Schließen immer gleich wieder zerstört. Das sollte ich dann wohl besser lassen
Grüße,
Ralf
Danke für den Hinweis. Da hätte ich eigentlich selbst drauf kommen müssen.baumina hat geschrieben:Dann setz halt in dem einen Formular im AfterPost eine Variable (z.B. PleaseDoRefresh), die du im anderen Formular wieder abfragst.
Bisher habe ich allerdings die Forms nach dem Schließen immer gleich wieder zerstört. Das sollte ich dann wohl besser lassen

Grüße,
Ralf
-
- Beiträge: 152
- Registriert: Mo 3. Feb 2014, 14:07
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
Re: Edit von Records eines DBGrids und Aktualisieren des Gri
Kannst doch trotzdem ein caFree im FormClose machen, wenn wir mal bei Michls Beispiel bleiben
Code: Alles auswählen
procedure TForm1.FormActivate(Sender: TObject);
begin
if Form2.Visible then begin
If Form2.PleasDoRefresh then DBGridQuery.Refresh;
Form2.Close;
end;
end;
.
Re: Edit von Records eines DBGrids und Aktualisieren des Gri
Stimmt, Danke.
Ich denke halt manchmal viel zu kompliziert.
Grüße,
Ralf
Ich denke halt manchmal viel zu kompliziert.
Grüße,
Ralf