Быстрый поиск в справочнике товаров средствами SQL   

Не так давно я размещал на своем сайте статью об универсальном алгоритме нечеткой фильтрации справочников средствами SQL. Обработка, которая в ней описана, является универсальной, и, в силу своей универсальности, недостаточно удобна. Я взял за основу идею, предложенную в ней и написал кусочек кода, который будет фильтровать по наименованию справочник «товары», или, если подправить код - любой другой справочник. Корректировка минимальная, и состоит в замене названия справочника.

Также как и в прошлой статье, используется внешняя компонента RainBow.dll, только требуется не оригинальная версия, а Rainbow v1.1.0.4 (by Максим Поломошнов aka LongMaster). Ее можно загрузить здесь.

Ниже расположены элементы диалога для поиска товара (строка поиска и кнопка, обведенные рамкой):

Элементы диалога для поиска

Текст в строку поиска набирается через пробелы. Пробел означает любое количество любых символов. После набора текста и нажатия кнопки поиска нам выдается список найденных товаров.

Найденные элементы представлены в списке

После выбора из списка выбранное значение активизируется в форме списка справочника:

Выбранный из списка элемент активизирован

Теперь немного об элементах диалога. Строка поиска имеет идентификатор «СтрокаПоиска» и тип «Строка» с длиной 20. Кнопка поиска имеет идентификатор «кнПоиск» и формулу НайтиТовар(). Код модуля формы списка справочника приведен ниже:

Перем Мета, Радуга;
Процедура НайтиТовар()
    Перем Запрос, ТекстЗапроса, СписокВыбора;
    Перем ВнутрИД, ТекВыбор;
    Перем ВремСтрокаПоиска;
    ВремСтрокаПоиска="%"+СокрЛП(СтрокаПоиска)+"%";
    ВремСтрокаПоиска=СтрЗаменить(ВремСтрокаПоиска," ","%");
    СписокВыбора=СоздатьОбъект("СписокЗначений");
    Если ПустаяСтрока(СтрокаПоиска)=0 Тогда
        ВнутрИД="SC"+Мета.ИДСправочника("Товары");
        Запрос=СоздатьОбъект("ODBCQuery");
        ТекстЗапроса="SELECT ID,DESCR
        | FROM "+ВнутрИД+"
        | WHERE (RTRIM(DESCR) LIKE '"+ВремСтрокаПоиска+"')";
        Если Запрос.Prepare(ТекстЗапроса,1,1)=1 Тогда
            Если Запрос.Open()=1 Тогда
                Запрос.GotoNext();
                Пока Запрос.IsOK()=1 Цикл
                    ТекЗнач=Радуга.ЗначениеИзСтрокиБД("Справочник","Товары",Запрос.GetString(Запрос.FindField("ID")));
                    Если ТекЗнач.ЭтоГруппа()=0 Тогда
                        СписокВыбора.ДобавитьЗначение(ТекЗнач);
                    КонецЕсли;
                    Запрос.GotoNext();
                КонецЦикла;
                Запрос.Close();
            Иначе
                Предупреждение("Ошибка Запрос.Open");
            КонецЕсли;
            Запрос.Reset();
        Иначе
            Предупреждение("Ошибка Запрос.Prepare");
        КонецЕсли;
        Если СписокВыбора.РазмерСписка()>0 Тогда
            Если СписокВыбора.ВыбратьЗначение(ТекВыбор,,,,1)=1 Тогда
                АктивизироватьОбъект(ТекВыбор);
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры
Процедура ПриОткрытии()
    СтрокаПоиска=ВосстановитьЗначение("СтрокаПоискаТовар");
    Попытка
        ЗагрузитьВнешнююКомпоненту("rainbow.dll");
        Мета=СоздатьОбъект("MetaDataWork");
        Радуга=СоздатьОбъект("RainBowService");
    Исключение
        Форма.кнПоиск.Доступность(0);
    КонецПопытки;
КонецПроцедуры
Процедура ПриЗакрытии()
    СохранитьЗначение("СтрокаПоискаТовар",СтрокаПоиска);
КонецПроцедуры


 


 

Перепечатка, воспроизведение в любой форме, распространение, в том числе в переводе, любых материалов с сайта www.softpoint.ru возможны только с письменного разрешения компании "СофтПоинт". Это правило действует для всех без исключения случаев, кроме тех, когда в материале прямо указано разрешение на копирование (основание: Закон Российской Федерации "Об авторском праве и смежных правах").