![]() |
Datenbank: mdb • Zugriff über: ado
SQL-String vereinfachen
Hallo Gemeinde,
wenn ich eine Maske erstelle die als Abfrageoption mehrere Spalten anbietet, wie macht man dies in einer SQL-Abfrage. als Beispiel: zur Option stehen username, datum von, datum bis, userid Ziel ist es eben nicht alle benutzen zu müssen,sondern nur eine, ein paar oder alle. Jetzt würde ich für jede Option einen SQL-String machen. Kann man also innerhalb eines SQL-Strings festellen ob eines die Felder leer ist? Bzw. für die Datumseinschränkung wollte ich einen Dattimepicker verwenden, der ja aber immer einen Inhalt hat. Sollte man da einen Schalter einbauen (Radio) um die Datumsabfrage einzuschließen? Grüße |
Re: SQL-String vereinfachen
Hi,
ich bin mir nicht sicher, ob ich dich verstanden habe. Wenn ja willst du doch zur Laufzeit den SQL Befehl zusammenbauen. Oder? Ich hatte mal vor lager Zeit ein ähnliches Problem und habe das so gelöst: qryB2 : TQuery edtXYZ : TEdit
Delphi-Quellcode:
with qryB2 do
begin S := GetSuchStr; if S = '' then Goto Ende; Close; SQL.Clear; SQL.Add(S); if edtSuchKtArt.Text <> '' then ParamByName('SuchKtArt').asString := edtSuchKtArt.Text; if edtSuchKonto.Text <> '' then ParamByName('SuchKonto').asString := edtSuchKonto.Text; if edtSuchBetrag.Text <> '' then ParamByName('SuchBetrag').asFloat := StrToFloat(edtSuchBetrag.Text); if edtSuchBelegNr.Text <> '' then ParamByName('SuchBelegnr').asString := edtSuchBelegnr.Text; ParamByName('VonDatum').asString := DateToStr(VonDatum); ParamByName('BisDatum').asString := DateToStr(BisDatum); Open; SetLength(lfBestand, RecordCount + 1); end; // von with qryB2 do
Delphi-Quellcode:
function TfrmMain.GetSuchStr: string;
var S : string; AddS2Aufrufe : integer; procedure AddS2(S2: string); begin Inc(AddS2Aufrufe); if S = 'SELECT * FROM B2' then S := S + ' WHERE '; if S = 'SELECT * FROM B2 WHERE ' then S := S + '(' + S2 + ')' else S := S + ' AND (' + S2 + ')'; end; begin AddS2Aufrufe := 0; S := 'SELECT * FROM B2'; if edtSuchKtArt.Text <> '' then AddS2('KTA2 = :SuchKtArt'); if edtSuchKonto.Text <> '' then AddS2('KTN2 = :SuchKonto'); if edtSuchBetrag.Text <> '' then if btbtnEUR.Visible then AddS2('BGB2 = :SuchBetrag') else AddS2('BGBT = :SuchBetrag'); if edtSuchBelegNr.Text <> '' then AddS2('BLN1 = :SuchBelegNr'); AddS2('BDA1 >= :VonDatum'); // 24.04.02 von BGDT auf BDA1 geändert AddS2('BDA1 <= :BisDatum'); // 24.04.02 von BGDT auf BDA1 geändert if chkbxSortieren.Checked then S := S + ' ORDER BY KTA2, KTN2, BDA1, BLN1'; if AddS2Aufrufe <= 2 then begin ShowMessage('Suchbedingung ist unvollständig'); S := ''; end; result := S; end; Der Code ist nicht schön aber es klappt Grüße Thomas |
Re: SQL-String vereinfachen
Danke,
das muss ich mir erstmal langsam reinziehen. st ja doch ganz schön komplex dann. Danke ! |
Re: SQL-String vereinfachen
Hallo!
Oder wenn Du Deinen SQL-String nicht zusammenbastelln willst:
Delphi-Quellcode:
select
* from Tabelle where (0 = :TEST_NAME or USERNAME = :USERNAME) and (0 = :TEST_ID or USERID = :USERID) and (0 = :TEST_VON or DATUM_VON = :DATUM_VON) and (0 = :TEST_BIS or DATUM_BIS = :DATUM_BIS)
Delphi-Quellcode:
Wenn der Parameter TEST_xxx = 0 gesetzt wird, dann wird die entsprechende Spalte nicht ausgewertet.
qry.ParamByName('TEST_NAME').AsInteger := Length(eUsername.Text);
qry.ParamByName('USERNAME').AsString := eUsername.Text; qry.ParamByName('TEST_ID').AsInteger := eUserID.AsInteger; qry.ParamByName('USERID').AsInteger := eUserID.AsInteger; qry.ParamByName('TEST_VON').AsInteger := Integer(cbCheckDatumVon.Checked); qry.ParamByName('DATUM_VON').AsDate := dtpDatumVon.Date; qry.ParamByName('TEST_BIS').AsInteger := Integer(cbCheckDatumBis.Checked); qry.ParamByName('DATUM_BIS').AsDate := dtpDatumBis.Date; Grüße |
Re: SQL-String vereinfachen
Cool.
Kannte ich noch nicht. (Ich bin übrigens in Remscheid geboren) Grüße Thomas |
Re: SQL-String vereinfachen
Hi,
SQL-Code:
Das funktioniert zwar, ist aber nicht sehr performant,
select
* from Tabelle where (0 = :TEST_NAME or USERNAME = :USERNAME) and (0 = :TEST_ID or USERID = :USERID) and (0 = :TEST_VON or DATUM_VON = :DATUM_VON) and (0 = :TEST_BIS or DATUM_BIS = :DATUM_BIS) da der SQL-Server wegen der OR-Verknüpfungen keinen Index nutzen kann. Je nach Datenvolumen kann das sehr langsam werden. Performantere Ergebnisse erhält man tatsächlich durch das Zusammenbauen einer SQL-Abfrage, in der nur die benötigten Bedingungen enthalten sind. |
Re: SQL-String vereinfachen
Danke für Eure Antworten,
das würde also bedeuten dass GroHae's Vorschlag der beste wäre. Ich habs immer noch nicht getestet da noch anderes auf der ToDo steht. kann man das nicht mit (IIF(edit.text > '',spalte,0)) lösen? |
Re: SQL-String vereinfachen
Zitat:
|
Re: SQL-String vereinfachen
Zitat:
Zitat:
|
Re: SQL-String vereinfachen
Zitat:
Dann werd ich mir das doch näher ansehen... Danke! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz