AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Optimierung von Abfrage
Thema durchsuchen
Ansicht
Themen-Optionen

Optimierung von Abfrage

Ein Thema von Klarabella · begonnen am 21. Dez 2004 · letzter Beitrag vom 22. Dez 2004
 
Klarabella

Registriert seit: 28. Sep 2004
59 Beiträge
 
#1

Optimierung von Abfrage

  Alt 21. Dez 2004, 15:23
Hallo Leute!

Ich weiß, es gibt zu diesem Thema einiges bei der Suche, aber ich habe mir schon einiges zu Herzen genommen und es geht immer noch nicht fixer...

Also, ich habe ein Progrämmchen, dass eine Abfrage aus einer Datenbank erstellt.

Zunächst werden von meinem Programm aus zwei Views auf die Datenbank erstellt. Dies geht recht schnell.

Anschließend werden alle benötigten Daten in einem bestimmten Zeitraum in ein Grid geladen. Das sind dann im Test etwa 40 Datensätze.

Beim Start des Programms wird der Benutzer nach einer weiteren Einschränkung gefragt, die bisher nicht berücksichtigt ist.
Die Datensätze im Grid werden nun noch einmal durchlaufen und auf die gegebene Einschränkung überprüft.

Alle Datensätze, die positiv geprüft wurden, werden dann in ein StringGrid übernommen, dass sichtbar auf dem Formular ist. Wenn dieses am Ende angezeigt wird, dann sind daher alle Einschränkungen enthalten.

Ich habe den Weg der zweifachen Übergabe deswegen gewählt, weil der Benutzer seine Einschränkung im geladenen Formular noch ändern kann. In diesem Fall muss nicht noch einmal komplett aus der Datenbank geladen werden, sondern es reicht ein Blick auf das im Hintergrund befindliche StringGrid.

Hier mal ein bisschen Code zum besseren Verständnis:
Das Laden aus der Datenbank:
Delphi-Quellcode:
 sqlBefehl1 := 'SELECT * FROM Garantie_View WHERE (ablaufdatum BETWEEN ' +
             ':startdatum AND :enddatum)';
  sqlBefehl2 := 'SELECT * FROM Garantie_View WHERE (bf_pov_feld_5 BETWEEN ' +
             ':startdatum AND :enddatum)';
  sqlBefehl3 := 'SELECT * FROM Garantie_View2 WHERE (bf_pov_feld_5 BETWEEN ' +
             ':startdatum AND :enddatum)';

  rowZaehler := 0;

  FillGrid(sqlBefehl1, rowZaehler, true);
  FillGrid(sqlBefehl2, rowZaehler, true);
  FillGrid(sqlBefehl3, rowZaehler, false);
Und die Zuweisung der Parameter in der Procedure FillGrid:
Delphi-Quellcode:
qryDatenbank.SQL.Text := sql;

  // Parsen des Statements um Query Parameter zu finden
  qryDatenbank.Prepared := true;

  //start_datum entspricht dem aktuellen Datum
  qryDatenbank.ParamByName('startdatum').DataType := ftDate;
  qryDatenbank.ParamByName('startdatum').Value := Date;
  qryDatenbank.ParamByName('enddatum').DataType := ftDate;
  qryDatenbank.ParamByName('enddatum').Value := m_end_Datum;
...und hier die Übernahme vom ersten StringGrid (sgGarantie) in das zweite (sgGarantie_Daten):
Delphi-Quellcode:
rowC := 1;
  if (m_verkaeufer = 'Alle') then
    for i := 0 to sgGarantie.RowCount - 1 do
    begin
      sgGarantie_Daten.Rows[rowC] := sgGarantie.Rows[i];
      rowC := rowC + 1;
      sgGarantie_Daten.RowCount := rowC;
    end
  else
    for i := 0 to sgGarantie.RowCount - 1 do
      if (sgGarantie.Cells[7,i] = m_verkaeufer) then
      begin
        sgGarantie_Daten.Rows[rowC] := sgGarantie.Rows[i];
        rowC := rowC + 1;
        sgGarantie_Daten.RowCount := rowC;
      end;
Hat jemand Vorschläge zur Optimierung? Denn das Aufrufen dauert doch sehr lange...
  Mit Zitat antworten Zitat
 


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