Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL und '' (https://www.delphipraxis.net/20028-sql-und.html)

Klaus D. 12. Apr 2004 18:34


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:
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;
VIEW_BREMSE:
SQL-Code:
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)
Danke Klaus

[edit=r_kerber]Code- durch Delphi- bzw. SQL-Tags ersetzt. Mfg, r_kerber[/edit]

r_kerber 12. Apr 2004 18:45

Re: SQL und ''
 
Hallo Klaus,

ich denke, das liegt daran, dass bei
SQL-Code:
SELECT * FROM tabelle WHERE spalte = ''
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!

Robert_G 12. Apr 2004 19:00

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:
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)
Standard-SQL-Problem Nummer 0815 ;)
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;

Hansa 12. Apr 2004 19:27

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 ?

MarkusB 12. Apr 2004 21:48

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:
select * 
from view_bremse
where fabrikat = :i_fabrikat
   or     typ = :i_typ
   or spannung = :i_spannung
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.

SQL-Code:
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)
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.

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:

Klaus D. 12. Apr 2004 22:22

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:

MarkusB 12. Apr 2004 22:49

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:

Klaus D. 13. Apr 2004 15:47

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

MarkusB 14. Apr 2004 22:35

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:
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
Viele Grüße
Markus
:gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:32 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