Не так давно я размещал на своем сайте статью об универсальном алгоритме нечеткой фильтрации справочников средствами 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 возможны только с письменного разрешения компании "СофтПоинт". Это правило действует для всех без исключения случаев, кроме тех, когда в материале прямо указано разрешение на копирование (основание: Закон Российской Федерации "Об авторском праве и смежных правах").
|