![]() |
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 ... |
AW: Refresh einer View (Sichten) auslösen
Ein
Delphi-Quellcode:
hat doch
TDataSource
Delphi-Quellcode:
und
OnDataChange
Delphi-Quellcode:
-Events?
OnUpdateData
|
AW: Refresh einer View (Sichten) auslösen
AfterPost von Tabelle Dateien ?
|
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 ... |
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.
|
AW: Refresh einer View (Sichten) auslösen
AfterScroll könnte auch gehn ... das wird doch bei einem Post ebenfalls ausgelöst.
|
AW: Refresh einer View (Sichten) auslösen
Ich hab's jetzt mit einer "normalen" CheckBox gelöst:
Delphi-Quellcode:
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ß.
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; 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:
|
AW: Refresh einer View (Sichten) auslösen
Zitat:
- anklichen/umschalten der Chackbox ändert noch nichts - das Speichern des Datensatzes (Post) aktualisiert dann den View. |
AW: Refresh einer View (Sichten) auslösen
Zitat:
|
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 04:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz