![]() |
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? |
Re: Schleifen Optimierung?
Verwende (SQL-)Paramter.
Die Schleife scheint mir zudem überflüssig, weil result auch direkt setzen kannst. |
Re: Schleifen Optimierung?
Stimmt habe nun nur noch:
Delphi-Quellcode:
Aber was gena meintest du mit SQL Paremeter benutzen?
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; |
Re: Schleifen Optimierung?
SQL-Code:
SELECT * FROM '+Tabelle.position+' Where Customer_Number = :Customer_Number;
|
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. |
Re: Schleifen Optimierung?
Zitat:
Ich würde noch
Delphi-Quellcode:
durch
StrToDate(FormMain.QueryUpdate.FieldByName('announcement_date').AsString)
Delphi-Quellcode:
oder noch besser
FormMain.QueryUpdate.FieldByName('announcement_date').AsDate
Delphi-Quellcode:
ersetzen.
FormMain.QueryUpdate.FieldByName('announcement_date').Value
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) |
Re: Schleifen Optimierung?
Glaube SQL-Parameter ist ein allgemein gemeinter Verbesserungsvorschlag ;)
...und reicht nicht auch ein
SQL-Code:
€: Der Thread schlummerte wohl zu lange im Tab, keine rote Box
SELECT announcement_date FROM ...
|
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? |
Re: Schleifen Optimierung?
Ich würde die Unterabfrage seinen lassen und direkt in die erste joinen lassen.
Das sollte viel schneller gehen. |
Re: Schleifen Optimierung?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:17 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