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


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
справочник.Уровень()
25. Июня 2009 :: 06:44
Печать  
Уровень справочника.

Как получить таблицу с двумя полями: Справочник,справочник.Уровень()?

Задача кажется тривиальной, но что-то простых решений не видно.
  
Наверх
 
IP записан
 
villy
Senior Member
****
Отсутствует



Сообщений: 287
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: справочник.Уровень()
Ответ #1 - 25. Июня 2009 :: 06:55
Печать  
прийдется самому строить или средствами 1С или sql
  
Наверх
IP записан
 
leov-001
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 150
Зарегистрирован: 05. Марта 2009
Re: справочник.Уровень()
Ответ #2 - 25. Июня 2009 :: 07:00
Печать  
Код
Выбрать все
Select
*
From
(SELECT
  Спр.IsFolder
, Спр.CODE
, CASE WHEN RTrim(LTrim(Спр4.Code)) <> ''  THEN RTrim(LTrim(Спр4.Code))+'/' ELSE '' END +
CASE WHEN RTrim(LTrim(Спр3.Code)) <> ''  THEN RTrim(LTrim(Спр3.Code))+'/' ELSE '' END +
CASE WHEN RTrim(LTrim(Спр2.Code)) <> ''  THEN RTrim(LTrim(Спр2.Code))+'/' ELSE '' END +
CASE WHEN RTrim(LTrim(Спр1.Code)) <> ''  THEN RTrim(LTrim(Спр1.Code))+'/' ELSE '' END + RTrim(LTrim(Спр.Code)) ПолнКод
, CASE WHEN RTrim(LTrim(Спр4.Code)) <> ''  THEN 1 ELSE 0 END +
  CASE WHEN RTrim(LTrim(Спр3.Code)) <> ''  THEN 1 ELSE 0 END +
  CASE WHEN RTrim(LTrim(Спр2.Code)) <> ''  THEN 1 ELSE 0 END +
  CASE WHEN RTrim(LTrim(Спр1.Code)) <> ''  THEN 1 ELSE 0 END + 1 Уровень
, Спр.DESCR
FROM
  $Справочник.Номенклатура as Спр (NoLock )
  Left Join $Справочник.Номенклатура as Спр1 (NoLock ) on Спр1.ID = Спр.ParentID  AND Спр1.IsFolder = 1
  Left Join $Справочник.Номенклатура as Спр2 (NoLock ) on Спр2.ID = Спр1.ParentID AND Спр2.IsFolder = 1
  Left Join $Справочник.Номенклатура as Спр3 (NoLock ) on Спр3.ID = Спр2.ParentID AND Спр3.IsFolder = 1
  Left Join $Справочник.Номенклатура as Спр4 (NoLock ) on Спр4.ID = Спр3.ParentID AND Спр4.IsFolder = 1
) as Temp1
ORDER BY Temp1.ПолнКод, Temp1.Isfolder, Temp1.DESCR
 



Это для справочника с уровнем вложенности 5
  
Наверх
 
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: справочник.Уровень()
Ответ #3 - 25. Июня 2009 :: 07:11
Печать  

круто.
спасибо огромное!
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: справочник.Уровень()
Ответ #4 - 25. Июня 2009 :: 08:16
Печать  
Только уровней может быть 10.
Если нужно чтобы было быстро и с наименьшей нагрузкой на sql
надо просто хранить уровень в справочнике.
Конечно надо будет переписать перемещение из одной папки
в другую но это довольно редкая операция ( по крайней мере у меня в базе).
  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: справочник.Уровень()
Ответ #5 - 25. Июня 2009 :: 09:39
Печать  
для произвольного количества уровней -  написать процедуру формирования текста запроса в зависимости от количества уровней; все таки лучше, чем добавлять реквизиты, писать скрипты в справочнике.
Правда,  в приведенном запросе: почему то идет привязка к Code, которые не обязательно уникальный; да и работать, наверное, б.дольше, нежели связка по id - parentid
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: справочник.Уровень()
Ответ #6 - 25. Июня 2009 :: 09:59
Печать  
ol писал(а) 25. Июня 2009 :: 09:39:
для произвольного количества уровней -  написать процедуру формирования текста запроса в зависимости от количества уровней; все таки лучше, чем добавлять реквизиты, писать скрипты в справочнике.
Правда,  в приведенном запросе: почему то идет привязка к Code, которые не обязательно уникальный; да и работать, наверное, б.дольше, нежели связка по id - parentid

Для произвольно количества уровней запрос как приведенный выше вообще не напишешь.
Все зависит от задачи если надо очень редко получать уровень то можно и sql запросом если надо очень часто то лучше sql запросом.

Если делать sql запросом я бы написал бы рекурсивную функцию
пока не доберемся до пустого родителя.
  
Наверх
 
IP записан
 
Bibr
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 49
Зарегистрирован: 10. Июня 2009
Re: справочник.Уровень()
Ответ #7 - 26. Июня 2009 :: 06:49
Печать  
Количество уровней справочника - это очень редко меняющаяся величина. практически константа.

какое произвольное количество уровней? делаешь сколько надо сразу и все.

Цитата:
если надо очень редко получать уровень то можно и sql запросом если надо очень часто то лучше sql запросом


это как понимать?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: справочник.Уровень()
Ответ #8 - 26. Июня 2009 :: 06:57
Печать  
если надо очень редко получать уровень то можно и sql запросом если надо очень часто то лучше хранить уровень в реквизите справочника ( реквизит и для элемента и для группы )
о чем было сказано в #4
в #6 опечатался
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: справочник.Уровень()
Ответ #9 - 27. Июня 2009 :: 16:54
Печать  
Проще - добавлением своей функции
Эффективнее - заведением поля Уровень Улыбка
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать