Страница 1 из 1

Дерево + Кросс данные

Добавлено: 04 дек 2014, 14:14
vecs
Есть два связанных Источника данных Master и Detail.
Первый (Master) содержит иерархические данные -узлы дерева, а второй (Detail) содержит по нескольку детальных записей для каждого узла.

Вывожу Master данные в бэнде "Дерево" (HierachicalBand).

Какими средствами можно в строке Дерева вместе с Master данными вывести кросс данные из Detail в виде:

Master.поле1 Master.поле2 Detail.поле1 Detail.поле1 Detail.поле1 ..

Master.поле1 Master.поле2 Detail.поле1 Detail.поле1 Detail.поле1 ..
Master.поле1 Master.поле2 Detail.поле1 Detail.поле1 Detail.поле1 ..

Master.поле1 Master.поле2 Detail.поле1 Detail.поле1 Detail.поле1 ..

Re: Дерево + Кросс данные

Добавлено: 05 дек 2014, 15:47
Aleksey
Здравствуйте,

Не могли бы вы прислать пример данных для анализа.

Спасибо.

Re: Дерево + Кросс данные

Добавлено: 08 дек 2014, 16:31
vecs
У нас сложная структура таблиц. Поэтому придумал простой искусственный пример (MSSQL).

Пример: Есть узлы дерева #CalcNode (дерево расчета). Для каждого узла есть несколько подчиненных записей в #CalcNodeExpend (некие расходы по узлу).

Сейчас у меня в шаблоне отчета два соответствующих источника данных CalcNode и CalcNodeExpend, связанных по полю NodeId.
Вывожу Master данные из CalcNode в бэнде "Дерево" (HierachicalBand). На бэнде лежит лишь текст с названием узла (NodeName).
Detail данные вывожу в подчиненном бэнде (ChildBand)- там лежат кросс-данные (ChildDataBand) привязанные к CalcNodeExpend. В ячейках кросс-данных выводятся значения поля Expend.

Задача: Нужно вывести кросс-данные непосредственно в Master строке СПРАВА от названия узла (NodeName).

Сейчас при попытке поместить кросс-данные в Master строку, они всегда выводятся без учета иерархического отступа и накладываются на название узла.

SQL-запрос для Master-таблицы:

Код: Выделить всё

/*insert data into #CalcNode table*/
IF Object_id('tempdb..#CalcNode') IS NOT Null DROP TABLE #CalcNode

CREATE TABLE #CalcNode(
    NodeId BIGINT NOT NULL,
    NodeName VARCHAR(100) NOT NULL,
    NodeParentId BIGINT NULL    
)

DECLARE @maxCount BIGINT,
        @count BIGINT,
        @parentId BIGINT;   
     
SET @maxCount = 5;
SET @count = 1;

WHILE @count <= @maxCount
BEGIN
    If @count = 1
        SET @parentId = NULL;
    ELSE
        SET @parentId = @count - 1;
        
    INSERT INTO #CalcNode(NodeId, NodeName, NodeParentId)
        VALUES (@count, 'Node_' + CONVERT(VARCHAR(400), @count), @parentId)
    SET @count = @count + 1;
END

SELECT * FROM #CalcNode
SQL-запрос для Detail-таблицы:

Код: Выделить всё

/*insert random data into #CalcNodeExpend table*/

IF Object_id('tempdb..#CalcNodeExpend') IS NOT Null DROP TABLE #CalcNodeExpend

CREATE TABLE #CalcNodeExpend(
    ExpendId BIGINT IDENTITY(1,1) NOT NULL,  
    NodeId BIGINT NOT NULL,
    Expend float NULL    
)

DECLARE @maxCount BIGINT

SELECT @maxCount = MAX(NodeId) FROM #CalcNode

INSERT INTO #CalcNodeExpend(NodeId, Expend)
SELECT 1 + ABS(CHECKSUM(NewId())) % @maxCount, ABS(CHECKSUM(NewId())) % 1000
FROM #CalcNode t1
JOIN #CalcNode t2 ON t2.NodeId <3

SELECT * FROM #CalcNodeExpend ORDER BY NodeId

Re: Дерево + Кросс данные

Добавлено: 09 дек 2014, 15:57
HighAley
Здравствуйте.

Попробуйте положить Cross-Data на панель как это сделано в приложенном шаблоне отчёта.
Report.mrt
(19.09 КБ) 511 скачиваний
Спасибо.