Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Поиск в DBF

Поиск в DBF
Я
   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

Срани в стакане нет...
 
 
   cw014
 
1 - 24.04.18 - 14:44
Таблица.НайтиПоКлючу(">="); - почему так?
   Absurdus
 
2 - 24.04.18 - 14:46
(1) А как?
   Absurdus
 
3 - 24.04.18 - 14:49
(1) По подстроке потому что хотелось бы найти.
    Т.е. СтрокаПоиска= "Срань", найти хотелось бы "Срань волшебная"
   cw014
 
4 - 24.04.18 - 14:56
Все таки поиск - больше математическая составляющая, нежели гуманитарная. Попробуй "=" - от тебя не убудет
   cw014
 
5 - 24.04.18 - 14:57
Я так понял, что ты не числа сравниваешь, а строки. Посему у тебя строка "Срань" преобразовалась в набор байтов, и были найдены все записи, последовательность байтов которых больше или равно последовательности байтов слова "Срань"
   cw014
 
6 - 24.04.18 - 14:57
А вообще насколько я помню, там подстановочные знаки должны фигурировать на поиск части слова
   Absurdus
 
7 - 24.04.18 - 14:59
По "=" работает, но надо всю строку целиком подставлять в СтрокуПоиска. А хочется по подстроке
   SleepyHead
 
8 - 24.04.18 - 16:39
Загрузите содержимое в таблицу значений с типизированными колонками и ищите запросом. Если размер DBF позволяет..
   Garykom
 
9 - 24.04.18 - 17:31
(0) Используй не встроенный xBase а нечто иное, вариантов дофига и более.
Банально как внешний источник данных подруби например.
   Garykom
 
10 - 24.04.18 - 17:33
Если надо осень-осень быстро то создаешь свой индекс по словам/подстрокам/N-граммам и получаешь офигенный результат.
 
 Рекламное место пустует
   Сияющий в темноте
 
11 - 24.04.18 - 20:20
дбф же ищет или по индексу или полным сканированием,по подстроке можно только полным сканированием,или заранее разбить каждую запись на слова и составить таблицу соответствия слов записям,но это выходит за рамки поиска по дбф файлу

Список тем форума
Рекламное место пустует  Рекламное место пустует
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует