![]() |
Datenbank: Firebird • Version: 2.5 • Zugriff über: Firedac
Dataset.Next | sehr langsam
Embarcadero® Delphi XE7 Version 21.0.17707.5020
Moin Leute, ich habe bisher keine große Erfahrung mit Delphi (Pascal). Ich habe die Aufgabe bekommen ein altes Programm auf den neusten Stand zu bringen und bitte um eure Unterstützung Ich habe bemerkt das DataSet.Next ziemlich langsam ist. Ich habe eine Tabelle, die mit der Datenbank verbunden ist und wenn ich eine neue Zeile hinzufüge dann braucht er, abhängig wie viele Zeile er hat, in diesen Fall z.B. 50 Zeilen, braucht er für eine neue Zeile so 2-3 Sekunden. Diese Funktion wird auch bei einem Button wo der kompletter Auftrag kopiert wird und neu erstellt wird mit einer neuer Vorgangs ID. Ich habe es so geregelt das ich es alles über einer Query gemacht habe. Ich habe es mit Insert + Select gemacht. Resultat Alte Geschwindigkeit: 4 min Neue Geschwindigkeit: 1-2 Sekunden Nur leider kann ich es bei der Funktion "Zeile hinzufügen" nicht einsetzen. Da er eine Spalte mit den Namen "Ordnung" hat. Die ist dafür da um die Daten zu sortieren in der Tabelle, weil es so gewollt ist, das man auch zwischen der Zeilen bei der Tabelle eine neue Zeilen hingezufügt werden kann und nicht nur am Ende. Ist sowas überhaupt möglich ohne das ich mit der Funktion Dataset.Next arbeite? Before Update
After Update
Code:
Lösung://Zeuerst wird die neue Zeile erstellt try try FDQuery21.Close; FDQuery21.ParamByName('Qs_0').AsInteger := daten.pos.fieldbyname('AUFNR').asinteger; FDQuery21.ParamByName('Qs_1').AsString := Z_ARTNR;; FDQuery21.ParamByName('Qs_2').AsString := Z_EINHEIT; FDQuery21.ParamByName('Qs_3').AsCurrency := Z_MENGE; FDQuery21.ParamByName('Qs_4').AsCurrency := Z_ZU1; FDQuery21.ParamByName('Qs_5').AsCurrency := Z_EK; FDQuery21.ParamByName('Qs_6').AsCurrency := Z_EP; FDQuery21.ParamByName('Qs_7').AsCurrency := Z_GP; FDQuery21.ParamByName('Qs_8').AsString := Z_TEXTZEILE; FDQuery21.ParamByName('Qs_9').AsCurrency := Z_EKEURO; FDQuery21.ParamByName('Qs_10').AsCurrency := Z_EPEURO; FDQuery21.ParamByName('Qs_11').AsCurrency := Z_GPEURO; FDQuery21.ParamByName('Qs_12').AsInteger := z_AktuellerStand; //AktuellerStand ist die aktuelle Zeile die in der Tabelle ausgewählt wurde FDQuery21.ParamByName('Qs_14').AsString := 'N'; FDQuery21.Open; except on e: Exception do end; finally Ini.Free; end; z_a := 1; daten.pos.First; while not daten.pos.eof do begin if z_a = z_AktuellerStand then //Falls der Zähler = Wert der aktuell gewählte Zeile begin try try z_a := z_a + 1; //Hier wird übersprungen, weil die neue Zeile die Zahl für die Ordnung hat FDQuery24.Close; FDQuery24.ParamByName('qs_0').AsInteger := ValueFieled0.AsInteger; //Auftragsnummer FDQuery24.ParamByName('os_1').AsInteger := z_a; //Zahl für die Ordnung FDQuery24.Open; except on e: Exception do end; finally Ini.Free; end; z_a := z_a + 1; daten.pos.next; end else begin try try FDQuery24.Close; FDQuery24.ParamByName('qs_0').AsInteger := ValueFieled0.AsInteger; FDQuery24.ParamByName('os_1').AsInteger := z_a; FDQuery24.Open; except on e: Exception do end; finally Ini.Free; end; z_a := z_a + 1; daten.pos.next; end; end; daten.pos.Refresh;
Code:
UPDATE Table
SET ORDNUNG = CASE WHEN ORDNUNG >= :QS1 THEN ORDNUNG + 1 ELSE Ordnung END WHERE AUFNR = :QS2 |
AW: Dataset.Next | sehr langsam
Mir ist nicht klar, wozu Du DataSet.Next benötigst.
Zum Anhängen neuer Datensätze nutzt man eher DataSet.Append oder zum "Einfügen irgendwo mittendrinne" DataSet.Insert. Mit DataSet.Next scrollt man zum nächsten, vorhandenen Datensatz. Zeig' mal bitte den fraglichen Quelltext, so dass man besser sehen kann, was Du genau meinst. |
AW: Dataset.Next | sehr langsam
Was genau ist das Problem?
Wenn die "Ordnung" beizubehalten ist, müssen nachfolgende Datensätze entsprechend aktualisiert werden oder mit geschickt gewählten Zwischenwerten (float) gearbeitet werden. Das langsame Einfügen scheint mir aber verdächtig. Und was ist z.B. 50? 50 Datensätz in der Tabelle? 50 Datensätze als Ergebnis einer Abfrage (aus 500T datensätzen)? Vielleicht kannst Du das noch erläutern. Das dürfte für alle Helfer wichtige Hinweise liefern. Welche Komponenten und welche DB sind auch spannende Infos. |
AW: Dataset.Next | sehr langsam
[Edit] Wenn ich die daten.pos.next verwende. Dann zieht man bei der Tabelle das er zu jede einzelne Zeile durchgeht und das dauert bei 50 Datensätze. Das ist so ob, er jeden Datensatz auswählt. |
AW: Dataset.Next | sehr langsam
Bei 400T Datensätzen kann das Scrollen schon mal dauern, wenn es keinen Index für irgendeine Ordnung der Daten gibt. Und soll dann per Next ein Datensatz eingefügt werden, so wird (schlimmstenfalls) ein Fulltablescan gemacht, um zum letzten Datensatz zu gelangen und dann einen neuen dranzuhängen. Das ist suboptimal.
Zitat:
Entweder den Code verbessern und dann hier posten oder damit leben, dass wir uns dadurch wurschteln müssen. Eventell liegt die Ursache des Problems ja auch am unübersichtlichen Code und man kann quasi mit 'ner Umstrukturierung auch das Problem beheben ;-) |
AW: Dataset.Next | sehr langsam
Zitat:
Ein 50 Rekords großes Ergebnis einer Query müsste eigentlich schnell navigierbar sein. Außnahmen gäbe es diverse, je nach Ereignisbehandlungsroutinen, die am Scrollen dran hängen. |
AW: Dataset.Next | sehr langsam
daten.pos ist ein FDQuery und sein SQL Text ist:
Code:
Die FDQuery ist verbunden mit der Tabelle. Die Tabelle wird dan per Ordnung sortiert. Wenn man auf "Zeile einfügen" drückt, dann erstellt er zuerst die neue Zeile mit den default Eingaben.
SELECT * From TABLE WHERE AUFNR = :QS1 Order by Ordnung
Dann wird mit die erste Zeile von daten.pos aufgerufen und von da aus erstellt für jede Zeile einen neue Ordnungsnummer. Falls er mit der neue Zeile kommt, dann soll er die Ordnung nochmal +1 machen. Ich versuche den Code verstänldich zu gestalten |
AW: Dataset.Next | sehr langsam
Existiert ein adäquater Index über AufNr und Ordnung?
|
AW: Dataset.Next | sehr langsam
Ok, wenn das alles mit den visuellen Komponenten geschieht, auch das next und dann das Update x 50 datensäte, dann ist es offensichtlich langsam. Wahrscheinlich würde schon ein deaktiviren der GUI etwas helfen.
Ich denke, ein pures Insert, gefolgt von dem Update für die "Ordnung" kann das sicher auf <1Sekunde beschleunigen. |
AW: Dataset.Next | sehr langsam
*Doppelter Eintrag*
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:19 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