Имя: Пароль:
1C
 
Альтернатива УложитьСписокОбъектов с группами
0 Если
 
28.04.10
13:46
|set nocount on    
   |update #Группа                
   |set                  
   |isfolder = 1                
   |from #Группа                
   |inner join sc417 as ref (nolock) on ref.id = #Группа.val                
   |where
   |ref.isfolder = 1                
   |declare @folders table(val char(9), primary key clustered (val))                
   |while 1=1                
   |begin    
   |insert into @folders                    
   |select val from #Группа
   |where
   |isfolder = 1                  
   |if @@rowcount = 0 break                  
   |insert into #Группа                    
   |select                      
   |id,                      
   |isfolder                    
   |from sc417 (nolock)                    
   |where
   |parentid in ( select val from @folders )  
   |and
   |id not in ( select val from #Группа )
   |delete #Группа                    
   |where
   |val in ( select val from @folders )
   |delete @folders                
   |end                
   |set nocount off
вытянул из профайлера УложитьСписокОбъектов,
так понимаю, что строка
|delete #Группа                    
   |where
   |val in ( select val from @folders )
как раз и удаляет группы из таблицы, но если ее закомментировать, то 1С виснет напрочь.
ЧЯНД? или точнее где ЯН прав?
1 SnarkHunter
 
28.04.10
13:50
Прекратите писать эти идиотские ЧЯНВХУ...

Комментируя этот оператор ты запускаешь бесконечный цикл...
2 Если
 
28.04.10
13:53
(1) хорошо. Так как же оставить в таблице группы?
3 trdm
 
28.04.10
13:59
(2) Просто добавь их.
4 trdm
 
28.04.10
14:00
(1) +500
неча фалосом размахивать, если лыжи не едут...
5 SnarkHunter
 
28.04.10
14:01
После цикла добавь:

insert into #Группа                    
select                      
 parentid,                      
 isfolder                    
from sc417 (nolock)                    
where
 id in ( select val from #Группа )
6 SnarkHunter
 
28.04.10
14:03
Точнее:

insert into #Группа                    
select distinct
 parentid,                      
 isfolder                    
from sc417 (nolock)                    
where
id in ( select val from #Группа )
7 Если
 
28.04.10
14:03
(5) так я только родителей получу, а если групп 5, к примеру?
8 Если
 
28.04.10
14:04
в  @folders я так понимаю они все уже есть.
9 SnarkHunter
 
28.04.10
14:04
Вся иерархия что ли нужна?
10 SnarkHunter
 
28.04.10
14:05
(8)Откуда?
11 Если
 
28.04.10
14:07
(9) ну само собой. ParentID и в запросе получить не проблема.
хочется если выбирается уровень, иметь тз со всеми элементами и группами
12 Если
 
28.04.10
14:08
(10)
|while 1=1                
   |begin    
   |insert into @folders                    
   |select val from #Группа
   |where
   |isfolder = 1                  
   |if @@rowcount = 0 break
13 SnarkHunter
 
28.04.10
14:09
(12)
|delete @folders                
|end
14 Если
 
28.04.10
14:11
(13) Ну да. А что до делита добавить нельзя? счас попробую.
15 SnarkHunter
 
28.04.10
14:13
Добавь в таблицу #Группа еще одно поле, скажем Check, инициализируй его нулем...

Затем в начале цикле вот так поменяй:
insert into @folders                    
select val from #Группа
where
isfolder = 1 and check = 0

А в конце цикла вот так:
update #Группа                
set check = 1
where
val in ( select val from @folders )
16 www0002
 
08.05.10
05:33
10624874714072651195608464066791