AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

SQL und ''

Ein Thema von Klaus D. · begonnen am 12. Apr 2004 · letzter Beitrag vom 14. Apr 2004
Antwort Antwort
Klaus D.

Registriert seit: 27. Okt 2003
Ort: 03238 Finsterwalde
124 Beiträge
 
Delphi 6 Professional
 
#1

SQL und ''

  Alt 12. Apr 2004, 19:34
Moin
habe mal wieder ne Frage?
folgende SQL Anweisung liefert kein Ergebnis zurück
wenn eines der 3 Edit SuchFelder leer ist.
WARUM ??

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]
  Mit Zitat antworten Zitat
Benutzerbild von r_kerber
r_kerber

Registriert seit: 11. Feb 2003
Ort: Trittau
3.538 Beiträge
 
Delphi XE Professional
 
#2

Re: SQL und ''

  Alt 12. Apr 2004, 19:45
Hallo Klaus,

ich denke, das liegt daran, dass bei
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!
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#3

Re: SQL und ''

  Alt 12. Apr 2004, 20:00
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;
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#4

Re: SQL und ''

  Alt 12. Apr 2004, 20:27
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 ?
Gruß
Hansa
  Mit Zitat antworten Zitat
MarkusB

Registriert seit: 3. Apr 2004
Ort: Hamburg
105 Beiträge
 
#5

Re: SQL und ''

  Alt 12. Apr 2004, 22:48
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
  Mit Zitat antworten Zitat
Klaus D.

Registriert seit: 27. Okt 2003
Ort: 03238 Finsterwalde
124 Beiträge
 
Delphi 6 Professional
 
#6

Re: SQL und ''

  Alt 12. Apr 2004, 23:22
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
  Mit Zitat antworten Zitat
MarkusB

Registriert seit: 3. Apr 2004
Ort: Hamburg
105 Beiträge
 
#7

Re: SQL und ''

  Alt 12. Apr 2004, 23:49
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
  Mit Zitat antworten Zitat
Klaus D.

Registriert seit: 27. Okt 2003
Ort: 03238 Finsterwalde
124 Beiträge
 
Delphi 6 Professional
 
#8

Re: SQL und ''

  Alt 13. Apr 2004, 16:47
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
  Mit Zitat antworten Zitat
MarkusB

Registriert seit: 3. Apr 2004
Ort: Hamburg
105 Beiträge
 
#9

Re: SQL und ''

  Alt 14. Apr 2004, 23:35
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
  Mit Zitat antworten Zitat
Antwort Antwort


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 15:22 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