Einzelnen Beitrag anzeigen

Dekras12

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

Dataset.Next | sehr langsam

  Alt 22. Jan 2019, 11: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 14:54 Uhr)
  Mit Zitat antworten Zitat