![]() |
Re: Schleifen Optimierung?
z.B. so:
SQL-Code:
[edit=mkinzler]Code-Tag durch SQL-Tag ersetzt Mfg, mkinzler[/edit]
SELECT c.*,
(SELECT count(p.Customer_Number) FROM Position p Where p.Customer_Number = c.Customer_Number) Anzahl FROM Customer c |
Re: Schleifen Optimierung?
^^^ Subquerys gehen natürlich auch.
Ich meinte eher mit den SQL Befehlen/Funktionen max,[left] join, group by zu arbeiten. Deine eine Schleife könnte man beschleunigen, in dem du in der IF-Abfrage hinter den result:=true ein break schreibst. Somit müsste nicht durch jeden Datensatz gegangen werden. Weitere Optimierungen sehe ich in dieser Bedingung:
Delphi-Quellcode:
Warum muss das im Code passieren? Warum machst du das nicht direkt im SQL.
StrToDate(FormMain.QueryUpdate.FieldByName('announcement_date').AsString) >= Date()
Somit müsste der Server dir weniger Daten liefern und du bräuchtest nur noch prüfen ob Daten da sind oder nicht. Allerdings ich würde meinen ersten Vorschlag bevorzugen, da dieser nur einen SQL Abfrage zu Server schickt. |
Re: Schleifen Optimierung?
Von generic: Break in der while-Schleife
Wenn Du dann noch nach dem Datumfeld sortierst, bist Du schnell fertig.
SQL-Code:
FormMain.QueryUpdate.SQL.Text:='SELECT * FROM '+Tabelle.position+' Where Customer_Number = '''+Customer_Number+'''' order by announcement_date DESC
Gruß Gerald |
Re: Schleifen Optimierung?
Zitat:
SQL-Code:
SELECT c.*,
(SELECT count(p.Customer_Number) FROM Position p Where p.Customer_Number = c.Customer_Number and p.announcement_date > Date()) Anzahl FROM Customer c |
Re: Schleifen Optimierung?
Mein SQL ist zwar gerade etwas eingerostet, aber geht es nicht einfacher (schneller) so?
Delphi-Quellcode:
Ergänzend schlage ich auch die Verwendung von Parametern vor, da gerade im Fall der wiederholten Abfrage (hier für jeden Kunden) ein Performancegewinn erzielt werden kann. Dabei würde man den SQL.Text entweder statisch in der IDE oder dynamisch vor der while-Schleife über die Kunden zuweisen. Bei der ersten Abfrage macht der SQL-Server dann ein Prepare, was beim wiederholten Aufruf mit anderen Parameterwerten dann nicht mehr gemacht werden muss.
Function StatusCustomer (Customer_Number: String): Boolean;
Begin result:= false; FormMain.QueryUpdate.SQL.Text := 'SELECT Count(*) AS Anzahl FROM ' + Tabelle.position + ' Where (Customer_Number = '''+Customer_Number+''') and (announcement_date >= '''+Date()+''')' ; FormMain.QueryUpdate.Open; Try result := (FormMain.QueryUpdate.FieldByName('Anzahl').AsInteger > 0); Finally FormMain.QueryUpdate.Close; End; End;
Delphi-Quellcode:
Die Funktion reduziert sich dann aufFormMain.QueryUpdate.SQL.Text := 'SELECT Count(*) AS Anzahl FROM ' + Tabelle.position + ' Where (Customer_Number = :Customer_Number) and (announcement_date >= :Date)' ;
Delphi-Quellcode:
Function StatusCustomer (Customer_Number: String): Boolean;
Begin result:= false; FormMain.QueryUpdate.Params.ParamValues['Customer_Number'] := Customer_Number; FormMain.QueryUpdate.Params.ParamValues['Date'] := Date(); FormMain.QueryUpdate.Open; Try result := (FormMain.QueryUpdate.FieldByName('Anzahl').AsInteger > 0); Finally FormMain.QueryUpdate.Close; End; End; |
Re: Schleifen Optimierung?
Noch ein Tipp: FieldByName('Anrede') ist bei Delphi 2009 extrem langsam, da die Heinis vergessen haben das "WideCompareText" durch ein "AnsiCompareText" zu ersetzen und somit der Feldname (UnicodeString) FieldCount-mal in einen WideString umgewandelt wird.
Wenn du das dann in einer Schleife anwendest, wäre es besser sich das TField vorher einmalig zu holen und dann direkt mit dem Field zu arbeiten. |
Re: Schleifen Optimierung?
Entschuldigt, aber die Ausgangsfrage war doch herauszufinden ob ein Kunde noch aktiv ist?
Dann sollte so etwas eigentlich ausreichen:
SQL-Code:
(Ich hab es nicht so mit den Joins, ich hoffe es ist trotzdem klar worauf ich raus will)
select distinct Kundenname
from KundendTab,PositionTab where KundenTab.KundenID=PositionTab.KundenID and Position.Datum>sysdate Dann hat man schon einmal eine Liste der "aktiven" Kunden, und wer nicht aktiv ist, ist halt "inaktiv". Gruß K-H |
Re: Schleifen Optimierung?
Delphi-Quellcode:
[/quote]
Function StatusCustomer (Customer_Number: String): Boolean;
Begin result:= false; FormMain.QueryUpdate.Params.ParamValues['Customer_Number'] := Customer_Number; FormMain.QueryUpdate.Params.ParamValues['Date'] := Date(); FormMain.QueryUpdate.Open; Try result := (FormMain.QueryUpdate.FieldByName('Anzahl').AsInteger > 0); Finally FormMain.QueryUpdate.Close; End; End; Wobei ich damit Probleme bekomme, da MySql irgendwi eine andere Formatierung benutzt für Date. Hate davor alles in Varchar und hab es für diese funktion in Date geändert, da er mit Varchar keine richtigen ergenisse seiten aktive und inaktive mehr raus geworfen hat, allerdings auch nicht mit Date. Date in MySQL sieht so aus: 2009-07-19 z.B, wobe in Date doch 19.07.2009 |
Re: Schleifen Optimierung?
Notfalls halt
Delphi-Quellcode:
FormMain.QueryUpdate.Params.ParamByName('Date').Value := Date();
|
Re: Schleifen Optimierung?
Würde es gern schon richtig machen.
Nur wie kann ich das anstellen das Delphi und MySQL Datum übereinstimmen ohne dabei auf dd.mm.yyyy verzichten zumüssen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:22 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