Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Поиск и фильтрация в ADO

Автор: filja
Дата сообщения: 04.01.2005 21:38
Хочу вместо поиска (грабли с к-рым см. ниже) воспользоваться фильтрацией данных.
Фильтр по дате работает в таком виде:


DataModule3.ADOTable1.Filter:=
'Data>='+DateToStr(DateTimePicker1.Date)+
' and Data<='+DateToStr(DateTimePicker2.Date);
DataModule3.ADOTable1.Filtered:=True;

А фильтр по полю 'Familija' в таком же виде:

DataModule3.ADOTable1.Filter := 'Familija=' + Edit1.Text;
почему-то не работает.
Что тут не так?

И вообще глобальный вопрос: как организовать поиск на НЕПОЛНОЕ соответствие в АДО так, чтобы при написании в Edit1.Text начальных букв слова, напр-р, "ко" сразу же отображались все записи, начинающиеся на "ко", "ков" - переходит на "ков" и т.д.???
FindNearest с АДО не работает.
Я осущ. поиск с пом. метода Locate, он у меня работает только на полное соответствие, опция [loPartialKey] выдает ошибку.


Автор: OdesitVadim
Дата сообщения: 05.01.2005 13:56
я делаю через ADOQuery, создав запрос (адаптированый к твоему запросу)

ADOQueryX.sql.text:='SELECT * FROM <имя таблицы> where Familija LIKE '+Edit1.text+'%';
ADOQueryX.open;

прицепи DBGrid (или что ты используеш) на ADOQueryX

А LOCATE не советую - тормозит на больших базах, особенно по сети
Автор: filja
Дата сообщения: 05.01.2005 15:46
Query хорошо, но мне бы в ADOTable... Я дупля не дам в квери.
Автор: OdesitVadim
Дата сообщения: 05.01.2005 17:20
Query не так сложен. Лично я когда пишу базу данных с ADO, то использую два компонента ADOConnectionString и ADOQuery. Остальные - излишек (так мне кажеться). хотя можно обойтись и без ADOConnectionString.

По поводу твоей проблемы:
Поставь на форму ADOQuery1. Если ты уже настроил соединение с базой, то настрой его здесь (аналогично ADOTable ). Теперь переведи DataSet с ADOTable на ADOQuery1(в настройках DataSet). Теперь твои компоненты даже не "ощутят" переключения.
В Edit1Change или подобное впиши следующий код.
ADOQueryX.close;//закроем запрос, так как изменяем запрос
//Имя твоей таблицы я не знаю - впиши
ADOQueryX.sql.text:='SELECT * FROM <имя таблицы> where Familija LIKE "'+Edit1.text+'%"';//обрати внимания на двойные и одинарные кавычки
ADOQueryX.open;

этим нехитрым запросом ты отбираеш все записи которые начинаются с введённого тобой текста. здесь нет ничего страшного.

Автор: OdesitVadim
Дата сообщения: 06.01.2005 18:20
почитай также статейку http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=584
Автор: filja
Дата сообщения: 06.01.2005 19:24

Цитата:
procedure TFormFilter.CheckBox1Click(Sender: TObject);
var strFilterString : String ;
begin

if CheckBox1.Checked = True then
begin
strFilterString := 'WHERE CustomerName Like "%' +
EditFilter.Text + '%"' ;


with ADOQueryCustomers do // Формируем запрос SQL
begin
with SQL do
begin
Clear;
Add('SELECT CustomerName ');
Add('FROM TabCustomers');
Add(strFilterString);
Add('ORDER BY CustomerName') ;
end;
Open;
end;

ADOQueryCustomers.Active := True ;
DBGRidCustomers.DataSource := DataSourceQueryCust ;
end

Else
begin
EditFilter.Text := '' ;
ADOQueryCustomers.Active := False ;
DBGRidCustomers.DataSource := DataSourceCustomers ;
end


end;

Что в этом коде означает выделенное жирным шрифтом, особенно "%'?
Автор: OdesitVadim
Дата сообщения: 06.01.2005 19:53
Рассказываю по кусочкам:
strFilterString := 'WHERE CustomerName Like "%' + EditFilter.Text + '%"' ;

strFilterString := - в этой строке мы формируем условие, будем использовать ниже
WHERE - начало определения условия (дословно "при условии")
CustomerName - имя поля
Like - подобный
% - любое количество символов.

Суммируя всё выше сказаное, данный запрос переводится на русский приблизительно так:
"С таблицы TabCustomers выбрать записи которые начинаются с любых символов, потом в нём есть текст с EditFilter.Text, потом снова любые символы. Отобразить только поле CustomerName. При этом любые символы может равнятся и пустоте"
Автор: YurikGL
Дата сообщения: 06.01.2005 21:36
>Query не так сложен.

