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


Автор: Vrungel 1.11.2009, 12:44
Доброго времени суток  smile 
у меня тут проблема не могу упростить поиск по АДО таблице ...
как сделать чтобы при нажатии на ПОИСК искал слово (или часть слова) которое было введенно в ЭДИТ??

компоненты: bitbtn2, edit1, label5.
Таблица: ADOTable1, поле поиска "Наименование"

Автор: Данкинг 1.11.2009, 12:49
Цитата(Vrungel @  1.11.2009,  12:44 Найти цитируемый пост)
как сделать чтобы при нажатии на ПОИСК искал слово (или часть слова) которое было введенно в ЭДИТ??

Запросом, например. smile 

Автор: Vrungel 1.11.2009, 13:22
как? как? как?  smile мне бы код конкретный пример с описанием чтобы я понял как делать ...

я год назад написал прогу где по 2м критериям одновремменно ищеться, а щас сел и не ч0 не понял =)))
год не программировал и всё заново вспоминать ... =(

Автор: Данкинг 1.11.2009, 14:12
Цитата(Vrungel @  1.11.2009,  13:22 Найти цитируемый пост)
а щас сел и не ч0 не понял =)))

Не верю ©.  smile 

Код

AdoQuery.Sql.Add('select * from BASE where POLE like "%'+edit5.text+'%"');



Автор: Vrungel 2.11.2009, 10:44
Опиши пожалусто "что?" да "как?"

я добавил компонент ADOQuery там указал путь к БД ... а как выбрать нужную таблицу не нашёл ...
Я думал поиск сделать методом "Locate" ... если можно на его примере поиск сделать ...
 smile 

Автор: Данкинг 2.11.2009, 15:26
Цитата(Vrungel @  2.11.2009,  10:44 Найти цитируемый пост)
я добавил компонент ADOQuery там указал путь к БД ... а как выбрать нужную таблицу не нашёл ...

Код

ADOQuery.SQL.Add('select * from TABLE');

 smile 

Автор: Vrungel 2.11.2009, 16:04
Код
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
with form1.AdoQuery1 do begin
close;
sql.clear;
AdoQuery.Sql.Add('select * from BASE where POLE like "%'+edit1.text+'%"');
ADOQuery.SQL.Add('select * from Продажа');
open;
if adoquery1.RecordCount<>0 then
datasource1.DataSet:=adoquery1
end;

что тут не так?
и ещё ошибку выдаёт "ADOQuery1: Missing SQL property"
объясни мне по пунктам, я в запросах совсем не чего не понимаю  ... smile 

Автор: Данкинг 2.11.2009, 16:32
Цитата(Vrungel @  2.11.2009,  16:04 Найти цитируемый пост)
что тут не так?

То, что в одном случае у тебя AdoQuery, а в другом - AdoQuery1. smile

Автор: chip_and_dayl 2.11.2009, 16:35
Жесть полнаяsmile

Код

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
AdoQuery1.close;
AdoQuery1.sql.clear;
AdoQuery1.Sql.Add('select * from Продажа where Поле_По_КОтором_ПОиск like "%'+edit1.text+'%"');
AdoQuery1.open;
if adoquery1.RecordCount<>0 then
datasource1.DataSet:=adoquery1
end;

Автор: Akella 2.11.2009, 22:22
Цитата(chip_and_dayl @  2.11.2009,  16:35 Найти цитируемый пост)
Жесть полнаяsmile

жгут напалмом.... оба  smile

Добавлено через 1 минуту и 41 секунду
Если требуется реализовать поиск именно с помощью ADOTable, то запросы тут не причём!!!! Вы что.. нарооод smile 
Про замечательные методы locate и lookup забыли, что ли?

Добавлено через 7 минут и 27 секунд
Цитата(Vrungel @  2.11.2009,  16:04 Найти цитируемый пост)
AdoQuery.Sql.Add('select * from BASE where POLE like "%'+edit1.text+'%"');
ADOQuery.SQL.Add('select * from Продажа');

Ты вообще ни капельки не понимаешь что и к чему, что такое select и с чем его едят. Зачем ты лезешь программировать? Обычно человек, который хочет научится программировать идёт учится, читает книги, полезные материалы в интернете, примеры. А НЕ задаёт вопросы ленивого студента первого курса на форумах.

Автор: Данкинг 2.11.2009, 22:50
Цитата(Akella @  2.11.2009,  22:22 Найти цитируемый пост)
Если требуется реализовать поиск именно с помощью ADOTable, то запросы тут не причём!!!! Вы что.. нарооод smile 
Про замечательные методы locate и lookup забыли, что ли?

Не было задания "именно с ADOTable". smile Было задание "осуществить поиск". К тому же, запросом однозначно быстрее, чем Locate. smile 

Автор: Vrungel 3.11.2009, 10:28
Цитата
Не было задания "именно с ADOTable".  Было задание "осуществить поиск".

Ну вообщетто в первом сообщении написаны компоненты которыми нада воспользоваться ...

Цитата
Ты вообще ни капельки не понимаешь что и к чему, что такое select и с чем его едят.


я в этом чистосердечно расскялся в одном из вышенаписанных сообщений

