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


I Love 1С!

Сообщений: 45
Зарегистрирован: 29. Июня 2007
Пол: Женский
Уровень()
11. Июля 2007 :: 11:54
Печать  
Кто-нить знает как запросом вытащить уровень элемента иерархического справочника? Аналогия функции 1С Уровень()?
Очень хочется в условие его(уровень) использовать...
  

Ваша Глаша
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Уровень()
Ответ #1 - 11. Июля 2007 :: 12:12
Печать  
В поиск. Этот вопрос очень часто задавался.
  
Наверх
 
IP записан
 
Glafira
Junior Member
**
Отсутствует


I Love 1С!

Сообщений: 45
Зарегистрирован: 29. Июня 2007
Пол: Женский
Re: Уровень()
Ответ #2 - 11. Июля 2007 :: 12:29
Печать  
достойный ответ
Поиск по слову "уровень" дал 1 результат и то на эту ветку )
  

Ваша Глаша
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Уровень()
Ответ #3 - 11. Июля 2007 :: 12:38
Печать  
Glafira писал(а) 11. Июля 2007 :: 12:29:
достойный ответ
Поиск по слову "уровень" дал 1 результат и то на эту ветку )


Кнопка!(не быстрый) - среди кнопок сверху.
Строка поиска - "Уровень"
Сообщения - "За все время"(!! быстрый - за неделю?)
Раздел - "Прямые запросы"
Показывать по одному результату из темы - галочка

Должно быть 7 тем.
  
Наверх
 
IP записан
 
lustin
1c++ power user
Отсутствует


1C *.*, ROR, Java - на
этом остановимся

Сообщений: 907
Местоположение: Москва
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Уровень()
Ответ #4 - 11. Июля 2007 :: 12:41
Печать  
Glafira писал(а) 11. Июля 2007 :: 12:29:
достойный ответ
Поиск по слову "уровень" дал 1 результат и то на эту ветку )



В поиске есть такой классный всплывающий список "Сообщения, сделанные за последние...", в котором по умолчанию стоит "Неделя"...

Соответственно за последнюю неделю вопрос про уровень поднимался только здесь, а если за год... то можно увидеть многое Подмигивание
  

бизнес-процесс как техническое задание прекрасно, только у бизнеса нет процессов; у бизнеса есть желание выжить
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Glafira
Junior Member
**
Отсутствует


I Love 1С!

Сообщений: 45
Зарегистрирован: 29. Июня 2007
Пол: Женский
Re: Уровень()
Ответ #5 - 11. Июля 2007 :: 12:46
Печать  
Ладно ладно, опозорили бедную девочку... И все равно только 1 нормальная ветка...
  

Ваша Глаша
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Уровень()
Ответ #6 - 11. Июля 2007 :: 12:57
Печать  
Glafira писал(а) 11. Июля 2007 :: 12:46:
Ладно ладно, опозорили бедную девочку... И все равно только 1 нормальная ветка...


Вообще то до меня тоже не сразу дошло  Подмигивание

Зачем нужен "быстрый поиск" на форуме, который ничего вообще не выдает - загадка.

А веток две и вариантов - несколько  Улыбка
  
Наверх
 
IP записан
 
vig
Junior Member
**
Отсутствует


Мой опыт показывает, что
умирают обычно другие.

