Entwickler-Ecke

Datenbanken - SQL-Befehl falsch (?)


D. Annies - Do 04.08.11 07:38
Titel: SQL-Befehl falsch (?)
Hi, Delpher,

wo ist denn der Fehler bei folgendem Befehl?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
with QBuecher2 do
  begin
    Close; SQL.Clear;                                                           //, S.Telefon
    SQL.Text := format('SELECT B.Klasse, B.Name, B.Vorname, B.Titel, U.ISBN ' +
                       'FROM "%s" B, "%s" U, ', [TbArtikel.tablename, TbBuchstamm.tablename])+
                       ' where (B.KLASSE like ''5%'' or B.KLASSE like ''6%'' ' +
                       ' or B.KLASSE like ''7%'' or B.KLASSE like ''8%'' ' +
                       ' or B.KLASSE like ''9%'' or B.KLASSE like ''10%'') ' +
                       ' and B.Titel = U.Titel ' +
                       ' and (B.Klasse = A.Klasse) ' +
                       ' order by B.Klasse, B.Name, B.Vorname, B.TITEL, U.ISBN';
    Open;
  end;


Die Fehlermeldung heißt: Ungültiges Schlüsselwort where
Vielen Dank für Hilfe


zuma - Do 04.08.11 07:42

wo gehört wohl der Formatstring und wo die parameter hin ??

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
    SQL.Text := format('SELECT B.Klasse, B.Name, B.Vorname, B.Titel, U.ISBN ' +
                       'FROM "%s" B, "%s" U, ', +
                       ' where (B.KLASSE like ''5%'' or B.KLASSE like ''6%'' ' +
                       ' or B.KLASSE like ''7%'' or B.KLASSE like ''8%'' ' +
                       ' or B.KLASSE like ''9%'' or B.KLASSE like ''10%'') ' +
                       ' and B.Titel = U.Titel ' +
                       ' and (B.Klasse = A.Klasse) ' +
                       ' order by B.Klasse, B.Name, B.Vorname, B.TITEL, U.ISBN',
                       [TbArtikel.tablename, TbBuchstamm.tablename]);


D. Annies - Do 04.08.11 08:29

Hi, Zumi,

habe ich geändert, (auch das letzte Komma entfernt) nun kommt in der ersten Zeile die Fehlermeldung:

Kein Argument für Format '%''

hast du ne Idee?


zuma - Do 04.08.11 08:45

hab ich schon gesehen ... ;)

kommt von deinen 5%, 6% usw. im Sql-Befehl.
Format in Hilfe angucken, dann solltest du sehen, was % im Formatbefehl bedeutet
Dann guckste dir an, was % in einem Sql-Befehl bedeutet.


btw: Da wir nicht zusammen im Sandkasten gespielt haben: Ich nenn mich zumA und nicht zumI, ok?


D. Annies - Do 04.08.11 09:34

hi, Zuma <= ok!

Nun, da komme ich leider so nicht weiter ..

tööööf, Detlef


BenBE - Do 04.08.11 09:57

Yum Escapen der %/Yeichen im Format/Befehl einfach die % verdoppeln. Steht aber eindeutig in der Hilfe erkl'rt. Weer also lesen kann, ist klar im Vorteil </(


uall@ogc - Do 04.08.11 10:47

das Komma vor dem where ist zu viel


baka0815 - Do 04.08.11 11:33

Ich weiß nicht, was am ersten Aufruf falsch sein soll.

Das Format() bezieht sich hier halt nur auf den ersten Teil des Befehlst, aber das sollte kein Problem mit dem WHERE verursachen, schließlich ist es das gleiche wie der folgende Quellcode (leicht umformatiert):


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
with QBuecher2 do
  begin
    Close; 
    SQL.Clear;                                                           //, S.Telefon
    SQL.Text := format('SELECT B.Klasse, B.Name, B.Vorname, B.Titel, U.ISBN ' +
                       'FROM "%s" B, "%s" U, ', [TbArtikel.tablename, TbBuchstamm.tablename]);
    SQL.Text := SQL.Text +
                       ' where (B.KLASSE like ''5%'' or B.KLASSE like ''6%'' ' +
                       ' or B.KLASSE like ''7%'' or B.KLASSE like ''8%'' ' +
                       ' or B.KLASSE like ''9%'' or B.KLASSE like ''10%'') ' +
                       ' and B.Titel = U.Titel ' +
                       ' and (B.Klasse = A.Klasse) ' +
                       ' order by B.Klasse, B.Name, B.Vorname, B.TITEL, U.ISBN';
    Open;
  end;


Wann genau kommt denn der Fehler? Wenn du das SQL ausführst (beim Open) oder beim Zuweisen des SQL-Befehls (SQL.Text := ...)?
Schon mal im Debugger vor dem Open den SQL-Befehl angeschaut? Vielleicht ist einer der Tabellennamen leer und daher das SQL falsch formatiert?

