AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Schleifen Optimierung?

Ein Thema von youuu · begonnen am 14. Jul 2009 · letzter Beitrag vom 15. Jul 2009
Antwort Antwort
Seite 2 von 3     12 3      
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#11

Re: Schleifen Optimierung?

  Alt 15. Jul 2009, 07:13
z.B. so:
SQL-Code:
SELECT c.*,
  (SELECT count(p.Customer_Number)
   FROM Position p
   Where p.Customer_Number = c.Customer_Number) Anzahl
FROM Customer c
[edit=mkinzler]Code-Tag durch SQL-Tag ersetzt Mfg, mkinzler[/edit]
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#12

Re: Schleifen Optimierung?

  Alt 15. Jul 2009, 08:51
^^^ 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:
StrToDate(FormMain.QueryUpdate.FieldByName('announcement_date').AsString) >= Date() Warum muss das im Code passieren? Warum machst du das nicht direkt im SQL.
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.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
GHorn

Registriert seit: 24. Mär 2009
Ort: NRW
124 Beiträge
 
#13

Re: Schleifen Optimierung?

  Alt 15. Jul 2009, 09:01
Von generic: Break in der while-Schleife

Wenn Du dann noch nach dem Datumfeld sortierst, bist Du schnell fertig.


    FormMain.QueryUpdate.SQL.Text:='SELECT * FROM '+Tabelle.position+' Where Customer_Number = '''+Customer_Number+'''order by announcement_date DESC
Gruß
Gerald
  Mit Zitat antworten Zitat
Tyrolean

Registriert seit: 3. Jul 2003
76 Beiträge
 
Delphi 7 Professional
 
#14

Re: Schleifen Optimierung?

  Alt 15. Jul 2009, 09:24
Zitat von Blup:
z.B. so:
SQL-Code:
SELECT c.*,
  (SELECT count(p.Customer_Number)
   FROM Position p
   Where p.Customer_Number = c.Customer_Number) Anzahl
FROM Customer c
Eigentlich am schnellsten müsste sein

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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.009 Beiträge
 
Delphi 12 Athens
 
#15

Re: Schleifen Optimierung?

  Alt 15. Jul 2009, 09:38
Mein SQL ist zwar gerade etwas eingerostet, aber geht es nicht einfacher (schneller) so?

Delphi-Quellcode:
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;
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.

Delphi-Quellcode:
  
  FormMain.QueryUpdate.SQL.Text := 'SELECT Count(*) AS Anzahl FROM ' + Tabelle.position +
      ' Where (Customer_Number = :Customer_Number) and (announcement_date >= :Date)' ;
Die Funktion reduziert sich dann auf

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;
Uwe Raabe
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#16

Re: Schleifen Optimierung?

  Alt 15. Jul 2009, 11:30
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.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#17

Re: Schleifen Optimierung?

  Alt 15. Jul 2009, 13:06
Entschuldigt, aber die Ausgangsfrage war doch herauszufinden ob ein Kunde noch aktiv ist?
Dann sollte so etwas eigentlich ausreichen:

SQL-Code:
select distinct Kundenname
from KundendTab,PositionTab
where KundenTab.KundenID=PositionTab.KundenID
  and Position.Datum>sysdate
(Ich hab es nicht so mit den Joins, ich hoffe es ist trotzdem klar worauf ich raus will)

Dann hat man schon einmal eine Liste der "aktiven" Kunden, und wer nicht aktiv ist, ist halt "inaktiv".

Gruß
K-H
  Mit Zitat antworten Zitat
youuu

Registriert seit: 2. Sep 2008
Ort: Kleve
822 Beiträge
 
Delphi 2010 Professional
 
#18

Re: Schleifen Optimierung?

  Alt 15. Jul 2009, 18:09
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;
[/quote]

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
Steven
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#19

Re: Schleifen Optimierung?

  Alt 15. Jul 2009, 18:16
Notfalls halt FormMain.QueryUpdate.Params.ParamByName('Date').Value := Date();
Markus Kinzler
  Mit Zitat antworten Zitat
youuu

Registriert seit: 2. Sep 2008
Ort: Kleve
822 Beiträge
 
Delphi 2010 Professional
 
#20

Re: Schleifen Optimierung?

  Alt 15. Jul 2009, 18:38
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?
Steven
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:27 Uhr.
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