Сообщений: 34
Местоположение: Киев
Зарегистрирован: 21. Мая 2006
Пол: Мужской
Re: Уровень()
Ответ #7 - 11. Июля 2007 :: 14:15
Печать  
Решил для себя задачу так :
1. Добавил реквизит "Уровень" в справочник.
2. ПриНачалеРаботы :
Код
Выбрать все
	лЗапросODBC=СоздатьОбъект("ODBCRecordSet");
	лЗапросODBC.ВыполнитьИнструкцию("
|set nocount on
|declare @level as int, @idspr as char(9),@idparent_spr as char(9)
|declare @cur_id as char(9),@cur_idparent as char(9),@cur_level as int
|declare mcursor cursor local for
|   select  SprTMZ.id, SprTMZ.parentid, $SprTMZ.Уровень
|   from   $Справочник.ТМЦ as SprTMZ (nolock)
|open mcursor
| fetch next from mcursor into @cur_id,@cur_idparent,@cur_level
| while @@fetch_status=0
| begin
| select @level=0
| select @idparent_spr = @cur_id
|   while (@idparent_spr<>$ПустойИД)
|   begin
|      select  @idparent_spr = SprTMZ.parentid
|      from   $Справочник.ТМЦ as SprTMZ (nolock) where SprTMZ.id=@idparent_spr
|      select @level=@level+1
|   end
|   if (@level<>@cur_level)
|   begin
|    update SprTMZ_u
|    set $SprTMZ_u.Уровень = @level
|    from $Справочник.ТМЦ as SprTMZ_u where  SprTMZ_u.id = @cur_id
|   end
| fetch next from mcursor into @cur_id,@cur_idparent,@cur_level
| end
|close mcursor
|deallocate mcursor
|set nocount off
|");
	лЗапросODBC.Закрыть();

 


Замечания :
1. Это хорошо, когда справочники меняются редко.
2. Это можно вставить также в процедуру "приоткрытии"
3. По-хорошему, если справочник изменяется интенсивно, нужно писать тригера на добавление записи в справочник и на изменение поля parentid.
4. В процедуре "ПриЗаписи()", "ПриПереносеЭлементаВДругуюГруппу()" не забыть заполнить реквизит "Уровень".
  
Наверх
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Уровень()
Ответ #8 - 12. Июля 2007 :: 04:13
Печать  
2 vig:  а ещё есть такая штука, как триггеры  Улыбка
вот здесь http://www.1cpp.ru/forum/YaBB.pl?num=1153469047/18 ; есть пример, правда решается немного другая задача, но попутно и уровень пишется.
  
Наверх
 
IP записан
 
KonstSV
Junior Member
**
Отсутствует



Сообщений: 39
Местоположение: Москва
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Уровень()
Ответ #9 - 12. Июля 2007 :: 04:40
Печать  
Вот функция для вычисления уровня вложенности, где XXX - номер таблицы вашего справочника, YYY - название вашего справочника:

CREATE FUNCTION [dbo].[YYY_Уровень] (@ID char(9)) RETURNS int
AS
BEGIN
   DECLARE @PARENTID char(9)
   DECLARE @Уровень int
     SET @Уровень = 1
   SELECT @PARENTID = PARENTID FROM dbo.SCXXX WITH (NOLOCK) WHERE ID = @ID      
   WHILE @PARENTID <> '     0  '
       SELECT @PARENTID = PARENTID, @Уровень = @Уровень+1 FROM dbo.SCXXX WITH (NOLOCK) WHERE ID = @PARENTID      
   RETURN (@Уровень)
END

А, заодно и ещё две похожие функции:

CREATE FUNCTION [dbo].[YYY_ПолноеНаименование] (@ID char(9)) RETURNS varchar(1000)
AS
BEGIN
   DECLARE @PARENTID char(9)
   DECLARE @DESCR varchar(1000)
   SELECT @PARENTID = PARENTID, @DESCR = RTRIM(DESCR) FROM dbo.SCXXX WITH (NOLOCK) WHERE ID = @ID      
   WHILE @PARENTID <> '     0  '
       SELECT @PARENTID = PARENTID, @DESCR = RTRIM(DESCR)+'/'+RTRIM(@DESCR) FROM dbo.SCXXX WITH (NOLOCK) WHERE ID = @PARENTID      
   RETURN (RTRIM(@DESCR))
END


CREATE FUNCTION [dbo].[YYY_ПринадлежитГруппе] (@ID char(9), @ID_Группы char(9))
RETURNS int
AS
BEGIN
   DECLARE @PARENTID char(9)
   IF @ID_Группы = '     0  ' RETURN 1
   SELECT @PARENTID = PARENTID FROM SCXXX WITH (NOLOCK) WHERE ID = @ID      
   WHILE @PARENTID <> '     0  '
   BEGIN
       IF @PARENTID = @ID_Группы RETURN 1
       SELECT @PARENTID = PARENTID FROM SCXXX WITH (NOLOCK) WHERE ID = @PARENTID      
   END
   RETURN 0
END
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Уровень()
Ответ #10 - 12. Июля 2007 :: 06:19
Печать  
Предлагаю эту ветку добавить в ФАК. Туда же поместить метод Кирилла.
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Уровень()
Ответ #11 - 12. Июля 2007 :: 06:52
Печать  
KonstSV писал(а) 12. Июля 2007 :: 04:40:
Вот функция для вычисления уровня вложенности, где XXX - номер таблицы вашего справочника, YYY - название вашего справочника:


Универсальную наверное было бы удобнее. Обратиться к таблице у которой имя задано в качестве переменной можно так:
Код
Выбрать все
DECLARE @SQL varchar(8000), @TABLE_NAME varchar(10)
SET @SQL = 'SELECT * FROM ' + @TABLE_NAME
exec(@SQL)
 

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