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 1 von 3  1 23      
youuu

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

Schleifen Optimierung?

  Alt 14. Jul 2009, 21:47
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] = 'aktivethen
        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?
Steven
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Schleifen Optimierung?

  Alt 14. Jul 2009, 21:52
Verwende (SQL-)Paramter.
Die Schleife scheint mir zudem überflüssig, weil result auch direkt setzen kannst.
Markus Kinzler
  Mit Zitat antworten Zitat
youuu

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

Re: Schleifen Optimierung?

  Alt 14. Jul 2009, 21:57
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?
Steven
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Schleifen Optimierung?

  Alt 14. Jul 2009, 21:59
SELECT * FROM '+Tabelle.position+Where Customer_Number = :Customer_Number;
Markus Kinzler
  Mit Zitat antworten Zitat
youuu

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

Re: Schleifen Optimierung?

  Alt 14. Jul 2009, 22:14
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.
Steven
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Schleifen Optimierung?

  Alt 14. Jul 2009, 22:20
Zitat:
Dadurch wird aber die Abfrage nicht schneller gestaltet oder?
In diesem Teil nicht, ist aber übersichtlicher
Ich würde noch
StrToDate(FormMain.QueryUpdate.FieldByName('announcement_date').AsString) durch
FormMain.QueryUpdate.FieldByName('announcement_date').AsDate oder noch besser
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)
Markus Kinzler
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Schleifen Optimierung?

  Alt 14. Jul 2009, 22:20
Glaube SQL-Parameter ist ein allgemein gemeinter Verbesserungsvorschlag
...und reicht nicht auch ein
SELECT announcement_date FROM ... €: Der Thread schlummerte wohl zu lange im Tab, keine rote Box
  Mit Zitat antworten Zitat
youuu

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

Re: Schleifen Optimierung?

  Alt 14. Jul 2009, 22:32
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?
Steven
  Mit Zitat antworten Zitat
generic

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

Re: Schleifen Optimierung?

  Alt 14. Jul 2009, 22:35
Ich würde die Unterabfrage seinen lassen und direkt in die erste joinen lassen.
Das sollte viel schneller gehen.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
youuu

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

Re: Schleifen Optimierung?

  Alt 14. Jul 2009, 22:37
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?
Steven
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 08:22 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