Вход | Регистрация

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 человек.
Рекламное место пустует