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