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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.09.2011, 02:51   #1
vmilyoshin
Пользователь
 
Регистрация: 20.02.2010
Сообщений: 66
По умолчанию Поиск по базе данных

База данных Access. В своей программе подключаюсь к ней через ADO.
В базе данных много людей с одинаковой фамилией. При поиске по фамилии курсор в DBGrid останавливается при первой найденой фамилии и дальше не ищет. Как заставить программу перейти к следующей фамилии.

Вот код:

Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if not Form1.DBGrid1.DataSource.DataSet.Locate('Фамилия', trim(Edit1.Text), [loPartialKey]) then
  Edit1.Text:= 'Запись не найдена';
end;

Последний раз редактировалось Stilet; 11.09.2011 в 14:05.
vmilyoshin вне форума Ответить с цитированием
Старый 10.09.2011, 14:04   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В вашем случае это не поиск по базе, а поиск в DataSet. Locate всегда находит только первую встреченную запись. Найти следующую (следующие) можно в цикле с DataSet.Next и сравнением значения поля с заданным поисковым образом.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 10.09.2011, 18:53   #3
vmilyoshin
Пользователь
 
Регистрация: 20.02.2010
Сообщений: 66
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
В вашем случае это не поиск по базе, а поиск в DataSet. Locate всегда находит только первую встреченную запись. Найти следующую (следующие) можно в цикле с DataSet.Next и сравнением значения поля с заданным поисковым образом.
Если не трудно приведи пример для образца. Я так понял что Locate в моём случае не годится.
vmilyoshin вне форума Ответить с цитированием
Старый 10.09.2011, 20:12   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
var xRecNo: Integer;
    xFound: Boolean;
...
  DataSource.Enable:=False;
  xRecNo:=DataSet.RecNo;
  xFound:=False;
  DataSet.Next;
  while not DataSet.Eof do begin
    xFound:=AnsiSameText(DataSet.FieldByName('Фамилия').AsString,Trim(Edit1.Text));
    if xFound then Break;
    DataSet.Next;
  end;
  if not xFound then DataSet.RecNo:=xRecNo;
  DataSource.Enable:=True;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.09.2011, 08:53   #5
vmilyoshin
Пользователь
 
Регистрация: 20.02.2010
Сообщений: 66
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Код:
var xRecNo: Integer;
    xFound: Boolean;
...
  DataSource.Enable:=False;
  xRecNo:=DataSet.RecNo;
  xFound:=False;
  DataSet.Next;
  while not DataSet.Eof do begin
    xFound:=AnsiSameText(DataSet.FieldByName('Фамилия').AsString,Trim(Edit1.Text));
    if xFound then Break;
    DataSet.Next;
  end;
  if not xFound then DataSet.RecNo:=xRecNo;
  DataSource.Enable:=True;
Спасибо огромное умный человек. Немного подогнал под себя и использовал в своей программе.
Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
  var
  xRecNo: Integer;
  xFound: Boolean;
begin
  if DataModule1.ADOTable1.RecordCount <> 0 then
  begin
  DBGrid1.DataSource.Enabled:= false;
  xRecNo:= DBGrid1.DataSource.DataSet.RecNo;
  xFound:= false;
  DBGrid1.DataSource.DataSet.Next;
  while not DBGrid1.DataSource.DataSet.Eof do
  begin
  xFound:= AnsiSameText(DBGrid1.DataSource.DataSet.FieldByName('Фамилия').AsString,Trim(Edit1.Text));
  if xFound then
  Break;
  DBGrid1.DataSource.DataSet.Next;
  DBGrid1.SetFocus;
  end;
  if not xFound then
  DBGrid1.DataSource.DataSet.RecNo:= xRecNo;
  DBGrid1.DataSource.Enabled:= true;
  DBGrid1.SetFocus;
  if xFound = false then
  if trim(Edit1.Text) <> '' then
  MessageDlg('  Поиск завершён!'#13'Запись не найдена.', mtInformation, [mbOk], 0);
  end
  else
  DBGrid1.SetFocus;
end;

Последний раз редактировалось vmilyoshin; 11.09.2011 в 08:56.
vmilyoshin вне форума Ответить с цитированием
Старый 11.09.2011, 11:00   #6
Surgeon
Форумчанин
 
Регистрация: 04.10.2007
Сообщений: 106
По умолчанию

А почему навигационный доступ а не реляционный? ИМХО SQL-запрос на порядок гибче и мощнее будет.
Все не так плохо, как вам кажется, на самом деле все гораздо хуже.
http://delphiworld.narod.ru/dw.html - 5000 статей!!! удобный поиск, оффлайн сборник, рекомендую всем
Surgeon вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск по базе данных WestDragon БД в Delphi 8 20.08.2011 19:55
Поиск в базе данных Egik_net БД в Delphi 3 17.02.2010 21:47
Поиск в базе данных St-Dyx Microsoft Office Excel 8 19.10.2008 12:13
Поиск по базе данных ERASERROR БД в Delphi 4 14.03.2008 16:34