[Delphi / InterBase] Kompilacja ok, a program się sypie- SQL

0

Sprawa wygląda następująco:

Program łączy się z bazą, wyświetla sobie w DBGrind1 tabelkę. Istnieją 3 Edity i Button.
Te Edity służą do podania danych, dzięki którym po kliknięciu w Button w DBGrind zostaną przefiltrowane dane.
I tak, w procedurze Button1.Click

var
//deklaruje zmienne
  skad:string;
  dokad:string;
  data:string;

begin
// dla pewności czyszcze je
  skad:='';
  dokad:='';
  data:='';

//wyłanczam i czyszcze IBQuery
  IBQuery1.Active:=False;
  IBQuery1.SQL.Clear;

//przypisuje zmienne
  skad:=Edit5.Text;
  dokad:=Edit6.Text;
  data:=Edit7.Text;

// pewnie da się to zrobić inaczej, ja każdą możliwość na oddzielnym ifie napisałem ważne, żeby działało
// ten if działa, wyświetla się to co ma się wyświetlać 
   if( (skad='') and (dokad='') and (data='') ) then
    IBQuery1.SQL.Add('select ID_LOTY, SKAD, DOKAD, DATA from LOTY');

// nie dziala, zapytanie jest dobre bo w IBConsole wyswietla wynik
   if( (skad<>'') and (dokad<>'') and (data<>'') ) then
    IBQuery1.SQL.Add('select ID_LOTY, SKAD, DOKAD, DATA from LOTY where SKAD='''+skad+''' and DOKAD='''+dokad+''' and DATA='''+data+'''');

// nie dziala, zapytanie jest dobre bo w IBConsole wyswietla wynik
   if( (skad<>'') and (dokad<>'') ) then
    IBQuery1.SQL.Add('select ID_LOTY, SKAD, DOKAD, DATA from LOTY where SKAD='''+skad+''' and DOKAD='''+dokad+'''');

// nie dziala, zapytanie jest dobre bo w IBConsole wyswietla wynik
   if( (skad<>'') and (data<>'') ) then
    IBQuery1.SQL.Add('select ID_LOTY, SKAD, DOKAD, DATA from LOTY where SKAD='''+skad+''' and DATA='''+data+'''');

// ten if działa, wyświetla się to co ma się wyświetlać 
   if( (skad<>'') ) then
    IBQuery1.SQL.Add('select ID_LOTY, SKAD, DOKAD, DATA from LOTY where SKAD='''+skad+'''');

// nie dziala, zapytanie jest dobre bo w IBConsole wyswietla wynik
   if( (dokad<>'') and (data<>'') ) then
    IBQuery1.SQL.Add('select ID_LOTY, SKAD, DOKAD, DATA from LOTY where DOKAD='''+dokad+''' and DATA='''+data+'''');

// ten if działa, wyświetla się to co ma się wyświetlać 
   if( (dokad<>'') ) then
    IBQuery1.SQL.Add('select ID_LOTY, SKAD, DOKAD, DATA from LOTY where DOKAD='''+dokad+'''');

// ten if działa, wyświetla się to co ma się wyświetlać 
   if( (data<>'') ) then
    IBQuery1.SQL.Add('select ID_LOTY, SKAD, DOKAD, DATA from LOTY where DATA='''+data+'''');

// włanczam IBQuery po ustawieniu zapytania SQL w nim i odświerzam DBGrid
  IBQuery1.Active:=True;
  DBGrid1.Refresh;
end;

W IBConsole wszystkie zapytania działają.
Część IFów (tych że tak powiem bez ANDów) działa, reszta (z ANDami) nie działa.

W tych które nie działają wyskakuje błąd:
"Poject Project1.exe reised exception class EIBInterBaseError with message 'Dynamic SQL Error SQL error code = -104
Token unknown - line 2, char -1
select' Process stopped. Use Step or Run to continue.

Gdzie jest coś nie tak? Bo ja nie widzę błedu :/

0

/ nie dziala, zapytanie jest dobre bo w IBConsole wyswietla wynik
if( (skad<>) and (dokad<>) and (data<>'') ) then
IBQuery1.SQL.Add('select ID_LOTY, SKAD, DOKAD, DATA from LOTY where SKAD=+skad+ and DOKAD=+dokad+ and DATA=+data+');

// nie dziala, zapytanie jest dobre bo w IBConsole wyswietla wynik
if( (skad<>) and (dokad<>) ) then
IBQuery1.SQL.Add('select ID_LOTY, SKAD, DOKAD, DATA from LOTY where SKAD=+skad+ and DOKAD=+dokad+');

jak skad będzie <> i dokąd będzie <> od itd to wykonają się wszystkie powyższe w wyniku czego będziesz miał zapytanie typu

SELECT ... SELECT ... SELECT ...

zmień if na else if poczynając od drugiego ifa - tak aby wykonał się tylko jeden

0

O tym nie pomyślałem. Dziękuję bardzo.

Jednak przy próbie zamiany ifów na else ify zaczęły się sypać jakieś błędy, dlatego też do tych ifów dopisałem dokładniejsze warunki, np.:

if ( (skad<>'') and (dokad<>'') <b>and (data='') </b> ) then...
0
if( (skad='') and (dokad='') and (data='') ) then
    IBQuery1.SQL.Add('select ID_LOTY, SKAD, DOKAD, DATA from LOTY') //<- bez średnika

// nie dziala, zapytanie jest dobre bo w IBConsole wyswietla wynik
   else if( (skad<>'') and (dokad<>'') and (data<>'') ) then
    IBQuery1.SQL.Add('select ID_LOTY, SKAD, DOKAD, DATA from LOTY where SKAD='''+skad+''' and DOKAD='''+dokad+''' and DATA='''+data+'''') //<- bez średnika

// nie dziala, zapytanie jest dobre bo w IBConsole wyswietla wynik
   else if( (skad<>'') and (dokad<>'') ) then
    IBQuery1.SQL.Add('select ID_LOTY, SKAD, DOKAD, DATA from LOTY where SKAD='''+skad+''' and DOKAD='''+dokad+''''); //<- za ostatnim średnika

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