я и просил обьяснить как сделать поиск методом Locate  smile 
читал несколько статей ... мало что понял =(((

Автор: Данкинг 3.11.2009, 11:28
Vrungel, на форуме искать по слову "Locate" не пробовал? smile 

Цитата(Vrungel @  3.11.2009,  10:28 Найти цитируемый пост)
Ну вообщетто в первом сообщении написаны компоненты которыми нада воспользоваться ...

Там просто перечисление компонентов и не слова о том, что ими "нада воспользоваться".

Автор: Akella 3.11.2009, 17:23
Цитата(Данкинг @  2.11.2009,  22:50 Найти цитируемый пост)
Не было задания "именно с ADOTable". 


Цитата(Vrungel @  1.11.2009,  12:44 Найти цитируемый пост)
у меня тут проблема не могу упростить поиск по АДО таблице ...


Цитата(Vrungel @  1.11.2009,  12:44 Найти цитируемый пост)
компоненты: bitbtn2, edit1, label5.
Таблица: ADOTable1, поле поиска "Наименование" 



Мало того, locate работает без переоткрытия НД ;)

Добавлено через 34 секунды
Цитата(Данкинг @  2.11.2009,  22:50 Найти цитируемый пост)
К тому же, запросом однозначно быстрее, чем Locate.

 smile

Добавлено через 3 минуты и 40 секунд
Цитата(Vrungel @  3.11.2009,  10:28 Найти цитируемый пост)
я и просил обьяснить как сделать поиск методом Locate  smile 
читал несколько статей ... мало что понял =((( 

1. Вверху каждой стриницы форума есть кнопка Поиск. Лично я не буду принципиально искать за тебя информацию.
2. Google.com
3. F1 у тебя тоже выламана?

Автор: chip_and_dayl 3.11.2009, 18:22
Мда... тяжело с Vrungel

Во-первы: чтобы через Locate найти часть слова, которое входит в поле, нужно помучиться. И если его решить, то я боюсь скорость будет не ахты

Во-вторы: есть готовый SQL-запрос. Что  тебе мешает его использовать!?!

Добавлено @ 18:23
Код

AdoQuery1.close;
AdoQuery1.sql.clear;
AdoQuery1.Sql.Add('select * from Продажи where Наименование like "%'+edit1.text+'%"');
AdoQuery1.open;
if adoquery1.RecordCount<>0 then
datasource1.DataSet:=adoquery1


Добавлено @ 18:25
Только не вмасти вместо двух одинарных кавычек '' одну двойную "

Автор: Данкинг 3.11.2009, 20:36
Не знаю, что быстрее будет: locate или select.... top 1 ?

Автор: Akella 3.11.2009, 22:58
Будет зависеть от некоторых факторов, например:
1. Мощность сервера, клиента
2. Пропускная способность сети.
3. СУБД
4. Состояние базы данных.

Пример. Есть таблица на 5000 записей. Нужно сфокусировать курсор на нужную запись. Какого перца выполнять Select ... Если можно выполнить просто locate или lookup. Ну если нужно просто узнать значение поля конкретной записи, то Lookup даже в разы быстрее может выполниться из-за того, что нет нужны перемещать курсор по набору данных. А что сделает Select? Select полезет на сервер за записью, серверу нужно будет вернуть ещё запись клиенту. Мало того... назначение и возможности Select`а и Locate`а разные. Тут нужно смотреть по конкретной ситуации. На то программисту голова и дадена. А по сему дальнейший спор по поводу Select vs Locate есть бессмысленный.
Спасибо за внимание. Всем спасибо, все свободны.

Автор: Vrungel 5.11.2009, 17:01
всем лень было помочь ...
оставлю это на случай если у кавото возникнет вопрос
Код

procedure TForm2.BitBtn2Click(Sender: TObject);
var
keyFields:string;
KeyValues:variant;
Options:tlocateOptions;
begin
if not(checkBox1.Checked or CheckBox2.Checked)then begin
MessageDLG ('Не заданы условия поиска!',mtInformation,[mbOK],0);
exit;
end;
if (CheckBox1.Checked=true and checkbox2.Checked=true) then begin
KeyFields:='Наименование;Поставщик';
KeyValues:=vararrayof([edit1.Text,edit2.text]);

If not ADOTable1.Locate(KeyFields,KEyValues,options) then begin
beep;
MessageDLG('Запись не найдена!!!', mtInformation,[mbOK],0);
exit;
end;
end
else begin
if checkbox1.Checked then begin
KeyFields:='Наименование';
KeyValues:=edit1.text;
end;

if CheckBox2.Checked then begin
KeyFields:='Поставщик';
KeyValues:=edit2.Text;
end;


OPtions:=[loCaseInsensitive,lopartialKey];

If not ADOTable1.Locate(KeyFields,KEyValues,options) then begin
beep;
MessageDLG('Запись не найдена!!!', mtInformation,[mbOK],0);
exit;
end;
end;
end;
procedure TForm2.BitBtn1Click(Sender: TObject);
begin
form2.hide;
form1.show;
end;

Автор: Данкинг 5.11.2009, 17:09
Vrungel, а BEEP зачем - неужели он пищать в динамик будет? smile 

Автор: Akella 5.11.2009, 19:03
Цитата(Vrungel @  5.11.2009,  17:01 Найти цитируемый пост)
всем лень было помочь ...

написать тебе одну строку кода нужно было, самому недодуматься?

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