AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQL-String vereinfachen

SQL-String vereinfachen

Ein Thema von Privateer3000 · begonnen am 20. Aug 2008 · letzter Beitrag vom 21. Aug 2008
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Privateer3000
Privateer3000

Registriert seit: 10. Jun 2002
Ort: Jena
1.128 Beiträge
 
Delphi 10.4 Sydney
 
#1

SQL-String vereinfachen

  Alt 20. Aug 2008, 09:02
Datenbank: mdb • Zugriff über: ado
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
Peter
+++Versuch es nicht mit Gewalt + Nimm einen größeren Hammer! +++
  Mit Zitat antworten Zitat
GroHae

Registriert seit: 19. Apr 2007
Ort: Nabburg
83 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: SQL-String vereinfachen

  Alt 20. Aug 2008, 09:55
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 B2then
      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
Grüße

Thomas
  Mit Zitat antworten Zitat
Benutzerbild von Privateer3000
Privateer3000

Registriert seit: 10. Jun 2002
Ort: Jena
1.128 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: SQL-String vereinfachen

  Alt 20. Aug 2008, 10:37
Danke,
das muss ich mir erstmal langsam reinziehen.
st ja doch ganz schön komplex dann.

Danke !
Peter
+++Versuch es nicht mit Gewalt + Nimm einen größeren Hammer! +++
  Mit Zitat antworten Zitat
automatix

Registriert seit: 1. Mai 2008
Ort: Remscheid
39 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: SQL-String vereinfachen

  Alt 20. Aug 2008, 11:21
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
  Mit Zitat antworten Zitat
GroHae

Registriert seit: 19. Apr 2007
Ort: Nabburg
83 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: SQL-String vereinfachen

  Alt 20. Aug 2008, 13:59
Cool.

Kannte ich noch nicht.

(Ich bin übrigens in Remscheid geboren)

Grüße

Thomas
Grüße

Thomas
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#6

Re: SQL-String vereinfachen

  Alt 20. Aug 2008, 16:20
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.
Gruß
Norman
  Mit Zitat antworten Zitat
Benutzerbild von Privateer3000
Privateer3000

Registriert seit: 10. Jun 2002
Ort: Jena
1.128 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: SQL-String vereinfachen

  Alt 21. Aug 2008, 08:39
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?
Peter
+++Versuch es nicht mit Gewalt + Nimm einen größeren Hammer! +++
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: SQL-String vereinfachen

  Alt 21. Aug 2008, 08:42
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
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Reinhardtinho
Reinhardtinho

Registriert seit: 26. Feb 2007
411 Beiträge
 
Delphi 5 Enterprise
 
#9

Re: SQL-String vereinfachen

  Alt 21. Aug 2008, 08:48
Zitat von Privateer3000:
das würde also bedeuten dass GroHae's Vorschlag der beste wäre.
Nur bitte ohne Goto:

Zitat von GroHae:
        if S = 'then Goto Ende;
Ich habe viel von meinem Geld für Alkohol, Weiber und schnelle Autos ausgegeben ... Den Rest habe ich einfach verpraßt.

George Best - 22.05.1946 - 25.11.2005 - nordirischer Fußballspieler
  Mit Zitat antworten Zitat
Benutzerbild von Privateer3000
Privateer3000

Registriert seit: 10. Jun 2002
Ort: Jena
1.128 Beiträge
 
Delphi 10.4 Sydney
 
#10

Re: SQL-String vereinfachen

  Alt 21. Aug 2008, 08:52
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!
Peter
+++Versuch es nicht mit Gewalt + Nimm einen größeren Hammer! +++
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 16:48 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