![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как осуществить поиск в индексе, построенном по двум полям в DBF [D4, dBase, FoxPro]
Duke2 © (2002-10-23 20:45:00)Уважаемые Мастера !
Как осуществить поиск в индексе, построенном по двум полям в таблицах DBF ?
Известный парадоксовский метод FindKey([поле1, поле2]) в таблицах BDF ругается примерно такими словами (перевод): "Нельзя применить массив полей поиска ", что совершенно логично, так как индекс был построен по выражению: IndexDefs.Add("поле1+поле2"), так как построить для DBF индекс типа IndexDefs.Add("поле1;поле2") - невозможно (почему -то)
Во времена ДОС (clipper) я спокойно мог построить индекс по выражению:
"поле1+IntToStr(поле2)" - и точно по такому же выражению искать. То есть в индексное выражение включались функции преобразования строк, чисел, дополнения строк пробелами и.т.д. В этом случае индексный поиск по двум полям проходит идеально. Но такой прием недопустим в Delphi.
Пробовал применить другой метод:
Table1.EditKey;
Table1.FieldByName(Поле1"").asString=значение1;
Table1.FieldByName("Поле2").asInteger:=значение2;
Table1.GotoKey;
Этот метод ищет только по первому полю, возвращает true и ставит курсор на первую попавшуюся запись, совпадающую только по параметру Поле1, а по двум сразу- не ищет.
Причем одинаково успешно НЕ ИЩЕТ независимо от типа полей- одинаковые String, одинаковые поле1 и поле2 Integer, разные по типам..
Пробовал искать по выражению, однако он ставит курсор на первую попавшуюся запись поле1+поле2, например, я хочу найти запись, где поле1=16 и поле2=3, находит первое попавшееся по сумме поле1 + поле2 запиь: поле1=15 и поле2=4.
Вы можете мне возразить, что можно воспользоваться Парадоксом а не bdf, однако индексы у DBF я хоть могу починить в случае их разрушения (в отличии от Парадокса), к тому же, если внимательно почитать эту конференцию - очень много ругательств на Парадокс за его непонятные разрушения и все советуют использовать dbf.
ВОПРОС: Неужели нельзя искать в индексах DBF сразу по двум полям, неужели придется искать простым и медленным перебором (типа Locate) ?
Duke2 (2002-10-24 06:43:00) [1]cod_p и cod_pos - это коды потребителя и поставщика, я их пробывал в разных комбинациях: строковые, числовые, смешанные -строкиа и число -НЕ ПОМОГАЕТ
А что касается индекса DBASE по выражению - тоже пробовал, но там нельзя использовать функции приведения индексных полей к одному типу и длинне (для строк)
Jeer (2002-10-23 21:23:00) [2]dBASE multi-field indexes cannot be created using a list of fields separated by semi-colons in the Fields parameter. To create these indexes, use an expression with dBASE data manipulation (DML) functions and operators to concatenate the multiple fields into a single expression.
Anatoly Podgoretsky (2002-10-23 21:22:00) [3]Я просил привести точно
Что такое cod_p и cod_pos
Duke2 (2002-10-23 21:15:00) [4]Table1.IndexDefs.Add("cod_p+cod_pos");
Duke2 (2002-10-23 21:13:00) [5]Значение индекса:
Table1.IndexDefs.Add("cod_p+cod_pos");
Anatoly Podgoretsky (2002-10-23 21:05:00) [6]Что то у тебя не то, приведенный метод работает, приведи точное значение индекса