SearchKey не работает
Модератор: Модераторы
-
Sergey_Afanasyev
- новенький
- Сообщения: 49
- Зарегистрирован: 22.02.2012 19:30:27
SearchKey не работает
dm.TAnketa.IndexName := 'ifam' ;
KeyValues := TRIM(Edit1.Text);
Lf := FALSE;
L := dm.TAnketa.SearchKey(KeyValues,stGreaterEqual,Lf);
if L = TRUE then DBGrid1.Refresh
else ShowMessage(' NOT FOUND ' );
Останавливается на первой записи, NOT FOUND не сообщает т.е. L = TRUE.
KeyValues := TRIM(Edit1.Text);
Lf := FALSE;
L := dm.TAnketa.SearchKey(KeyValues,stGreaterEqual,Lf);
if L = TRUE then DBGrid1.Refresh
else ShowMessage(' NOT FOUND ' );
Останавливается на первой записи, NOT FOUND не сообщает т.е. L = TRUE.
KeyValues в тип Variant не пробовали переводить?
-
Sergey_Afanasyev
- новенький
- Сообщения: 49
- Зарегистрирован: 22.02.2012 19:30:27
KeyValues сразу был объявлен как variant, это следует из шаблона функции:
function SearchKey(Key: Variant; SearchType: TSearchKeyType): Boolean;
function SearchKey(Key: Variant; SearchType: TSearchKeyType): Boolean;
Да что Вы? Позвольте Вас опровергнуть.
Вот Ваш код:
Из него со всей очевидностью следует, что у Вас KeyValues объявлено как string и ни какой шаблон функции тут не при чём.
Sergey_Afanasyev писал(а):KeyValues := TRIM(Edit1.Text);
Из него со всей очевидностью следует, что у Вас KeyValues объявлено как string и ни какой шаблон функции тут не при чём.
-
Sergey_Afanasyev
- новенький
- Сообщения: 49
- Зарегистрирован: 22.02.2012 19:30:27
Тип данных variant позволяет менять тип соответствующих ему
данных прямо во время программы, т.е. можно записать:
var KeyValues : variant;
begin
KeyValues := 1.5;
KeyValues := 'Иванов И.И.';
KeyValues := TRUE;
И, наконец, KeyValues :=TRIM(Edit1.Text);
данных прямо во время программы, т.е. можно записать:
var KeyValues : variant;
begin
KeyValues := 1.5;
KeyValues := 'Иванов И.И.';
KeyValues := TRUE;
И, наконец, KeyValues :=TRIM(Edit1.Text);
Наверное Вы меня не поняли. Вы НЕ УКАЗАЛИ в своём коде, какой тип данных у переменной KeyValues. То что знаете Вы - не знаю я, поэтому будьте добры отвечайте на поставленный вопрос.
У Вас в БД строки в какой кодировке хранятся и в какой кодировке Вы даёте строку для поиска?
У Вас в БД строки в какой кодировке хранятся и в какой кодировке Вы даёте строку для поиска?
-
Sergey_Afanasyev
- новенький
- Сообщения: 49
- Зарегистрирован: 22.02.2012 19:30:27
Все таблицы БД хранятся в кодировке UTF 8.
Добавлено спустя 1 час 45 минут 24 секунды:
Что интересно, такой способ поиска, как Locate тоже не работает.
Это касается поиска по фамилии сотрудника. Но вместо фамилии пользователь может ввести идентификационный код человека. Это тоже сивольное данное состоящее из 10 цифр. Программа распознает по первому символу, что ввели подключает соответствующий индекс и осуществляет поиск. Так вот поиск по коду работает и в SearchKey и в Locate. В чем разница? Разница в том, что цифры в кодирорвке UTF8 занимают по одному байту, а русские буквы по два.
Добавлено спустя 1 час 45 минут 24 секунды:
Что интересно, такой способ поиска, как Locate тоже не работает.
Это касается поиска по фамилии сотрудника. Но вместо фамилии пользователь может ввести идентификационный код человека. Это тоже сивольное данное состоящее из 10 цифр. Программа распознает по первому символу, что ввели подключает соответствующий индекс и осуществляет поиск. Так вот поиск по коду работает и в SearchKey и в Locate. В чем разница? Разница в том, что цифры в кодирорвке UTF8 занимают по одному байту, а русские буквы по два.
- alexs
- долгожитель
- Сообщения: 4069
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
Sergey_Afanasyev писал(а):Разница в том, что цифры в кодирорвке UTF8 занимают по одному байту, а русские буквы по два.
А в чём проблема?
Код: Выделить всё
S:=Trim(Edit1.Text);
C:=Val(S, R);
if R = 0 then
Поиск по коду
else
Поиск по фамилии
И нет никаких проблема что текст в UTF8
-
Sergey_Afanasyev
- новенький
- Сообщения: 49
- Зарегистрирован: 22.02.2012 19:30:27
Уважаемый alexs ! Проблема не в том как организовать поиск по коду или фамилии, а в том, что SearchKey и Locate не ищут по фамилии.
alexs
Товарищ работает с TDbf, т.к. SearchKey больше нигде не осталось.
Добавлено спустя 2 минуты 38 секунд:
Sergey_Afanasyev
У меня есть определённые подозрения на этот счёт, но чтобы их проверить, попробуйте:
1) в поле фамилии ввести слова на английском и посмотреть, будет ли осуществлятся поиск с помощью SearchKey() этих английских слов.
2) Удалите индекс по полю фамилий (именно удалите, а не отключите и вообще любые индексы, в которые включено поле фамилий) и ищите русские фамилии с помощью Locate() без опции loPartialKey. Что будет?
Товарищ работает с TDbf, т.к. SearchKey больше нигде не осталось.
Добавлено спустя 2 минуты 38 секунд:
Sergey_Afanasyev
У меня есть определённые подозрения на этот счёт, но чтобы их проверить, попробуйте:
1) в поле фамилии ввести слова на английском и посмотреть, будет ли осуществлятся поиск с помощью SearchKey() этих английских слов.
2) Удалите индекс по полю фамилий (именно удалите, а не отключите и вообще любые индексы, в которые включено поле фамилий) и ищите русские фамилии с помощью Locate() без опции loPartialKey. Что будет?
-
Sergey_Afanasyev
- новенький
- Сообщения: 49
- Зарегистрирован: 22.02.2012 19:30:27
Если удалить индексный файл, то Locate работает. Спасибо за помощь.
Sergey_Afanasyev
В общем, вот моя мысль по этому поводу, которую Вы косвенно подтвердили.
TDbf до сих пор считает, что строка в таблице - исключительно однобайтная и поэтому строит индексы исходя из этого принципа. Поэтому в индексах, в случае применения многобайтных алфавитов, творится сущая билиберда. SearchKey() работает исключительно с индексами, поэтому и результат поиска такой абсурдный. Locate() же работает с индексами только если они есть, если нету, то производит поиск обычным перебором строк и хотя теряет при этом в скорости, но имеет нужный результат, когда сравнение происходит на предмет полного соответствия.
В общем, вот моя мысль по этому поводу, которую Вы косвенно подтвердили.
TDbf до сих пор считает, что строка в таблице - исключительно однобайтная и поэтому строит индексы исходя из этого принципа. Поэтому в индексах, в случае применения многобайтных алфавитов, творится сущая билиберда. SearchKey() работает исключительно с индексами, поэтому и результат поиска такой абсурдный. Locate() же работает с индексами только если они есть, если нету, то производит поиск обычным перебором строк и хотя теряет при этом в скорости, но имеет нужный результат, когда сравнение происходит на предмет полного соответствия.
-
Sergey_Afanasyev
- новенький
- Сообщения: 49
- Зарегистрирован: 22.02.2012 19:30:27
Если TDbf не работает с многобайтными алфавитами, то как объяснить тот факт, что когда программа обнаруживает, что поиск будет по фамилии и выбирает соответствующий индекс
dm.TAnketa.IndexName := 'ifam' ;
в Гриде, который расположен на форме, данные действительно выстраиваются по алфавиту. Но
Locate и SearchKey при этом не работают.
dm.TAnketa.IndexName := 'ifam' ;
в Гриде, который расположен на форме, данные действительно выстраиваются по алфавиту. Но
Locate и SearchKey при этом не работают.
- Vapaamies
- постоялец
- Сообщения: 292
- Зарегистрирован: 24.07.2012 22:37:59
- Откуда: Санкт-Петербург
- Контактная информация:
Мне кажется, что индекс строится по байтам, и ему всё равно, какие данные на входе. Но байты, поступающие на вход SearchKey, отличаются от байтов, по которым построен индекс, поэтому ничего и не находится. Предполагаю, что индекс строится по фактическому представлению данных в DBF в однобайтовой кодировке (1251 или 866), а SearchKey передает строку UTF-8.
