Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.066 Beiträge
 
Delphi 12 Athens
 
#2

AW: unbestimmte Anzahl TFDQuerys abgleichen

  Alt 19. Feb 2021, 16:37
Hängen da auch noch paar Edits/Grids an diesen DataSets?
Dann ist es natürlich langsam, wenn man währenddessen nicht mit DisableControls arbeitet.

Und warum àlles manuell durchscrollen und die ID suchen, anstatt Locate zu benutzen?


Vom Tempo her ist es fast egal, auch wenn rückwärts natürlich dennoch schneller ist, weil insgesamt im Array weniger einträge verschoben werden müssen.
Und zusätzlich ist der Code auch noch wesentlich kürzer/übersichtlicher.
Zitat:
Delphi-Quellcode:
    i := 0;
    while i < Length(quArrData) do
    begin
      if quArrData[i].IsEmpty then
      begin
        Delete(quArrData, i, 1);
        Delete(sArrIdField, i, 1);
        Dec(i);
      end;

      Inc(i);
    end;
Delphi-Quellcode:
    for i := High(quArrData) downto 0 do
      if quArrData[i].IsEmpty then
      begin
        Delete(quArrData, i, 1);
        Delete(sArrIdField, i, 1);
      end;
Zitat:
Delphi-Quellcode:
            bQuAction := false;

            while not quArrData[i].Eof
            and (quDataLong.FieldByName(sIdFieldLong).AsInteger > quArrData[i].FieldByName(sArrIdField[i]).AsInteger) do
            begin
              quArrData[i].Next;
              bQuAction := true;
            end;

            if bQuAction then Break;
Delphi-Quellcode:
            //bQuAction := quArrData[i].Locate(sArrIdField[i], quDataLong.FieldByName(sIdFieldLong).AsInteger);
            bQuAction := quArrData[i].LocateEx(sArrIdField[i], quDataLong.FieldByName(sIdFieldLong).AsInteger, [lxNext]);
            if bQuAction then Break;
[edit]
Ich seh grad, es war hier kein <> sondern >
und Locate arbeitet natürlich wie =, also das Gegenteil von <>
Hatte hier zuerst die Schleife von //Start ID anfügen und weiter springen , welche aber über das Array und kein Dataset läuft.
Bei einem sortierten Array kann man könnte man aber ebenfalls ein TArray.BinarySearch verwenden.
[/edit]

PS: Was soll das Zweite if Length(sArrIdField) <> Length(quArrData) then Exit; machen?
Wenn es beim Ersten schon gleich war und dazwischen links und rechts genau gleichviel gelöscht wurde, dann kann es dort NIEMALS unterschiedlich sein.


Ansonsten isses ein bissl schwer direkt zu erkennen, was nun genau gemacht wird, aber mit bissl kürzerem/übersichtlicherm Code versteht man es womöglich auch schneller.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (19. Feb 2021 um 17:03 Uhr)
  Mit Zitat antworten Zitat