ADOTable - dwa filtry dla jednej tabeli

Odpowiedz Nowy wątek
2016-04-11 22:52
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

edytowany 4x, ostatnio: pewi, 2016-04-11 23:05

Pozostało 580 znaków

2016-04-11 23:52
0

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

user image

Lub:
user image

edytowany 2x, ostatnio: pewi, 2016-04-11 23:55

Pozostało 580 znaków

2016-04-12 02:35

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);
edytowany 11x, ostatnio: pewi, 2016-04-12 04:56

Pozostało 580 znaków

2016-04-12 07:22
0

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

ADOQuery1.Parameters.ParamByName('Data').asdate := WartoscKalendarz.Date;
Masz rację, tylko Twój kod jest błędny dla ADO... - wloochacz 2016-04-12 17:18
ADO to trochę nie moja bajka , sądziłem że dla ADO taka konstrukcja jest poprawna - grzegorz_so 2016-04-12 19:44

Pozostało 580 znaków

2016-04-12 09:41
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.

A ja wiele lat używałem ADO i się nigdy nie zawiodłem. Na dwoje babka wróżyła. Natomiast jestem przeciwnikiem filtrowania po stronie klienta, bo to się mija z celem. - Juhas 2016-04-12 11:28

Pozostało 580 znaków

2016-04-12 17:01
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'

Pozostało 580 znaków

2016-04-12 17:23
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.

Pozostało 580 znaków

2016-04-12 18:09
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); 
edytowany 1x, ostatnio: pewi, 2016-04-12 18:09

Pozostało 580 znaków

2016-04-13 03:59
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; 

Pozostało 580 znaków

2016-04-13 04:08
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'));

edytowany 2x, ostatnio: furious programming, 2016-04-13 15:15
Dzięki za pomoc:) Btw ta druga 'forma' jakoś bardziej do mnie przemawia:p - pewi 2016-04-13 23:13
IfThen znajduje się w module StrUtils :) - furious programming 2016-04-13 23:15
A wersja IfThen dla liczb siedzi w module Math ;P - furious programming 2016-04-13 23:15
Tak wiem:p 2min przed Twoim komentarzem zdążyłem odwiedzić: IfThen ;p - ale podziękował za czujność:p - pewi 2016-04-13 23:17

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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