|
Вопрос # 3 866/ вопрос решён / |
|
Здравствуйте, эксперты! ADO
У меня три поля Card_fam, Card_imy, Card_otch (фамилия Имя Отчеств)
На EdtFam у меня включена фильтрация по Фамилии, хочу cделать Поиск по трем полям не получается, Помогите пожалуйста! Вот код:
DM.FindCard.Filtered := False;
if (EdtFam.Text = '') and (EdtName.Text = '') and (EdtOtch.Text = '')then
begin
MessageDlg('Не заданы условия поиска!!', mtInformation, [mbOK], 0);
Exit;
end;
if (EdtFam.Text <> '') and (EdtName.Text <> '') and (EdtOtch.Text <> '') then
begin
if not dm.FindCard.Locate('Card_fam;Card_imy;Card_otch',
VarArrayOf([EdtFam.Text,EdtName.Text,EdtOtch.Text]),
[loCaseInsensitive, loPartialKey]) then
MessageDlg('Запись не найдена!', mtInformation, [mbOk], 0);
end;
Выдает пустую строку. Не могу разобраться помогите пожалуйста уважаемые Экспертыю
За ранее благодарен Senyor.
 |
Вопрос задал: senyor (статус: Посетитель)
Вопрос отправлен: 10 марта 2010, 10:44
Состояние вопроса: решён, ответов: 1.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, senyor!
лучше сделать по простому.
Ставим на форму TADOQuery. Одним концом привязываем к нашей базе, другим к таблице (он фактически подменяет собой TADOTable).
для обработчика пишем что то в стиле.
if (EdtFam.Text = '') and (EdtName.Text = '') and (EdtOtch.Text = '')then
begin
MessageDlg('Не заданы условия поиска!!', mtInformation, [mbOK], 0);
Exit;
end;
if (EdtFam.Text <> '') and (EdtName.Text <> '') and (EdtOtch.Text <> '') then
begin
ADOQuery1.Close;
ADOQuery1.SQL.Text := 'select * from ИМЯ_ТАБЛИЦЫ where Card_fam LIKE "%'+EdtFam.Text+'%"
and Card_imy LIKE "%'+EdtName.Text+'%" and Card_otch LIKE "%'+EdtOtch.Text+'%"';
ADOQuery1.Open;
end;
значки процента там стоят для того, что бы можно было набрать часть имени/фамилии. Если надо точный поиск, то используем конструкцию вида
'select * from ИМЯ_ТАБЛИЦЫ where Card_fam = "'+EdtFam.Text+'" and Card_imy = "'+EdtName.Text+'" and Card_otch = "'+EdtOtch.Text+'"';
ИМЯ_ТАБЛИЦЫ - здесь надо вписать имя таблицы с базы.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 10 марта 2010, 11:09
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 24; последнее сообщение — 11 марта 2010, 18:17; участников в обсуждении: 3.
Страницы: [1] [2] [Следующая »]
|
Егор (статус: 10-ый класс), 10 марта 2010, 20:09 [#1]:
senyor: вот честно говоря, в адо есть какой-то глюк, связанный с фильтром. в своё время я от фильтра отказался и стал использовать как раз ADOQuery. хотя при простых условиях фильтра всё работает более-менее.
так что вариант, предложенный Вадимом, не плох
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
senyor (статус: Посетитель), 10 марта 2010, 21:20 [#2]:
Да, тут я согласен, Использовав вариант Вадима накинул ADOQuey и DataSource настроил на DBGrid, отключаю фильтрацию показывает пустую строку
|
|
Вадим К (статус: Академик), 11 марта 2010, 10:59 [#3]:
А Вы используете фильтрацию в ADOQuery?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
senyor (статус: Посетитель), 11 марта 2010, 11:57 [#4]:
На EdtFamChange я использую фильтрацию код такой:
procedure TFindCardForm.EdtFamChange(Sender: TObject);
var s: string;
begin
s:=EdtFam.Text+'*';
with DM do
begin
FindCard.Active:=true;
if EdtFam.Text<>'' then
begin
FindCard.IndexFieldNames:='Card_fam';
FindCard.Filter:='Card_fam>'''+s+'''';
FindCard.Filtered:=true;
end;
end;
end;
Теперь я хочу сделать точный поиск по трем полям использую ваш код: Добавляю ADOQuery2 и DataSource2 на форму DM, у меня не видит ADOQuery2.DataSource не могу присвоить DataSource2 выдает ошибку: "ADOQuery2: Circular datalinks are not allowed"
|
|
Вадим К (статус: Академик), 11 марта 2010, 12:05 [#5]:
то есть просто поставив два компонента и связав их вместе, уже получаем ошибку? или ADOQuery уже привязано к чему то?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
senyor (статус: Посетитель), 11 марта 2010, 12:12 [#6]:
Да так и получается
ADOQuery2 и DataSource2 только, что добавленные компоненты, DataSource2 видит и спокойно связывается с ADOQuery2, ADOQuery2 коннектиться с базой но не видит DataSource2, и даже на форме когда я пишу DM.ADOQuery2.DataSource:=DM.DataSource2;
вызывает ошибку
|
|
senyor (статус: Посетитель), 11 марта 2010, 12:17 [#7]:
Вот полный код по нажатию на Баттон "Поиск" не могу разобраться помогите пожалуйста
procedure TFindCardForm.BtnFindClick(Sender: TObject);
begin
DM.FindCard.Filtered := False;
DM.ADOQuery2.DataSource:=DM.DataSource2;
DBGrid1.DataSource := DM.DataSource2;
if (EdtFam.Text = '') and (EdtName.Text = '') and (EdtOtch.Text = '')then
begin
MessageDlg('Не заданы условия поиска!!', mtInformation, [mbOK], 0);
Exit;
end;
if (EdtFam.Text <> '') and (EdtName.Text <> '') and (EdtOtch.Text <> '') then
begin
DM.ADOQuery2.Close;
DM.ADOQuery2.SQL.Text := 'select * from Arrest where Card_fam LIKE "%'+EdtFam.Text+'%" and Card_imy LIKE "%'+EdtName.Text+'%" and Card_otch LIKE "%'+EdtOtch.Text+'%"';
// DM.ADOQuery2.SQL.Text := 'select * from Arrest where Card_fam LIKE "'+EdtFam.Text+'" and Card_imy LIKE "'+EdtName.Text+'" and Card_otch LIKE "'+EdtOtch.Text+'"';
DM.ADOQuery2.Open;
end;
end;
|
|
Вадим К (статус: Академик), 11 марта 2010, 12:34 [#8]:
если DataSource2 связан с ADOQuery2, то обратное связывание не нужно делать.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
senyor (статус: Посетитель), 11 марта 2010, 12:41 [#9]:
А как тогда сделать, чтобы в DBGride по нажатию на поиск показывало то что надо
|
|
Вадим К (статус: Академик), 11 марта 2010, 12:51 [#10]:
попробую написать "полную" версию.
нужно
ADOConnection, подключенный к базе.
ADOQuery, подключенное к ADOConnection через свойство Connection.
DataSource подключенный к ADOQuery.
грид по вкусу, подключенный к DataSource.
Если фильтрации нет и надо вывести все запросы, то выполняем такой запрос 'select * from Arrest'
если надо фильтровать - то он указан выше.
Никаких других привязок, фильтраций.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
senyor (статус: Посетитель), 11 марта 2010, 13:44 [#11]:
Я сделал как вы написали, убрал фильтрации, набираю фамилию Иванов и ни какой реакции
|
|
senyor (статус: Посетитель), 11 марта 2010, 13:50 [#12]:
Я отключил фильтрацию, набираю фамилию Иванов и ни какой реакции хотя ивановых там тьма
|
|
Вадим К (статус: Академик), 11 марта 2010, 14:03 [#13]:
ну... видели там слово "and" в запросе? а это значит, что поиск будет по всех трех полях. замените его на or (в двух местах!) и посмотрите.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
senyor (статус: Посетитель), 11 марта 2010, 14:09 [#14]:
Благодарю, все получилось.
А можно сделать чтоб фильтрация работала и точный поиск
|
|
Вадим К (статус: Академик), 11 марта 2010, 14:14 [#15]:
а в чем проблема? просто разные запросы.
Главное определитесь, какой именно точный поиск нужен, и я попробую подсказать запрос.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
senyor (статус: Посетитель), 11 марта 2010, 14:30 [#16]:
Вся проблема получается в том, что DBGrid1 устанавливаю FindCardSource работает фильтрация, а если DBGrid1 устанавливаю DataSource2 работает точный поиск
|
|
senyor (статус: Посетитель), 11 марта 2010, 14:33 [#17]:
Все сделал спасибо огромное
|
|
senyor (статус: Посетитель), 11 марта 2010, 14:54 [#18]:
Другая проблема возникла По поиску Находит нужную фамилию открывая ее открывает пустую форму, не пойму запарился
|
|
Вадим К (статус: Академик), 11 марта 2010, 14:57 [#19]:
ну если бы знать, как форма открывается с пустой фамилией...
Или чувствую, там просто dbedit'ы привязанные к таблице?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
senyor (статус: Посетитель), 11 марта 2010, 15:06 [#20]:
DBEdit-ы к FindCardSource, а по нажатию на поиск у нас переходит свзяь переходит на dataSource2
|
Страницы: [1] [2] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|