Вот, что у нас получится на выходе
Чтобы освоить базовые принципы работы с фильтрами, посмотрите пример, который находится в
1 |
C:\Program Files (x86)\FMSoft\Framework\uniGUI\Demos\Desktop\GridFiltering |
Вообще, у UniGUI отличные демки! Можно просто смотреть их и многое делать по аналогии!
Формируем запрос
Итак, в основе нам нужно построить запрос. Пример для MySQL из моего проекта
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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
select * from ( SELECT creationDateTime,phone,message,serverAnswer,cost, (SELECT token FROM galionsms_db.programs where s.programs_id=galionsms_db.programs.id ) as ProgramToken, (SELECT name FROM galionsms_db.clients where id=(SELECT clients_id FROM galionsms_db.programs where token=ProgramToken)) as ClientName, (SELECT name FROM galionsms_db.clients where id=( ( SELECT clients_id FROM galionsms_db.clients where id=(SELECT clients_id FROM galionsms_db.programs where token=ProgramToken) ) )) as PartnerName, (SELECT phone FROM galionsms_db.clients where id=( ( SELECT clients_id FROM galionsms_db.clients where id=(SELECT clients_id FROM galionsms_db.programs where token=ProgramToken) ) )) as PartnerPhone FROM galionsms_db.sms s /* comments where a.message like '%%' and a.creationDateTime like '%%' and a.phone like '%%' and a.serverAnswer like '%%' and (a.cost like '%%' or cost IS NULL) and (a.ProgramToken like '%%' or a.ProgramToken IS NULL) and (a.ClientName like '%%' or a.ClientName IS NULL) and (a.PartnerName like '%%' or a.PartnerName IS NULL) and (a.PartnerPhone like '%%' or a.PartnerPhone IS NULL) */ order by creationDateTime desc ) a where a.message like :message and a.creationDateTime like :creationDateTime and a.phone like :phone and a.serverAnswer like :serverAnswer and (a.cost like :cost or cost IS NULL) and (a.ProgramToken like :ProgramToken or a.ProgramToken IS NULL) and (a.ClientName like :ClientName or a.ClientName IS NULL) and (a.PartnerName like :PartnerName or a.PartnerName IS NULL) and (a.PartnerPhone like :PartnerPhone or a.PartnerPhone IS NULL) |
В написании этого запроса мне помогли следующие ресурсы
Can we use alias name in LIKE statement?
Can I make WHERE col LIKE ‘%’ select NULL values too?
Нужно было сделать так, чтобы NULL поля тоже отображались, поэтому я добавлял везде
1 |
or a.ClientName IS NULL |
Также нужно было обернуть запрос с псевдонимами (alias) в другой запрос. Иначе MySQL сервер не видит псевдонимы.
Настраиваем TFDQUERY
Вставляем запрос
Ставим значение параметров, для старта так сказать. В дальнейшем оно будет обрабатываться в ColumnFilter.
Готовим UNIDBGRID
Обрабатываем событие OnColumnFilter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
procedure TSMS.DBGridColumnFilter(Sender: TUniDBGrid; const Column: TUniDBGridColumn; const [Ref] Value: Variant); begin // if qSelectSMS.Active then begin qSelectSMS.Params.ParamValues[Column.FieldName]:='%'+Value+'%'; qSelectSMS.Close(); qSelectSMS.Open(); end; end; |
Если Value =”‘, тогда значение фильтра станет %%, что будет означать, что будут видны все записи.
А также событие OnClearFilters
1 2 3 4 5 6 7 8 9 10 |
procedure TSMS.DBGridClearFilters(Sender: TObject); var i: Integer; begin for i := 0 to qSelectSMS.Params.Count-1 do qSelectSMS.Params.ParamByPosition(i).Value:='%%'; end; |
Добавляем UniHiddenPanel и добавляем на неё столько edit ов, сколько нужно фильтров
Открываем DBGrid > Columns и настраиваем для каждой колонки
В принципе это всё!