Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Иеирархия снова (число прочтений - 1967 )
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Иеирархия снова
09. Июня 2012 :: 18:14
Печать  
есть справочник номенклатура иерархический.
есть справочник объекты скидок одно уровневый. В составе реквизитов справочника есть реквизит с типом "Справочник.Номенклатура"

Вопрос:
1. Требуется построить дерево значений от самого верхнего уровня, до уровней элементов в реквизите с типом "Справочник.Номенклатура". в реквизите могут быть как элементы так и группы элементов.
2. как бы сварганить запрос под это дело?
При использовании WITH если идти от нижних уровней к верхним выберем все группы относящиеся только к нашим данным, но не получил уровень. Если идти сверху, то получим список групп с уровнями, но как соединить ее с выборкой номенклатуры из Объектов скидок?
  
Наверх
 
IP записан
 
Anatol
Senior Member
****
Отсутствует


тыц, пыц, тыц!!!

Сообщений: 412
Зарегистрирован: 24. Апреля 2009
Re: Иеирархия снова
Ответ #1 - 11. Июня 2012 :: 09:43
Печать  
Конечная цель какая?
Получить скидку на самом низком уровне?
Справочник объекты скидок кому нибудь подчинен?
  
Наверх
wwwICQ  
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Иеирархия снова
Ответ #2 - 12. Июня 2012 :: 05:51
Печать  
Anatol писал(а) 11. Июня 2012 :: 09:43:
Конечная цель какая?
Получить скидку на самом низком уровне?
Справочник объекты скидок кому нибудь подчинен?

Конечная цель выстроить древовидную структуру плана скидок.
Объекты скидок подчинены плану скидок. Объект скидки представлЯет из себя набор из 3-х основных реквизитов Номенклатура, ставка, условие.
Сам план скидок представляет из себя набор соответствий. Номенклатуры и ставки или условия.
древовидная структура должна начинатся с корня справочника Номенклатура и до самого глубокого соответствия. Не важно есть эта номенклатура в соответствии или нет. Для отличия вхождения будет использоватся цвет.
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Иеирархия снова
Ответ #3 - 12. Июня 2012 :: 07:46
Печать  
А строить дерево по мере прохождения пользователя по нему не вариант? Скажем отображаешь первый уровень, пытается развернуть считываешь далее и т.д.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Иеирархия снова
Ответ #4 - 13. Июня 2012 :: 10:03
Печать  
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Иеирархия снова
Ответ #5 - 14. Июня 2012 :: 03:25
Печать  
vandalsvq писал(а) 12. Июня 2012 :: 07:46:
А строить дерево по мере прохождения пользователя по нему не вариант? Скажем отображаешь первый уровень, пытается развернуть считываешь далее и т.д.

будет дольше. Я же стою иерархию по реквизиту справочника объекты скидок "Номенклатура". соответственно придется перечитывать данные каждый раз.

Вот запрос на иерархию номенклатуры
Код
Выбрать все
текстЗапроса = "
	|WITH Номенклатура_Иерархия(ID,CODE,ParentID,IsFolder,Level) as (
	|SELECT
	|	СпрНоменкл.ID,
	|	СпрНоменкл.CODE,
	|	СпрНоменкл.ParentID,
	|	СпрНоменкл.IsFolder,
	|	1
	|FROM
	|	$Справочник.Номенклатура СпрНоменкл
	|WHERE
	|	СпрНоменкл.ParentID = $ПустойИД
	|UNION ALL
	|SELECT
	|	СпрН.ID,
	|	СпрН.CODE,
	|	СпрН.ParentID,
	|	СпрН.IsFolder,
	|	Level + 1
	|FROM
	|	$Справочник.Номенклатура СпрН
	|INNER JOIN
	|	Номенклатура_Иерархия СпрНИ ON СпрН.ParentID = СпрНИ.ID AND СпрН.IsFolder = 1
	|)
	|
	|SELECT
	|	НомИерарх.ID [Номенклатура $Справочник.Номенклатура],
	|	НомИерарх.CODE Код,
	|	НомИерарх.ParentID [ИдГруппы $Справочник.Номенклатура],
	|	НомИерарх.IsFolder Группа,
	|	НомИерарх.Level Уровень
	|FROM
	|	Номенклатура_Иерархия НомИерарх
	|";
 



Вот запрос на выборку данных из объектов скидок.

Код
Выбрать все
текстЗапроса = "
	|WITH Номенклатура_Иерархия(ID,CODE,ParentID,IsFolder,Level) as (
	|SELECT
	|	СпрНоменкл.ID,
	|	СпрНоменкл.CODE,
	|	СпрНоменкл.ParentID,
	|	СпрНоменкл.IsFolder,
	|	1
	|FROM
	|	$Справочник.Номенклатура СпрНоменкл
	|WHERE
	|	СпрНоменкл.ParentID = $ПустойИД
	|UNION ALL
	|SELECT
	|	СпрН.ID,
	|	СпрН.CODE,
	|	СпрН.ParentID,
	|	СпрН.IsFolder,
	|	Level + 1
	|FROM
	|	$Справочник.Номенклатура СпрН
	|INNER JOIN
	|	Номенклатура_Иерархия СпрНИ ON СпрН.ParentID = СпрНИ.ID
	|)
	|
	|SELECT
	|	$ОбъектыСкидок.Ставка [Ставка $Справочник.сфСтавкиСкидок],
	|	$ОбъектыСкидок.Условие [Условие $Справочник.сфУсловия],
	|	НомИерарх.ID [Номенклатура $Справочник.Номенклатура],
	|	НомИерарх.CODE Код,
	|	НомИерарх.ParentID [ИдГруппы $Справочник.Номенклатура],
	|	НомИерарх.IsFolder Группа,
	|	НомИерарх.Level Уровень,
	|	1 ВОбъекте
	|FROM
	|	$Справочник.сфОбъектыСкидок ОбъектыСкидок
	|LEFT JOIN
	|	Номенклатура_Иерархия НомИерарх ON НомИерарх.ID = $ОбъектыСкидок.Номенклатура
	|WHERE
	|	ОбъектыСкидок.parentext = :Владелец AND ОбъектыСкидок.ismark = 0
	|";
 



Как видно во втором запросе приходится выбирать всю номенклатуру, для получения уровней.

после этого я соединяю таблицы вот так
Код
Выбрать все
итГруппыНоменклатуры.Сортировать("-Уровень");
	итГруппыНоменклатуры.ВыбратьСтроки();
	Пока итГруппыНоменклатуры.ПолучитьСтроку() = 1 Цикл
		Если а,,1) <> 0)
		и тура,,1) = 0)) Тогда
			итЭлементыНоменклатуры.НоваяСтрока();
			итЭлементыНоменклатуры.Код = итГруппыНоменклатуры.Код;
			итЭлементыНоменклатуры.Номенклатура = итГруппыНоменклатуры.Номенклатура;
			итЭлементыНоменклатуры.ИдГруппы = итГруппыНоменклатуры.ИдГруппы;
			итЭлементыНоменклатуры.Группа = итГруппыНоменклатуры.Группа;
			итЭлементыНоменклатуры.Уровень = итГруппыНоменклатуры.Уровень;
			итЭлементыНоменклатуры.ВОбъекте = 0;
		КонецЕсли;
	КонецЦикла;
 


что позволяет мне получить полное дерево, но открытие формы происходит секунды 3. да и запрос второй выбирает больше 20000 элементов чтоб выстроить иерархию для 200 элементов. Хочется оптимизировать запросы.
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Иеирархия снова
Ответ #6 - 14. Июня 2012 :: 04:11
Печать  
Повесь индексы, сделай параметризированный запрос... или я плохо понял задачу и структуру данных
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Иеирархия снова
Ответ #7 - 14. Июня 2012 :: 05:41
Печать  
vandalsvq писал(а) 14. Июня 2012 :: 04:11:
Повесь индексы, сделай параметризированный запрос... или я плохо понял задачу и структуру данных

Индексы на что?
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать