Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Проблемка: Запрос по справочникам (число прочтений - 1942 )
YuRa
Junior Member
**
Отсутствует



Сообщений: 19
Местоположение: Ебург
Зарегистрирован: 03. Апреля 2007
Пол: Мужской
Проблемка: Запрос по справочникам
13. Апреля 2007 :: 09:59
Печать  
Не получается чето с оптимизацией Печаль

справочник ОпцииАвто подчинен справочнику Автомобили.
так же, из справочника ОпцииАвто есть ссылка на справочник "Опции" (ОпцииАвто.Опция)
нужно выбирать элементы справочника ОпцииАвто только корневые (верхние группы и корневые элементы)
исходный код 1С (для выбранного элемента спр.Автомобили  -  Авто):
Акция = Авто.Акция;
     ОпцииАвто = СоздатьОбъект("Справочник.ОпцииАвто");
     ОпцииАвто.ИспользоватьВладельца(Авто);
     ОпцииАвто.ВыбратьЭлементы();
     ЦенаА = 0;
     Если Акция = 0 Тогда
           ЦенаА = Авто.Цена;
           Пока ОпцииАвто.ПолучитьЭлемент() = 1 Цикл
                 Если ОпцииАвто.Опция.Базовый  = 1 Тогда Продолжить КонецЕсли;
                 Если ОпцииАвто.Уровень()<>1 Тогда Продолжить КонецЕсли;  
                 ЦенаА = ЦенаА + ОпцииАвто.Цена;
           КонецЦикла;
         Возврат ЦенаА;
     Иначе
           ЦенаА = ?(Авто.ЦенаПоАкции > 0,Авто.ЦенаПоАкции,Авто.Цена);
           Пока ОпцииАвто.ПолучитьЭлемент() = 1 Цикл
                 Если ОпцииАвто.Опция.Базовый  = 1 Тогда Продолжить КонецЕсли;
                 Если ОпцииАвто.Уровень()<>1 Тогда Продолжить КонецЕсли;
           ЦенаА = ЦенаА + ?(ОпцииАвто.ЦенаПоАкции>0,ОпцииАвто.ЦенаПоАкции,ОпцииАвто.Цена);
           КонецЦикла;
         Возврат ЦенаА;
     КонецЕсли;
/////
я написал следующее:
СЗАвто - Список занчений, в котором элементы справочниука Автомобили

     ТЗ = СоздатьОбъект("ТаблицаЗначений");
     ТЗ.НоваяКолонка("Авто");
     ТЗ.НоваяКолонка("СуммаБаза","Число");
     ТЗ.НоваяКолонка("СуммаОпций","Число");
     
     RS            = СоздатьОбъект("ODBCRecordset");
     ТЗЦен      = СоздатьОбъект("ТаблицаЗначений");      
     ТекстЗапроса = "
     |SELECT Автомобили.ID [Авто $Справочник.Автомобили]
     |      , ОпцииАвто.ID [Опция $Справочник.ОпцииАвто]
     |      , ($ОпцииАвто.Цена) ОпцииЦена
     |      , ($ОпцииАвто.ЦенаПоАкции) ОпцииЦенаПоАкции
     |      , ($Автомобили.Цена) Цена
     |      , ($Автомобили.ЦенаПоАкции) ЦенаПоАкции
     |FROM $Справочник.Автомобили AS Автомобили
     |      INNER JOIN $Справочник.ОпцииАвто AS ОпцииАвто ON Автомобили.ID = ОпцииАвто.PARENTEXT
     |      INNER JOIN $Справочник.Опции AS Опции ON $ОпцииАвто.Опция = Опции.ID
     |WHERE ($Опции.Базовый = $ПустойИд)
     |      AND (Автомобили.ID IN (SELECT val FROM #СЗАвто))
     |   AND ($ОпцииАвто.Цена <> $ПустойИд)
     |GROUP BY Автомобили.ID
     |      , ОпцииАвто.ID
     |      , $ОпцииАвто.Цена
     |      , $ОпцииАвто.ЦенаПоАкции
     |      , $Автомобили.Цена
     |      , $Автомобили.ЦенаПоАкции                  
     |";
     
     RS.УложитьСписокОбъектов(СЗАвто, "#СЗАвто","Автомобили");      
     ТЗЦен = RS.ВыполнитьИнструкцию(ТекстЗапроса);
     ТЗЦен.ВыбратьСтроки();
     Пока ТЗЦен.ПолучитьСтроку() = 1 Цикл
           стр=0;            
           Если ТЗ.НайтиЗначение(ТЗЦен.Авто,стр,"Авто")=1 Тогда
                 ТЗ.ПолучитьСтрокуПоНомеру(стр);
           Иначе
                 ТЗ.НоваяСтрока();
                 ТЗ.Авто                  = ТЗЦен.Авто;
                 ТЗ.СуммаБаза      = ен.Цена),ТЗЦен.Цена);
           КонецЕсли;            
           Если ТЗЦен.Опция.Уровень()=1 Тогда
                 ТЗ.СуммаОпций = ТЗ.СуммаОпций + оАкции,ТЗЦен.ОпцииЦена),ТЗЦен.ОпцииЦена);            
           КонецЕсли;            
     КонецЦикла;

