Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Грамотный поиск записей 
V
    Опции темы
former
Дата 13.12.2006, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 7
Всего: 17



Подскажите, пожалуйста, как организовать грамотный поиск при условии, что данные могут повторяться в разных записях. Необходимо получить список этих записей с указанием даннх из других полей этих записей (например, в ListView) и число найденных записей. smile 


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Rodman
Дата 13.12.2006, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 22
Всего: 122



Код

Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


Почитай про LIKE
PM MAIL WWW Skype GTalk YIM MSN   Вверх
former
Дата 13.12.2006, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 7
Всего: 17



Использую AbsoluteDB

Цитата

Rodman:  Почитай про LIKE


Не понял! smile 


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Rodman
Дата 13.12.2006, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 22
Всего: 122



Пишешь запрос
Код

SELECT * FROM Table where (Field like 'Вася');


И запускаешь его...

Все строки в которіх в поле Field  встречается Вася будут выведены....
PM MAIL WWW Skype GTalk YIM MSN   Вверх
former
Дата 13.12.2006, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 7
Всего: 17



Это понятно. Вопрос в другом. Я имею виду следующее. После выполнения поиска записей будет повляться окно (результаты поиска) в котором присутствует список найденных записей следующего вида:

Допустим ищем текст 'абвгд' в поле 'поле 1'. Находим, допустим 5 записей. Теперь в появляется форма результатов поиска на которой находится Label с количеством найденных замисей и список типа ListView в котором заполнены колонки найденными записями. ListView имеет следующие колонки: 
  1) порядковый номер
  2) 'поле 1' найденной записи
  3) 'поле 2' тойже записи

и так для всех пяти.

Разжевал до безобразия. smile 


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Vas
Дата 13.12.2006, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



former, а почему обязательно ListView, чем DBGrid не устраивает или AbsoluteDB не свяжешь с гридом?


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
former
Дата 13.12.2006, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 7
Всего: 17



Vas, DBGrid отображает все поля записи, а мне нужно всего два.


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
ТоляМБА
Дата 14.12.2006, 06:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


Профиль
Группа: Завсегдатай
Сообщений: 1607
Регистрация: 15.12.2004

Репутация: 3
Всего: 252



Цитата(former @  13.12.2006,  21:22 Найти цитируемый пост)
Допустим ищем текст 'абвгд' в поле 'поле 1'.

Цитата(former @  13.12.2006,  21:22 Найти цитируемый пост)
  2) 'поле 1' найденной записи
  3) 'поле 2' тойже записи
 
Код

Select поле1, поле2 from table1 where поле1 Like '%абвгд%'
 
Цитата(former @  13.12.2006,  22:06 Найти цитируемый пост)
Vas, DBGrid отображает все поля записи, а мне нужно всего два. 
 В Table1 может быть хоть 100 полей, но в гриде только 2 из селекта отобразятся
PM   Вверх
SergeBS
Дата 14.12.2006, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



former, 
Цитата
Vas, DBGrid отображает все поля записи, а мне нужно всего два. 

А если зайти в Columns Editor? Для каждой колонки есть свойства  visible, readonly и еще куча не менее полезных. Так что F1 и вперед smile (в дополнение к способу select что надо)
PM MAIL   Вверх
Akella
Дата 14.12.2006, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



а ещё кроме SQL можно использовать Locate, Lookup, TTable.Filter, событие OnFilterRecord

короче возможностей для поиска, группировки и фильтрации масса... smile 
PM MAIL   Вверх
former
Дата 14.12.2006, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 7
Всего: 17



Цитата

ТоляМБА:
Код

Select поле1, поле2 from table1 where поле1 Like '%абвгд%'



ТоляМБА, а как связать этот запрос с ListView? Я не то, что в SQL, я с БД только начинаю работать. Поэтому хотелоь бы увидеть код. smile 

Понятно, что использовать таблицу целесообразнее. Однако, я решил решил использовать ListView, т.к. хочу иметь пронумерованный список(1, 2, 3...n) найденных записей при щелчке по которым в главной форме появляется нужная запись. К тому же на против каждой записи будет стоять соответствующая иконка (в зависимости от типа найденной записи). Это упростит работу пользователя с результатами поиска. Поэтому, благодарю за советы Vas, ТоляМБА, SergeBS, Akella, но вариант с таблицей меня не устраивает.


И ещё. Остаётся непонятным как определить количество найденных записей. Если бал бы ListView было бы проще.






--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
skyboy
Дата 14.12.2006, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: нет
Всего: 260



former, у компонента - наследника TQuery есть свойство RowCount или RecordCount(не помню, чесно говоря) - это и есть количество записей в результате запроса.
PM MAIL   Вверх
former
Дата 15.12.2006, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 7
Всего: 17



skyboy, спасибо.


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
SergeBS
Дата 18.12.2006, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



