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


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Выборка и упорядочивание иерархического справочника
15. Ноября 2011 :: 07:33
Печать  
Есть пример как сделать выборку номенклатуры, а после сгруппировать по Родителям с учетом уровня
Код
Выбрать все
WITH Номенклатура_Иерархия(ID,Code,Descr,ParentID,IsFolder,SP85,Level) as (
	|SELECT
	|	СпрНоменкл.ID,
	|	СпрНоменкл.Code,
	|	СпрНоменкл.Descr,
	|	СпрНоменкл.ParentID,
	|	СпрНоменкл.IsFolder,
	|	СпрНоменкл.SP85,
	|	1
	|FROM
	|	$Справочник.Номенклатура СпрНоменкл
	|WHERE
	|	СпрНоменкл.ParentID = $ПустойИД
	|UNION ALL
	|SELECT
	|	СпрН.ID,
	|	СпрН.Code,
	|	СпрН.Descr,
	|	СпрН.ParentID,
	|	СпрН.IsFolder,
	|	СпрН.SP85,
	|	Level + 1
	|FROM
	|	$Справочник.Номенклатура СпрН
	|INNER JOIN
	|	Номенклатура_Иерархия СпрНИ ON СпрН.ParentID = СпрНИ.ID
	|)
	|
	|SELECT
	|	НомИерарх.ID [Номенклатура $Справочник.Номенклатура],
	|	RTRIM(CAST(CAST(НомИерарх.Code as INT) as CHAR)) Код,
	|	RTRIM(НомИерарх.Descr) Наименование,
	|	НомИерарх.ParentID ИдГруппы,
	|	НомИерарх.IsFolder Группа,
	|	RTRIM(НомИерарх.SP85) Артикул,
	|	Level Уровень,
	|	0 Остаток
	|FROM
	|Номенклатура_Иерархия НомИерарх
 



запрос написал, но вот проблема, как можно свернуть это дело в индексированной таблице
делаю так
Код
Выбрать все
итВыборка = СоздатьОбъект("ИндексированнаяТаблица");
	НаборЗаписей.ВыполнитьИнструкцию(ТекстЗапроса,итВыборка);
	итВыборка.Сортировать("Номенклатура");
	итВыборка.Группировать("ИдГруппы:ИдГруппы","Остаток",1);
	итВыборка.ВыбратьСтроки();
	Пока итВыборка.ПолучитьСтроку() = 1 Цикл
		Сообщить(итВыборка.Наименование);
	КонецЦикла;
 


получается фигня! Где я ошибся
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Выборка и упорядочивание иерархического справочника
Ответ #1 - 15. Ноября 2011 :: 08:07
Печать  
     Получай просто выборку из запроса БЕЗ ГРУПП, далее скармливай её индексированной ТЗ, имей иерархию.
ИЛИ имей всю иерархию в самом запросе и НЕ скармливай результат запроса индексированной ТЗ.
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Выборка и упорядочивание иерархического справочника
Ответ #2 - 15. Ноября 2011 :: 08:25
Печать  
Eprst писал(а) 15. Ноября 2011 :: 08:07:
    Получай просто выборку из запроса БЕЗ ГРУПП, далее скармливай её индексированной ТЗ, имей иерархию.
ИЛИ имей всю иерархию в самом запросе и НЕ скармливай результат запроса индексированной ТЗ.

Поясни тогда ка не скармливать результат индексированной ТЗ ...
в простую тз результат пихать? и я так понимаю нужна конструкция Gruop by в запросе
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Выборка и упорядочивание иерархического справочника
Ответ #3 - 15. Ноября 2011 :: 10:26
Печать  
если ты поимеешь всю иерархию в самом запросе, то просто выводи результат запроса в Таблицу и привет.
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Выборка и упорядочивание иерархического справочника
Ответ #4 - 16. Ноября 2011 :: 02:43
Печать  
Eprst писал(а) 15. Ноября 2011 :: 10:26:
если ты поимеешь всю иерархию в самом запросе, то просто выводи результат запроса в Таблицу и привет.


Такой вариант не прокатывает ...
Пробовал так
1. Выборка = НаборЗаписей.ВыполнитьИнструкцию(ТекстЗапроса);
Получается плоская таблица. А мне нужна имменно та иерархия, которая в справочнике.
2. Через методы самого Recordset
Код
Выбрать все
НаборЗаписей.ВНачало();
	Сообщить("Что то происходит 1");
	Пока НаборЗаписей.След() = 1 Цикл
		Сообщить("Что то происходит 2");
		//Сообщить(НаборЗаписей.ПолучитьЗначение());
	КонецЦикла;
 


"Что то происходит 2" не выводится (может я где-то затупил)
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Выборка и упорядочивание иерархического справочника
Ответ #5 - 16. Ноября 2011 :: 08:02
Печать  
1. если ты всю иеррархию поимел в тексте запроса, то вот не пофик ли, что на выходе будет обычная ТЗ ? выводи ей через выборку и привет, иерархия то уже в ней вся есть!

2. Открыть() + вНачало() + цикл пока Конец()=1 + След()

Код
Выбрать все
Запрос.Открыть(ТекстЗапроса);
Запрос.ВНачало();
Пока Запрос.Конец()=0 Цикл
	Сообщить(Запрос.ПолучитьЗначение(1));
	Запрос.След();
КонецЦикла;  




  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Выборка и упорядочивание иерархического справочника
Ответ #6 - 16. Ноября 2011 :: 08:08
Печать  
Eprst писал(а) 16. Ноября 2011 :: 08:02:
1. если ты всю иеррархию поимел в тексте запроса, то вот не пофик ли, что на выходе будет обычная ТЗ ? выводи ей через выборку и привет, иерархия то уже в ней вся есть!

2. Открыть() + вНачало() + цикл пока Конец()=1 + След()

Код
Выбрать все
Запрос.Открыть(ТекстЗапроса);
Запрос.ВНачало();
Пока Запрос.Конец()=0 Цикл
	Сообщить(Запрос.ПолучитьЗначение(1));
	Запрос.След();
КонецЦикла;  





Очень довольный Все понял где косяк!
Код
Выбрать все
Запрос.Открыть(ТекстЗапроса);
 


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