AGB  ·  Datenschutz  ·  Impressum  







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

Dataset.Next | sehr langsam

Ein Thema von Dekras12 · begonnen am 22. Jan 2019 · letzter Beitrag vom 23. Jan 2019
 
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
 


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 08:46 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