Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.04.2010, 20:43   #1
Explosion
Пользователь
 
Регистрация: 08.11.2008
Сообщений: 50
По умолчанию поиск по фамилиям и вывод результатов в DBGrid

Подскажите пожалуйста.
Я осуществляю поиск по фамилиям и вывожу результат в DBGrid.
Вот код:
Код:
With datamodule2 do
  begin
    ADOQueryPoiskSotrudnika.Close;
    ADOQueryPoiskSotrudnika.SQL.Clear;
    ADOQueryPoiskSotrudnika.SQL.Add('select * from Sotrudnik where Familiya=:et');
    ADOQueryPoiskSotrudnika.Parameters.ParamByName('et').Value:=edit5.Text;
    ADOQueryPoiskSotrudnika.Open;
  end;
Всё прекрасно работает. Но назрели следующие вопросы:

1) Если я в 3 строчке кода ставлю %, то эта функция не работает
Код:
ADOQueryPoiskSotrudnika.SQL.Add('select * from Sotrudnik where Familiya=:et%');
Хотя вроде как должен выводить все фамилии начинающиеся с тех символов, которые хранятся в параметре et.



2)Мне кажется у меня запутанная связь между компонентами в датамодуле... Есть компонент ADOConnection1, который связывается с БД. Есть компонент DataSet1, в котором хранится таблица по которой осуществляется поиск. Есть компонент DataSource1, который связан с DataSet1. Есть компонент ADOQueryPoiskSotrudnika, в котором осуществляется запрос, и который связан с DataSource1. Есть DataSourcePoiskSotrudnika, который связан ADOQueryPoiskSotrudnika, чтоб в дальнейшем этот датасурс привязать к ДБГриду, так как ДБГрид связывается только по дата сурсам и напрямую с ADOQuery его не связать.
Скажите можно ли как-нибудь упростить связку или так оно и делается?
На 2 вопрос уже ответил. Только дошло, что ADOQueryPoiskSotrudnika достаточно связать с ADOConnection1 и все работает =ъ

3) Можно ли как-нибудь сделать, чтоб при поиске выделялась найденная запись в ДБГриде? И какой командой обращаться к выделенной записи в ДБГриде?

4) А еще слышал про такую структуру как LookupResult, может проще искать лукапризалтом? Если да то не подскажите как примерно с этим работать.

5) Подскажите пожалуйста текст запроса: поиск по фамилии, имени, отчеству, но так чтоб если задана фамилия, то имя и отчество учитывалась с учетом заданной фамилии.

Последний раз редактировалось Explosion; 21.04.2010 в 22:30.
Explosion вне форума Ответить с цитированием
Старый 21.04.2010, 23:21   #2
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Код:
 ADOQueryPoiskSotrudnika.SQL.Add('select * from Sotrudnik where Familiya like:et');
    ADOQueryPoiskSotrudnika.Parameters.ParamByName('et').Value:=edit5.Text + '%';
искать запись можно локейтом по датасету
датасет.locate('field', value, [LocateOptions])
все подробности по кнопке F1
soleil@mmc вне форума Ответить с цитированием
Старый 22.04.2010, 12:23   #3
Explosion
Пользователь
 
Регистрация: 08.11.2008
Сообщений: 50
По умолчанию

Спасибо огромное! А как насчет 3 вопроса?
Explosion вне форума Ответить с цитированием
Старый 22.04.2010, 12:30   #4
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Сообщение от Explosion Посмотреть сообщение
Спасибо огромное! А как насчет 3 вопроса?
это и есть по 3му вопросу

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
искать запись можно локейтом по датасету
датасет.locate('field', value, [LocateOptions])
все подробности по кнопке F1
а к записи обращаются не в дбгриде, а в датасете
soleil@mmc вне форума Ответить с цитированием
Старый 22.04.2010, 13:24   #5
dron-s
Форумчанин
 
Регистрация: 04.03.2007
Сообщений: 615
По умолчанию

Цитата:
3) Можно ли как-нибудь сделать, чтоб при поиске выделялась найденная запись в ДБГриде? И какой командой обращаться к выделенной записи в ДБГриде?
необходимо отрисовывать в самом гриде
dron-s вне форума Ответить с цитированием
Старый 22.04.2010, 14:22   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
необходимо отрисовывать в самом гриде
не, не надо ничего ручками отрисовывать!
soleil@mmc, в пост #4 уже полностью ответил на этот вопрос!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.04.2010, 15:36   #7
Explosion
Пользователь
 
Регистрация: 08.11.2008
Сообщений: 50
По умолчанию

