Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Schleifen Optimierung? (https://www.delphipraxis.net/137124-schleifen-optimierung.html)

youuu 14. Jul 2009 20:47


Schleifen Optimierung?
 
Hi,

ich habe ein Problem, am Anfang meines Programms Teste ich den Status einzellner Einträge.

Ausgangssituation.

2 Tabellen
--> Tabelle 1 Kunde
--> Tabelle 2 Positionen (mehrere Einträge möglich pro Kundennummer)

Nun möchte ich testen ob der Kunde noch aktive ist oder inaktive, heißt wenn der Kunde keine aktive position mehr besitzt, dann ist er inaktive.


Ich habe es bislang so gelöst.

Delphi-Quellcode:
  Query.SQL.Text:='SELECT * FROM '+Tabelle.customer+'';
  Query.Open;
  while not Query.Eof do
  begin
    Customer:= TCustomerDaten.create;
    with Customer do
    Begin
      Anrede:= Customer.FieldByName('Anrede').AsString;
      name:= Customer.FieldByName('name').AsString;
    end;
    VstCustomer.Addchild(nil, Customer);

    If StatusCustomer (Customer.Customer_number) Then  // Status updaten
      Customer.status:= 'aktive'
    Else
      Customer.status:= 'inaktive';

    Customer.Next

Hier die Funktion Status Customer

Delphi-Quellcode:
Function StatusCustomer (Customer_Number: String): Boolean;
Var
  Status: TStringlist;
  i: Integer;
Begin
  Status:= TStringlist.Create;
  result:= false;

  Try
    QueryUpdate.SQL.Text:='SELECT * FROM '+Tabelle.position+' Where Customer_Number = '''+Customer_Number+'''';
    QueryUpdate.Open;
      while not QueryUpdate.Eof do
      Begin
        if StrToDate(QueryUpdate.FieldByName('announcement_date').AsString) >= Date() then
          status.Add('aktive')
        else
          status.Add('inaktive');

        QueryUpdate.Next;
      End;

      for i := 0 to status.Count - 1 do
        if Status[i] = 'aktive' then
        Begin
          result:= True;
          exit;
        End
        Else
          result:= false;
  Finally
    QueryUpdate.Close;
    Status.Free;
  End;
End;

So entstehen bei 10.000 Kunden a 40.000 Positionen extreme lange Wartezeiten.

Kann mir jemand einen Tipp geben um dies zu beschleunigen?

mkinzler 14. Jul 2009 20:52

Re: Schleifen Optimierung?
 
Verwende (SQL-)Paramter.
Die Schleife scheint mir zudem überflüssig, weil result auch direkt setzen kannst.

youuu 14. Jul 2009 20:57

Re: Schleifen Optimierung?
 
Stimmt habe nun nur noch:

Delphi-Quellcode:
Function StatusCustomer (Customer_Number: String): Boolean;
Var
  Status: TStringlist;
  i: Integer;
Begin
  Status:= TStringlist.Create;
  result:= false;

  Try
    FormMain.QueryUpdate.SQL.Text:='SELECT * FROM '+Tabelle.position+' Where Customer_Number = '''+Customer_Number+'''';
    FormMain.QueryUpdate.Open;
      while not FormMain.QueryUpdate.Eof do
      Begin
        if StrToDate(FormMain.QueryUpdate.FieldByName('announcement_date').AsString) >= Date() then
          result:= true;
        FormMain.QueryUpdate.Next;
      End;
  Finally
    FormMain.QueryUpdate.Close;
    Status.Free;
  End;
Aber was gena meintest du mit SQL Paremeter benutzen?

mkinzler 14. Jul 2009 20:59

Re: Schleifen Optimierung?
 
SQL-Code:
SELECT * FROM '+Tabelle.position+' Where Customer_Number = :Customer_Number;

youuu 14. Jul 2009 21:14

Re: Schleifen Optimierung?
 
Dadurch wird aber die Abfrage nicht schneller gestaltet oder?

Trotz der Schleifen Änderung, bin ich bei den momentanen 670 Kunden und 1400 Positionen schon bei knapp 1 Minute Wartezeit.

mkinzler 14. Jul 2009 21:20

Re: Schleifen Optimierung?
 
Zitat:

Dadurch wird aber die Abfrage nicht schneller gestaltet oder?
In diesem Teil nicht, ist aber übersichtlicher
Ich würde noch
Delphi-Quellcode:
StrToDate(FormMain.QueryUpdate.FieldByName('announcement_date').AsString)
durch
Delphi-Quellcode:
FormMain.QueryUpdate.FieldByName('announcement_date').AsDate
oder noch besser
Delphi-Quellcode:
FormMain.QueryUpdate.FieldByName('announcement_date').Value
ersetzen.
Zudem könnte man die Abfrage schon auf announcement_date > Datum einschränken.
U.U könnte auch die Db Struktur geändert werden ( Warum mehrere gleiche Tabellen?; sieht für mich so aus)

Satty67 14. Jul 2009 21:20

Re: Schleifen Optimierung?
 
Glaube SQL-Parameter ist ein allgemein gemeinter Verbesserungsvorschlag ;)
...und reicht nicht auch ein
SQL-Code:
SELECT announcement_date FROM ...
€: Der Thread schlummerte wohl zu lange im Tab, keine rote Box

youuu 14. Jul 2009 21:32

Re: Schleifen Optimierung?
 
Für Verbeserungsvorschläge bin ich imer offen ;)

Ich wüsste nicht wie ich dies in einer Tabelle unterbingen sollte, da jeder Kunde mehrere Positionen(Rechnungen) haben kann.

Ansonsten noch Ideen für die Beschleunigung oder soll ich gar lieber eine Art Splashscreen mit dem Status laufen lassen?

generic 14. Jul 2009 21:35

Re: Schleifen Optimierung?
 
Ich würde die Unterabfrage seinen lassen und direkt in die erste joinen lassen.
Das sollte viel schneller gehen.

youuu 14. Jul 2009 21:37

Re: Schleifen Optimierung?
 
Zitat:

Zitat von generic
Ich würde die Unterabfrage seinen lassen und direkt in die erste joinen lassen.
Das sollte viel schneller gehen.

Wie meinst du das?


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:11 Uhr.
Seite 1 von 3  1 23      

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