AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.07.2014, 10:32   #1  
userax2009 is offline
userax2009
Участник
 
24 / 10 (1) +
Регистрация: 16.05.2014
рекурсия
Подскажите пожалуйста, как данный запрос в MsSQL переписать на Х++. Использую СТЕ для раскрытия дерева, нахожу нужный мне уровень и вывожу отфильтрованные данные в итоговом запросе.

Цитата:
;WITH countrySegmentation
AS (SELECT TreeNodeId
,NAME
,PARENTTreeNodeId
,DATAAREAID
,0 Level
FROM dbo.MULTILEVELSEGMENTTREE_ZTR

UNION ALL
SELECT t.TreeNodeId
,t.NAME
,t.PARENTTreeNodeId
,t.DATAAREAID
,Level+1
FROM countrySegmentation c
JOIN dbo.MULTILEVELSEGMENTTREE_ZTR t
ON c.TreeNodeId = t.PARENTTreeNodeId)

select distinct mt.TREENODEID, mt.PARENTTREENODEID, mt.NAME, Level
from MULTILEVELSEGMENTDATA_ZTR md
join MULTILEVELSEGMENTTREE_ZTR mt on md.SEGMENTID = mt.SEGMENTID
join countrySegmentation on mt.TREENODEID = countrySegmentation.TREENODEID
where mt.SEGMENTID = 'География' and Level > 1
order by NAME
Думаю, что надо воспользоваться рекурсивной функцией, но как именно не знаю.
Есть идеи ?
Старый 23.07.2014, 12:29   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
В каком виде вам нужно получить результат? Вам его нужно отобразить на форме или просто обойти в цикле?
Старый 23.07.2014, 12:33   #3  
userax2009 is offline
userax2009
Участник
 
24 / 10 (1) +
Регистрация: 16.05.2014
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
В каком виде вам нужно получить результат? Вам его нужно отобразить на форме или просто обойти в цикле?
Результат надо выводить на форму
Старый 23.07.2014, 12:41   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Тогда все равно сначала обход дерева в цикле (можно рекурсивно)
Заполняйте временную таблицу и уже её выводите на форму.

P.S.: Если такие операции с деревом необходимо выполнять часто, то лучше изменить структуру данных добавив как минимум номер строки, при помощи которого можно будет без рекурсии вычислить "границы" любого парента.
Старый 23.07.2014, 12:53   #5  
andiv is offline
andiv
Участник
 
16 / 34 (2) +++
Регистрация: 11.01.2007
погугли Дерево каталогов NESTED SETS. по мне так самый удачный вариант реализации дерева
Старый 23.07.2014, 12:59   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
На всякий случай, если вопрос был в том как именно можно обойти дерево
X++:
void dfs(int _parent)
{
	MULTILEVELSEGMENTTREE_ZTR mt

	while select mt where mt.PARENTTreeNodeId == _parent	
	{
		if (mt.SEGMENTID == 'География')
		{
			addToResultSet(mt);
		}

		dfs(mt.TreeNodeId)
	}		
}
За это сообщение автора поблагодарили: userax2009 (1).
Старый 23.07.2014, 14:33   #7  
userax2009 is offline
userax2009
Участник
 
24 / 10 (1) +
Регистрация: 16.05.2014
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
if (mt.SEGMENTID == 'География')
{
addToResultSet(mt);
}
[/XPP]
ошибка: Функция не была объявлена.

Или это я должен создать метод addToResultSet, в котором будет происходит раскрытие дерева ?
А как мне выполнить фильтрацию по уровню(Level) , как я делаю выше в запросе mssql?

Последний раз редактировалось userax2009; 23.07.2014 в 14:46.
Старый 23.07.2014, 14:47   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от userax2009 Посмотреть сообщение
ошибка: Функция не была объявлена.

Или это должен создать метод addToResultSet, в котором будет происходит раскрытие дерева ?
Я привел в качестве примера псевдокод (с поправкой на X++) функции обхода дерева в глубину. Под методом addToResultSet я подразумевал код, который сохранит найденный узел дерева в результирующий список/множество.

Цитата:
Сообщение от userax2009 Посмотреть сообщение
А как мне выполнить фильтрацию по уровню(Level) , как я делаю выше в запросе mssql?
Да так же как и фильтрацию по SEGMENTID.
Старый 24.07.2014, 16:10   #9  
userax2009 is offline
userax2009
Участник
 
24 / 10 (1) +
Регистрация: 16.05.2014
спасибо, все получилось
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
рекурсия макроса Wamr DAX: Программирование 7 20.04.2010 00:17
Рекурсия, память Shakr DAX: Программирование 10 28.07.2008 15:28
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 18:25.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.