Имя: Пароль:
1C
1С v8
Поиск в 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
дбф же ищет или по индексу или полным сканированием,по подстроке можно только полным сканированием,или заранее разбить каждую запись на слова и составить таблицу соответствия слов записям,но это выходит за рамки поиска по дбф файлу
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший