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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2009, 18:47   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
Вопрос FindNearest

Всем добрый вечер! . Возникла небольшая проблемка у меня, нужна ваша помощь. Я написал программу с БД. БД состоит, например, из двух полей: ID (+), LAST_NAME (A). Мне нужно по мере ввода букв фамилии в Edit, чтобы курсор перемещался на позицию, которая удовлетворяет поиску. Взял пример из справки по Delphi.
Код:
procedure TForm1.FormActivate(Sender: TObject);

begin
  Table1.DatabaseName := 'DBDemos';
  Table1.TableName := 'Customer.db';
  Table1.Active := True;
  Table1.IndexName := 'ByCompany';
end;

procedure TForm1.Edit1Change(Sender: TObject);

begin
    Table1.FindNearest([Edit1.Text]);
end;
Переделал под себя:
Код:
procedure TForm1.FormActivate(Sender: TObject);

begin
  Table1.DatabaseName := 'Nomera';
  Table1.TableName := 'nomera.db';
  Table1.Active := True;
  Table1.IndexName := 'ByCompany'; {???}
end;

procedure TForm1.Edit1Change(Sender: TObject);

begin
    Table1.FindNearest([Edit1.Text]);
end;
И возникло два вопроса:
1. Что мне написать в моем случае в строке, рядом с которой стоят вопросительные знаки?
2. Почему, когда я начинаю набирать фамилию искомую, то у меня вылазить ошибка: " 'Г' is not valid integer value for field 'ID' "? Вообщем-то смысл ошибки понятен, а когда я набираю какой-нибудь номер порядковый, то все ништяк переходит.
Как сделать, чтобы я мог фамилию вводить а не номер?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 01.06.2009, 19:30   #2
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

замени это
Код:
Table1.IndexName := 'ByCompany'; {???}
на это
Код:
Table1.IndexName := 'LAST_NAME';
soleil@mmc вне форума Ответить с цитированием
Старый 01.06.2009, 19:45   #3
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Выдается такая ошибка:
Изображения
Тип файла: jpg Безымянный.JPG (11.8 Кб, 116 просмотров)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 02.06.2009, 18:07   #4
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Если мне не изменяет память, ...Nearest не работает с числовыми полями.
И вообще, если это не учебное задание, для поиска удобнее использовать sql-запрос

Код:
Select LAST_NAME from Customer where Upper(LAST_NAME) LIKE Upper("' + Edit1.Text +'%")
_SERGEYX_ вне форума Ответить с цитированием
Старый 03.06.2009, 09:42   #5
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

if not (Table1.Locate('last_name',Edit1.Te xt,[loCaseInsensitive, loPartialKey])) and (Edit1.Text<>'') then
Label1.Caption:='Данное наименование отсутствует'
else Label1.Caption:='';
Принцип работы, если при изменении значения в edit выполняется locate то курсор переходит на ту запись, иначе записывает ошибку.
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 03.06.2009, 10:31   #6
Andrei
Форумчанин
 
Регистрация: 20.06.2007
Сообщений: 270
По умолчанию

А поле LAST_NAME у вас предварительно проиндексировано? Если нет - то проиндексируйте и подключайте этот индекс перед вызовом FindNearest.
-Кукушка, кукушка! Накукуй мне сто лет!
-А накукуй тебе столько?

(с) Библия. Вольный перевод с древнееврейского.
Andrei вне форума Ответить с цитированием
Старый 03.06.2009, 10:36   #7
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

Зачем его индексировать?????
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 03.06.2009, 10:55   #8
Andrei
Форумчанин
 
Регистрация: 20.06.2007
Сообщений: 270
По умолчанию

Цитата:
Сообщение от Sparky Посмотреть сообщение
Зачем его индексировать?????
А как FindNearest будет искать ближайшее значение по вашему?

Сначала он выстроит таблицу по-порядку, в соответствии с индексом, а потом в таблице найдет ближайшее значение, соответствующее ключу. Только так.
-Кукушка, кукушка! Накукуй мне сто лет!
-А накукуй тебе столько?

(с) Библия. Вольный перевод с древнееврейского.
Andrei вне форума Ответить с цитированием
Старый 03.06.2009, 10:59   #9
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

я сама неоднократно использовала данный код, без индексов, работает без проблем!!!
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 03.06.2009, 11:03   #10
Andrei
Форумчанин
 
Регистрация: 20.06.2007
Сообщений: 270
По умолчанию

А я всегда предварительно индексировал. Наверное, я перестраховщик.
-Кукушка, кукушка! Накукуй мне сто лет!
-А накукуй тебе столько?

(с) Библия. Вольный перевод с древнееврейского.
Andrei вне форума Ответить с цитированием
Ответ


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