Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Кто как "расчехляет" группы справочника в запросе? (число прочтений - 1552 )
Amel
Junior Member
**
Отсутствует


1С++ rulezzz!

Сообщений: 85
Местоположение: Украина, Винница
Зарегистрирован: 20. Ноября 2007
Пол: Мужской
Кто как "расчехляет" группы справочника в запросе?
26. Ноября 2007 :: 13:59
Печать  
Я тут поискал-поискал... Ничего толкового не нашел на эту тему.
Не знаю, может кому пригодится то, что я накропал:



//
Функция ПолучитьГруппу(Уровней, ИмяПоля, ИмяКол)
     ТекКолонка = Уровней;
     возвр = "";
     Для ТекКолонка = 1 По Уровней-1 Цикл
           возвр = возвр + "
           |      CASE";
           ВерхнийИндекс = Уровней-1;
           Пока ВерхнийИндекс > 0 Цикл
                 возвр = возвр + "
                 |            WHEN ";
                 Для НижнийИндекс = 1 По Уровней-1 Цикл
                       возвр = возвр + "t"+НижнийИндекс+".ID is"+?(НижнийИндекс >= (ВерхнийИндекс-ТекКолонка+1)," not","")+" null "+?(НижнийИндекс = Уровней-1,"","AND ");
                 КонецЦикла;                        //    --  ВерхнийИндекс  --
                 возвр = возвр + "then t"+ВерхнийИндекс+"."+ИмяПоля;
                 ВерхнийИндекс = ВерхнийИндекс - 1;
           КонецЦикла;                                    //  -- ВерхнийИндекс --
           возвр = возвр + "
           |      END as "+ИмяКол+ТекКолонка+", ";
     КонецЦикла;                        //    --  Уровней  --
     возврат возвр;
КонецФункции // ПолучитьОписаниеЭлемента


//
Функция ПолучитьЭлемент(Уровней, ИмяПоля)
     возвр = "
     |      CASE";
     Для ВерхнийИндекс = 1 По Уровней Цикл
           возвр = возвр + "
           |            WHEN ";
           НижнийИндекс = Уровней;
           Пока НижнийИндекс >= ВерхнийИндекс Цикл
                 возвр = возвр + "t"+НижнийИндекс+".ID is "+?(НижнийИндекс = ВерхнийИндекс,"not","")+" null "+?(НижнийИндекс = ВерхнийИндекс," AND t"+НижнийИндекс+".IsFolder=2 "," AND ");
                 НижнийИндекс = НижнийИндекс - 1;
           КонецЦикла;                                    //  -- НижнийИндекс > 0 --
           возвр = возвр + " then t"+ВерхнийИндекс+"."+ИмяПоля;
     КонецЦикла;                        //    --  Уровней  --
     возвр = возвр + "
     |      END ";
     возврат возвр;
КонецФункции // ПолучитьОписаниеЭлемента


//
Функция ЭлементыВИерархии(ВидСправочника)
     Уровней = Метаданные.Справочник(ВидСправочника).КоличествоУровней;
     Переменных = Уровней*2 + 2;
     СчетчикФильтров = СчетчикФильтров + 1;
     ТекстЗапроса = "
     |SELECT "+ПолучитьГруппу(Уровней, "ID", "lev")+" "+ПолучитьГруппу(Уровней, "Descr", "name");
     el = ПолучитьЭлемент(Уровней, "ID");
     elName = ПолучитьЭлемент(Уровней, "Descr");
     ТекстЗапроса = ТекстЗапроса + el +" as el, "+elName+" as elName
     |FROM
     |      $Справочник."+ВидСправочника+" as t"+Уровней;
     инд = Уровней-1;
     Пока инд > 0 Цикл
           ТекстЗапроса = ТекстЗапроса + "
           |LEFT JOIN $Справочник."+ВидСправочника+" as t"+инд+" ON t"+инд+".ID = t"+(инд+1)+".ParentID";
           инд = инд - 1;
     КонецЦикла;                                    //  -- ВерхнийИндекс > 0  --
     ТекстЗапроса = ТекстЗапроса + "
     |WHERE
     |      t"+Уровней+".IsFolder = 2";
     возврат ТекстЗапроса;
КонецФункции //


Функция ЭлементыВИерархии(ВидСправочника) возвращает текст, который можн использовать как подзапрос, где нужно.
В результатах запроса мы получаем колонки с группами для выбранных элементов.
lev1 - ID группы верхнего уровня, lev2 - группы следующего уровня и т.д.
  

Восторгаюсь 1С++ и классами к ней!
Наверх
ICQ  
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Кто как "расчехляет" группы справочника в запр
Ответ #1 - 26. Ноября 2007 :: 15:06
Печать  
>>Ничего толкового не нашел на эту тему
Акцент на слове "толкового"? Или все же не нашел?
Поищи еще
  

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


1С++ rulezzz!

Сообщений: 85
Местоположение: Украина, Винница
Зарегистрирован: 20. Ноября 2007
Пол: Мужской
Re: Кто как "расчехляет" группы справочника в запр
Ответ #2 - 27. Ноября 2007 :: 16:23
Печать  
Нет, правда, после такого комментария порылся еще...
Нашел только разговоры о частных случаях, которые меня не интересуют (либо итог по группе-родителю элементов, либо проверка вхождения в группу).
Насколько я понял принято оптимальным создание дополнительных таблиц к справочникам (для SQL).
То, что я предложил - работает "на лету" для любых баз (и чужих).
Правда "на лету" - сильно сказал, поскольку для больших справочников запрос сильно тормозит, если к нему жоинить результат приведенного подзапроса.
Короче говоря, в моем частном случае работает то, что я накропал.
А мне нужно в нескольких отчетах результат представлять со всей иерархией по группам справочника - при чем по двум спр. сразу "Бюджет" и "Подразделение".
Например спр. "Бюджет" имеет 8 уровней вложенности.
Так что я подумал, вдруг кому еще пригодится...
  

Восторгаюсь 1С++ и классами к ней!
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать