Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi cxgrid mit NexusDB, Update stoppen (https://www.delphipraxis.net/68120-cxgrid-mit-nexusdb-update-stoppen.html)

Surrounder 24. Apr 2006 22:50

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 )

dataspider 24. Apr 2006 23:13

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

alzaimar 25. Apr 2006 07:07

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:
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;
Natürlich geht das noch ausgefeilter, z.B. über den FocusedRecordIndex des TcxGrids, aber das Prinzip ist klar.

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.

Surrounder 25. Apr 2006 14:56

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

alzaimar 25. Apr 2006 15:09

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

dataspider 25. Apr 2006 16:32

Re: cxgrid mit NexusDB, Update stoppen
 
vielleicht so:

Delphi-Quellcode:
View.DataController.DataModeController.SyncMode := False;
Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:18 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