![]() |
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:
|
Re: SQL Statements verknüpfen
Nur ein Verdacht:
Sind Deine Attribute vom Typ String? Wenn ja, dann solltest Du Anführungszeichen um die Werte machen. Also wie :
Code:
sonst denkt das Datenbanksystem, dass Du einen Satz abfragen willst, dessen Feld Attributname gleich dem Feld abc ist.
WHERE Attributname = "abc" and ...
|
Re: SQL Statements verknüpfen
Auch wenn der String von " eingeschlossen ist kommt dieser Fehler! Die Felder in der Tabelle sind alles Strings, ja.
|
Re: SQL Statements verknüpfen
Hallo,
So richtig habe ich das erste Posting nicht verstanden ;) aber vielleicht kannst du es ja ohne Filter machen ... Wenn es sich immer um die gleiche Tabelle geht, die gleichen auszugebenden Felder und nur um verschiedene WHERE-Klauseln handelt, könnte man auch UNION benutzen. Bsp. Tabelle Personal PersonalId Integer PersonalName Char(50) PersonGroup Integer Dann klappt folgendes
SQL-Code:
Das ist nur ein einfaches Bsp., was natürlich viel einfacher mit einem Where gemacht werden könnte!
Select Personal.PersonalId, Personal.PersonalName
From Personal Where PersonalId<100 Union Select Personal.PersonalId, Personal.PersonalName From Personal Where (PersonalId>200) and (PersonalId<300)
SQL-Code:
Select Personal.PersonalId, Personal.PersonalName
From Personal Where PersonalId<100 Union Select Personal.PersonalId, Personal.PersonalName From Personal Join PersonGroup on PersonGroup.Id=Personal.PersonGroup Where (PersonGroup.No=5) Im 2. Union wird der 2. Teil der Personaltabelle über einen "komplexeren" join ermittelt Vielleicht hilft es ja. Heiko |
Re: SQL Statements verknüpfen
So ganz kapier ich nicht was Union eigentlich macht, verknüpft es die untere mit der oberen Select-Anweisung?
|
Re: SQL Statements verknüpfen
Hallo BBB
Versuchs doch einfach mal so AdsQuery1.Close; AdsQuery1.SQL.Clear; AdsQuery1.SQL.Add('SELECT * FROM "cFileName" WHERE '); AdsQuery1.SQL.Add('PRIMNUTZER LIKE " '+UpperCase(trim(txtPrimNutz.Text))+'% " '); Wichtig sind die doppelten Anführungszeichen und anstatt dem Sternchen musst du in SQL das Prozentzeichen setzten. Die Trim Funktion entfernt unötige Leerzeichen vor und hinter dem Text. Erwin |
Re: SQL Statements verknüpfen
Jetzt bekomm ich dann einen Fehler,den ich auch schon mehrmals heute gesehen habe, aber mit dem ich leider nichts anfangen kann:
[...] Either ACE could not find the specified file, or you do not have sufficent rights to access the file. Table name: cFileName' [...] An der Stelle hab ich dann (mehrmals) probiert anstelle von cFileName (beinhaltet: "Testtabelle.ADT"), den kompletten Pfadnamen inklusive dem Tabellennamen zu übergeben (C:\Temp\Testtabelle.ADT zB.) Und bekomme dann [...] Column not found: abc1 --Location of Error in the SQL Statement is 122 (line2: column: 17)'. [...] An dieser Stelle würde praktisch "a" aus abc1 stehen. //edit: Nein ich glaube dass das Zeichen 122 das "-Zeichen ist; also scheint er an dieser Stelle irgendwas ganz anderes zu erwarten!?! //edit: Der String sieht so aus, nochmal zum Verständnis: SELECT * FROM "C:\Verzeichnis\Tabelle.Dateiendung" WHERE PRIMNUTZER LIKE "ABC1" |
Re: SQL Statements verknüpfen
hast du es schon mit single quotes versucht? (#39: ')
|
Re: SQL Statements verknüpfen
Funktioniert nicht, dann würde mein String irgendwo zu früh aufhören, oder wo würdest du die setzen?
|
Re: SQL Statements verknüpfen
Zitat:
|
Re: SQL Statements verknüpfen
LOL
Die Delphi-Syntax hat doch mit Abfragestring nichts zu tun. Du setzt ein single quote in einen string-literal, indem du #39 als char einfügst ('nicht wie '+39'raus hier') oder indem du zwei single quotes notierst ('nicht wie ''raus'). So: abfrage := 'SELECT * FROM "C:\Verzeichnis\Tabelle.Dateiendung" WHERE PRIMNUTZER LIKE ''ABC1''"; |
Re: SQL Statements verknüpfen
Hm, je nachdem wie ich sie dann setze, passiert entweder garnichts mehr oder der Fehler bleibt derselbe.
|
Re: SQL Statements verknüpfen
Hallo BBB,
genau das macht UNION. Falls du mit deiner Query weitermachen willst: Benutze doch mal eine parametrisierte Query (siehe Hilfe). Dann kannst du dir den ganzen "Quatsch" mit Hochkomma usw. sparen. Heiko |
Re: SQL Statements verknüpfen
dann eben nicht...
|
Re: SQL Statements verknüpfen
Hi
Ob nun cFilter oder SQLSatz, die Vorgehensweise ist die gleiche. Vielleicht schaust du mal unter Tutorials nach, da hab ich mal den Zugriff auf eine Datenbank versucht zu beschreiben. Möglicherweise hilft's. Übrigends, komplizierte Zugriffe lassen sich mit hilfe von Query-Objekten lösen, indem man diese mit rechter Maustaste anklickt. Man bekommt den SQL Editor. Nun kann man die Tabellen laden, die man braucht, Verbindungen sowie Bedingungen einrichten und anschließend sich den SQL-Satz ansehen. Diesen in einen String geschrieben und über die SQL.Add-Methode ener Query zugefügt. Wichtig ist nur, das bevor ein Query.SQL.Add(...) durchgeführt wird, der Aufruf Query.SQL.Clear durchgeführt wird. Ansonsten addieren sich die SQL-Anweisungen und dann ist klar, kann's nicht mehr funktionieren. Übrigends, auf das Close kann lt. Delphi verzichtet werden, da ein Query.SQL.Clear ein Query.Close automatisch durchführt. Aber darauf hab ich bisher auch nicht gesetzt, da ein Close nicht schadet. Wie gesagt: auch wenn einige SQL-Handbücher immer wieder das *-Zeichen als Platzhalter angeben, wenn's funktionieren soll, muß dafür ein % stehen. So geht auch ein Like statt einem Where. Übrigends, was mir auffällt, das du den Syntax SQLSatz:=' Select * from "TabellenName" Where ....' benutzt. Nun ja, diese Art geht vielleicht irgendwo, aber bisher hab ich immer, und das problemlos, SQLSatz:='Select * from '+TabellenName+' Where....' geschrieben. Wichtig sind die Leerzeichen, aber das siehst du, wenn du einen Haltepunkt auf die Zeile Query.Open setzt. Dann kannst du dir den Inhalt deiner SQLSatz-Variable ansehen, wenn du mit der Maus darüber gehst und vielleicht die Fehler erkennen. Gruß oldmax |
Re: SQL Statements verknüpfen
Hallo BBB,
genau das macht das UNION. Heiko |
Re: SQL Statements verknüpfen
Zitat:
|
Re: SQL Statements verknüpfen
Habs dann doch noch hinbekommen gestern :)
Vielen Dank euch allen! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:37 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