Спасибо всем большое!
А не могли бы вы привести пример кода
Код:
датасет.locate('field', value, [LocateOptions])
. В фиелде мы через запятую прописываем поля которые будут выделяться, а что вписывать впараметре value и какие бывают LocateOptions?

А еще подскажите пожалуйста текст запроса. Я осуществляю поиск по фамилии, имени, отчеству:
Код:
With datamodule2 do
  begin
    ADOQueryPoiskSotrudnika.Close;
    ADOQueryPoiskSotrudnika.SQL.Clear;
    ADOQueryPoiskSotrudnika.SQL.Add('select * from Sotrudnik where (Familiya like :etFamiliya) and (Imya like :etImya) and (Otchestvo like :etOtchestvo)');
    ADOQueryPoiskSotrudnika.Parameters.ParamByName('etFamiliya').Value:=edit5.Text+'%';
    ADOQueryPoiskSotrudnika.Parameters.ParamByName('etImya').Value:=edit6.Text+'%';
    ADOQueryPoiskSotrudnika.Parameters.ParamByName('etOtchestvo').Value:=edit7.Text+'%';
    ADOQueryPoiskSotrudnika.Open;
  end;
У меня все работает. А теперь надо сделать, чтобы поиск осуществлялся кроме ФИО еще и по "статусу сотрудника", "организации" и "должности". Пробую так ничего не выходит (ругается на неверно заданный параметр):

Код:
With datamodule2 do
  begin
    ADOQueryPoiskSotrudnika.Close;
    ADOQueryPoiskSotrudnika.SQL.Clear;
    ADOQueryPoiskSotrudnika.SQL.Add('select * from Sotrudnik where (Familiya like :etFamiliya) and (Imya like :etImya) and (Otchestvo like :etOtchestvo) and (FK_StatusSotrudika = :etStatus) and (FK_Organization = :etOrganization) and (FK_Dolzhnost = :etDolzhnost)');
    ADOQueryPoiskSotrudnika.Parameters.ParamByName('etFamiliya').Value:=edit5.Text+'%';
    ADOQueryPoiskSotrudnika.Parameters.ParamByName('etImya').Value:=edit6.Text+'%';
    ADOQueryPoiskSotrudnika.Parameters.ParamByName('etOtchestvo').Value:=edit7.Text+'%';
    ADOQueryPoiskSotrudnika.Parameters.ParamByName('etStatus').Value:=DBLookupComboBox1.KeyValue;
    ADOQueryPoiskSotrudnika.Parameters.ParamByName('etOrganization').Value:=DBLookupComboBox2.KeyValue;
    ADOQueryPoiskSotrudnika.Parameters.ParamByName('etDolzhnost').Value:=DBLookupComboBox3.KeyValue;
    ADOQueryPoiskSotrudnika.Open;
  end;

Последний раз редактировалось Explosion; 22.04.2010 в 17:11.
Explosion вне форума Ответить с цитированием
Старый 22.04.2010, 17:49   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
не могли бы вы привести пример кода
типа так:
Код:
if YourDataset.Locate('Familiya;Imya;Otchestvo' VarArrayOf([Edit5.Text,Edit6.Text,Edit7.Text]),[loCaseInsensitive]) then
   // тут код, если запись нашлась
else
  // нет таких данных в выборке!
А нажать на Locate F1 ?!!!
из хелпа:
Цитата:
Код:
TLocateOption = (loCaseInsensitive, loPartialKey);

loCaseInsensitive	Key fields and key values are matched without regard to case.
loPartialKey	Key values can include only part of the matching key field value; for example, 'HAM' would match both 'HAMM' and 'HAMMER.'