Вместо ADOQuery и ADOTable насколько я знаю всегда советуется использовать ADODataset. А ADOQuery и ADOTable были оставлены для совместимости с BDE-элементами.

Фильтры пользовать не советую. Луше сразу запрос с like
Автор: Pinocchio
Дата сообщения: 07.01.2005 02:20
YurikGL
ADODataset тоже для совместимости, цитирую из Delphi7:

Код: constructor TCustomADODataSet.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FCommand := TADOCommand.Create(Self);
Автор: YurikGL
Дата сообщения: 08.01.2005 14:09
>а для редактирования гридом гораздо удобнее TADOTable.
Если не секрет - чем?
ИМХО ADODataset - просто более общий компонент.
Я исползую ADODataset для отбражения таблиц и построения запросов, TADOCommand для посылки комманд и ADOStoredProc для выполнения хранимых процедур...
Автор: OdesitVadim
Дата сообщения: 10.01.2005 11:54
Я лично использую ListView + ADOQuery. ListView заполняю вручную (код очень простой! - если есть желания - могу набросать)- получается красиво.
Автор: Pinocchio
Дата сообщения: 11.01.2005 10:45
YurikGL

Цитата:
>а для редактирования гридом гораздо удобнее TADOTable.
Если не секрет - чем?

А ничего знать не надо про SQL. Бывают случаи когда заказчик хочет, чтобы было не BDE (Paradox) и выбирается SQL сервер только для имени, а не функционала.
Автор: OdesitVadim
Дата сообщения: 11.01.2005 11:19

Цитата:
>а для редактирования гридом гораздо удобнее TADOTable.

редактировать удобней, а функциональность почти на нулю. Появляются тогда вопросы о многострочных гридах, с хитрыми шапками ...
Одним словом, учите SQL (на первое время SELECT хватит) - и подобные вопросы отпадут.
И во вторых, не бойтесь трудностей. Один раз изобревши велосипед, второй раз он изобретается быстрей, а третий - вообще на автомате. (Тоесть придумывайте свои алгоритмы )
Автор: YurikGL
Дата сообщения: 11.01.2005 15:09
>А ничего знать не надо про SQL.

В случае ADODataset тоже ничего не надо знать про SQL...

ADOTable, ADOQuery - просто урезанные копии ADODataset с уменьшенной функциональностью и все.
Автор: Pinocchio
Дата сообщения: 13.01.2005 11:13
YurikGL
Может быть, но меня это мало касается. У меня компонент TPinADOValues может содержать субкомпоненты (как в TMenuItem в меню) TPinADOInteger, TPinADOBoolean, TPinADOString, TPinADOFloat и TPinADODateTime. Сам Values строит по ним запросы на создание таблиц, примарю, удаления вставки м модификации записи. А главное субкомпоненты имеют уже типизированное свойство Value которое перенаправляет непосредственно всю работу в интерфейс _Recordset и в TParameter.
Компонент TPinADOValues нужно связывать с TADOCommand. После этого вопрос работы с данными решён. Единственный случай когда мне лень самому заполнять TListView можно использовать ADOTable с гридом. Для меня польза в одном - текст программы не содержит имён полей и имеет точно такой же вид как при работе с TPinRegistryValues (INI,DB,IB и просто вычисляемыми значениями).
Борландовского решения Dataset для значений реестра я не видел.
Автор: filja
Дата сообщения: 25.01.2005 11:15
Ребятки, вы мне скажите: отчего у меня не работает НЕПОЛНОЕ соответствие?

DataModule3.ADOTable1.Locate('Familija', VarArrayOf([Edit1.Text]), [loPartialKey]);

loPartialKey как бы "мешает" всей строке и выдаются ошибки:

[Error] Unit1.pas(236): Undeclared identifier: 'loPartialKey'
[Error] Unit1.pas(236): Incompatible types: 'TLocateOption' and 'Integer'
Автор: YurikGL
Дата сообщения: 25.01.2005 16:57
попробуй
DataModule3.ADOTable1.Lookup('Familija', VarArrayOf([Edit1.Text]), [loPartialKey]);

Автор: filja
Дата сообщения: 25.01.2005 18:09
ТАк Lookup вроде ищет, но не переходит на найденную строку?

Добавлено:
YurikGL,
а существует ли ФИЛЬТР с неполным соответствием??? Тоже в АДОТаблице.
Автор: YurikGL
Дата сообщения: 26.01.2005 09:12
>filja
про lookup - фигню сказал... пользуй locate

Например, вот так
Dataset.Locate('IdMan',dssearch.fieldByName('IdMan').Value,[loCaseInsensitive]);

>а существует ли ФИЛЬТР с неполным соответствием??? Тоже в АДОТаблице
Пользуй датасет с slect-м.
Фильтры - от лукавого...

Страницы: 1

Предыдущая тема: Компилирование в С++Builder 6


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.