Hallo Kerim,
wenn die Funktion GetSQL dein
SQL-Statement zusammenbaut, dann solltest du nicht die einzelnen Teile der
SQL-Eigenschaft der
Query zuweisen. Die Zuweisung geschieht doch wahrscheinlich an einer ganz anderen Stelle:
Delphi-Quellcode:
procedure TListeBuchungen.CBYearChange();
var
dt: TDateTime;
begin
Query.SQL.Text := GetSQL;
dt := Now;
Query.Open;
ShowMessage(TimeToStr(Now - dt));
...
end;
Die Funktion GetSQL sollte dann besser so aussehen:
Delphi-Quellcode:
function TListeBuchungen.GetSql:
string;
const
fmt = '
SELECT b.buchunglfdnr, b.lfdnr, b.buchungnr, b.ticketnr, '
+ '
b.adrnr, b.veranstalter, b.hinabflugdatum, b.hinabflugzeit, '
+ '
b.hinabflugort, b.hinankunftort, b.hinflugnr, '
+ '
b.rueckabflugdatum, b.rueckabflugzeit, b.rueckabflugort, '
+ '
b.rueckankunftort, b.rueckflugnr, b.nettopreis, b.anzahlung, '
+ '
b.tax, b.mwst, b.rabatt, b.gewinnprozent, a.name, a.vorname '
+ '
FROM buchungen b, adressen a '
+ '
WHERE EXTRACT(YEAR FROM b.hinabflugdatum) = %d '
+ '
AND b.adrnr = a.adrnr %s '
+ '
ORDER BY %s '
;
var
iJahr: integer;
s, sFilter, sOrder, sPattern:
string;
begin
with CBYear
do
iJahr := StrToInt(Items[ItemIndex]);
sFilter := AnsiUppercase(Trim(edit1.Text));
s := '
';
if sFilter <> '
'
then begin
sPattern := QuotedStr('
%' + SFilter + '
%');
with query do
for i := 0
to FieldCount - 1
do
if Fields[i].DataType = ftString
then begin
if s <> '
'
then s := s + '
OR';
s := s + Format('
UPPER(%s) LIKE %s', [LowerCase(Fields[i].FieldName), sPattern]);
end;
s := '
AND ( ' + s + '
)';
end;
sOrder := '
b.hinabflugdatum';
// hier kommt bestimmt noch mehr Code hin...
Result := Format(fmt, [iJahr, sWhere, sOrder]);
end;
Die Filterung in jedem Textfeld mit einem Like-Pattern, bei dem vorne und hinten trunkiert wird, kann bei größeren Tabellen irgendwann zum Laufzeitproblem werden. Eventuell wirst du die Suche etwas mehr einschränken müssen.
Der Vergleich der Ausführungszeiten von deinem Programm und IBConsole ist bestimmt nicht korrekt. Grundsätzlich erwarte ich ähnliche Zeiten in deinem Programm. Die kurze Ausführungszeit in IBConsole werte ich als Indiz dafür, dass FireBird mit der Erstellung eines optimierten Zugriffsplanes kein Problem hat.
Grüße vom marabu