| 
| 
 | Вопрос # 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] [Следующая »]  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |