AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Dataset.Next | sehr langsam

Dataset.Next | sehr langsam

Ein Thema von Dekras12 · begonnen am 22. Jan 2019 · letzter Beitrag vom 23. Jan 2019
Antwort Antwort
Seite 1 von 4  1 23     Letzte » 
Dekras12

Registriert seit: 22. Jan 2019
11 Beiträge
 
#1

Dataset.Next | sehr langsam

  Alt 22. Jan 2019, 12:54
Datenbank: Firebird • Version: 2.5 • Zugriff über: Firedac
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
ID Value 1 Value 2 Value 3 Ordnung
1 A B C 0
1 A B C 0
1 A B C 0
1 A B C 0

After Update
ID Value 1 Value 2 Value 3 Ordnung
1 A B C 1
1 A B C 2
1 A B C 3
1 A B C 4



Code:

//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;
Lösung:
Code:
UPDATE Table
SET   ORDNUNG = CASE
                        WHEN ORDNUNG >= :QS1 THEN ORDNUNG + 1                       
                        ELSE Ordnung
                    END
WHERE AUFNR = :QS2

Geändert von Dekras12 (22. Jan 2019 um 15:54 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.400 Beiträge
 
Delphi 7 Professional
 
#2

AW: Dataset.Next | sehr langsam

  Alt 22. Jan 2019, 13:01
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.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#3

AW: Dataset.Next | sehr langsam

  Alt 22. Jan 2019, 13:06
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.
Gruß, Jo
  Mit Zitat antworten Zitat
Dekras12

Registriert seit: 22. Jan 2019
11 Beiträge
 
#4

AW: Dataset.Next | sehr langsam

  Alt 22. Jan 2019, 13:13
  • 50 Datensätze als Ergebnis einer Abfrage (aus ~ 400T Datensätzen)
  • Der Code sieht unüberscihtlich aus

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

Geändert von Dekras12 (22. Jan 2019 um 13:17 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.400 Beiträge
 
Delphi 7 Professional
 
#5

AW: Dataset.Next | sehr langsam

  Alt 22. Jan 2019, 13:22
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:
Der Code sieht unüberscihtlich aus
Das ist irrelevant. Ohne den auch nur ansatzweise zu kennen, ist es annähernd unmöglich Dir irgendwelche zielführenden Tipps zu dem konkreten Problem zu geben.

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
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#6

AW: Dataset.Next | sehr langsam

  Alt 22. Jan 2019, 13:31
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.
Wer woll denn wissen was daten.pos.netxt macht und welche Ereignisse dabei noch behandelt werden? Ohne konkreten Code, Eventroutinen etc. ist keine Unterstützung zu leisten. Alles nur Kaffeesatz Leserei.

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.
Gruß, Jo
  Mit Zitat antworten Zitat
Dekras12

Registriert seit: 22. Jan 2019
11 Beiträge
 
#7

AW: Dataset.Next | sehr langsam

  Alt 22. Jan 2019, 13:33
daten.pos ist ein FDQuery und sein SQL Text ist:

Code:
SELECT * From TABLE WHERE AUFNR = :QS1 Order by Ordnung
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.
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Dataset.Next | sehr langsam

  Alt 22. Jan 2019, 13:38
Existiert ein adäquater Index über AufNr und Ordnung?
Markus Kinzler
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#9

AW: Dataset.Next | sehr langsam

  Alt 22. Jan 2019, 13:39
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.
Gruß, Jo
  Mit Zitat antworten Zitat
Dekras12

Registriert seit: 22. Jan 2019
11 Beiträge
 
#10

AW: Dataset.Next | sehr langsam

  Alt 22. Jan 2019, 13:40
*Doppelter Eintrag*

Geändert von Dekras12 (22. Jan 2019 um 13:47 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 03:22 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