Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Иерархический справочник? (число прочтений - 2942 )
dmkf
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 5
Зарегистрирован: 26. Августа 2010
Иерархический справочник?
26. Августа 2010 :: 09:13
Печать  
Кто нибудь может подсказть, можно ли в одном запросе получить все элементы содержащиеся в группе вместе с подгруппами и элементами этих  подгрупп, не используя УложитьСписокОбъектов?

Т.е. по сути нужно получить таблицу из 2-х колонок: 1-я колонка исходная группа, 2-я колонка подчиненные элементы группы.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Иерархический справочник?
Ответ #1 - 26. Августа 2010 :: 09:19
Печать  
Можно, делая left join столько раз, сколько уровней в справочнике..
  
Наверх
 
IP записан
 
dmkf
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 5
Зарегистрирован: 26. Августа 2010
Re: Иерархический справочник?
Ответ #2 - 26. Августа 2010 :: 09:24
Печать  
Eprst писал(а) 26. Августа 2010 :: 09:19:
Можно, делая left join столько раз, сколько уровней в справочнике..


Это самый простой вариант Улыбка
Справочник имеет 10 уровней и довольно большое количество элементов...
Есть ли какой либо еще вариант?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Иерархический справочник?
Ответ #3 - 26. Августа 2010 :: 09:25
Печать  
dmkf писал(а) 26. Августа 2010 :: 09:13:
Кто нибудь может подсказть, можно ли в одном запросе получить все элементы содержащиеся в группе вместе с подгруппами и элементами этих  подгрупп, не используя УложитьСписокОбъектов?

Т.е. по сути нужно получить таблицу из 2-х колонок: 1-я колонка исходная группа, 2-я колонка подчиненные элементы группы.

Почему нельзя использовать УложитьсписокОбъектов ?
тем или иным способом ты будешь вынужден тоже самое что и уложить списокобъектов.

Чтобы получить и группы и элементы может легче пройтись по результату временной таблице и добавить туда родителей
(или только уникальных родителей)
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Иерархический справочник?
Ответ #4 - 26. Августа 2010 :: 09:26
Печать  
Да, хранение данных о подчиненности в отдельное табличке и использование триггеров для записи в неё.
Садовников по этому спец.
  
Наверх
IP записан
 
dmkf
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 5
Зарегистрирован: 26. Августа 2010
Re: Иерархический справочник?
Ответ #5 - 26. Августа 2010 :: 09:42
Печать  
Z1 писал(а) 26. Августа 2010 :: 09:25:
Почему нельзя использовать УложитьсписокОбъектов ?
тем или иным способом ты будешь вынужден тоже самое что и уложить списокобъектов.


Потому что мне нужно получить таблицу "главных" групп и их подчиненных элементов, естетсвенно что мне нужно получить таблицу не для одной группы а для нескольких сразу. И вся дальнейшая обработки данных происходит применительно к "главным группам". Если бы группа была бы одна, то я бы использовал УложитьСписокОбъектов.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Иерархический справочник?
Ответ #6 - 26. Августа 2010 :: 10:10
Печать  
непонятно что такое таблица главных групп

УложитьСписокОбъектов - правильно работает для любого числа групп.


Я тебе предложил следущее :
1. УложитьСписокОбъектов в #temp1
2.Скопировать из #temp1 в #temp2
3. Для каждого элемента  из temp1 
получить элемент.Родитель и если его нет в #temp2
добавить в #temp2
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Иерархический справочник?
Ответ #7 - 26. Августа 2010 :: 10:11
Печать  
Далее можно написать свой_УложитьСписокОбъектов.
Он должен отличаться от того что в 1с++ только тем что не надо удалять элементы группы.
  
Наверх
 
IP записан
 
dmkf
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 5
Зарегистрирован: 26. Августа 2010
Re: Иерархический справочник?
Ответ #8 - 26. Августа 2010 :: 10:19
Печать  
Z1 писал(а) 26. Августа 2010 :: 10:10:
непонятно что такое таблица главных групп

УложитьСписокОбъектов - правильно работает для любого числа групп.


то что УложитьСписокОбъектов работает для любого числа групп я знаю...но он полачает общую таблицу для всех групп а мне надо таблицу вида:

группа1 эл1
группа1 эл2
....
группаN эл1
...
группаN элN

где группа1...ГруппаN это группы переданые в запрос...причем это мугут быть не обязатеьно группы верхнего уровня но и группы из самого последнего уровня иерархии.

