Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Refresh einer View (Sichten) auslösen (https://www.delphipraxis.net/179604-refresh-einer-view-sichten-ausloesen.html)

Perlsau 19. Mär 2014 11:36

Datenbank: MsSQL • Version: 11.0 • Zugriff über: Ado (dbGo)

Refresh einer View (Sichten) auslösen
 
Moin allerseits,

ich stehe hier vor dem Problem, eine Read-Only-View-Tabelle unmittelbar auf die Änderung eines Feldwertes der zugrundeliegenden realen Tabelle reagieren zu lassen. Es geht um eine TDBCheckBox-Komponente, die mit der realen Tabelle Dateien verbunden ist, auf die sich das View V_Dateien bezieht. Das View wird in einem DBGrid angezeigt und soll auf die Änderung in einem Boolean-Feld reagieren. Es stellt sich die Frage nach dem Auslöser: TDBCheckBox.OnChange kann ich genauso wenig verwenden wie TDBCheckBox.OnClick, da beide vor dem Schreiben des neuen Wertes ausgelöst werden. Ich benötige aber einen Auslöser, der nach dem Schreiben des neuen Wertes in die Datenbank triggert. Bin vorerst ratlos ...

Der schöne Günther 19. Mär 2014 11:40

AW: Refresh einer View (Sichten) auslösen
 
Ein
Delphi-Quellcode:
TDataSource
hat doch
Delphi-Quellcode:
OnDataChange
und
Delphi-Quellcode:
OnUpdateData
-Events?

Bummi 19. Mär 2014 11:52

AW: Refresh einer View (Sichten) auslösen
 
AfterPost von Tabelle Dateien ?

Perlsau 19. Mär 2014 11:58

AW: Refresh einer View (Sichten) auslösen
 
Hi Günther, hi Thomas,

natürlich kenne ich diese Ereignisse, doch nützen sie mir nichts, da sie erst ausgelöst werden, wenn sich der Datensatzzeiger ändert bzw. wenn ich explizit ein Post absetze. Anders ausgedrückt:

Beim Klick auf eine TDBCheckBox ändert sich der Status der Checkbox sofort. Der Eintrag in die DB (das Update) erfolgt aber erst, wenn sich der Datensatzzeiger ändert oder wenn ich AdoDataSet.Post auführe. Es geht jedoch darum, sofort eine Änderung der beiden Anzeigen DBCheckBox (Tabelle) und DBGrid (View) zu erzeugen. Ich muß also irgendwie bewerkstelligen, daß das Ändern des DBCheckBox-Status sofort ein Update der verbundenen Tabelle auslöst.

Ich versuch's jetzt mal mit einer "normalen" CheckBox, die beim AfterScroll eben jedesmal den aktuellen Status des aktuellen Feldes zugewiesen bekommt. Melde mich gleich wieder ...

Bummi 19. Mär 2014 12:03

AW: Refresh einer View (Sichten) auslösen
 
wenn Du ungepostete Werte darstellen willst könntest Du ein berechnetes Feld in das Dataset von V_Dateien aufnehmen, oder die Checkbox Direkt an die View binden.

himitsu 19. Mär 2014 12:05

AW: Refresh einer View (Sichten) auslösen
 
AfterScroll könnte auch gehn ... das wird doch bei einem Post ebenfalls ausgelöst.

Perlsau 19. Mär 2014 12:30

AW: Refresh einer View (Sichten) auslösen
 
Ich hab's jetzt mit einer "normalen" CheckBox gelöst:
Delphi-Quellcode:
Procedure TFormMain.Check_GesehenClick(Sender: TObject);
begin
  IF GL.CheckModus THEN Exit;
  GL.CheckModus := True;
  DatMod.Aset_Datei.Edit;
  DatMod.Aset_Datei.FieldByName('Gesehen').AsBoolean := Check_Gesehen.Checked;
  DatMod.Aset_Datei.Post;
  DatMod.ViewDateienRefresh;
  GL.CheckModus := False;
end;
GL ist eine Unit mit Globalen Variablen und Konstanten, CheckModus ein Boolean. Der Status von Check_Gesehen wird im AfterScroll des Views aktualisiert (selbstverständlich mit einem Ereignis, das in der Formular-Unit abgefangen wird). Das Flag GL.CheckModus ist deshalb notwendig, weil beim Ändern des Checkstatus, was ja beim Scrollen passiert, ebenfalls das Ereignis OnClick ausgelöst wird. So funktioniert's auf jeden Fall einwandfrei, das View wird sofort aktualisiert, ohne daß der Anwender erst einen anderen Datensatz anwählen muß.

DatMod.ViewDateienRefresh ist eine Public-Methode im Datenmodul, die ich benötige, weil das normale Refresh offenbar nicht korrekt arbeitet. Ersetze ich DatMod.ViewDateienRefresh durch DatMod.Tab_VDateien.Refresh, erhalte ich diese Fehlermeldung:

Nicht genügend Basistabelleninformationen zum Aktualisieren
Delphi-Quellcode:
Procedure TDatMod.ViewDateienRefresh;
Var
  Merk : Integer;

begin
  Merk := Aset_Datei.FieldByName('Id_Video').AsInteger;
  Tab_VDateien.Close;
  Tab_VDateien.Open;
  Tab_VDateien.Locate('Id_Video',Merk,[]);
end;
Zitat:

Zitat von Bummi (Beitrag 1252521)
wenn Du ungepostete Werte darstellen willst könntest Du ein berechnetes Feld in das Dataset von V_Dateien aufnehmen, oder die Checkbox Direkt an die View binden.

Es handelt sich um ein sehr komplexes View, das Werte aus etlichen Subtabellen interpretiert und darstellt. Mit einem Datenbank-View kann ich einfacher und effizienter arbeiten als mit Lookup-Feldern, die auf Clientseite erstellt werden. Auch das Sortieren nach diversen Spalten gestaltet sich einfacher. Wollte ich deinen Vorschlag umsetzen, müßte ich die Anwendung komplett umbauen.

Zitat:

Zitat von himitsu (Beitrag 1252522)
AfterScroll könnte auch gehn ... das wird doch bei einem Post ebenfalls ausgelöst.

Es geht aber gerade um das Post: Das wird beim Ändern des Checkstatus einer TDBCheckBox erst ausgelöst, wenn sich der Datensatzzeiger ändert. Durch reines Klicken auf die Komponente passiert noch gar nix.

himitsu 19. Mär 2014 12:34

AW: Refresh einer View (Sichten) auslösen
 
Zitat:

Zitat von Perlsau (Beitrag 1252530)
Es geht aber gerade um das Post: Das wird beim Ändern des Checkstatus einer TDBCheckBox erst ausgelöst, wenn sich der Datensatzzeiger ändert. Durch reines Klicken auf die Komponente passiert noch gar nix.

Ich dachte das sollte so werden?
- anklichen/umschalten der Chackbox ändert noch nichts
- das Speichern des Datensatzes (Post) aktualisiert dann den View.

Perlsau 19. Mär 2014 12:42

AW: Refresh einer View (Sichten) auslösen
 
Zitat:

Zitat von himitsu (Beitrag 1252534)
Zitat:

Zitat von Perlsau (Beitrag 1252530)
Es geht aber gerade um das Post: Das wird beim Ändern des Checkstatus einer TDBCheckBox erst ausgelöst, wenn sich der Datensatzzeiger ändert. Durch reines Klicken auf die Komponente passiert noch gar nix.

Ich dachte das sollte so werden?
- anklichen/umschalten der Chackbox ändert noch nichts
- das Speichern des Datensatzes (Post) aktualisiert dann den View.

Schon klar, aber "das Speichern des Datensatzes (Post)" wird nicht allein durch das Klicken auf die DBCheckBox ausgelöst. Mit anderen Worten: Das Klicken auf die DBCheckBox ändert lediglich den Wert des Feldes im Dataset, ohne daß ein Post ausgelöst wird. Ich wollte jedoch erreichen, daß bereits ein Klick auf die Checkbox eine Änderung in der Datenbank auslöst, ohne daß der Anwender noch eine weitere Aktion bringen muß. Das habe ich mit der TCheckBox nun erreicht: Die Anzeige der Änderung im DBGrid (View) erfolgt jetzt wie gewünscht sofort. Jetzt kann der Anwender einfach Strg-G drücken, um den Status des Gesehen-Feldes zu ändern, auch wenn der Fokus gerade auf dem DBGrid ist, weil der Anwender darin herumscrollt.

Perlsau 19. Mär 2014 12:56

Nachtrag
 
Jetzt blieb nur noch der unschöne Effekt, daß sich die Position der vertikalen Scrollbar im DBGrid verändert. Dem konnte ich mit GetScrollPos und SetScrollPos abhelfen. Der Vollständigkeit halber hier der überarbeitete Code:
Delphi-Quellcode:
Procedure TFormMain.Check_GesehenClick(Sender: TObject);
Var
  ScrollPos : Integer;

begin
  IF GL.CheckModus THEN Exit;
  GL.CheckModus := True;
  DatMod.Aset_Datei.Edit;
  DatMod.Aset_Datei.FieldByName('Gesehen').AsBoolean := Check_Gesehen.Checked;
  DatMod.Aset_Datei.Post;
  ScrollPos := GetScrollPos(Handle, SB_VERT);
  DatMod.ViewDateienRefresh;
  SetScrollPos(Handle, SB_VERT, ScrollPos, True);
  GL.CheckModus := False;
  AL_ED_Gesehen.Checked := Check_Gesehen.Checked;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:46 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz