Имя: Пароль:
1C
1C 7.7
v7: Поиск по подстроке прямым запросом
0 Fiasko
 
16.11.12
00:06
Господа, а это вообще реализуемо? Делал кто-нибудь подобное? Хотел оптимизировать типовой "ПодборОбъектов", но что-то засомневался... Может я просто sql-язык плохо знаю..
1 Азат
 
16.11.12
00:07
а чем тебе LIKE '%ТВОЯСТРОКА%' не катит?
2 exchang
 
16.11.12
00:08
(1) exactly
3 Fiasko
 
16.11.12
00:10
понял, буду пытаться.. спасибо
4 Fiasko
 
17.11.12
16:13
Запрос работает, когда я непосредственно запускаю его с фильтром с конкрентным значением, а хотелось бы получать данные с фильтром по переменной.. Запрос, приведенный ниже, ничего не находит..
       стрПоиска = "efg";
       Запрос.УстановитьТекстовыйПараметр("Подстрока",стрПоиска);

       ТекстЗапроса = "
       |SELECT
       |    Спр.ID as [Номенклатура $Справочник.Номенклатура],
       |    Спр.Code as Код,
       |    Спр.PARENTID as [Производитель $Справочник.Номенклатура],
       |    Спр.Descr as Наименование,
       |    $Спр.КатНомер as КатНомер
       |FROM
       |    $Справочник.Номенклатура as Спр
       |WHERE $Спр.КатНомер LIKE '%Подстрока%'
       |"
       ;
Подскажите, пожалуйста :)
5 Злопчинский
 
17.11.12
16:27
|WHERE $Спр."+имяРеквизита+" LIKE
6 Fiasko
 
17.11.12
16:29
не, наоборот, переменная после like должна быть..
7 ADirks
 
17.11.12
16:30
'%'+:Подстрока+'%'
8 Fiasko
 
17.11.12
16:33
точно! Спасибо :)
9 Злопчинский
 
17.11.12
16:37
//======================================================================
Функция ПоискПоПодстрокеSQlite()
   
   Попытка
       глВКлайт.Открыть(":memory:");
       Запрос = глВКлайт.НовыйЗапрос();
       Запрос.ВыполнитьЗапрос("create virtual table Товары using dbeng(Справочник.Номенклатура)");
   Исключение
       //тОшибка = "инфо: проблема при выполнении запроса инициализации вирт.таблицы, при случае - сообщите программисту: "+ОписаниеОшибки();
       //Сообщить(тОшибка);
       Возврат 0;
   КонецПопытки;    

   РазбиваемаяСтрока    = ПодСтрокаПоиска;    
   РазбиваемаяСтрока    = СтрЗаменить(РазбиваемаяСтрока,"'","");
   РазбиваемаяСтрока    = СтрЗаменить(РазбиваемаяСтрока,"""","");
   РазбиваемаяСтрока    = СтрЗаменить(СокрЛП(РазбиваемаяСтрока)," ",РазделительСтрок);
   
   ТекстЗапроса = "SELECT
   |Товары.id [Элемент :Справочник.Номенклатура]
   |FROM Товары
   |WHERE Товары.isfolder=2 and Товары.ismark <> '*'";    

   Для Индекс = 1 По СтрКоличествоСтрок(РазбиваемаяСтрока)
   Цикл Слово = Врег(СтрПолучитьСтроку(РазбиваемаяСтрока,Индекс));
       
       Если  ПустоеЗначение(Слово)=1
       Тогда Продолжить;
       КонецЕсли;    
       ТекстЗапроса = ТекстЗапроса+"
       |AND UPPER(Товары.descr) LIKE '%"+Слово+"%'";
   КонецЦикла;
   
   //ТекстЗапроса = ТекстЗапроса+"
   //|ORDER BY Элемент.descr";
   
   ТЗраб = СоздатьОбъект("ТаблицаЗначений");
   Попытка
       _время1 = _GetPerformanceCounter();
       Запрос.ВыполнитьЗапрос(ТекстЗапроса).Выгрузить(ТЗраб);
   Исключение
       глВКлайт.Закрыть();
       тОшибка = "ошибка при выполнении запроса, сообщите программисту: "+ОписаниеОшибки();
       Сообщить(тОшибка);
       Возврат 0;
   КонецПопытки;
   глВКлайт.Закрыть();
10 Fiasko
 
17.11.12
16:39
(9) полезная штука, однозначно
11 Fiasko
 
17.11.12
16:39
(9) шпасиб :)
12 Злопчинский
 
17.11.12
16:44
это мелкий допил штатной тисовской ВыборИзСправочникаПоПодстроке
.
есть более продвинутые варианты, на том же ИС
13 Fiasko
 
18.11.12
18:18
блиииин... а если есть список значений подстрок, по которому и нужно найти элементы, как тут лучше поступить? через уложитьсписокобъектов? или дополнять текстзапроса по списку?
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший