Autor |
Beitrag |
D. Annies
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Do 04.08.11 07:38
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
_________________ ut vires desint, tamen est laudanda voluntas
|
|
zuma
      
Beiträge: 660
Erhaltene Danke: 21
Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
|
Verfasst: 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]); |
_________________ Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: 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?
_________________ ut vires desint, tamen est laudanda voluntas
|
|
zuma
      
Beiträge: 660
Erhaltene Danke: 21
Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
|
Verfasst: 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?
_________________ Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Do 04.08.11 09:34
hi, Zuma <= ok!
Nun, da komme ich leider so nicht weiter ..
tööööf, Detlef
_________________ ut vires desint, tamen est laudanda voluntas
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 </(
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Für diesen Beitrag haben gedankt: D. Annies
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Do 04.08.11 10:47
das Komma vor dem where ist zu viel
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
Für diesen Beitrag haben gedankt: D. Annies
|
|
baka0815
      
Beiträge: 489
Erhaltene Danke: 14
Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
|
Verfasst: 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.
Für diesen Beitrag haben gedankt: D. Annies
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: 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 .. 
_________________ ut vires desint, tamen est laudanda voluntas
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Do 04.08.11 12:50
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: 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
_________________ ut vires desint, tamen est laudanda voluntas
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: 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
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
|
|
baka0815
      
Beiträge: 489
Erhaltene Danke: 14
Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
|
Verfasst: 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.
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 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Fr 05.08.11 21:21
Danke, Christoph,
mal sehen, wie ich das umsetze.
Gruß, Detlef
_________________ ut vires desint, tamen est laudanda voluntas
|
|
|