Thema: Delphi Optimierung von Abfrage

Einzelnen Beitrag anzeigen

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