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; 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; 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 .. :)
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; 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
D. Annies hat folgendes geschrieben : |
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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!