Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL-String vereinfachen (https://www.delphipraxis.net/119044-sql-string-vereinfachen.html)

Privateer3000 20. Aug 2008 08:02

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

GroHae 20. Aug 2008 08:55

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

Privateer3000 20. Aug 2008 09:37

Re: SQL-String vereinfachen
 
Danke,
das muss ich mir erstmal langsam reinziehen.
st ja doch ganz schön komplex dann.

Danke !

automatix 20. Aug 2008 10:21

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:
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;
Wenn der Parameter TEST_xxx = 0 gesetzt wird, dann wird die entsprechende Spalte nicht ausgewertet.

Grüße

GroHae 20. Aug 2008 12:59

Re: SQL-String vereinfachen
 
Cool.

Kannte ich noch nicht.

(Ich bin übrigens in Remscheid geboren)

Grüße

Thomas

NormanNG 20. Aug 2008 15:20

Re: SQL-String vereinfachen
 
Hi,

SQL-Code:
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)
Das funktioniert zwar, ist aber nicht sehr performant,
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.

Privateer3000 21. Aug 2008 07:39

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?

mkinzler 21. Aug 2008 07:42

Re: SQL-String vereinfachen
 
Zitat:

kann man das nicht mit (IIF(edit.text > '',spalte,0)) lösen?
Nein, den der SQL-Server kann ja nicht auf deine Edits zugreifen

Reinhardtinho 21. Aug 2008 07:48

Re: SQL-String vereinfachen
 
Zitat:

Zitat von Privateer3000
das würde also bedeuten dass GroHae's Vorschlag der beste wäre.

Nur bitte ohne Goto:

Zitat:

Zitat von GroHae
Delphi-Quellcode:
        if S = '' then Goto Ende;

:mrgreen:

Privateer3000 21. Aug 2008 07:52

Re: SQL-String vereinfachen
 
Zitat:

Zitat von mkinzler
Zitat:

kann man das nicht mit (IIF(edit.text > '',spalte,0)) lösen?
Nein, den der SQL-Server kann ja nicht auf deine Edits zugreifen

richtig! hab ich nicht bedacht.
Dann werd ich mir das doch näher ansehen...

Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:27 Uhr.
Seite 1 von 2  1 2      

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