Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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 Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: 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

senyor (статус: Посетитель), 10 марта 2010, 21:20 [#2]:

Да, тут я согласен, Использовав вариант Вадима накинул ADOQuey и DataSource настроил на DBGrid, отключаю фильтрацию показывает пустую строку
Вадим К

Вадим К (статус: Академик), 11 марта 2010, 10:59 [#3]:

А Вы используете фильтрацию в ADOQuery?
Галочка "подтверждения прочтения" - вселенское зло.
senyor

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

senyor (статус: Посетитель), 11 марта 2010, 12:12 [#6]:

Да так и получается
ADOQuery2 и DataSource2 только, что добавленные компоненты, DataSource2 видит и спокойно связывается с ADOQuery2, ADOQuery2 коннектиться с базой но не видит DataSource2, и даже на форме когда я пишу DM.ADOQuery2.DataSource:=DM.DataSource2;
вызывает ошибку
senyor

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

senyor (статус: Посетитель), 11 марта 2010, 12:41 [#9]:

А как тогда сделать, чтобы в DBGride по нажатию на поиск показывало то что надо
Вадим К

Вадим К (статус: Академик), 11 марта 2010, 12:51 [#10]:

попробую написать "полную" версию.
нужно
ADOConnection, подключенный к базе.
ADOQuery, подключенное к ADOConnection через свойство Connection.
DataSource подключенный к ADOQuery.
грид по вкусу, подключенный к DataSource.
Если фильтрации нет и надо вывести все запросы, то выполняем такой запрос 'select * from Arrest'
если надо фильтровать - то он указан выше.

Никаких других привязок, фильтраций.
Галочка "подтверждения прочтения" - вселенское зло.
senyor

senyor (статус: Посетитель), 11 марта 2010, 13:44 [#11]:

Я сделал как вы написали, убрал фильтрации, набираю фамилию Иванов и ни какой реакции
senyor

senyor (статус: Посетитель), 11 марта 2010, 13:50 [#12]:

Я отключил фильтрацию, набираю фамилию Иванов и ни какой реакции хотя ивановых там тьма
Вадим К

Вадим К (статус: Академик), 11 марта 2010, 14:03 [#13]:

ну... видели там слово "and" в запросе? а это значит, что поиск будет по всех трех полях. замените его на or (в двух местах!) и посмотрите.
Галочка "подтверждения прочтения" - вселенское зло.
senyor

senyor (статус: Посетитель), 11 марта 2010, 14:09 [#14]:

Благодарю, все получилось.
А можно сделать чтоб фильтрация работала и точный поиск
Вадим К

Вадим К (статус: Академик), 11 марта 2010, 14:14 [#15]:

а в чем проблема? просто разные запросы.
Главное определитесь, какой именно точный поиск нужен, и я попробую подсказать запрос.
Галочка "подтверждения прочтения" - вселенское зло.
senyor

senyor (статус: Посетитель), 11 марта 2010, 14:30 [#16]:

Вся проблема получается в том, что DBGrid1 устанавливаю FindCardSource работает фильтрация, а если DBGrid1 устанавливаю DataSource2 работает точный поиск
senyor

senyor (статус: Посетитель), 11 марта 2010, 14:33 [#17]:

Все сделал спасибо огромное
senyor

senyor (статус: Посетитель), 11 марта 2010, 14:54 [#18]:

Другая проблема возникла По поиску Находит нужную фамилию открывая ее открывает пустую форму, не пойму запарился
Вадим К

Вадим К (статус: Академик), 11 марта 2010, 14:57 [#19]:

ну если бы знать, как форма открывается с пустой фамилией...
Или чувствую, там просто dbedit'ы привязанные к таблице?
Галочка "подтверждения прочтения" - вселенское зло.
senyor

senyor (статус: Посетитель), 11 марта 2010, 15:06 [#20]:

DBEdit-ы к FindCardSource, а по нажатию на поиск у нас переходит свзяь переходит на dataSource2

Страницы: [1] [2] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:30
Выполнено за 0.03 сек.