Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Рекурсивный запрос "ИерархическийСправочник" с ТЗ как в 1С. Решен (число прочтений - 7394 )
kos
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
Рекурсивный запрос "ИерархическийСправочник" с ТЗ как в 1С. Решен
01. Мая 2013 :: 18:57
Печать  
Понадобилось реализовать SELECT из иерархического справочника
так, чтобы результирующая ТЗ отображалась
РОВНО также как в оригинальном окошке
иерархического справочника 1С.

ОДНИМ запросом.

исходный вид 1С - см.рисунок №1
желаемый результат - см.рисунок №2

Может кому приходится.

Прошу критиковать.

Исходные посылки из этой статьи:
http://citforum.ru/database/articles/tsql_mssql/#ERHA

Использует фичу MS SQL "рекурсивные запросы".
Одно ограничение: запрос работает только начиная с SQL2005+:

Код
Выбрать все
рс = СоздатьОбъект("ODBCRecordset");

	ТекстЗапроса = "
	|WITH _TblWithParents (ID,ISFOLDER,PARENTID) AS
	|(
	|
	|	SELECT 	ТМЦ.ID
	|	,	ТМЦ.ISFOLDER
	|	,	ТМЦ.PARENTID
	|	FROM $Справочник.ТМЦ AS ТМЦ With (NOLOCK)
	|	WHERE (ТМЦ.PARENTID = :ВыбРодитель)
	|
	|	UNION ALL
	|
	|	SELECT 	ТМЦ.ID
	|	,	ТМЦ.ISFOLDER
	|	,	ТМЦ.PARENTID
	|	FROM $Справочник.ТМЦ AS ТМЦ With (NOLOCK)
	|		INNER JOIN _TblWithParents ON _TblWithParents.PARENTID = ТМЦ.ID
	|
	|)
	|
	|SELECT DISTINCT
	|	ID [Ссылка $Справочник.ТМЦ]
	|,	ISFOLDER
	|,	PARENTID [Родитель $Справочник.ТМЦ]
	|FROM
	|	_TblWithParents
	|ORDER BY
	|	ISFOLDER, ID
	|";

	рс.УстановитьТекстовыйПараметр("ВыбРодитель", ВыбРодитель);
	тз = рс.ВыполнитьИнструкцию(ТекстЗапроса);
	тз.ВыбратьСтроку();
 




  

risunok1-TehZadanie.JPG ( 76 KB | Загрузки )
risunok1-TehZadanie.JPG
Наверх
 
IP записан
 
kos
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
Re: Запрос "ИерархическийСправочник" с ТЗ как в 1С. Решение.
Ответ #1 - 01. Мая 2013 :: 19:01
Печать  
рисунок №2 - результат запроса:
  

risunok2-Rezultat.JPG ( 57 KB | Загрузки )
risunok2-Rezultat.JPG
Наверх
 
IP записан
 
zk96
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 320
Местоположение: Киев
Зарегистрирован: 15. Ноября 2009
Пол: Мужской
Re: Рекурсивный запрос "ИерархическийСправочник" с ТЗ как в 1С. Решен
Ответ #2 - 13. Мая 2013 :: 08:53
Печать  
Не понятно. Ты хочешь отсортировать еще и по наименованию? Тогда к результирующему селекту присоедеени еще раз табличку ТМЦ и добавь в ORDER BY сортировку по наименованию(DESCR).
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Рекурсивный запрос "ИерархическийСправочник" с ТЗ как в 1С. Решен
Ответ #3 - 13. Мая 2013 :: 10:01
Печать  
автор ничего не хочет.
Он просто поделился методикой рекурсивных запросов, начиная с 2005 скуля.

ЗЫ: неплохо бы в текст запроса воткнуть, чтоб нумер уровня возвращал еще.
  
Наверх
 
IP записан
 
newbas
Junior Member
**
Отсутствует



Сообщений: 32
Местоположение: Краснодар
Зарегистрирован: 29. Августа 2008
Пол: Мужской
Re: Рекурсивный запрос "ИерархическийСправочник" с ТЗ как в 1С. Решен
Ответ #4 - 01. Июля 2013 :: 10:06
Печать  
Eprst писал(а) 13. Мая 2013 :: 10:01:
ЗЫ: неплохо бы в текст запроса воткнуть, чтоб нумер уровня возвращал еще.


Код
Выбрать все
	ТекстЗапроса = "
		|WITH _TblWithParents (ID,ISFOLDER,PARENTID,Descr, Level) AS
		|(
		|	SELECT 	ТМЦ.ID
		|		,ТМЦ.ISFOLDER
		|		,ТМЦ.PARENTID
		|		,ТМЦ.Descr
		|		,1
		|	FROM $Справочник.Номенклатура AS ТМЦ With (NOLOCK)
		|	WHERE (ТМЦ.PARENTID = :ВыбРодитель)
		|
		|	UNION ALL
		|
		|	SELECT 	ТМЦ.ID
		|		,ТМЦ.ISFOLDER
		|		,ТМЦ.PARENTID
		|		,ТМЦ.Descr
		|		,Level+1
		|	FROM $Справочник.Номенклатура AS ТМЦ With (NOLOCK)
		|		INNER JOIN _TblWithParents ON _TblWithParents.PARENTID = ТМЦ.ID
		|
		|)
		|
		|SELECT DISTINCT
		|	 ID 			[Ссылка 		$Справочник.Номенклатура]
		|	,ISFOLDER		[ЭтоГруппа		$Число]
		|	,PARENTID 		[Родитель 		$Справочник.Номенклатура]
		|	,DESCR
		|	,Level			Уровень
		|FROM
		|	_TblWithParents
		|ORDER BY
		|	ISFOLDER, DESCR
		|"; 

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