Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Грамотный поиск записей


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

Автор: Rodman 13.12.2006, 20:11
Код

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

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

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


Почитай про LIKE

Автор: former 13.12.2006, 20:30
Использую AbsoluteDB

Цитата

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


Не понял! smile 

Автор: Rodman 13.12.2006, 20:49
Пишешь запрос
Код

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


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

Все строки в которіх в поле Field  встречается Вася будут выведены....

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

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

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

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

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

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

Автор: ТоляМБА 14.12.2006, 06:45
Цитата(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 из селекта отобразятся

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

А если зайти в Columns Editor? Для каждой колонки есть свойства  visible, readonly и еще куча не менее полезных. Так что F1 и вперед smile (в дополнение к способу select что надо)

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

короче возможностей для поиска, группировки и фильтрации масса... smile 

Автор: former 14.12.2006, 20:14
Цитата

ТоляМБА:
Код

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



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

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


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




Автор: skyboy 14.12.2006, 20:50
former, у компонента - наследника TQuery есть свойство RowCount или RecordCount(не помню, чесно говоря) - это и есть количество записей в результате запроса.

Автор: former 15.12.2006, 07:55
skyboy, спасибо.

Автор: SergeBS 18.12.2006, 12:18
former, 
ListView будешь связывать с результатами, как нетрудно догадаться, ручками. Т.е. своими строчками кода. Это не DB-aware компонент.

Автор: Akella 18.12.2006, 14:32
что-то вроде этого
Код

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

Автор: Mephisto 20.12.2006, 10:17
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;

Автор: former 27.12.2006, 20:50
Благодарю всех за помощь. Сделал, как посоветовали 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;


Автор: former 29.12.2006, 00:14
Тема закрыта.

Автор: Mephisto 29.12.2006, 17:05
Код

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;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)