Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Поиск(ADOTable+MSAccess)


Автор: Palladin 23.4.2009, 10:44
В триллионый раз поднимаю тему поиска, т.к. в поисковике не нашел ничего подходящего. Задача такова, есть таблица по ней необходимо сделать поиск на выбор по одному либо по ругому полю(все зависит от выбора в радиогруппе) Но именно поиск, не фильтр. И поиск не на 100%, а к примеру введем букву В указатель переместится на первую строку в которой В первая, наберем Валь, Указатель на первую строку в которой в поле встретилось Валь и т.п.
Попробовал Locate вообще ничего не ошибок не результата

Автор: Данкинг 23.4.2009, 10:52
А запрос с where... чем плох? smile 

Автор: Palladin 23.4.2009, 10:56
Не владею smile Если можешь напиши плз эту часть кода:
у меня поле 'ФИО' искать то что в FindEdit

Автор: Данкинг 23.4.2009, 11:00
В общем случае - 
select * from BASE where FIO like ' "%'+trim(FindEdit.Text)+'%" '

Автор: Palladin 23.4.2009, 11:14
Хм=) как бы это помягче сказать=) я даже незнаю где это писать smile с запросами вообще никогда не работал smile 

Автор: insoft 23.4.2009, 11:22
выброси ADOTable и используй ADOQuery...
в ADOQuery в SQL пишешь запрос которой тебе необходим (в текущем случае это то что написал тебе Данкинг
или же можно всё сделать программным путём ;)

Автор: Данкинг 23.4.2009, 11:26
Цитата(Palladin @ 23.4.2009,  12:14)
Хм=) как бы это помягче сказать=) я даже незнаю где это писать smile с запросами вообще никогда не работал smile

Ну так это (приёмы работы с БД) в любых книгах для начинающих описываются. А так ты в любом случае не поймёшь...

Код

Query.Close;
Query.SQL.Clear;
Query.SQL.Add(select * from BASE where FIO like ' "%'+trim(FindEdit.Text)+'%" ');
Query.Open;



Автор: Palladin 23.4.2009, 11:30
Как я понял к ADOTable мне это не прикрутить, он SQL не держит да?
А для ADOTable есть какойнить метод, а то как-то переписывать много где придется:(

Автор: insoft 23.4.2009, 11:32
Palladin
только использовать Filter и Filtered

Автор: Данкинг 23.4.2009, 11:41
Цитата(Palladin @  23.4.2009,  12:30 Найти цитируемый пост)
Как я понял к ADOTable мне это не прикрутить, он SQL не держит да?

Или
Цитата(insoft @  23.4.2009,  12:32 Найти цитируемый пост)
только использовать Filter и Filtered 

 - но ИМХО это извращение, хотя в редких случаях бывает удобно. Но лучше не привыкай к фильтрам.


Автор: insoft 23.4.2009, 11:47
Цитата(Данкинг @  23.4.2009,  11:41 Найти цитируемый пост)
но ИМХО это извращение, хотя в редких случаях бывает удобно. 

самый полный
но если нет времени разбираться а сделать всё тап-ляп, то пойдёт smile

Автор: Palladin 23.4.2009, 11:57
Лана значит будет урок на будущее, придется программно, т.к. очень многое уже написано при замене ADOTable на ADOQuery придется считай заново всю программу написать smile 

Автор: insoft 23.4.2009, 12:02
Palladin
да не мучайся  ты
используй Filter и Filtered
Код

ADOTable.Filter := 'select * from BASE where FIO like ' +QuotedStr(FindEdit.Text)+'%');
ADOTable.Filtered := True;

тоже самое будет

Автор: Palladin 23.4.2009, 12:13
Маразм крепчал и я нашел выход из положения smile 
была фильтрация, сделал поиск
было:
Код

...............................................................................
if(RadioGroup1.ItemIndex=0)then
begin
if Length(Edit1.Text)>0 then
ADOTable1.Filtered:=true
else
ADOTable1.Filtered:=false;

ADOTable1.Filter:='ФИО>='''+Edit1.Text+'''';
end;
...............................................................................


стало:
Код

var
i:integer;
............................................................................................
if(RadioGroup1.ItemIndex=0)then
begin
if Length(Edit1.Text)>0 then
ADOTable1.Filtered:=true
else
ADOTable1.Filtered:=false;

ADOTable1.Filter:='ФИО>='''+Edit1.Text+'''';
if(adotable1.Filtered=true) then begin i:=ADOTable1.RecNo; ADOTable1.Filtered:=false; ADOtable1.RecNo:=i; end;
end;
............................................................................................


Как видно по коду идет фильтрация, при ней находится нужная запись, запоминается номер строки, потом отключаем фильтрацию и по рекно переходим к нужной записи smile 
Интересно что будет происходит на экране если в таблциу забить 10к записей smile 

P.S. Такого маразма давно не писал smile

Добавлено через 1 минуту и 37 секунд
2insoft, При фильтрации скрываются не подходящие условию записи, мне это ненадо, мне надо чтобы были видны все, а коретка так сказать подгонялась к найденной

Автор: Kbl4AH 23.4.2009, 13:19
Цитата(Palladin @  23.4.2009,  11:44 Найти цитируемый пост)
Попробовал Locate вообще ничего не ошибок не результата

Ничего подобного, все работает, проверено smile 
Код

procedure TForm1.Edit1Change(Sender: TObject);
begin
  ADOTable1.Locate('ename', Edit1.Text, [loPartialKey]);
end;

Автор: Palladin 23.4.2009, 13:24
2Kbl4AH, Писал точно так, толку не было, не ошибки не поиска, скорее всего где-то сморозил...

Автор: Kbl4AH 23.4.2009, 13:30
Цитата(Palladin @  23.4.2009,  14:24 Найти цитируемый пост)
Писал точно так

из с опцией loPartialKey?! 
Цитата

If Options contains the loPartialKey setting, then Locate allows partial-string matching on strings in KeyValues. 

© Borland Help
Добавлено @ 13:30
Цитата(Palladin @  23.4.2009,  14:24 Найти цитируемый пост)
толку не было, не ошибки не поиска

А какой тип поля, по которому очуществляется поиск? Должен быть строковый! Для чисел - не прокатит!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)