AXForum  
Zurück   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Kennwort vergessen?
Registrieren Forum Rules Hilfe Benutzerliste Heutige Beiträge Suchen Alle Foren als gelesen markieren

 
 
Themen-Optionen Thema durchsuchen Ansicht
Alt 12.10.2013, 17:58   #1  
Cardagant ist offline
Cardagant
Участник
 
317 / 54 (2) ++++
Registriert seit: 11.10.2011
Прошу помощи в OLAP
Всем доброго времени суток!

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

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

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

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

Спасибо!

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

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

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

и всё это скармливаем SSAS, где будет использоваться совершенно стандартное измерение дат.
This post has been rated by: Cardagant (1).
Alt 12.10.2013, 20:29   #3  
Cardagant ist offline
Cardagant
Участник
 
317 / 54 (2) ++++
Registriert seit: 11.10.2011
Zitat:
Zitat von Alex_K Beitrag anzeigen
Структура в "сыром" виде для OLAP малоподходящая.
В любом случае я бы сначала привёл её к удобоваримому виду с помощью, например, периодического задания, которое будет переливать данные в буферную таблицу.
Отсюда вопросы:
1. FromDate и ToDate - это всегда понедельник и воскресенье?
2. Result - аддитивная мера для всех измерений?

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

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

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

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

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

Geändert von Cardagant (12.10.2013 um 21:09 Uhr)
Alt 12.10.2013, 21:53   #4  
Alex_K ist offline
Alex_K
Участник
 
531 / 36 (3) +++
Registriert seit: 07.02.2003
Zitat:
Zitat von Cardagant Beitrag anzeigen
То есть, насколько я понимаю,,никакие стандартные преобразования, к примеру вычисляемые поля или др., здесь применить не удастся. Понял, спасибо!
Я, честно говоря, давненько в Аксапту не заглядывал и не помню, как в базе хранятся значения массивов, но теоретически всё, что я сказал, можно сделать SQL-запросом на уровне DataSourceView в SSAS. Тогда выгрузка не понадобится.
Alt 12.10.2013, 22:26   #5  
Cardagant ist offline
Cardagant
Участник
 
317 / 54 (2) ++++
Registriert seit: 11.10.2011
Zitat:
Zitat von Alex_K Beitrag anzeigen
Я, честно говоря, давненько в Аксапту не заглядывал и не помню, как в базе хранятся значения массивов, но теоретически всё, что я сказал, можно сделать SQL-запросом на уровне DataSourceView в SSAS. Тогда выгрузка не понадобится.
То есть на уровне SSAS создаётся новый View и запросом туда выбираются и преобразовываются значения? Все релейшены, соответственно также прописываются вручную?

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

Geändert von Cardagant (12.10.2013 um 23:47 Uhr)
Alt 13.10.2013, 00:59   #6  
Alex_K ist offline
Alex_K
Участник
 
531 / 36 (3) +++
Registriert seit: 07.02.2003
Правый клик по диаграмме DatasourceView:
Name:  screenshot.png
Hits: 3248
Größe:  5,9 KB

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

Кстати, а редакция SQL какая?
Alt 13.10.2013, 01:26   #7  
twilight ist offline
twilight
MCTS
MCBMSS
 
890 / 241 (10) ++++++
Registriert seit: 17.10.2004
Ort: Королёв
Можно и в Аксапте создать View c вычислимыми полями.
Например, следующим образом:
1. Сделать таблицу / представление из 7 значений.
2. Сделать view в котором будет исходная таблица заджойнена на эту таблицу с 7 значениями (сначала создается query, потом на его основе view).
3. Во View сделать вычислимые поля, которые на основе значения поля из таблицы из 7 элементов будут определять результат и дату.
__________________
I could tell you, but then I would have to bill you.
This post has been rated by: Cardagant (1).
Alt 13.10.2013, 23:44   #8  
Cardagant ist offline
Cardagant
Участник
 
