ADOTable - dwa filtry dla jednej tabeli

0

Hej, da się jakoś połączyć dwa filtry dla ADOTable?

W sensie, że użyje pierwszy filtr, wyświetli mi w Dbgridzie pasujące elementy. Następnie dla tej samej tabeli użyje drugi filtr, który będzie brał pod uwagę elementy z poprzedniego filtra. Obecnie jest tak, że oba filtry filtrują z całej zawartości ADOTable (jeden anuluje drugi).

user image

Tak wygląda fragment kodu:

 begin
  DaMod.ATWyc.disablecontrols;
  DaMod.ATWyc.first;
  while not DaMod.ATWyc.eof do
    begin
      if tabela.Text = 'IdWycieczki' then
        begin
          if ZnakRownosci.ItemIndex = 0 then DaMod.ATWyc.Filter:='IdWycieczki = ' + WartoscFiltr.Text
          else if ZnakRownosci.ItemIndex = 1 then DaMod.ATWyc.Filter:='IdWycieczki > ' + WartoscFiltr.Text
          else if ZnakRownosci.ItemIndex = 2 then DaMod.ATWyc.Filter:='IdWycieczki < ' + WartoscFiltr.Text;
        end
      else if tabela.Text = 'Koszt' then
        begin
          if ZnakRownosci.ItemIndex = 0 then DaMod.ATWyc.Filter:='Koszt = ' + WartoscFiltr.Text
          else if ZnakRownosci.ItemIndex = 1 then DaMod.ATWyc.Filter:='Koszt > ' + WartoscFiltr.Text
          else if ZnakRownosci.ItemIndex = 2 then DaMod.ATWyc.Filter:='Koszt < ' + WartoscFiltr.Text;
        end;
      DaMod.ATWyc.Filtered := true;
      DaMod.ATWyc.next;
    end;
  DaMod.ATWyc.first;
  DaMod.ATWyc.enablecontrols;
end;

A tak okno (bez filtrowania):
user image

0

Jeśli tak się nie da, to czy da się:

user image

Lub:
user image

0

Dobra nieważne, widzę, że za pomocą SQL można zrobić to szybciej i łatwiej

begin
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('SELECT * FROM Wycieczka WHERE IdWycieczki > 3 and Koszt < 600');
  ADOQuery1.Open;
  ADOQuery1.Active:=true;
end;

Tylko mam mały problem z filtrem dla daty.
Dla liczb działa dobrze, a tutaj problem;/
Ktoś coś poradzi?

 WartoscKalendarz:TDateTimePicker;
ADOQuery1.SQL.Add('SELECT * FROM Wycieczka WHERE Termin'+ZnakRownosci+Datetostr(WartoscKalendarz.Date)) 

w sensie błędne filtrowanie dla =, > i <

Dobra z tym też sobie jakoś poradziłem:

ADOQuery1.SQL.Text := 'SELECT * FROM Wycieczka WHERE Termin'+ZnakRownosci+':Data';
ADOQuery1.Parameters.ParamByName('Data').Value := datetostr(WartoscKalendarz.Date);
0

Lepiej uzyć zapisu który uniezależnia zapytanie od systemowego formatu daty :

ADOQuery1.Parameters.ParamByName('Data').asdate := WartoscKalendarz.Date;
0

Jeśli ja mogę Ci coś doradzić to staraj się unikać ADO, fakt są tu na forum zwolennicy tego komponentu ale uwierz mi na słowo, że przy bardziej zaawansowanych funkcjonalnościach będziesz miał problem. Ja od wielu lat używam http://zeoslib.sourceforge.net/ i jeszcze nigdy się nie zawiodłem.

0
grzegorz_so napisał(a):

Lepiej uzyć zapisu który uniezależnia zapytanie od systemowego formatu daty :

ADOQuery1.Parameters.ParamByName('Data').asdate := WartoscKalendarz.Date;

Chciałem tak zrobić na początku, jednak wywala mi błąd przy kompilacji: Undeclared indentifier 'asdate'

0
pewi napisał(a):
grzegorz_so napisał(a):

Lepiej uzyć zapisu który uniezależnia zapytanie od systemowego formatu daty :

ADOQuery1.Parameters.ParamByName('Data').asdate := WartoscKalendarz.Date;

Chciałem tak zrobić na początku, jednak wywala mi błąd przy kompilacji: Undeclared indentifier 'asdate'

W tym Delphi masz dokumentację, czy zabronili jej używać?
Tak ma być:

ADOQuery1.Parameters.ParamByName('Data').Value := WartoscKalendarz.Date;

Dlaczego?
A dlatego, że Parameters.ParamByName zwraca obiekt typu TParameter z modułu ADODB. A TParameter nie posiada dostępu do wartości parametru przez typowane funkcje typu AsDate itp. Jest tylko i wyłącznie Value typu Variant.

0

Tak ma być:

ADOQuery1.Parameters.ParamByName('Data').Value := WartoscKalendarz.Date;

Niestety ale i w tym przypadku wywala błąd, jednak podczas samego filtrowania:
user image

Co jest złego w tym zapisie który podałem, skoro wszystko działa jak należy?

ADOQuery1.Parameters.ParamByName('Data').Value := datetostr(WartoscKalendarz.Date); 
0

Że tak zapytam, jest jakiś bardziej estetyczny sposób zapisu sortowania według title, niż to?:

  if i mod 2 = 0 then ADOQuery1.Sort := '[' + Column.FieldName + ']' + ' ASC'
  else ADOQuery1.Sort := '[' + Column.FieldName + ']' + ' DESC';
  i:=i+1; 
2
const
  SORT_DIR: array [Boolean] of String = ('DESC', 'ASC');

{...}

  ADOQuery1.Sort := Format('[%s] %s', [Column.FieldName, SORT_DIR[I and 1 = 0]]);

albo tak:

ADOQuery1.Sort := Concat('[', Column.FieldName, '] ', IfThen(Odd(i), 'DESC', 'ASC'));

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