Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Оптимизация условия со значениями "перечисление" (число прочтений - 5909 )
Андрюха
Junior Member
**
Отсутствует



Сообщений: 74
Местоположение: Красноярск
Зарегистрирован: 19. Марта 2008
Пол: Мужской
Оптимизация условия со значениями "перечисление"
16. Апреля 2008 :: 02:35
Печать  
Как оптимизировать формирование условия выборки по реквизиту справочника, который может принимать одно из значений типа перечисление?

Допустим, есть некий справочник "Сотрудники", в котором существует реквизит "Должность", тип которого - Перечисление.Должности. Как выбрать запросом те элементы справочника, должность которых может быть равна следующим значениям:
  • Перечисление.Должности.Бригадир
  • Перечисление.Должности.Прораб
  • Перечисление.Должности.Управляющий


В настоящий момент, в цикле по возможным значениям я формирую условие запроса и соответственно устанавливаю в цикле же значения соответствующих переменных:
Код
Выбрать все
УсловияОтбора = "";
Для Сч = 1 По СписокДолжностей.РазмерСписка() Цикл
	УсловияОтбора = УсловияОтбора + ?(ПустаяСтрока(УсловияОтбора) = 0, " OR ", "");
	УсловияОтбора = УсловияОтбора + "($Сотрудники.Должность=:Должность" + Строка(Сч) + ")";
КонецЦикла; 



Установка значений переменных:
Код
Выбрать все
Для Сч = 1 По СписокДолжностей.РазмерСписка() Цикл
	рс.УстановитьТекстовыйПараметр("Должность" + Строка(Сч), СписокДолжностей.ПолучитьЗначение(Сч));
КонецЦикла; 





В идеале хотелось бы использовать что-то типа метода УложитьСписокОбъектов13, но когда я его использую,  в запрос ничего не попадает:
Код
Выбрать все
|WHERE ($Сотрудники.Должность IN (SELECT val FROM #СписокДолжностей)) 



Укладка:
Код
Выбрать все
рс.УложитьСписокОбъектов13(СписокДолжностей, "#СписокДолжностей"); 


« Последняя редакция: 16. Апреля 2008 :: 08:54 - Андрюха »  
Наверх
 
IP записан
 
Андрюха
Junior Member
**
Отсутствует



Сообщений: 74
Местоположение: Красноярск
Зарегистрирован: 19. Марта 2008
Пол: Мужской
Re: Оптимизация условия со значениями "перечислени
Ответ #1 - 16. Апреля 2008 :: 02:59
Печать  
Вопрос снят

Для этого случая нужно пользоваться методом УложитьСписокОбъектов, без указания 3-его параметра:
Код
Выбрать все
рс.УложитьСписокОбъектов(СписокДолжностей, "#СписокДолжностей"); 

  
Наверх
 
IP записан
 
ev-kov
God Member
*****
Отсутствует



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Оптимизация условия со значениями "перечислени
Ответ #2 - 16. Апреля 2008 :: 04:50
Печать  
Вопрос не в тему, но все же: "Зачем должности загонять в перечисления, почему не в справочник ?"
  

Информация - то, что снижает неопределенность в какой-либо области и очень важно не ошибиться областью в наш информационный век!
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: Оптимизация условия со значениями "перечислени
Ответ #3 - 16. Апреля 2008 :: 05:34
Печать  
ev-kov писал(а) 16. Апреля 2008 :: 04:50:
Вопрос не в тему, но все же: "Зачем должности загонять в перечисления, почему не в справочник ?"


Если должностей мало, особого смысла в справочнике нет.
  
Наверх
 
IP записан
 
Андрюха
Junior Member
**
Отсутствует



Сообщений: 74
Местоположение: Красноярск
Зарегистрирован: 19. Марта 2008
Пол: Мужской
Re: Оптимизация условия со значениями "перечислени
Ответ #4 - 16. Апреля 2008 :: 06:27
Печать  
ev-kov писал(а) 16. Апреля 2008 :: 04:50:
Вопрос не в тему, но все же: "Зачем должности загонять в перечисления, почему не в справочник ?"

Я привел гипотетический пример. Если угодно, пусть будет справочник "Автосредства" с реквизитом "Тип", принимающим значения:
  • Перечисления.ТипыАвтосредств.Мотоцикл
  • Перечисления.ТипыАвтосредств.ЛегковойАвтомобиль
  • Перечисления.ТипыАвтосредств.Грузовик
  • Перечисления.ТипыАвтосредств.Автобус
  • Перечисления.ТипыАвтосредств.Прицеп
  
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Оптимизация условия со значениями "перечислени
Ответ #5 - 16. Апреля 2008 :: 06:45
Печать  
Я, конечно, извиняюсь, но зачем напрягать скуль методом УложитьСписокОбъектов?
Не проще ли в случае перечисления задействовать IN?
  
Наверх
 
IP записан
 
Андрюха
Junior Member
**
Отсутствует



Сообщений: 74
Местоположение: Красноярск
Зарегистрирован: 19. Марта 2008
Пол: Мужской
Re: Оптимизация условия со значениями "перечислени
Ответ #6 - 16. Апреля 2008 :: 08:41
Печать  
sadovnikov писал(а) 16. Апреля 2008 :: 06:45:
Не проще ли в случае перечисления задействовать IN?

Можно и в IN, только что указывать в скобках?
  
Наверх
 
IP записан
 
novichek
Экс-Участник


Re: Оптимизация условия со значениями "перечислени
Ответ #7 - 16. Апреля 2008 :: 08:45
Печать  
иды перечислений через запятую
  
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Оптимизация условия со значениями "перечислени
Ответ #8 - 16. Апреля 2008 :: 08:45
Печать  
идПеречисл1 = РадугаСервис.ЗначениеВСтрокуБД(Перечисление.ИмяПеречисления.Значение1);
идПеречисл2 = РадугаСервис.ЗначениеВСтрокуБД(Перечисление.ИмяПеречисления.Значение2);
идПеречисл3 = РадугаСервис.ЗначениеВСтрокуБД(Перечисление.ИмяПеречисления.Значение3);

ТекстЗапроса = ".... IN ('+идПеречисл1+", '"+идПеречисл2+'", '"+идПеречисл3+'")..."
  
Наверх
 
IP записан
 
Андрюха
Junior Member
**
Отсутствует



Сообщений: 74
Местоположение: Красноярск
Зарегистрирован: 19. Марта 2008
Пол: Мужской
Re: Оптимизация условия со значениями "перечислени
Ответ #9 - 16. Апреля 2008 :: 08:51
Печать  
ОК, спасибо.
Думаешь SQL сервер слишком напряжется от укладки 5 перечислений?
  
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Оптимизация условия со значениями "перечислени
Ответ #10 - 16. Апреля 2008 :: 08:56
Печать  
Цитата:
ОК, спасибо.
Думаешь SQL сервер слишком напряжется от укладки 5 перечислений?


А зачем, в принципе, его заставлять это делать?
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Оптимизация условия со значениями "перечислени
Ответ #11 - 16. Апреля 2008 :: 08:57
Печать  
sadovnikov писал(а) 16. Апреля 2008 :: 08:45:
идПеречисл1 = РадугаСервис.ЗначениеВСтрокуБД(Перечисление.ИмяПеречисления.Значение1);
идПеречисл2 = РадугаСервис.ЗначениеВСтрокуБД(Перечисление.ИмяПеречисления.Значение2);
идПеречисл3 = РадугаСервис.ЗначениеВСтрокуБД(Перечисление.ИмяПеречисления.Значение3);

ТекстЗапроса = ".... IN ('+идПеречисл1+", '"+идПеречисл2+'", '"+идПеречисл3+'")..."


В SQL нет ограничений по кол. выражений в секии IN ? (В Fox чуть более 100)
  
Наверх
 
IP записан
 
novichek
Экс-Участник


Re: Оптимизация условия со значениями "перечислени
Ответ #12 - 16. Апреля 2008 :: 09:04
Печать  
Цитата:
ОК, спасибо.
Думаешь SQL сервер слишком напряжется от укладки 5 перечислений?


От укладки не напряжется, зато напряжется при многократном поиске. У меня в одном случае при замене таблицы со значениями перечислений на IN (...,...,...) выигрыш по скорости всего запроса был в 3 раза. Даже с учетом что по таблице индекс пробовал строить.
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Оптимизация условия со значениями "перечислени
Ответ #13 - 16. Апреля 2008 :: 09:24
Печать  
Я в ин юзал порядка 2000 текстовых значений
Работало великолепно

Автору моно типо такого:

Код
Выбрать все
СписокПер = СоздатьОбъект("СписокЗначений");
СписокПер.ДобавитьЗначение("$Перечисление.Вид.Значение1");
СписокПер.ДобавитьЗначение("$Перечисление.Вид.Значение2");
....

	СтрокаУсловия = "";

	Для Сч = 1 по СписокПер.РазмерСписка() Цикл
		ТекПер = СписокПер.ПолучитьЗначение(Сч);
		СтрокаУсловия	= СтрокаУсловия + ТекПер + ", ";
	КонецЦикла;

	Если Прав(СтрокаУсловия,2) = ", " Тогда
		СтрокаУсловия = Лев(СтрокаУсловия, СтрДлина(СтрокаУсловия) - 2);
	КонецЕсли;


--в запросе
IN (" + СтрокаУсловия + ")
 



Скопипастил свое, не претендую Улыбка



  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
ev-kov
God Member
*****
Отсутствует



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Оптимизация условия со значениями "перечислени
Ответ #14 - 16. Апреля 2008 :: 09:37
Печать  
Вадимко. А разве нет ограничения на размер запроса, все таки 2000 это немало ?
  

Информация - то, что снижает неопределенность в какой-либо области и очень важно не ошибиться областью в наш информационный век!
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать