AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Refresh einer View (Sichten) auslösen
Thema durchsuchen
Ansicht
Themen-Optionen

Refresh einer View (Sichten) auslösen

Ein Thema von Perlsau · begonnen am 19. Mär 2014 · letzter Beitrag vom 19. Mär 2014
Antwort Antwort
Seite 1 von 2  1 2      
Perlsau
(Gast)

n/a Beiträge
 
#1

Refresh einer View (Sichten) auslösen

  Alt 19. Mär 2014, 11:36
Datenbank: MsSQL • Version: 11.0 • Zugriff über: Ado (dbGo)
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 ...
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Refresh einer View (Sichten) auslösen

  Alt 19. Mär 2014, 11:40
Ein TDataSource hat doch OnDataChange und OnUpdateData -Events?
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#3

AW: Refresh einer View (Sichten) auslösen

  Alt 19. Mär 2014, 11:52
AfterPost von Tabelle Dateien ?
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#4

AW: Refresh einer View (Sichten) auslösen

  Alt 19. Mär 2014, 11:58
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 ...
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#5

AW: Refresh einer View (Sichten) auslösen

  Alt 19. Mär 2014, 12:03
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.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#6

AW: Refresh einer View (Sichten) auslösen

  Alt 19. Mär 2014, 12:05
AfterScroll könnte auch gehn ... das wird doch bei einem Post ebenfalls ausgelöst.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#7

AW: Refresh einer View (Sichten) auslösen

  Alt 19. Mär 2014, 12:30
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;
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.

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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#8

AW: Refresh einer View (Sichten) auslösen

  Alt 19. Mär 2014, 12:34
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#9

AW: Refresh einer View (Sichten) auslösen

  Alt 19. Mär 2014, 12:42
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.
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#10

Nachtrag

  Alt 19. Mär 2014, 12:56
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;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:11 Uhr.
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