мне надо это для того чтобы по элементам получить парметры из других справочников и сгруппировать по исходным группам, чтобы в итоге получить таблицу вида

Группа1 зн1 зн2 знN
...
ГруппаN зн1 зн2 знN


надеюсь понятно написал   Улыбка
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Иерархический справочник?
Ответ #9 - 26. Августа 2010 :: 10:30
Печать  
тогда тебе надо написать свою хранимую процедуру которая делает #8
  
Наверх
 
IP записан
 
dmkf
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 5
Зарегистрирован: 26. Августа 2010
Re: Иерархический справочник?
Ответ #10 - 26. Августа 2010 :: 11:57
Печать  
Z1 писал(а) 26. Августа 2010 :: 10:30:
тогда тебе надо написать свою хранимую процедуру которая делает #8


Спасибо!
Скорее всего так и сделаю, раз более простого способа нет.
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Иерархический справочник?
Ответ #11 - 26. Августа 2010 :: 13:08
Печать  
dmkf писал(а) 26. Августа 2010 :: 11:57:
Спасибо!
Скорее всего так и сделаю, раз более простого способа нет.

Можно получить результат в ИТЗ и воспользоваться методом Группировать() с указанием модификатора '&'
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Иерархический справочник?
Ответ #12 - 26. Августа 2010 :: 14:41
Печать  
(0) Смотри как делает это 1с
Код
Выбрать все
СREATE PROCEDURE #RGTEMP0PROC(@current CHAR(9)) AS
   SET TEXTSIZE 0
   DECLARE @VAL CHAR(9)
   IF EXISTS (SELECT * FROM SC4019(NOLOCK) WHERE ID=@current AND ISFOLDER=1 ) BEGIN
	 SET NOCOUNT ON
	 INSERT INTO #RGTEMP0 SELECT ID,ISFOLDER FROM SC4019(NOLOCK) WHERE PARENTID=@current AND ID NOT IN( SELECT VAL FROM #RGTEMP0 )
	 WHILE 1=1 BEGIN
	     SELECT @VAL=MAX(VAL) FROM #RGTEMP0 WHERE ISFOLDER=1
	     IF @VAL IS NULL BREAK
	     INSERT INTO #RGTEMP0 SELECT ID,ISFOLDER FROM SC4019(NOLOCK) WHERE PARENTID=@VAL AND ID NOT IN( SELECT VAL FROM #RGTEMP0 )
	     DELETE FROM #RGTEMP0 WHERE VAL=@VAL AND ISFOLDER=1
	 END
   END
   ELSE
   IF NOT EXISTS( SELECT * FROM #RGTEMP0 WHERE VAL=@current )
	 INSERT #RGTEMP0 VALUES(@current, 2) 



На основе этого кода  вариант решения
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Иерархический справочник?
Ответ #13 - 26. Августа 2010 :: 14:49
Печать  
Вариант
Из этой процедуры коментируем удаление папок
Также убираем случай пустого справочника
Код
Выбрать все
СREATE PROCEDURE #RGTEMP0PROC(@current CHAR(9)) AS
   SET TEXTSIZE 0
   DECLARE @VAL CHAR(9)
BEGIN
	 SET NOCOUNT ON
	 INSERT INTO #RGTEMP0 SELECT ID,ISFOLDER FROM SC4019(NOLOCK) WHERE PARENTID=@current AND ID NOT IN( SELECT VAL FROM #RGTEMP0 )
	 WHILE 1=1 BEGIN
	     SELECT @VAL=MAX(VAL) FROM #RGTEMP0 WHERE ISFOLDER=1
	     IF @VAL IS NULL BREAK
	     INSERT INTO #RGTEMP0 SELECT ID,ISFOLDER FROM SC4019(NOLOCK) WHERE PARENTID=@VAL AND ID NOT IN( SELECT VAL FROM #RGTEMP0 )
--- закоментарили удаление папок	     DELETE FROM #RGTEMP0 WHERE VAL=@VAL AND ISFOLDER=1
	 END
   END
 



Твое решение
Для Каждой исходной папки делаем
1.Очищаем #RGTEMP0
2.Вызываем #RGTEMP0PROC( @Curent_el)
3.Все строки из #RGTEMP0 добавляем в окончательную таблицу
скажем в  tabl_x где третье поле этой таблицы = @Curent_el
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать