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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.10.2013, 17:58   #1  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Прошу помощи в OLAP
Всем доброго времени суток!

Хочу попросить помощи у знатоков OLAP, в частности SSAS.
DAX 2012 R2

Имею следующие исходные условия:
Есть таблица, имеющая поля:
1. Поле основанное на EDT, который построен как массив из 7 элементов, определяющих каждый из дней недели и заполняющийся некоторым числовым значением (то есть определяет некое количество единиц в определённый день недели). Назову это поле Результаты (Results).
2. Есть два поля дат
FromDate - дата начала недели
ToDate - дата окончания недели.
3. Worker - поле, которое ссылается на таблицу сотрудников и будет обычной аналитикой.

Задача в следующем:
Создать такое измерение Даты, которое даст возможность анализировать числовые значения поля Результаты (Measure, Sum) как обычное измерение даты (в разрезе лет, кварталов, месяцев, недель и дней ). то есть, по сути, произвести разбивку массива из семи элементов для каждой даты недели.
Но как это правильно сделать и, что ещё важнее, возможно ли это?

Буду благодарен за любые советы!

Спасибо!

Последний раз редактировалось Cardagant; 12.10.2013 в 18:31.
Старый 12.10.2013, 19:56   #2  
Alex_K is offline
Alex_K
Участник
 
531 / 36 (3) +++
Регистрация: 07.02.2003
Структура в "сыром" виде для OLAP малоподходящая.
В любом случае я бы сначала привёл её к удобоваримому виду с помощью, например, периодического задания, которое будет переливать данные в буферную таблицу.
Отсюда вопросы:
1. FromDate и ToDate - это всегда понедельник и воскресенье?
2. Result - аддитивная мера для всех измерений?

Если в обоих случаях "да" - то всегда можно вычислить дату, зная индекс элемента в массиве.

Тогда просто грузим данные в таблицу вида:
Дата
Сотрудник
Result

и всё это скармливаем SSAS, где будет использоваться совершенно стандартное измерение дат.
За это сообщение автора поблагодарили: Cardagant (1).
Старый 12.10.2013, 20:29   #3  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Цитата:
Сообщение от Alex_K Посмотреть сообщение
Структура в "сыром" виде для OLAP малоподходящая.
В любом случае я бы сначала привёл её к удобоваримому виду с помощью, например, периодического задания, которое будет переливать данные в буферную таблицу.
Отсюда вопросы:
1. FromDate и ToDate - это всегда понедельник и воскресенье?
2. Result - аддитивная мера для всех измерений?

Если в обоих случаях "да" - то всегда можно вычислить дату, зная индекс элемента в массиве.

Тогда просто грузим данные в таблицу вида:
Дата
Сотрудник
Result

и всё это скармливаем SSAS, где будет использоваться совершенно стандартное измерение дат.
Спасибо за Ваш ответ!

1. Да.
2. Это никак не связанные между собой величины результативности данного дня. Но все считаются как суммы.

То есть, насколько я понимаю,,никакие стандартные преобразования, к примеру вычисляемые поля или др., здесь применить не удастся. Понял, спасибо!

Последний раз редактировалось Cardagant; 12.10.2013 в 21:09.
Старый 12.10.2013, 21:53   #4  
Alex_K is offline
Alex_K
Участник
 
531 / 36 (3) +++
Регистрация: 07.02.2003
Цитата:
Сообщение от Cardagant Посмотреть сообщение
То есть, насколько я понимаю,,никакие стандартные преобразования, к примеру вычисляемые поля или др., здесь применить не удастся. Понял, спасибо!
Я, честно говоря, давненько в Аксапту не заглядывал и не помню, как в базе хранятся значения массивов, но теоретически всё, что я сказал, можно сделать SQL-запросом на уровне DataSourceView в SSAS. Тогда выгрузка не понадобится.
Старый 12.10.2013, 22:26   #5  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Цитата:
Сообщение от Alex_K Посмотреть сообщение
Я, честно говоря, давненько в Аксапту не заглядывал и не помню, как в базе хранятся значения массивов, но теоретически всё, что я сказал, можно сделать SQL-запросом на уровне DataSourceView в SSAS. Тогда выгрузка не понадобится.
То есть на уровне SSAS создаётся новый View и запросом туда выбираются и преобразовываются значения? Все релейшены, соответственно также прописываются вручную?

Upd: Не нахожу я что-то инструментов у ДатасорсВью для реализации подобного.

Последний раз редактировалось Cardagant; 12.10.2013 в 23:47.
Старый 13.10.2013, 00:59   #6  
Alex_K is offline
Alex_K
Участник
 
531 / 36 (3) +++
Регистрация: 07.02.2003
Правый клик по диаграмме DatasourceView:
Название: screenshot.png
Просмотров: 2583

Размер: 5.9 Кб

Обычный конструктор запросов.

Кстати, а редакция SQL какая?
Старый 13.10.2013, 01:26   #7  
twilight is offline
twilight
MCTS
MCBMSS
 
874 / 237 (9) ++++++
Регистрация: 17.10.2004
Адрес: Королёв
Можно и в Аксапте создать View c вычислимыми полями.
Например, следующим образом:
1. Сделать таблицу / представление из 7 значений.
2. Сделать view в котором будет исходная таблица заджойнена на эту таблицу с 7 значениями (сначала создается query, потом на его основе view).
3. Во View сделать вычислимые поля, которые на основе значения поля из таблицы из 7 элементов будут определять результат и дату.
__________________
I could tell you, but then I would have to bill you.
За это сообщение автора поблагодарили: Cardagant (1).
Старый 13.10.2013, 23:44   #8  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Цитата:
Сообщение от twilight Посмотреть сообщение
Можно и в Аксапте создать View c вычислимыми полями.
Например, следующим образом:
1. Сделать таблицу / представление из 7 значений.
2. Сделать view в котором будет исходная таблица заджойнена на эту таблицу с 7 значениями (сначала создается query, потом на его основе view).
3. Во View сделать вычислимые поля, которые на основе значения поля из таблицы из 7 элементов будут определять результат и дату.
Не совсем понимаю что имеется ввиду в первом пункте. И по чему джойнить к основной таблице?
Старый 13.10.2013, 23:45   #9  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Цитата:
Сообщение от Alex_K Посмотреть сообщение
Правый клик по диаграмме DatasourceView:
Вложение 8450

Обычный конструктор запросов.

Кстати, а редакция SQL какая?
А как вообще может выглядеть подобный запрос? Следует использовать временную таблицу?

Последний раз редактировалось Cardagant; 13.10.2013 в 23:50.
Старый 14.10.2013, 00:45   #10  
twilight is offline
twilight
MCTS
MCBMSS
 
874 / 237 (9) ++++++
Регистрация: 17.10.2004
Адрес: Королёв
Цитата:
Сообщение от Cardagant Посмотреть сообщение
Не совсем понимаю что имеется ввиду в первом пункте. И по чему джойнить к основной таблице?
Например, создать таблицу DayOfWeekTable с одним полем DayOfWeek, целое.
В таблице создать 7 записей со значениями 0, 1, 2, 3, 4, 5, 6.
В query для нового view в датасорсе по DayOfWeekTable relation не задавать, тогда получится cross join.
Т. е. на каждую запись исходной таблицы будет 7 записей в новой view с различными значения DayOfWeek.
Далее создаем вычислимые поля, в котором используем SysComputedColumn::switch() и прочие функции для анализа DayOfWeek. Для даты прибавляем к начальной дате DayOfWeek, для результата берем соответвующий DayOfWeek элемент из массива.
__________________
I could tell you, but then I would have to bill you.
Старый 14.10.2013, 16:39   #11  
Alex_K is offline
Alex_K
Участник
 
531 / 36 (3) +++
Регистрация: 07.02.2003
Цитата:
Сообщение от Cardagant Посмотреть сообщение
А как вообще может выглядеть подобный запрос? Следует использовать временную таблицу?
Под руками аксы нет, поэтому сразу и не ответить.

Всё-таки, каким образом хранятся в БД индекс и значение элемента массива? Пример можно?
Старый 14.10.2013, 19:50   #12  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Цитата:
Сообщение от Alex_K Посмотреть сообщение
Под руками аксы нет, поэтому сразу и не ответить.

Всё-таки, каким образом хранятся в БД индекс и значение элемента массива? Пример можно?
Аксапта хранит их как одно отдельное поле для каждого индекса.
К примеру, для Results это было бы
Result, Result2_, Result3_, ..., Result7_
Старый 14.10.2013, 19:51   #13  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Цитата:
Сообщение от twilight Посмотреть сообщение
Например, создать таблицу DayOfWeekTable с одним полем DayOfWeek, целое.
В таблице создать 7 записей со значениями 0, 1, 2, 3, 4, 5, 6.
В query для нового view в датасорсе по DayOfWeekTable relation не задавать, тогда получится cross join.
Т. е. на каждую запись исходной таблицы будет 7 записей в новой view с различными значения DayOfWeek.
Далее создаем вычислимые поля, в котором используем SysComputedColumn::switch() и прочие функции для анализа DayOfWeek. Для даты прибавляем к начальной дате DayOfWeek, для результата берем соответвующий DayOfWeek элемент из массива.
Благодарю за интересный вариант, думаю, это стоит попробовать!
Старый 14.10.2013, 22:02   #14  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Цитата:
Сообщение от twilight Посмотреть сообщение
Далее создаем вычислимые поля, в котором используем SysComputedColumn::switch() и прочие функции для анализа DayOfWeek. Для даты прибавляем к начальной дате DayOfWeek, для результата берем соответвующий DayOfWeek элемент из массива.
В 2012й программирую не так давно, прошу Вас привести пример подобного SysComputedColumn::switch() в контексте данной задачи!

Благодарю!
Старый 14.10.2013, 22:18   #15  
twilight is offline
twilight
MCTS
MCBMSS
 