Цитата:
А теперь надо сделать, чтобы поиск осуществлялся кроме ФИО еще и по "статусу сотрудника"
А типы данных совпадают?!
Какого типа поля (FK_StatusSotrudika, FK_Organization, FK_Dolzhnost ) ?
А с какой таблицей связаны DBLookupComboBox 1 2 3 ?
А Вы не забыли Выбрать все три величины?! (при Вашем подходе все ComboBox-ы должны иметь выбранное значение параметра!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.04.2010, 18:28   #9
Explosion
Пользователь
 
Регистрация: 08.11.2008
Сообщений: 50
По умолчанию

Цитата:
А нажать на Locate F1 ?!!!
На ф1 конечно же нажимал, но перевести не смог... Получается loPartialKey работает аналогично тому как в запросах like?
Спасибо за пример, сча попробую... А вот еще такой вопрос, допустим поиск дал 2 результата, 2 записи, а выделилась первая запись, есть ли какая нибудь команда, перебросить локейт на следующую запись?

Цитата:
А типы данных совпадают?!
Какого типа поля (FK_StatusSotrudika, FK_Organization, FK_Dolzhnost ) ?
А с какой таблицей связаны DBLookupComboBox 1 2 3 ?
А Вы не забыли Выбрать все три величины?! (при Вашем подходе все ComboBox-ы должны иметь выбранное значение параметра!
FK_StatusSotrudika, FK_Organization, FK_Dolzhnost типа интежер, это внешние поля служащие для связи со справочниками. В DBLookupCombobox'ы как раз хранятся значения справочников.
DBLookupCombobox.Key value это как раз тоже интережер, поэтому с FK_StatusSotrudika, FK_Organization, FK_Dolzhnost типы данных совпадают... При добавлении все работает прекрасно.

Вы правы при моем раскладе все 3 величины надо чтоб были выбраны, я когда тестил не выбрал все 3, так как написал одно а хотел совсем другое... Если не сложно подскажите как написать запрос для не стрингового типа, чтоб по ним можно было осуществлять поиск. Если допустим один комбобокс не выбран осуществляется поиск по двум другим и т.д. У меня все работает с фамилией, именем, отчеством как задумано. Вот теперь хочется очень хочется, чтоб по ДБЛукапкомбобоксам результаты поиска фильтровались.
А еще мне кажется с такой проблемой столкнусь: когда у DBCombobox'a не выбрано значение, то по умолчанию KeyValue равно нулю и поэтому он наверно будет левые результаты выдавать...
Explosion вне форума Ответить с цитированием
Старый 22.04.2010, 18:29   #10
Explosion
Пользователь
 
Регистрация: 08.11.2008
Сообщений: 50
По умолчанию

Цитата:
А нажать на Locate F1 ?!!!
На ф1 конечно же нажимал, но перевести не смог... Получается loPartialKey работает аналогично тому как в запросах like?
Спасибо за пример, сча попробую... А вот еще такой вопрос, допустим поиск дал 2 результата, 2 записи, а выделилась первая запись, есть ли какая нибудь команда, перебросить локейт на следующую запись?

Цитата:
А типы данных совпадают?!
Какого типа поля (FK_StatusSotrudika, FK_Organization, FK_Dolzhnost ) ?
А с какой таблицей связаны DBLookupComboBox 1 2 3 ?
А Вы не забыли Выбрать все три величины?! (при Вашем подходе все ComboBox-ы должны иметь выбранное значение параметра!
FK_StatusSotrudika, FK_Organization, FK_Dolzhnost типа интежер, это внешние поля служащие для связи с первичными ключами в справочниках. В DBLookupCombobox'ы как раз хранятся значения справочников.
DBLookupCombobox.Keyvalue это как раз тоже числовой тип, поэтому с FK_StatusSotrudika, FK_Organization, FK_Dolzhnost типы данных думаю совпадают... Тем более при добавлении все работает прекрасно.

Вы правы при моем раскладе все 3 величины надо чтоб были выбраны, я когда тестил не выбрал все 3, так как написал одно а хотел совсем другое... Если не сложно подскажите как написать запрос для не стрингового типа, чтоб по ним можно было осуществлять поиск. Если допустим один комбобокс не выбран осуществляется поиск по двум другим и т.д. У меня все работает с фамилией, именем, отчеством как задумано. Вот теперь очень хочется, чтоб по ДБЛукапкомбобоксам результаты поиска тоже фильтровались как по заданной фамилии, имени, отчеству.
А еще мне кажется с такой проблемой столкнусь: когда у DBCombobox'a не выбрано значение, то по умолчанию KeyValue равно нулю и поэтому он наверно будет левые результаты выдавать...

Locate попробовал. Запускаю делфи ругается что не знает, что такое loPartialKey.
Цитата:
if Datamodule2.ADODataSetSotrudnik.Loc ate('Familiya;Imya;Otchestvo', VarArrayOf([Edit5.Text,Edit6.Text,Edit7.Text]), [loPartialKey]) then
begin
end
else
begin
end;

Последний раз редактировалось Explosion; 22.04.2010 в 19:07.
Explosion вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль. Вывод результатов алгоритма пошагово mistertvister Помощь студентам 2 12.11.2009 08:25
Класс матрица, вывод результатов на экран Student_911 Помощь студентам 0 03.10.2009 20:55
Вывод результатов! Серый Рыйцарь Помощь студентам 3 21.05.2009 07:46
Как осуществить ввод данных в одном цикле, их обработку в другом, и вывод результатов в третьем? ReM Паскаль, Turbo Pascal, PascalABC.NET 5 11.11.2008 18:21
Вывод результатов в другой Grid Barbara БД в Delphi 7 20.02.2007 15:14