![]() |
Bearbeiten von markierten Datensätzen im DBGrid
Hallo,
der Benutzer meiner Anwendung kann eine oder mehrere Zeilen im DBGrid markieren und anschließend im Kontextmenü eine Bearbeitungsfunktion aufrufen. Der Funktion wird die Datenmenge übergeben. Anhand der gesetzten Bookmarks werden die markierten Zeilen bearbeitet. Es funktioniert, ist allerdings durch Benutzung von
Delphi-Quellcode:
sehr langsam.
...
Grid.DataSource.DataSet.GotoBookmark(pointer(Grid.SelectedRows.Items[i])); ... Hat jemand eine Idee, wie ich das Bearbeiten markierter Zeilen beschleunigen kann? Danke! |
Re: Bearbeiten von markierten Datensätzen im DBGrid
Hi,
ich habe eine leichte Verbesserung feststellen können. Ich habe nicht mehr für jeden Bookmark einzeln ein Update-Statement abgesetzt, sondern baue das gesamte Statement zuerst aus den Bookmarks zusammen (Oder-Verknüpfung) und schicke es dann ab.
Delphi-Quellcode:
Leider behebt diese Lösung das Problem nicht endgültig. Das Neupositionieren des Datensatzzeigers durch 'GotoBookmark' bleibt das Problem. Dieser Aufruf dauert ewig...
...
with Query do begin SQL.Add('UPDATE position'); SQL.Add('SET container_ID='+QuotedStr(ContID)); SQL.Add('WHERE Position_ID='+QuotedStr(DataSet.Fields[0].AsString)); // Positionen ab dem 2. Bookmark zum Statement hinzufügen for i:=1 to Grid.SelectedRows.Count-1 do begin DataSet.GotoBookmark(pointer(Grid.SelectedRows.Items[i])); SQL.Add('OR Position_ID='+QuotedStr(DataSet.Fields[0].AsString)); end; // for execSQL; ... Wie kann ich Performace gewinnen, um das Update durchzuführen? |
Re: Bearbeiten von markierten Datensätzen im DBGrid
Du kannst z.B. das zeitaufwendige Aktualisieren der Controls unterbinden mit:
Delphi-Quellcode:
DataSet.DisableControls;
try ... // Deine Aktion finally DataSet.EnableControls; end; |
Re: Bearbeiten von markierten Datensätzen im DBGrid
Hi,
bei jeder Aktion deaktiviere ich die Darstellung. Das Problem besteht im Aufruf von 'GotoBookmark'... |
Re: Bearbeiten von markierten Datensätzen im DBGrid
Alles klar, war nicht ersichtlich.
Bestünde die Möglichkeit bereits beim selektieren die erforderlichen Daten zu speichern, in einer TList o.ä. und dann die enthaltenen Daten auszuwerten? |
Re: Bearbeiten von markierten Datensätzen im DBGrid
Hi,
ich müsste die Datensätze anders festhalten, z.B. Array. Ich wollte das eigentlich mit Bordmitteln lösen... Weitere Ideen? |
Re: Bearbeiten von markierten Datensätzen im DBGrid
Zitat:
Bist du wirklich sicher, daß GotoBookmark der Grund ist? GotoBookmark ist eine Pointeroperation. Und ich hatte subjektiv eigentlich nie das Gefühl, daß sie langsam ist. Du solltest aber die verwendeten Komponenten angeben, denn GotoBokkmark wird von jedem TDataset- Abkömmling selbst implementiert. Grüße Woki |
Re: Bearbeiten von markierten Datensätzen im DBGrid
Hi,
ich habe überprüft an welcher stelle es hakt. 'GotoBookmark' ist definitiv das 'Nadelöhr'. Ich benutze mysqlDAC von microOLAP. Die Datensatzanzahl bewegt sich zwischen 1 und 200. |
Re: Bearbeiten von markierten Datensätzen im DBGrid
Hallo barnti,
du könntest durch die SelectedRows iterieren und das Schlüsselfeld in eine StringList speichern, die du der Funktion übergibst. Diese kann dann über FindKey die entsprechenden Datensätze finden. |
Re: Bearbeiten von markierten Datensätzen im DBGrid
Zitat:
Das verstehe ich nicht. Mein Quelltext der betreffenden Stelle ist oben zu finden. Ich iteriere bereits über die 'selectedRows'. Ich komme aber nicht an die Inhalte ohne den Datensatzzeiger zu verändern(GotoBookmark). Oder wie ist dein Tip zu verstehen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:56 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