-- edit --
Sehe gerade, dass mein Vorposter das Problem bereits gefunden hat. Habe es oben hervorgehoben.


D. Annies - Do 04.08.11 11:58

Hi, Benny,
vielen Dank!
Detlef

by the way: aus welcher Hilfe liest du das, beschreib doch mal, wenn es dir nicht zu blöd ist.
Ich würd mich freuen .. :)


BenBE - Do 04.08.11 12:50

Aus dem Online-Joker [http://stackoverflow.com/questions/267487/in-delphi-7-how-do-i-escape-a-percent-sign-in-the-format-function].


D. Annies - Fr 05.08.11 07:41

Noch ein Nachtrag:

der folgende Befehl arbeitet im Prinzip richtig:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
with QBuecher2 do
  begin
    Close; SQL.Clear;                                                           //, S.Telefon
    SQL.Text := format('SELECT B.Klasse, B.Name, B.Vorname, B.Titel, U.ISBN ' +
                       ' FROM "%s" B, "%s" U ' +
                       ' where (B.KLASSE like ''5%%'' or B.KLASSE like ''6%%'' ' +
                       ' or B.KLASSE like ''7%%'' or B.KLASSE like ''8%%'' ' +
                       ' or B.KLASSE like ''9%%'' or B.KLASSE like ''10%%'') ' +
                       ' and (B.Titel = U.Titel) and (B.Klasse like U.Kla) ' +
                       ' order by B.Klasse, B.Name, B.Vorname, B.TITEL, U.ISBN',
                         [TbArtikel.tablename, TbBuchstamm.tablename]);
    Open;
  end;


Man beachte "and (B.Klasse like U.Kla)", die Felder heissen also verschieden.
Es ist aber auch noch so, dass ein Feldeintrag in B.Klasse 8a oder 9c heißen kann,
also eine echte Schulklasse repräsentiert,
aber in der Stammdatei steht an dieser Stelle der Klassenstufenbereich, also z.B. 89,
wenn der Titel für beide Klassen ausleihbar ist.

Ich habe versucht, das durch like, also (B.Klasse like U.Kla) auszudrücken, aber das klappt
(noch) nicht.

Gibt es dafür auch eine Lösung?
Danke


ZeitGeist87 - Fr 05.08.11 09:27

Gibt es bei deinem Query nicht die Möglichkeit, mit Parametern zu arbeiten?
Da tust du dich um einiges leichter.


Delphi-Quelltext
1:
2:
3:
4:
query.sql.text:= 'SELECT feld1, feld2, feld3 FROM tabelle WHERE bedingung1 = :bed1 AND bedingung2 like :bed2';
query.ParamByName('bed1').value:= 'test';
query.ParamByName('bed2').value:= '9%';
query.open;


Hab auch immer so solche Statements wie du gebaut. Mit der Zeit wird das unübersichtlich.
Ich verwende die ZEOS-Komponenten.

Lieben Gruß
Stefan


baka0815 - Fr 05.08.11 12:55

user profile iconD. Annies hat folgendes geschrieben Zum zitierten Posting springen:
Man beachte "and (B.Klasse like U.Kla)", die Felder heissen also verschieden.
Es ist aber auch noch so, dass ein Feldeintrag in B.Klasse 8a oder 9c heißen kann,
also eine echte Schulklasse repräsentiert,
aber in der Stammdatei steht an dieser Stelle der Klassenstufenbereich, also z.B. 89,
wenn der Titel für beide Klassen ausleihbar ist.

Ich habe versucht, das durch like, also (B.Klasse like U.Kla) auszudrücken, aber das klappt
(noch) nicht.

Gibt es dafür auch eine Lösung?
Danke


Dass die Felder unterschiedlich heißen, spielt überhaupt keine Rolle.

Wenn du in der einen Tabelle aber 89101112 drin stehen hast, wird es schwierig. Datenbanktechnisch würde man das anders lösen und zwar über eine Tabelle in der du die Jahrgänge hast, eine Tabelle in der du die Artikel hast und eine Zwischentabelle, die dann klärt welcher Artikel von welchem Jahrgang ausgeliehen werden darf.


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
Tabelle: Jahrgaenge

Stufe
------
    5
    6
    7
    8
    9
   10
   11
   12
   13


Tabelle: Buecher

ISBN10     | Name         
-----------+-----------------------
3826686624 | Delphi für Kids
8791364353 | Delphi für Einsteiger
3898421015 | Delphi 6 für Profis


Tabelle: BuecherZuJahrgang

Stufe | ISBN10
------+------------
    6 | 3826686624 
    7 | 3826686624 
    8 | 3826686624 
    9 | 3826686624 
    9 | 8791364353 
   10 | 8791364353 
   11 | 8791364353 
   11 | 3898421015
   12 | 8791364353
   12 | 3898421015 
   13 | 8791364353
   13 | 3898421015


D. Annies - Fr 05.08.11 21:21

Danke, Christoph,
mal sehen, wie ich das umsetze.
Gruß, Detlef