former, 
ListView будешь связывать с результатами, как нетрудно догадаться, ручками. Т.е. своими строчками кода. Это не DB-aware компонент.
PM MAIL   Вверх
Akella
Дата 18.12.2006, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



что-то вроде этого
Код

while not Query1.eof do begin
  ListView1.add(query1.FieldByName('Имя_Поля').asString);
  query1.next;
end;

PM MAIL   Вверх
Mephisto
Дата 20.12.2006, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: нет
Всего: 34



skyboy, 
Цитата(skyboy @  14.12.2006,  21:50 Найти цитируемый пост)
у компонента - наследника TQuery есть свойство RowCount или RecordCount(не помню, чесно говоря) -

Только он всегда будет возвращать 1, если не двусторонний select!!!!!! Т.е. необходмо количество записей узнавать отдельным запросом, либо вообще использовать тот пример что Akella написал. Как по мне боле уместно!
Только нужно будет написать:
Код

ListView1.Columns.Clear;
ListView1.Columns.Add.Caption := '1';
ListView1.Columns.Add.Caption := '2';
ListView1.Columns.Add.Caption := '3';
ListView1.ViewStyle  := vsReport;
Query1.First;
while not Query1.eof do begin
  With ListView1.Items.Add do
  begin
    Caption := query1.FieldByName('Имя_Поля1').asString;
    SubItems.Append(query1.FieldByName('Имя_Поля2').asString);
    SubItems.Append(query1.FieldByName('Имя_Поля3').asString);
  end;
  query1.next;
end;


Это сообщение отредактировал(а) Mephisto - 20.12.2006, 10:19
PM   Вверх
former
Дата 27.12.2006, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 7
Всего: 17



Благодарю всех за помощь. Сделал, как посоветовали Akella и Mephisto, а для определения количества найденных записей использовал переменную типа integer.

Код

procedure TMainForm.SpeedButton1Click(Sender: TObject);
var i:integer;
begin
  i:=0;
  ListView1.Clear;
  Label2.Caption:='';
  ABSQuery.Active:=false;
  ABSQuery.SQL.Clear;
  if RadioButton1.Checked=true then
  begin
    ABSQuery.SQL.Text:='SELECT PNum, DClassID, UpFNum FROM mmsedb WHERE PNum LIKE :val';
    ABSQuery.Params.ParamByName('val').Value:=Edit1.Text;
  end
  else if RadioButton2.Checked=true then
  begin
    ABSQuery.SQL.Text:='SELECT PNum, DClassID, UpFNum FROM mmsedb WHERE DClassID LIKE :val';
    ABSQuery.Params.ParamByName('val').Value:=Edit1.Text;
  end;
  ABSQuery.Active:=true;
  ABSQuery.First;
  while not ABSQuery.Eof do
  begin
    with ListView1.Items.Add do
    begin
      i:=i+1;
      Caption:=ABSQuery.FieldByName('UpdateFileNum').asString;
      SubItems.Append(ABSQuery.FieldByName('PutNum').asString);
      SubItems.Append(ABSQuery.FieldByName('DevClassID').asString);
    end;
    ABSQuery.next;
  end;
  if i=0 then ShowMessage('По вашему запросу ничего не найдено!')
  else  Label2.Caption:=IntToStr(i);
end;




--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
former
Дата 29.12.2006, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 7
Всего: 17



Тема закрыта.


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Mephisto
Дата 29.12.2006, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: нет
Всего: 34



Код

procedure TMainForm.SpeedButton1Click(Sender: TObject);
begin
  ListView1.Clear;
  Label2.Caption:='';
  ABSQuery.Active:=false;
  ABSQuery.SQL.Clear;
  if RadioButton1.Checked=true then
  begin
    ABSQuery.SQL.Text:='SELECT PNum, DClassID, UpFNum FROM mmsedb WHERE PNum LIKE :val';
    ABSQuery.Params.ParamByName('val').Value:=Edit1.Text;
  end
  else if RadioButton2.Checked=true then
  begin
    ABSQuery.SQL.Text:='SELECT PNum, DClassID, UpFNum FROM mmsedb WHERE DClassID LIKE :val';
    ABSQuery.Params.ParamByName('val').Value:=Edit1.Text;
  end;
  ABSQuery.Active:=true;
  ABSQuery.First;
  while not ABSQuery.Eof do
  begin
    with ListView1.Items.Add do
    begin
      Caption:=ABSQuery.FieldByName('UpdateFileNum').asString;
      SubItems.Append(ABSQuery.FieldByName('PutNum').asString);
      SubItems.Append(ABSQuery.FieldByName('DevClassID').asString);
    end;
    ABSQuery.next;
  end;
  if ListView1.Items.Count = 0 then ShowMessage('По вашему запросу ничего не найдено!')
  else  Label2.Caption:=IntToStr(ListView1.Items.Count);
end;

PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

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


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0735 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.