AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQL Statements verknüpfen
Thema durchsuchen
Ansicht
Themen-Optionen

SQL Statements verknüpfen

Ein Thema von BBB · begonnen am 23. Aug 2006 · letzter Beitrag vom 25. Aug 2006
Antwort Antwort
Seite 1 von 3  1 23      
BBB

Registriert seit: 13. Jul 2006
25 Beiträge
 
#1

SQL Statements verknüpfen

  Alt 23. Aug 2006, 12:53
Datenbank: .adt • Version: 7.0 • Zugriff über: SQL
Leider konnte ich über die Suchefunktion im Forum mal wieder nichts finden und deswegen Frage ich nochmal, obwohl ich mir sicher bin, dass dieses Problem schonmal jemand vor mir hatte.
Ich möchte Datensätze aus einer Tabelle filtern und die Bedingung bzw. das SQL-Statement für verschiedene Fälle anders übergeben. Die Abfrage für die Bedinungen dazu habe ich, aber mir fehlt die Verknüpfung der SQL-Statements.
Bevor ich den Filter mit SQL definiert habe sah das ganze noch so aus:

Delphi-Quellcode:
begin
   cFilter := '';

   if txtPrimNutz.Text <> 'then begin
      if checkboxExakt1.checked = true then begin
         cFilter := 'Upper(PRIMNUTZER) = ALLTRIM("'+UpperCase(txtPrimNutz.Text)+'")';
      end
      else begin
         cFilter := 'Upper(PRIMNUTZER) = ALLTRIM("'+UpperCase(txtPrimNutz.Text + '*')+'")';
      end;
   end;

   if txtBez.Text <> 'then begin
      if checkboxExakt2.Checked = true then begin
         if cFilter <> 'then cFilter := cFilter + ' and';
         cFilter := cFilter + ' Upper(BEZEICHNUNG) = ALLTRIM("'+UpperCase(txtBez.Text)+'")';
      end
      else begin
         if cFilter <> 'then cFilter := cFilter + ' and';
         cFilter := cFilter + ' Upper(BEZEICHNUNG) = ALLTRIM("'+UpperCase(txtBez.Text + '*')+'")';
      end;
   end;

   if txtStandort.Text <> 'then begin
      if checkboxExakt3.checked = true then begin
         if cFilter <> 'then cFilter := cFilter + ' and';
         cFilter := cFilter + ' Upper(STANDORT) = ALLTRIM("'+UpperCase(txtStandort.Text)+'")';
      end
      else begin
         if cFilter <> 'then cFilter := cFilter + ' and';
         cFilter := cFilter + ' Upper(STANDORT) = ALLTRIM("'+UpperCase(txtStandort.Text + '*')+'")';
      end;
   end;

   //Filter setzen
   AdsTable1.Filter := cFilter;
   If cFilter <> ''then AdsTable1.Filtered := true;
end;
Mit SQL würde es für den ersten Teil so aussehen und auch soweit funktionieren:

SQL-Code:
begin
   cFileName := AdsTable1.TableName;

   if txtPrimNutz.Text <> 'then begin
      if checkboxExakt1.checked = true then begin
         AdsQuery1.Close;
         AdsQuery1.SQL.Clear;
         AdsQuery1.SQL.Add('SELECT * FROM "cFileName" WHERE PRIMNUTZER = '+UpperCase(txtPrimNutz.Text)+'');
      end
      else begin
         AdsQuery1.Close;
         AdsQuery1.SQL.Clear;
         AdsQuery1.SQL.Add('SELECT * FROM "cFileName" WHERE PRIMNUTZER = '+UpperCase(txtPrimNutz.Text + '*')+'');
      end;
   end;
.
.
.
Aber wie verknüpf ich die Statements jetzt wieder miteinander?
Bzw. wie würde eine and-Verknüpfung von

AdsQuery1.SQL.Add('SELECT * FROM "cFileName" WHERE PRIMNUTZER = '+UpperCase(txtPrimNutz.Text)+'');

und

AdsQuery1.SQL.Add('SELECT * FROM "cFileName" WHERE BEZEICHNUNG = '+UpperCase(txtBez.Text)+'');

aussehen???
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: SQL Statements verknüpfen

  Alt 23. Aug 2006, 12:57
w
Zitat:
ie würde eine and-Verknüpfung von

AdsQuery1.SQL.Add('SELECT * FROM "cFileName" WHERE PRIMNUTZER = '+UpperCase(txtPrimNutz.Text)+'');

und

AdsQuery1.SQL.Add('SELECT * FROM "cFileName" WHERE BEZEICHNUNG = '+UpperCase(txtBez.Text)+'');