////////
собсно проблемы по скорости с функцией Уровень(), да и ваще, можно как нить написать запрос, чтобы потом не обрабатывать уже полученную выборку?
  
Наверх
ICQ  
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Проблемка: Запрос по справочникам
Ответ #1 - 13. Апреля 2007 :: 17:16
Печать  
Что-то не очень осилил
Корневые нужны?
Условие
ОпцииАвто.ParentID = $ПустойИД
  

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



Сообщений: 19
Местоположение: Ебург
Зарегистрирован: 03. Апреля 2007
Пол: Мужской
Re: Проблемка: Запрос по справочникам
Ответ #2 - 16. Апреля 2007 :: 03:54
Печать  
Цитата:
Что-то не очень осилил
Корневые нужны?
Условие
ОпцииАвто.ParentID = $ПустойИД

до этого я уже допер Улыбка

мне больше интересно, как написать ченить типа:

          ЦенаА = ЦенаА + ?(ОпцииАвто.ЦенаПоАкции>0,ОпцииАвто.ЦенаПоАкции,ОпцииАвто.Цена);
  
Наверх
ICQ  
IP записан
 
pavel_tr
Senior Member
****
Отсутствует



Сообщений: 279
Местоположение: Казань
Зарегистрирован: 14. Октября 2006
Пол: Мужской
Re: Проблемка: Запрос по справочникам
Ответ #3 - 16. Апреля 2007 :: 08:48
Печать  
Почитай в BOL про CASE

ОпцииАвто.ЦенаПоАкции>0,ОпцииАвто.ЦенаПоАкции,ОпцииАвто.Цена примерно так:

Код
Выбрать все
CASE WHEN $ОпцииАвто.ЦенаПоАкции>0
	   THEN $ОпцииАвто.ЦенаПоАкции
	   ELSE $ОпцииАвто.Цена
END 

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



Сообщений: 19
Местоположение: Ебург
Зарегистрирован: 03. Апреля 2007
Пол: Мужской
Re: Проблемка: Запрос по справочникам
Ответ #4 - 16. Апреля 2007 :: 09:21
Печать  
pavel_tr писал(а) 16. Апреля 2007 :: 08:48:
Почитай в BOL про CASE

ОпцииАвто.ЦенаПоАкции>0,ОпцииАвто.ЦенаПоАкции,ОпцииАвто.Цена примерно так:

Код
Выбрать все
CASE WHEN $ОпцииАвто.ЦенаПоАкции>0
	   THEN $ОпцииАвто.ЦенаПоАкции
	   ELSE $ОпцииАвто.Цена  
END 



пасибо, про кейс я чето ваще забыл Улыбка
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать