![]() |
Datenbank: .adt • Version: 7.0 • Zugriff über: SQL
SQL Statements verknüpfen
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:
Mit SQL würde es für den ersten Teil so aussehen und auch soweit funktionieren:
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;
SQL-Code:
Aber wie verknüpf ich die Statements jetzt wieder miteinander?
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; . . . 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??? |
Re: SQL Statements verknüpfen
w
Zitat:
SQL-Code:
SELECT * FROM "cFileName" WHERE PRIMNUTZER = :nutzer and BEZEICHNUNG = :bez;
|
Re: SQL Statements verknüpfen
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 |
Re: SQL Statements verknüpfen
Das führt zu einem Fehler oder ich versteh deinen Tipp nicht.
SQL-Code:
//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.
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; . . . |
Re: SQL Statements verknüpfen
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; |
Re: SQL Statements verknüpfen
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:
cFilter sieht, wenn ich abc1-3 als Suchkriterium übergebe dann so aus:
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! Zitat:
Und der Fehler lautet: Zitat:
|
Re: SQL Statements verknüpfen
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?
|
Re: SQL Statements verknüpfen
Zitat:
|
Re: SQL Statements verknüpfen
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) |
Re: SQL Statements verknüpfen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:31 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