Edit von Records eines DBGrids und Aktualisieren des Grids

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
dl5eu
Beiträge: 33
Registriert: Do 12. Sep 2013, 12:40

Edit von Records eines DBGrids und Aktualisieren des Grids

Beitrag von dl5eu »

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)

Benutzeravatar
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

Beitrag von m.fuchs »

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.
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.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Edit von Records eines DBGrids und Aktualisieren des Gri

Beitrag von Michl »

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

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;  

baumina
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

Beitrag von baumina »

Eine weitere Möglichkeit wäre im

Code: Alles auswählen

SQLQuery2.AfterPost
ein

Code: Alles auswählen

SQLQuery1.Refresh
zu machen.
.

dl5eu
Beiträge: 33
Registriert: Do 12. Sep 2013, 12:40

Re: Edit von Records eines DBGrids und Aktualisieren des Gri

Beitrag von dl5eu »

Hallo baumina,
baumina hat geschrieben:Eine weitere Möglichkeit wäre im

Code: Alles auswählen

SQLQuery2.AfterPost
ein

Code: Alles auswählen

SQLQuery1.Refresh
zu machen.
womit ich dann aber eine enge Kopplung der beiden Queries hätte, was ich, wenn möglich, gerne vermeiden möchte.

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

baumina
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

Beitrag von baumina »

Dann setz halt in dem einen Formular im AfterPost eine Variable (z.B. PleaseDoRefresh), die du im anderen Formular wieder abfragst.
.

dl5eu
Beiträge: 33
Registriert: Do 12. Sep 2013, 12:40

Re: Edit von Records eines DBGrids und Aktualisieren des Gri

Beitrag von dl5eu »

Hallo baumina,
baumina hat geschrieben:Dann setz halt in dem einen Formular im AfterPost eine Variable (z.B. PleaseDoRefresh), die du im anderen Formular wieder abfragst.
Danke für den Hinweis. Da hätte ich eigentlich selbst drauf kommen müssen.

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

baumina
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

Beitrag von baumina »

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; 
.

dl5eu
Beiträge: 33
Registriert: Do 12. Sep 2013, 12:40

Re: Edit von Records eines DBGrids und Aktualisieren des Gri

Beitrag von dl5eu »

Stimmt, Danke.

Ich denke halt manchmal viel zu kompliziert.

Grüße,

Ralf

Antworten