![]() |
Datenbank: NexusDB • Version: 4.05 • Zugriff über: Datasource
cxgrid mit NexusDB, Update stoppen
Hallo Forum,
ich sitz gerade in Mexico und hab ein kleines Geschwindigkeitsproblem mit meinem cxgrid. Folgende Situation: Ich schreibe alle 25 Sekunden 1 Datensatz in meinen Mastertable, und meine Slavetable 10 Datensätze. Auf einem extra Formular in meiner Software habe ich ein cxGrid (DevExpress) mit dem ich die Datensätze aus der Mastertabelle anzeige. Das cxGrid läuft nicht im GridMode und hat eine Verbindung zur DataSource. Problem: Wenn ich das Formular öffne sehe ich alle Daten die in der Tabelle sind, wenn dann neue Daten im Hintergrund geschrieben werden dann springt die Ansicht in der Tabelle ständig zum letzten Datensatz, außerdem ist das schreiben des Datensatzes ca. 2-3 Sekunden langsamer vermutlich weil das cxGrid sich ständig aktualisiert und die db auch mit belastet. Ich hab mir nun gedacht ich könnte das Problem so lösen indem ich dem Grid einfach verbiete sich die aktuellen Daten aus der Tabelle zu holen. Aber leider hab ich nicht heraus gefunden wie und ob das überhaupt geht? Mir würde es reichen wenn das cxGrid einfach einmal beim erzeugen des Formulars die aktuellen Daten laden würde und dann nix mehr tut so dass die db in ruhe arbeiten kann. Ich brauche aber die Verbindung zur db trotzdem weil wenn ich einen datensatz auswähle dann würde ich gerne auch die zugehörigen Einträge in der Slavetabelle haben. Hat da jemand eine Idee oder einen anderen Vorschlag wie ich so etwas machen kann? Gruß an alle aus dem 35 Grad warmen Mexico ... ( schwitz ) |
Re: cxgrid mit NexusDB, Update stoppen
Hallo,
ich kann mir vorstellen, dass man es mit der Methode BeginUpdate oder BeginFullUpdate des DataControllers lösen könnte. Man sollte dann nur noch beim Schliessen des Forms evtll. CancelUpdate aufrufen. Ich habe es aber nicht getestet. Wenn keine anderen Controls mit der DataSource verbunden sind, kann man auch DisableControls des DataSet verwenden. Cu, Frank |
Re: cxgrid mit NexusDB, Update stoppen
Ja ja, das alte Refresh-Problem....
Wenn es dir nichts ausmacht, bei einem Refresh jedesmal alle Daten neu zu laden, dann verwende DisableControls/EnableControls sowie ein Bookmark während des Neuladens:
Delphi-Quellcode:
Natürlich geht das noch ausgefeilter, z.B. über den FocusedRecordIndex des TcxGrids, aber das Prinzip ist klar.
Procedure DatasetRefresh (aDataset : TDataset);
Var B : TBookmark; Begin aDataset.DisableControls; Try B := aDataset.GetBookmark; aDataSet.Close; aDataset.Open; Try // Schützen, weil der ehemals aktuelle Datensatz nun weg sein könnte aDataset.GotoBookmark (B); Except End; Finally aDataset.FreeBookmark (B); aDataset.EnableControls; End; End; Alternative (wenn das Grid nur zur Anzeige dient): - Entweder ein Unbound Grid verwenden (TcxGridTableView) und die Datacontroller.Values befüllen - Oder ein Memory-Dataset odr ADO-DS (Lockmode = BatchOptimistic) mit einer Kopie der Master-Dateil Tabellen bilden und alle DB-Operationen auf diese Clones duplizieren. |
Re: cxgrid mit NexusDB, Update stoppen
danke erst mal für Eure Antworten, hab das meiste auch schon getestet. Bei BeginUpdate egal welcher Art hab ich das Problem dass das cxGrid sich nicht mehr scrollen lässt und ich also auch nicht mehr alle Einträge anschauen kann. Je 25 Sekunden einen Eintrag, da kommt schon was zusammen.
Das mit dem Disable Controls hab ich auch getestet das hat zwar soweit funktioniert dass der Refresh verhindert wird, aber einige andere Funktionen des cxGrid gingen nicht mehr. Ich denke ich verlange da zuviel, denn es ist halt nunmal eine Datenbank. Ich denke die einzige Möglichkeit ist wirklich einen MemTable zu verwenden und die aktuelle db zu kopieren um das Problem zu umgehen, und das werde ich jetzt einfach mal testen. Falls jemand noch eine Idee hat, ich bin für alles noch offen |
Re: cxgrid mit NexusDB, Update stoppen
Wer braucht schon das Grid, in dem alle Werte angezeigt werden? Niemand. Wenn es wirklich 25 Sekunden braucht, die Werte zu laden ist a) entweder die Tabelle sehr lang oder b) die Abfrage zu komplex.
Ich würde mir die Frage stellen, ob es wirklich sinnvoll ist, die gesamte Tabelle anzuzeigen. Die Suchfunktionen (Inkrementelle Suche) sind zwar ganz nett, aber eben doch nur für ein paar 1000 Records akzeptabel. Ich habe eine Tabelle mit ca. 1000 Einträgen (Produktdatenbank), da mache ich das mit dem Refresh nach jeder Änderung. Ist bescheuert, geht aber gerade noch... |
Re: cxgrid mit NexusDB, Update stoppen
vielleicht so:
Delphi-Quellcode:
Frank
View.DataController.DataModeController.SyncMode := False;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:39 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 by Thomas Breitkreuz