|
Поиск в DBF | ☑ | ||
---|---|---|---|---|
0
Absurdus
24.04.18
✎
14:39
|
На форме есть два реквизита "СтрокаПоиска" и "Колонка"
Надо найти в DBF файлах в выбранной колонке по подстроке: &НаКлиенте Процедура НайтиНужнуюЗаписьВФайлахВФорматеDBFНаКлиенте(ПутьККаталогу) МассивНайденныхФайлов = НайтиФайлы( ПутьККаталогу, // где искать "*.dbf", // маска поиска Ложь // если Истина, то будет искать и в подкаталогах ); Для Каждого Файл Из МассивНайденныхФайлов Цикл Таблица = Новый XBase; Таблица.ОткрытьФайл( Файл.ПолноеИмя, // путь к базе , // путь к индексу Ложь // открываем на запись ); Таблица.Индексы.Добавить( "INDEX_"+СокрЛП(Колонка), // имя индекса СокрЛП(Колонка), // выражение индекса Истина // уникальность создаваемого индекса ); ПутьКФайлуИндекса = ПутьККаталогу + "\temp.cdx"; Таблица.СоздатьИндексныйФайл(ПутьКФайлуИндекса); Таблица.ЗакрытьФайл(); Таблица = Новый XBase; Таблица.ОткрытьФайл( Файл.ПолноеИмя, // путь к базе ПутьКФайлуИндекса, // путь к индексу Истина // только чтение ); // В таблице всего один индекс Таблица.ТекущийИндекс = Таблица.Индексы.Получить(0); Таблица.Ключ[СокрЛП(Колонка)] = СокрЛП(СтрокаПоиска); ЗаписьНайдена = Таблица.НайтиПоКлючу(">="); сообщить("ЗаписьНайдена: "+ЗаписьНайдена); Если ЗаписьНайдена Тогда Сообщить("Запись найдена в "+Файл.ПолноеИмя); Сообщить(Строка(Таблица[СокрЛП(Колонка)])); Иначе Сообщить("Запись НЕ найдена в "+Файл.ПолноеИмя); КонецЕсли; Таблица.ЗакрытьФайл(); УдалитьФайлы(ПутьКФайлуИндекса); КонецЦикла; КонецПроцедуры Ввожу СтрокаПоиска = "Срань" Колнка = "Name" Почему возвращает Запись найдена в Vozv0297.DBF Стакан высокий Букеты 250мл Д1256/101 Запись найдена в Vozv0311.DBF Стакан 145мл для чая/кофе с ручкой 55411 PSB Срани в стакане нет... |
|||
1
cw014
24.04.18
✎
14:44
|
Таблица.НайтиПоКлючу(">="); - почему так?
|
|||
2
Absurdus
24.04.18
✎
14:46
|
(1) А как?
|
|||
3
Absurdus
24.04.18
✎
14:49
|
(1) По подстроке потому что хотелось бы найти.
Т.е. СтрокаПоиска= "Срань", найти хотелось бы "Срань волшебная" |
|||
4
cw014
24.04.18
✎
14:56
|
Все таки поиск - больше математическая составляющая, нежели гуманитарная. Попробуй "=" - от тебя не убудет
|
|||
5
cw014
24.04.18
✎
14:57
|
Я так понял, что ты не числа сравниваешь, а строки. Посему у тебя строка "Срань" преобразовалась в набор байтов, и были найдены все записи, последовательность байтов которых больше или равно последовательности байтов слова "Срань"
|
|||
6
cw014
24.04.18
✎
14:57
|
А вообще насколько я помню, там подстановочные знаки должны фигурировать на поиск части слова
|
|||
7
Absurdus
24.04.18
✎
14:59
|
По "=" работает, но надо всю строку целиком подставлять в СтрокуПоиска. А хочется по подстроке
|
|||
8
SleepyHead
гуру
24.04.18
✎
16:39
|
Загрузите содержимое в таблицу значений с типизированными колонками и ищите запросом. Если размер DBF позволяет..
|
|||
9
Garykom
гуру
24.04.18
✎
17:31
|
(0) Используй не встроенный xBase а нечто иное, вариантов дофига и более.
Банально как внешний источник данных подруби например. |
|||
10
Garykom
гуру
24.04.18
✎
17:33
|
Если надо осень-осень быстро то создаешь свой индекс по словам/подстрокам/N-граммам и получаешь офигенный результат.
|
|||
11
Сияющий в темноте
24.04.18
✎
20:20
|
дбф же ищет или по индексу или полным сканированием,по подстроке можно только полным сканированием,или заранее разбить каждую запись на слова и составить таблицу соответствия слов записям,но это выходит за рамки поиска по дбф файлу
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |