Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Фильтр с использованием like - (число прочтений - 2980 )
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Фильтр с использованием like -
24. Января 2009 :: 07:32
Печать  
Привет всем!
есть простенький запрос



Код
Выбрать все
ТекстЗапроса="
|Select
|$ИмпортИзБанкКлиентаТЧ.Предприниматель as [Предприниматель $Справочник.Предприниматели],
|Журнал.date date
|From
|$ДокументСтроки.ИмпортИзБанкКлиента ИмпортИзБанкКлиентаТЧ
|inner join 1SJOURN Журнал on Журнал.IDDOC=ИмпортИзБанкКлиентаТЧ.IDDOC
|	and Журнал.date BETWEEN :НачДата~~ AND :КонДата~~
|where
|   $ИмпортИзБанкКлиентаТЧ.Приход<>0
|";
 



Все прекрасно работает, проблема возникает, когда нужно исключить строки, поле "Содержание" в которых содержат определенные фрагменты текста; т.е. я пишу

Код
Выбрать все
Для с=1 по сз_искл.РазмерСписка() цикл
	ТекСтрИскл=сз_искл.ПолучитьЗначение(с);

	ТекстЗапроса=ТекстЗапроса+"
	|and not Upper($ИмпортИзБанкКлиентаТЧ.Содержание) like '%"+ТекСтрИскл+"%'
КонецЦикла;
 



И при определенном количестве этих исключений (порядка 50) выдается ошибка

Цитата:
FAILED! ICommandText::Execute(): SQL: Statement too long.


Да и запрос выполняется очень долго при приближении к этому пределу - больше двух минут, тогда как без условий - секунд 6.

База ДБФ, Использую Provider=VFPOLEDB.1 - если это существенно.
  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Фильтр с использованием like -
Ответ #1 - 24. Января 2009 :: 10:21
Печать  
1. Вставлять РазделительСтрок между условиями - чтобы не было очень длинной строки
2. Есть предел размера запроса.
Тогда данные сохраняются в курсор и там обрабатываются.

Для начала пункт 1.
  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Фильтр с использованием like -
Ответ #2 - 24. Января 2009 :: 11:42
Печать  
Пункт 1 выполнен ))
  
Наверх
ICQ  
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Фильтр с использованием like -
Ответ #3 - 24. Января 2009 :: 11:56
Печать  
Да и в общем то, сам принцип формирования не подходит - запрос то медленный получается
  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Фильтр с использованием like -
Ответ #4 - 24. Января 2009 :: 13:10
Печать  
ol писал(а) 24. Января 2009 :: 11:56:
Да и в общем то, сам принцип формирования не подходит - запрос то медленный получается


Попробуй наоборот.
like or like - этот список "плохих" документов. Потом их убрать несложно.

Либо скидывай все в ТЗ и построчно проверяй условия (like).

P.S>
Насчет курсора http://www.1cpp.ru/forum/YaBB.pl?num=1188673318 - там универсальная функция,
скидывает результат запроса в курсор(временная таблица в оперативке)
Дальше этот курсор можно обрабатывать опять запросами (например накладывать условия like).



  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: Фильтр с использованием like -
Ответ #5 - 24. Января 2009 :: 17:58
Печать  
ок, насчет курсора я сразу не понял, об чем речь; вещь конечно удобная, спасибо!

я пока свой запрос разбил на два: в первом вычисляю "неправильные" документы, потом загоняю IDDOC+LineNo во временную dbf-ку и во втором запросе уже ее использую. При этом попадаю в индекс, все работает очень шустро.

Попробую с курсором - насколько это будет интереснее.
  
Наверх
ICQ  
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Фильтр с использованием like -
Ответ #6 - 25. Января 2009 :: 21:41
Печать  
Подсказка: временную таблицу можно заменить вложенным запросом
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Фильтр с использованием like -
Ответ #7 - 27. Января 2009 :: 12:34
Печать  
Снять ошибку Цитата:
FAILED! ICommandText::Execute(): SQL: Statement too long.
также можно командой
SYS(3055,440)
описание
SYS(3055) - Уровни значимости в конструкциях FOR и WHERE
440 просто параметр(может быть любым  <2000), похоже деленное на восемь дает макс кол в WHERE (а также IN, если в IN список параметров(констант), не подзапрос).
По умолчанию равен 240 (/8 = 40 условий)
В коде 1С эта команда будет выглядеть как :
Код
Выбрать все
ОлеДБКоманда.Выполнить("SYS(3055,440)"); 


« Последняя редакция: 27. Января 2009 :: 20:45 - kiruha »  
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Фильтр с использованием like -
Ответ #8 - 31. Января 2009 :: 08:51
Печать  
  
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать