Wątek przeniesiony 2015-04-05 14:04 z Delphi i Pascal przez furious programming.

Nie mogę uruchomić zapytania SQL

0

W SQL Builderze stworzyłem działające zapytanie:
Skopiowałem je do kodu programu i podczas kompilacji wyrzuca mi komunikat :

[Error] Unit9.pas(182): Unterminated string
[Error] Unit9.pas(183): ')' expected but identifier 'FROM' found
[Error] Unit9.pas(183): Undeclared identifier: 'DB'
[Error] Unit9.pas(184): Missing operator or semicolon
[Error] Unit9.pas(184): Illegal character in input file: '"' ($22)
[Error] Unit9.pas(184): Undeclared identifier: 'DB'
[Error] Unit9.pas(185): Missing operator or semicolon
[Error] Unit9.pas(185): ':=' expected but '=' found
[Error] Unit9.pas(185): 'END' expected but ')' found
[Error] Unit9.pas(186): Illegal character in input file: '"' ($22)
[Error] Unit9.pas(186): Illegal character in input file: '"' ($22)
[Error] Unit9.pas(188): Unterminated string

Podpowiedzcie jak poprawić poniższy kod by zadziałał.

     Query_SQL.SQL.Clear   ;
     Query_SQL.SQL.Add
     ('SELECT D.Nr_dnia, D1.Nazwisko, D1.Imie, D2.Godz_powrotu
     FROM "tab_dzien.DB" D
     INNER JOIN "tab_ucznia.DB" D1
     ON  (D1.ID_dnia = D.ID_dnia)
     INNER JOIN "tab_wyjscia.DB" D2
     ON  (D2.ID_ucznia = D1.ID_ucznia)
     ORDER BY D1.Nazwisko, D1.Imie') ;
     Query_SQL.Open ;
2

W ten sposób nie robi się wieloliniowego tekstu w delphi.

0

OK.
A jakaś podpowiedź ?

0

Dzięki !
Zaraz będę próbował.

Poniższe działa jak należy, ale ...

     Query_SQL.SQL.Clear   ;
     Query_SQL.SQL.Add('SELECT D.Nr_dnia, D1.Nazwisko, D1.Imie, D2.Godz_powrotu') ;
     Query_SQL.SQL.Add('FROM "tab_dzien.DB" D') ;
     Query_SQL.SQL.Add('INNER JOIN "tab_ucznia.DB" D1') ;
     Query_SQL.SQL.Add('ON  (D1.ID_dnia = D.ID_dnia)') ;
     Query_SQL.SQL.Add('INNER JOIN "tab_wyjscia.DB" D2') ;
     Query_SQL.SQL.Add('ON  (D2.ID_ucznia = D1.ID_ucznia)') ;
     Query_SQL.SQL.Add('WHERE D.Nr_dnia = ' + Tdzien);
     Query_SQL.SQL.Add('ORDER BY D1.Nazwisko, D1.Imie') ;
     Query_SQL.Open ;

Chciałbym do WHERE dorzucić jeszcze jeden warunek:

Query_SQL.SQL.Add('AND  D2.Godz_powrotu = ''); ;

czyli uczeń nie wrócił (brak godziny powrotu)
Kombinuję jak koń pod górę i kicha.

2

Dodaj go konkatując tekst znakiem +, oraz oznacz apostrofy jako znaki specjalne, żeby całość przeszła bez błędu kompilacji

0

Dzięki.

0

Doczytałem, że aby wstawić '
muszę poprzedzić go backslashem czyli '
Wg tej teorii powinienem zapisać mój problem:

Query_SQL.SQL.Add('WHERE D.Nr_dnia = ' + Tdzien);
Query_SQL.SQL.Add('AND  D2.Godz_powrotu = ' +  \'\') ;
Query_SQL.SQL.Add('ORDER BY D1.Nazwisko, D1.Imie') ;

... ale niestety działać nie chce !
Wywala błąd:
[Error] Unit9.pas(188): Illegal character in input file: '\' ($5C)
Co robię źle ?

1

Druga linijka nie jest zgodna ze składnią języka; Zwróć uwagę na to, że pierwszy backslash nie jest częścią literału - operatorem też nie jest, więc masz błąd składniowy;

Nie znam się na tych bazach, jednak poniższy przykład przynajmniej będzie poprawny składniowo:

Query_SQL.SQL.Add('AND  D2.Godz_powrotu = \''');

Ewentualnie posłuż się kodem znaku:

Query_SQL.SQL.Add('AND  D2.Godz_powrotu = \'#92);

czy tam w heksie:

Query_SQL.SQL.Add('AND  D2.Godz_powrotu = \'#$5C);
0

Dzięki za wszystko.
Pomogło ?
...
Próbuję zostawić bazę danych i nauczyć się jak na komponencie Label umieścić apostrof.
Powinno się to zacząć :

Label1.Caption :=   /i tu ma być apostrof, a najlepiej dwa

No i niestety nie wiem jak. Brrr.

0

Przede wszystkim naucz się wstawiać apostrofy do literałów i w ogóle je tworzyć;

Znaku apostrofu nie można wstawić do łańcucha bezpośrednio (podobnie jak w C++ znaku cudzysłowu), bo znaki te są częścią składni języka; Aby dodać do literału pojedynczy apostrof, musisz zapisać dwa pod rząd; Czyli jeśli w etykiecie ma znaleźć się przykładowo ciąg 'pomidor', to musisz zapisać to tak:

Label1.Caption := '''pomidor''';

Gdzie pierwszy i ostatni apostrof w literale określa początek i koniec wartości, a w miejsca pary początkowej i końcowej zostaną wstawione pojedyncze apostrofy; Pary apostrofów (składniowych) możesz zastąpić pojedynczymi wstawkami z kodem znaku, który jako prefiks musi zawierać znak #:

Label1.Caption := #92'pomidor'#92; // to samo co #92 + 'pomidor' + #92

Po znaku prefiksu możesz dodać też prefiks systemu liczbowego (w poprzednim przykładzie podałem Ci kod znaku w formacie heksadecymalnym).

0

Nareszcie !!!

Query_SQL.SQL.Add('AND  D2.Godz_powrotu = ' + '''''');

i... i działa , sprawdza czy

D2.Godz_powrotu = '' ;

jest pustym łańcuchem.
Jeszcze raz wszystkim dziękuję.
Las mi pokazaliście, grzyby musiałem sam znaleźć,
ale bez Was dalej szukałbym ich w polu. ;-)
Dzięki raz jeszcze.

0

Ok.
No cóż uczę się.

1 użytkowników online, w tym zalogowanych: 0, gości: 1