874 / 237 (9) ++++++
Регистрация: 17.10.2004
Адрес: Королёв
Например, вот анализируется поле EnumItemValue из датасорса MSKOLAP_FactTypeView представления MSKOLAP_FactSalesView и выбирается соответвующее ему значение из Map amountMap
X++:
public static server str getAmountFactType1()
{
    #macrolib.MSKOLAP

    Map                     amountMap = new Map(Types::String, Types::String);

    amountMap.insert(#cLiteral(MSKOlapFactType::Qty), #cField(MSKOLAP_FactSalesAllDiscView, CustInvoiceTrans, Qty));
    amountMap.insert(#cLiteral(MSKOlapFactType::Retail), MSKOLAP_FactSalesAllDiscView::amount());
    amountMap.insert(#cLiteral(MSKOlapFactType::Sale), MSKOLAP_FactSalesAllDiscView::amountSales());
    amountMap.insert(#cLiteral(MSKOlapFactType::Purch), MSKOLAP_FactSalesAllDiscView::amountPurch());

    return #cSwitch(#cComparisonField(MSKOLAP_FactSalesView, MSKOLAP_FactTypeView, EnumItemValue),
        amountMap,
        #cLiteral(0));
}
я использую свою небольшую макробиблиотеку, чтобы выражения не были слишком громоздкими
X++:
    #localmacro.cField
    SysComputedColumn::returnField(tableStr(%1), identifierStr(%2), fieldStr(%2, %3))
    #endmacro

    #localmacro.cFieldL
    SysComputedColumn::returnField(tableStr(%1), identifierStr(%2), fieldStr(%3, %4))
    #endmacro

    #localmacro.cAdd
    SysComputedColumn::add(%1, %2)
    #endmacro

    #localmacro.cMultiply
    SysComputedColumn::multiply(%1, %2)
    #endmacro

    #localmacro.cSubtract
    SysComputedColumn::subtract(%1, %2)
    #endmacro

    #localmacro.cLiteral
    SysComputedColumn::returnLiteral(%1)
    #endmacro

    #localmacro.cSwitch
    SysComputedColumn::switch(%1, %2, %3)
    #endmacro

    #localmacro.cComparisonField
    SysComputedColumn::comparisonField(tableStr(%1), identifierStr(%2), fieldStr(%2, %3))
    #endmacro

    #localmacro.cComparisonFieldL
    SysComputedColumn::comparisonField(tableStr(%1), identifierStr(%2), fieldStr(%3, %4))
    #endmacro

    #localmacro.cIf
    SysComputedColumn::if(%1, %2, %3)
    #endmacro

    #localmacro.cEqual
    SysComputedColumn::equalExpression(%1, %2)
    #endmacro

    #localmacro.cCast
    SysComputedColumn::cast(%1, %2)
    #endmacro

    #localmacro.isNullExpr
    SysComputedColumn::isNullExpression(%1)
    #endmacro
__________________
I could tell you, but then I would have to bill you.
Старый 14.10.2013, 23:47   #16  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Благодарю!

А как в методе SysComputedColumn::returnField() правильно указать индекс поля массива в третьем параметре?

Upd: Можно прописать просто строкой. Но может есть какие-то стандартные методы?

Последний раз редактировалось Cardagant; 15.10.2013 в 00:05.
Старый 15.10.2013, 00:35   #17  
Alex_K is offline
Alex_K
Участник
 
531 / 36 (3) +++
Регистрация: 07.02.2003
Ну тады и от себя добавлю 5 копеек
Небольшая наколенная модель с использованием оператора UNPIVOT:
X++:
--    
CREATE TABLE Perfomance (EmplID varchar(20), FromDate datetime, ToDate datetime, 
                         Result int, Result2_ int, Result3_ int, Result4_ int,Result5_ int,Result6_ int, Result7_ int);

GO
INSERT INTO Perfomance VALUES ('Иванов','2013-10-07','2013-10-07',1,2,3,4,5,6,7);
INSERT INTO Perfomance VALUES ('Иванов','2013-10-14','2013-10-20',4,5,6,7,8,9,10);
INSERT INTO Perfomance VALUES ('Петров','2013-10-07','2013-10-07',2,3,4,5,6,7,8);
INSERT INTO Perfomance VALUES ('Петров','2013-10-14','2013-10-20',9,8,6,7,8,9,10);

GO

--  Unpivot    
SELECT EmplID, (dateadd(DAY, CAST(DayIdx as int), FromDate) ) as TransDate, Results
FROM 
   (SELECT EmplID, FromDate, Result "0", Result2_ "1", Result3_ "2", Result4_ "3", Result5_ "4", Result6_ "5", Result7_ "6"
   FROM Perfomance) p
UNPIVOT
   (Results FOR DayIdx IN 
      ("0", "1", "2", "3", "4", "5", "6")
)AS unpvt;
GO
Создаем в DSV новый Named Query, вставляем в него SELECT и после некоторого негодования BIDS на нему "Unpivot statement not supported" получаем искомый результат.
Нажмите на изображение для увеличения
Название: screenshot.png
Просмотров: 388
Размер:	10.9 Кб
ID:	8454
За это сообщение автора поблагодарили: Cardagant (1).
Старый 15.10.2013, 15:33   #18  
twilight is offline
twilight
MCTS
MCBMSS
 
874 / 237 (9) ++++++
Регистрация: 17.10.2004
Адрес: Королёв
Цитата:
Сообщение от Cardagant Посмотреть сообщение
Благодарю!

А как в методе SysComputedColumn::returnField() правильно указать индекс поля массива в третьем параметре?

Upd: Можно прописать просто строкой. Но может есть какие-то стандартные методы?
Точно не знаю, с полями-массивами в вычислимых полях ранее не сталкивался. А просто указать индекс в [] у названия поля не работает?
__________________
I could tell you, but then I would have to bill you.
Старый 15.10.2013, 23:17   #19  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
2Alex_K

Спасибо большое за Ваш интересный вариант! С удовольствием его попробую!
Старый 15.10.2013, 23:23   #20  
Cardagant is offline
Cardagant
Участник
 
317 / 54 (2) ++++
Регистрация: 11.10.2011
Цитата:
Сообщение от twilight Посмотреть сообщение
Точно не знаю, с полями-массивами в вычислимых полях ранее не сталкивался. А просто указать индекс в [] у названия поля не работает?
Работает, если указать подобным образом, к примеру для пятого индекса:
X++:
comparisonExpressionMap.insert(SysComputedColumn::returnLiteral(WeekDays::Monday),
        SysComputedColumn::returnField(viewName, identifierStr(myTable), fieldStr(myTable, Results) + "[5]"));
За это сообщение автора поблагодарили: twilight (1).
Теги
olap, ssas, кубы

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
daxdilip: Troubleshooting OLAP Errors in OLAP Storage Engine The attribute key cannot be found when processing: Table Blog bot DAX Blogs 0 14.04.2012 17:13
emeadaxsupport: Dynamics AX OLAP cubes shows data only till 2008 year Blog bot DAX Blogs 0 07.02.2011 16:11
Почему не могут зайти пользователи Excel 2003 на OLAP 2005? mazzy DAX: Администрирование 4 30.08.2007 10:35
Опять про OLAP и Enum mit DAX: Программирование 6 05.04.2004 11:06
Проблема с подключением к OLAP серверу Andrew Besedin DAX: Администрирование 0 20.03.2002 12:06
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:10.