317 / 54 (2) ++++
Registriert seit: 11.10.2011
Zitat:
Zitat von twilight Beitrag anzeigen
Можно и в Аксапте создать View c вычислимыми полями.
Например, следующим образом:
1. Сделать таблицу / представление из 7 значений.
2. Сделать view в котором будет исходная таблица заджойнена на эту таблицу с 7 значениями (сначала создается query, потом на его основе view).
3. Во View сделать вычислимые поля, которые на основе значения поля из таблицы из 7 элементов будут определять результат и дату.
Не совсем понимаю что имеется ввиду в первом пункте. И по чему джойнить к основной таблице?
Alt 13.10.2013, 23:45   #9  
Cardagant ist offline
Cardagant
Участник
 
317 / 54 (2) ++++
Registriert seit: 11.10.2011
Zitat:
Zitat von Alex_K Beitrag anzeigen
Правый клик по диаграмме DatasourceView:
Anhang 8450

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

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

Geändert von Cardagant (13.10.2013 um 23:50 Uhr)
Alt 14.10.2013, 00:45   #10  
twilight ist offline
twilight
MCTS
MCBMSS
 
890 / 241 (10) ++++++
Registriert seit: 17.10.2004
Ort: Королёв
Zitat:
Zitat von Cardagant Beitrag anzeigen
Не совсем понимаю что имеется ввиду в первом пункте. И по чему джойнить к основной таблице?
Например, создать таблицу 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.
Alt 14.10.2013, 16:39   #11  
Alex_K ist offline
Alex_K
Участник
 
531 / 36 (3) +++
Registriert seit: 07.02.2003
Zitat:
Zitat von Cardagant Beitrag anzeigen
А как вообще может выглядеть подобный запрос? Следует использовать временную таблицу?
Под руками аксы нет, поэтому сразу и не ответить.

Всё-таки, каким образом хранятся в БД индекс и значение элемента массива? Пример можно?
Alt 14.10.2013, 19:50   #12  
Cardagant ist offline
Cardagant
Участник
 
317 / 54 (2) ++++
Registriert seit: 11.10.2011
Zitat:
Zitat von Alex_K Beitrag anzeigen
Под руками аксы нет, поэтому сразу и не ответить.

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

Благодарю!
Alt 14.10.2013, 22:18   #15  
twilight ist offline
twilight
MCTS
MCBMSS
 
890 / 241 (10) ++++++
Registriert seit: 17.10.2004
Ort: Королёв
Например, вот анализируется поле 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.
Alt 14.10.2013, 23:47   #16  
Cardagant ist offline
Cardagant
Участник
 
317 / 54 (2) ++++
Registriert seit: 11.10.2011
Благодарю!

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

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

Geändert von Cardagant (15.10.2013 um 00:05 Uhr)
Alt 15.10.2013, 00:35   #17  
Alex_K ist offline
Alex_K
Участник
 
531 / 36 (3) +++
Registriert seit: 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" получаем искомый результат.
Klicken Sie auf die Grafik für eine größere Ansicht

Name:	screenshot.png
Hits:	405
Größe:	10,9 KB
ID:	8454
This post has been rated by: Cardagant (1).
Alt 15.10.2013, 15:33   #18  
twilight ist offline
twilight
MCTS
MCBMSS
 
890 / 241 (10) ++++++
Registriert seit: 17.10.2004
Ort: Королёв
Zitat:
Zitat von Cardagant Beitrag anzeigen
Благодарю!

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

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

Спасибо большое за Ваш интересный вариант! С удовольствием его попробую!
Alt 15.10.2013, 23:23   #20  
Cardagant ist offline
Cardagant
Участник
 
317 / 54 (2) ++++
Registriert seit: 11.10.2011
Zitat:
Zitat von twilight Beitrag anzeigen
Точно не знаю, с полями-массивами в вычислимых полях ранее не сталкивался. А просто указать индекс в [] у названия поля не работает?
Работает, если указать подобным образом, к примеру для пятого индекса:
X++:
comparisonExpressionMap.insert(SysComputedColumn::returnLiteral(WeekDays::Monday),
        SysComputedColumn::returnField(viewName, identifierStr(myTable), fieldStr(myTable, Results) + "[5]"));
This post has been rated by: twilight (1).
Stichworte
olap, ssas, кубы

 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
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
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Gehe zu

Рейтинг@Mail.ru
Alle Zeitangaben in WEZ +3. Es ist jetzt 21:55 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.