![]() |
SQL und ''
Moin
habe mal wieder ne Frage? folgende SQL Anweisung liefert kein Ergebnis zurück wenn eines der 3 Edit SuchFelder leer ist. WARUM ??:wall:
Delphi-Quellcode:
VIEW_BREMSE:
frmDataMod.SQLDetailQuery.Close;
frmDataMod.SQLDetailQuery.SQL.Clear; frmDataMod.SQLDetailQuery.SQL.Text:=' SELECT * FROM View_Bremse WHERE (( UPPER (Fabrikat ) = '+#39 + AnsiUpperCase(Edit1.Text ) + #39+' ) AND ' + ' ( UPPER (Typ ) = '+#39 + AnsiUpperCase(Edit2.Text ) + #39+' ) AND ' + ' ( UPPER (Spannung ) = '+#39 + AnsiUpperCase(Edit3.Text ) + #39+' )) '; frmDataMod.SQLDetailQuery.Open;
SQL-Code:
Danke Klaus
SELECT t1."ID_Bremse"
, t1."Typ" , t1."sid_Fabrikat" , t1."sid_Spannung" , t2."id_Fabrikat" , t2."Fabrikat" , t3."id_Spannung" , t3."Spannung" FROM tbl_Bremse t1 Left Outer Join tbl_Fabrikat t2 on (t1.sid_Fabrikat=t2.id_Fabrikat) Left Outer Join tbl_Spannung t3 on (t1.sid_Spannung=t3.id_Spannung) [edit=r_kerber]Code- durch Delphi- bzw. SQL-Tags ersetzt. Mfg, r_kerber[/edit] |
Re: SQL und ''
Hallo Klaus,
ich denke, das liegt daran, dass bei
SQL-Code:
Nach einem Nullstring gesucht wird! Du solltest den SQL-String, zumindest jedoch die WHERE-Klausel, besser vorher aufbauen und dann abprüfen, ob das entsprechende Edit-Feld leer ist. Dann erscheint dieser Teil erst gar nicht in der Abfrage!
SELECT * FROM tabelle WHERE spalte = ''
|
Re: SQL und ''
Problem 1:
Warum schreibst du diese #34 vor und nach den Splatennamen? Das kann dazu führen, das du sie auch wieder genauso schreiben musst, wenn du über irgendwelche Mid-ware (ADO, ODBC,...) auf die Daten zugreifen willst. Der View sollte also so aussehen:
SQL-Code:
Standard-SQL-Problem Nummer 0815 ;)
SELECT t1.ID_Bremse
,t1.Typ ,t1.sid_FabrikatE ,t1.sid_Spannung ,t2.id_Fabrikat ,t2.Fabrikat ,t3.id_Spannung ,t3.Spannung FROM tbl_Bremse t1 LEFT OUTER JOIN tbl_Fabrikat t2 ON (t1.sid_Fabrikat = t2.id_Fabrikat) LEFT OUTER JOIN tbl_Spannung t3 ON (t1.sid_Spannung = t3.id_Spannung) Ein Vergleich mit NULL ergibt weder TRUE noch FALSE, sondern NULL (1 = Null) -> NULL !!! Der einzige Operator, der da ein TRUE oder FALSE auspuckt ist "is" (NULL is NULL) -> TRUE (NULL is not NULL) -> FALSE Auch wenn es irgendwie eklig aussieht ;) , vielleicht funktioniert es ja so:
Delphi-Quellcode:
With frmDataMod.SQLDetailQuery Do
Begin SQL.Text := 'SELECT *' + #10 + 'FROM View_Bremse' + #10 + 'WHERE (:i_Fabrikat is NULL OR' + #10 + ' Upper(Fabrikat) = :i_Fabrikat) AND' + #10 + ' (:i_Typ is NULL OR' + #10 + ' Upper(Typ) = :i_Typ) AND' + #10 + ' (:i_Spannung is NULL OR' + #10 + ' Upper(Spannung) = :i_Spannung)'; // Parsen des Statements um Query Parameter zu finden... Prepared := True; // Werte an Query Parameter übergeben... With Parameters Do Begin ParamByName('i_Fabrikat').Value := Edit1.Text; ParamByName('i_Typ').Value := Edit2.Text; ParamByName('i_Spannung').Value := Edit3.Text; End; Open; End; |
Re: SQL und ''
Ich beziehe mich auf den Titel des Threads ! Die " sind nicht notwendig, wenn die Bezeichner genau übereinstimmen ! Also entweder GROß oder klein. Sowohl in SQL, als auch in Delphi !! Was soll das chr (39) bewirken ?
|
Re: SQL und ''
Hallo Klaus!
Wie hier schon gesagt wurde liegt das Problem in dem Vergleich des Inhalts eines Feldes mit '' (das heißt "Nichts" oder anders gesagt NULL). Obwohl ich Deine Aufgabestellung nicht kenne, hoffe ich jedoch, dass die folgenden Selects Dir behilflich sein können.
SQL-Code:
Selektiert werden alle Datensätze, bei denen mindestens eine Bedingung erfüllt ist. Wobei nicht alle Felder in der Tabelle gefüllt sein müssen. Es kann sein, dass "Nichts" (NULL) im Parameter eine gültiger "Wert" ist und in der Tabelle auch vorkommen kann.
select *
from view_bremse where fabrikat = :i_fabrikat or typ = :i_typ or spannung = :i_spannung
SQL-Code:
Selektiert werden alle Datensätze, bei denen alle Bedingungen erfüllt sind. Wobei alle Felder in der Tabelle und Parameter gefüllt sein müssen. Die Klammern sind in diesem Fall nicht notwendig, sie dienen aber der besseren Lesbarkeit.
select *
from view_bremse where (fabrikat is not null and fabrikat = :i_fabrikat) and (typ is not null and typ = :i_typ) and (spannung is not null and spannung = :i_spannung) Wenn Du eine genaue Aufgabestellung vorstellen würdest, könnte man Dir bestimmt auch genauere Antworten geben. Kleine Randbemerkung: Man muss zwischen Feldnamen und Parameternamen streng unterscheiden. Hier kann man ziemlich schnell durcheinander kommen. Viele Grüße Markus :gruebel: |
Re: SQL und ''
Hallo
So nun mal die genaue Aufgabestellung: ich versuche nur eine Lösung zu finden um doppelte Datensätze auszuschließen. z.Bsp: die Angaben zu einer Bremse... Tabelle Bremse: Field: sid_Fabrikat (integer) ==> LookupField ==> tblFabrikat Field: sid_Spannung (integer) ==> LookupField ==> tblSpannung Field: ID-Nr. (TStringField) Field: Best.-Nr. (TStringField) Field: Typ (TStringField) Field: Ser-Nr. (TStringField) ich möchte jetzt bevor der User einen neuen Datensatz postet all die Daten in eine Query packen und bekomme ich als Resultat"Query.RecordCount > 0" das Posten mit einer Meldung abbrechen. MfG Klaus :gruebel: |
Re: SQL und ''
Hallo Klaus!
Tabelle „Bremse“: Hast Du auch Keys definiert? Wenn ja, welche? Müssen die Felder sid_fabrikat, sid_Spannung und Typ immer gefüllt sein? Viele Grüße Markus :gruebel: |
Re: SQL und ''
Hallo
sid_Fabrikat,sid_Spannung sind die sek-Schlüssel(LookupComboBox->Eingabe pflicht) die den Pr-Schlüssel von "Tabelle-Fabrikat und Tabelle Spannung" aufnehmen. die restlichen Felder müßen nicht ausgefüllt werden. Danke Klaus |
Re: SQL und ''
Hi Klaus!
Deine erste SQL-Anweisung deutet darauf hin, dass man drei Felder benötigt, um einen Eintrag in der Tabelle „Bremse“ eindeutig identifizieren zu können. Nämlich: Fabrikat, Typ und Spannung. Am Besten definierst Du einen Primäry-Key, der aus diesen drei Feldern besteht. Wenn das Anlegen des neuen Primäry-Keys nicht möglich ist und man die die Suche nach "duplicates" selber übernehmen muss, dann würde ich das etwa so machen:
Code:
Viele Grüße
if (edit1.gettextlen <> 0)
and (edit2.gettextlen <> 0) and (edit3.gettextlen <> 0) then begin with query.sql do begin clear; add('select *'); add('from view_bremse'); add('where fabrikat = ' + edit1.text); add(' and spannung = ' + edit2.text); add(' and typ = ' + edit3.text); end end Markus :gruebel: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:42 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-2025 by Thomas Breitkreuz