aussehen???
SELECT * FROM "cFileName" WHERE PRIMNUTZER = :nutzer and BEZEICHNUNG = :bez;
Markus Kinzler
  Mit Zitat antworten Zitat
oldmax

Registriert seit: 27. Apr 2006
Ort: Gieboldehausen
167 Beiträge
 
#3

Re: SQL Statements verknüpfen

  Alt 23. Aug 2006, 13:27
Hi
Ich nehme grundsätzlich eine Stringvariable, die ich auch übersichtlich zusammensetzen kann. z.B.
SqlSatz:='Select * From '+TabelleName;
SqlSatz:=SqlSatz+' Where (Feld_A='''+Vergleich_A+''')';
MyQuery.SQL.Clear;
MyQuery.SQL.Add(SQLSatz);
MyQuery.Open;

es mag vielleicht etwas umständlich aussehen, aber ich kann diesen Satz bpw. durch einen Haltepunkt bei bei der Query-Open Anweisung kontrollieren. Außerdem ist eine Erweiterung mit "And" und "Or" kein Problem und bleibt selbst bei kompliziert geschachtelten Bedingungen übersichtlich.

SqlSatz:='Select * From '+TabelleName;
SqlSatz:=SqlSatz+' Where ((Feld_A='''+Vergleich_A+''')';
SqlSatz:=SqlSatz+' and (Feld_B='''+Vergleich_B+'''))';
SqlSatz:=SqlSatz+' or (Feld_C='''+Vergleich_C+''')';

Selbst Klammern sind kein Problem.
Gruß oldmax
Noch ist mein Rechner mir zu Diensten.... ansonsten habe ich die Macht ihn zu vernichten !
  Mit Zitat antworten Zitat
BBB

Registriert seit: 13. Jul 2006
25 Beiträge
 
#4

Re: SQL Statements verknüpfen

  Alt 23. Aug 2006, 13:31
Das führt zu einem Fehler oder ich versteh deinen Tipp nicht.


SQL-Code:
begin
   cFilter := '';
   cFileName := AdsTable1.TableName;

   if txtPrimNutz.Text <> 'then begin
      if checkboxExakt1.checked = true then begin
         AdsQuery1.Close;
         AdsQuery1.SQL.Clear;
         cFilter := 'SELECT * FROM "cFileName" WHERE PRIMNUTZER = "'+UpperCase(txtPrimNutz.Text)+'"';
      end
      else begin
         AdsQuery1.Close;
         AdsQuery1.SQL.Clear;
         cFilter := ('SELECT * FROM "cFileName" WHERE PRIMNUTZER = "'+UpperCase(txtPrimNutz.Text + '*')+'"');
      end;
   end;

   if txtBez.Text <> 'then begin
      if checkboxExakt2.Checked = true then begin
         if cFilter <> 'then cFilter := cFilter + ' and';
         AdsQuery1.Close;
         AdsQuery1.SQL.Clear;
         cFilter := cFilter + ' BEZEICHNUNG = "'+UpperCase(txtBez.Text)+'"';
      end
      else begin
         if cFilter <> 'then cFilter := cFilter + ' and';
         AdsQuery1.Close;
         AdsQuery1.SQL.Clear;
         cFilter := cFilter + ' BEZEICHNUNG = "'+UpperCase(txtBez.Text + '*')+'"';
      end;
   end;
.
.
.
//edit: Danke oldmax ich werds mal sorum probieren aber ich denke mein Fehler liegt irgendwo anders, kann garnicht mehr kompilieren mitlerweile und bekomm nur ne 4zeilige, recht unverständliche Fehlermeldung.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: SQL Statements verknüpfen

  Alt 23. Aug 2006, 13:47
Delphi-Quellcode:
AdsQuery1.SQL.Text := 'SELECT * FROM "cFileName" WHERE PRIMNUTZER like :nutzer and BEZEICHNUNG like :bez and standort like :standort;';
if txtPrimNutz.Text <> 'then
begin
    AdsQuery1.ParamByName('nutzer').value := UpperCase( txtPrimNutz.Text)
    if checkboxExakt1.checked then
        AdsQuery1.ParamByName('nutzer').value := AdsQuery1.ParamByName('nutzer').value+'%';
else
    AdsQuery1.ParamByName('nutzer').value := '%';
...
AdsQuery1.Open;
Markus Kinzler
  Mit Zitat antworten Zitat
BBB

Registriert seit: 13. Jul 2006
25 Beiträge
 
#6

Re: SQL Statements verknüpfen

  Alt 23. Aug 2006, 14:03
Danke für die Codebsp! Ich weis eure Mühe echt zu schätzen aber so ganz blick ich in dem Code nicht durch. Ich werd einfach mal damit rumprobieren.

Es gibt nach wie vor einen Fehler, obwohl es meiner Meinung nach richtig aussieht.
Hier nochmal der Code, vielleicht kann mir jemand sagen wo der Fehler liegt.

SQL-Code:
begin
   cFilter := '';
   cFileName := AdsTable1.TableName;

   if txtPrimNutz.Text <> 'then begin
      if checkboxExakt1.checked = true then begin
         cFilter := 'Select * From "cFileName" Where PRIMNUTZER = '+UpperCase(txtPrimNutz.Text)+'';
      end
      else begin
         cFilter := 'Select * From "cFileName" Where PRIMNUTZER = '+UpperCase(txtPrimNutz.Text + '*')+'';
      end;
   end;

   if txtBez.Text <> 'then begin
      if checkboxExakt2.Checked = true then begin
         if cFilter <> 'then cFilter := cFilter + ' and';
         cFilter := cFilter + ' BEZEICHNUNG = '+UpperCase(txtBez.Text)+'';
      end
      else begin
         if cFilter <> 'then cFilter := cFilter + ' and';
         cFilter := cFilter + ' BEZEICHNUNG = '+UpperCase(txtBez.Text + '*')+'';
      end;
   end;

   if txtStandort.Text <> 'then begin
      if checkboxExakt3.checked = true then begin
         if cFilter <> 'then cFilter := cFilter + ' and';
         cFilter := cFilter + ' STANDORT = '+UpperCase(txtStandort.Text)+'';
      end
      else begin
         if cFilter <> 'then cFilter := cFilter + ' and';
         cFilter := cFilter + ' STANDORT = '+UpperCase(txtStandort.Text + '*')+'';
      end;
   end;

   AdsQuery1.Close;
   AdsQuery1.SQL.Clear;
   AdsQuery1.SQL.Add(cFilter);
   If cFilter <> 'Then AdsQuery1.ExecSQL; // <-- In dieser Zeile kommt der Fehler!
cFilter sieht, wenn ich abc1-3 als Suchkriterium übergebe dann so aus:
Zitat:
Select * From "cFileName" Where PRIMNUTZER = abc1 and BEZEICHNUNG = abc2 and Standort = abc3
cFileName beinhaltet "Testtabelle1.ADT"

Und der Fehler lautet:

Zitat:
Im Projekt <Projektname.exe> ist eine Exeption der Klasse EADSDatabaseError aufgetreten. Meldung: 'AdsQuery1: Error 7200: AQEError: State = 42000; NativeError = 2115; [Extended Systems][Advantage SQL Engine]Expected lexical Element not found: identifier or Expression -- Location of error in the SQL Statement is: 55 (line: 2 column: 1) There was a Problem parsing the WHERE clause in your SELECT statement.'. Prozeß wurde angehalten. Mit einzelne Anweisung oder Start fortsetzen.
  Mit Zitat antworten Zitat
BBB

Registriert seit: 13. Jul 2006
25 Beiträge
 
#7

Re: SQL Statements verknüpfen

  Alt 23. Aug 2006, 15:05
Es funktioniert auch nicht wenn ich die Bedingungen im "Where"-Bereich einklammere; kann es vielleicht sein, dass man "and" nicht verwenden darf wenn man mehr als 2 Bedingungen stellt?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: SQL Statements verknüpfen

  Alt 23. Aug 2006, 15:10
Zitat von BBB:
Es funktioniert auch nicht wenn ich die Bedingungen im "Where"-Bereich einklammere; kann es vielleicht sein, dass man "and" nicht verwenden darf wenn man mehr als 2 Bedingungen stellt?
Ich kenne mich mich ADS nicht so aus, könnte aber durchaus möglich sein.
Markus Kinzler
  Mit Zitat antworten Zitat
BBB

Registriert seit: 13. Jul 2006
25 Beiträge
 
#9

Re: SQL Statements verknüpfen

  Alt 23. Aug 2006, 15:35
Also das SQL-Statement ansich stimmt so oder?
Also:

Select * From "cFileName" Where PRIMNUTZER = abc1 and BEZEICHNUNG = abc2 and STANDORT = abc3

bzw auch mit Klammern gehts nicht:

Select * From "cFileName" Where (PRIMNUTZER = abc1) and (BEZEICHNUNG = abc2) and (STANDORT = abc3)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: SQL Statements verknüpfen

  Alt 23. Aug 2006, 15:54
Zitat:
Also das SQL-Statement ansich stimmt so oder?
Ansich sollte es stimmen.
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 17:39 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