Программирование расширенных объектов AMO OLAP
В этом разделе рассказывается о программировании объектов AMO объектов OLAP с расширенными возможностями. Этот раздел состоит из следующих подразделов.
Объекты Action
Объекты Kpi
Объекты Perspective
Объекты ProactiveCaching
Объекты Translation
Объекты Action
Классы действий позволяют создавать активные ответные действия во время просмотра определенных областей куба. Объекты действий можно определять при помощи AMO, но они используются из клиентского приложения, просматривающего данные. Действия могут быть разных типов, поэтому их создание должно осуществляться в соответствии с их типом. Действия могут представлять собой следующее.
Действия детализации, которые возвращают набор строк, представляющих основополагающие данные выделенных ячеек куба, в которых происходит действие.
Действия формирования отчета, которые возвращают из служб Reporting Services отчет, относящийся к выделенной секции куба, в которой происходит действие.
Стандартные действия, которые возвращают элемент действия (URL, HTML, DataSet, RowSet и другие элементы), связанный с выделенной секцией куба, в которой происходит действие.
Для создания объекта действия требуется выполнить следующие шаги:
Создайте производный объект действия и заполните основные атрибуты.
Основные атрибуты: тип действия, целевой тип или раздел куба, целевая или определенная область куба, где доступно действие, заголовок, а также то, где заголовок является многомерным выражением.
Заполните атрибуты типа действия.
У трех типов действий разные атрибуты, параметры см. в приведенном ниже образце кода.
Добавьте действие в коллекцию кубов и обновите куб. Действие не является обновляемым объектом.
Для проверки действия требуется другая прикладная программа. Проверить действие можно в среде Business Intelligence Development Studio. Сначала нужно установить образцы служб Reporting Services, см. раздел Processing Analysis Services Objects.
Следующий образец кода выполняет репликацию трех разных действий из образца AdventureWorks Analysis Services Project. Дополнительные сведения об установке образцов см. в разделе AdventureWorks Sample Databases. Действия можно различать, поскольку названия действий, введенных при помощи следующего образца, начинаются с «My».
static public void CreateActions(Cube cube)
{
#region Adding a drillthrough action
// Verify That action exists and drop it
if (cube.Actions.ContainsName("My Reseller Details"))
cube.Actions.Remove("My Drillthrough Action",true);
//Create a Drillthrough action
DrillThroughAction dtaction = new DrillThroughAction("My Reseller Details", "My Drillthrough Action");
//Define the Action
dtaction.Type = ActionType.DrillThrough;
dtaction.TargetType = ActionTargetType.Cells;
dtaction.Target = "MeasureGroupMeasures(\"Reseller Sales\")";
dtaction.Caption = "My Drillthrough...";
dtaction.CaptionIsMdx = false;
#region create drillthrough action specifics
//Adding Drillthrough columns
//Adding Measure columns to the drillthrough
MeasureGroup mg = cube.MeasureGroups.FindByName("Reseller Sales");
MeasureBinding mb1 = new MeasureBinding();
mb1.MeasureID = mg.Measures.FindByName( "Reseller Sales Amount").ID;
dtaction.Columns.Add(mb1);
MeasureBinding mb2 = new MeasureBinding();
mb2.MeasureID = mg.Measures.FindByName("Reseller Order Quantity").ID;
dtaction.Columns.Add(mb2);
MeasureBinding mb3 = new MeasureBinding();
mb3.MeasureID = mg.Measures.FindByName("Reseller Unit Price").ID;
dtaction.Columns.Add(mb3);
//Adding Dimension Columns to the drillthrough
CubeAttributeBinding cb1 = new CubeAttributeBinding();
cb1.CubeID = cube.ID;
cb1.CubeDimensionID = cube.Dimensions.FindByName("Reseller").ID;
cb1.AttributeID = "Reseller Name";
cb1.Type = AttributeBindingType.All;
dtaction.Columns.Add(cb1);
CubeAttributeBinding cb2 = new CubeAttributeBinding();
cb2.CubeID = cube.ID;
cb2.CubeDimensionID = cube.Dimensions.FindByName("Product").ID;
cb2.AttributeID = "Product Name";
cb2.Type = AttributeBindingType.All;
dtaction.Columns.Add(cb2);
#endregion
//Add the defined action to the cube
cube.Actions.Add(dtaction);
#endregion
#region Adding a Standard action
// Verify That action exists and drop it
if (cube.Actions.ContainsName("My City Map"))
cube.Actions.Remove("My Action", true);
//Create a Drillthrough action
StandardAction stdaction = new StandardAction("My City Map", "My Action");
//Define the Action
stdaction.Type = ActionType.Url;
stdaction.TargetType = ActionTargetType.AttributeMembers;
stdaction.Target = "[Geography].[City]";
stdaction.Caption = "\"My View Map for \" + [Geography].[City].CurrentMember.Member_Caption + \"...\"";
stdaction.CaptionIsMdx = true;
#region create standard action specifics
stdaction.Expression = "\"http://maps.msn.com/home.aspx?plce1=\" + " +
"[Geography].[City].CurrentMember.Name + \",\" + " +
"[Geography].[State-Province].CurrentMember.Name + \",\" + " +
"[Geography].[Country].CurrentMember.Name + " +
"\"®n1=\" + " +
"Case " +
"When [Geography].[Country].CurrentMember Is " +
"[Geography].[Country].&[Australia] " +
"Then \"3\" " +
"When [Geography].[Country].CurrentMember Is " +
"[Geography].[Country].&[Canada] " +
"Or [Geography].[Country].CurrentMember Is " +
"[Geography].[Country].&[United States] " +
"Then \"0\" " +
"Else \"1\" " +
"End ";
#endregion
//Add the defined action to the cube
cube.Actions.Add(stdaction);
#endregion
#region Adding a Reporting action
// Verify That action exists and drop it
if (cube.Actions.ContainsName("My Sales Reason Comparisons"))
cube.Actions.Remove("My Report Action", true);
//Create a Report action
ReportAction rsaction = new ReportAction("My Sales Reason Comparisonsp", "My Report Action");
//Define the Action
rsaction.Type = ActionType.Report;
rsaction.TargetType = ActionTargetType.AttributeMembers;
rsaction.Target = "[Product].[Category]";
rsaction.Caption = "\"My Sales Reason Comparisons for \" + [Product].[Category].CurrentMember.Member_Caption + \"...\"";
rsaction.CaptionIsMdx = true;
#region create Report action specifics
rsaction.ReportServer = "MyRSSamplesServer";
rsaction.Path = "ReportServer?/AdventureWorks Sample Reports/Sales Reason Comparisons";
rsaction.ReportParameters.Add("ProductCategory", "UrlEscapeFragment( [Product].[Category].CurrentMember.UniqueName )");
rsaction.ReportFormatParameters.Add("rs:Command", "Render");
rsaction.ReportFormatParameters.Add("rs:Renderer", "HTML5");
#endregion
//Add the defined action to the cube
cube.Actions.Add(rsaction);
#endregion
}
Объекты Kpi
Ключевой индикатор производительности представляет собой коллекцию вычислений, связанных с группой мер куба и используемых для оценки успешности бизнеса. Объекты Kpi можно определять при помощи объектов AMO, однако они используются клиентским приложением, просматривающим данные.
Для создания объекта Kpi необходимо выполнить следующие действия.
Создайте объект Kpi и заполните основные атрибуты.
Список основных атрибутов: «Описание», «Папка отображения», «Связанная группа мер» и «Значение». Атрибут «Папка отображения» указывает клиентскому приложению, где следует размещать ключевые индикаторы производительности для конечного пользователя. Атрибут «Связанная группа мер» указывает группу мер, с которой следует связывать все вычисления многомерных выражений. Атрибут «Значение» показывает фактическое значение индикатора производительности в виде многомерного выражения.
Определите ключевые индикаторы производительности: «Цель», «Состояние» и «Тенденция».
Индикаторы являются многомерными выражениями, которые должны иметь значение в диапазоне от -1 до 1, за исключением обзорного приложения, которое определяет диапазон значений для индикаторов.
При обзоре ключевых индикаторов производительности в среде Business Intelligence Development Studio значения менее -1 принимаются за -1, а значения более 1 принимаются за 1.
Определите графические изображения.
Графические изображения представляют собой строковые значения, используемые в клиентском приложении в качестве ссылок для указания правильного набора изображений для отображения. Строка графического изображения также определяет поведение функции отображения. Обычно диапазон разбивается на нечетное число состояний, от плохого к хорошему, каждому из которых присваивается изображение из набора.
Если для обзора ключевых индикаторов производительности используется среда Business Intelligence Development Studio, то в зависимости от имен диапазон индикатора разбивается на три или пять состояний. Кроме того, есть имена, при которых диапазон инвертируется, то есть -1 становиться «Хорошо», а 1 «Плохо». В среде Business Intelligence Development Studio в этом диапазоне есть три следующих состояния:
Плохо = от -1 до -0,5
Приемлемо = от -0,4999 до -0,4999
Хорошо = от 0,50 до 1
В среде Business Intelligence Development Studio в этом диапазоне есть пять следующих состояния:
Плохо = от -1 до -0,75
Рискованно = от -0,7499 до -0,25
Приемлемо = от -0,2499 до 0,2499
Лучше = от 0,25 до 0,7499
Хорошо = от 0,75 до 1
В следующей таблице приведено использование, имя и число состояний, связанное с изображением.
Использование изображения |
Имя изображения |
Количество состояний |
---|---|---|
Status |
Фигуры |
3 |
Status |
Светофор |
3 |
Status |
Дорожные знаки |
3 |
Status |
Датчик |
3 |
Status |
Обратный датчик |
5 |
Status |
Термометр |
3 |
Status |
Цилиндрическая |
3 |
Status |
Лица |
3 |
Status |
Стрелка отклонения |
3 |
Тренд |
Стандартная стрелка |
3 |
Тренд |
Стрелка состояния |
3 |
Тренд |
Обратная стрелка состояния |
5 |
Тренд |
Лица |
3 |
- Добавьте ключевой индикатора производительности в коллекцию кубов и обновите куб, так как ключевой индикатор производительности не является обновляемым объектом.
Для проверки ключевого индикатора производительности требуется другая прикладная программа. Проверить ключевой индикатор производительности можно в среде Business Intelligence Development Studio.
Следующий образец кода создает ключевой индикатор производительности в папке «Финансовая перспектива/Рост прибыли» для куба AdventureWorks, который включен в образец AdventureWorks Analysis Services Project. Дополнительные сведения об установке образцов см. в разделе AdventureWorks Sample Databases.
static public void CreateKPIs(Cube cube)
{
Kpi kpi = cube.Kpis.Add("My Internet Revenue", "My Internet Revenue");
kpi.Description = "(My) Revenue achieved through direct sales via Interner";
kpi.DisplayFolder = "\\Financial Perspective\\Grow Revenue";
kpi.AssociatedMeasureGroupID = "Internet Sales";
kpi.Value = "[Measures].[Internet Sales Amount]";
#region Goal
kpi.Goal = "Case" +
" When IsEmpty" +
" (" +
" ParallelPeriod" +
" (" +
" [Date].[Fiscal Time].[Fiscal Year]," +
" 1," +
" [Date].[Fiscal Time].CurrentMember" +
" )" +
" )" +
" Then [Measures].[Internet Sales Amount]" +
" Else 1.10 *" +
" (" +
" [Measures].[Internet Sales Amount]," +
" ParallelPeriod" +
" (" +
" [Date].[Fiscal Time].[Fiscal Year]," +
" 1," +
" [Date].[Fiscal Time].CurrentMember" +
" )" +
" ) " +
" End";
#endregion
#region Status
kpi.Status = "Case" +
" When KpiValue( \"Internet Revenue\" ) / KpiGoal ( \"Internet Revenue\" ) >= .95 " +
" Then 1 " +
" When KpiValue( \"Internet Revenue\" ) / KpiGoal ( \"Internet Revenue\" ) < .95 " +
" And " +
" KpiValue( \"Internet Revenue\" ) / KpiGoal ( \"Internet Revenue\" ) >= .85 " +
" Then 0 " +
" Else -1 " +
"End";
#endregion
#region Trend
kpi.Trend = "Case " +
" When VBA!Abs " +
" ( " +
" KpiValue( \"Internet Revenue\" ) - " +
" ( " +
" KpiValue ( \"Internet Revenue\" ), " +
" ParallelPeriod " +
" ( " +
" [Date].[Fiscal Time].[Fiscal Year], " +
" 1, " +
" [Date].[Fiscal Time].CurrentMember " +
" ) " +
" ) / " +
" ( " +
" KpiValue ( \"Internet Revenue\" ), " +
" ParallelPeriod " +
" ( " +
" [Date].[Fiscal Time].[Fiscal Year], " +
" 1, " +
" [Date].[Fiscal Time].CurrentMember " +
" ) " +
" ) " +
" ) <=.02 " +
" Then 0 " +
" When KpiValue( \"Internet Revenue\" ) - " +
" ( " +
" KpiValue ( \"Internet Revenue\" ), " +
" ParallelPeriod " +
" ( " +
" [Date].[Fiscal Time].[Fiscal Year], " +
" 1, " +
" [Date].[Fiscal Time].CurrentMember " +
" ) " +
" ) / " +
" ( " +
" KpiValue ( \"Internet Revenue\" ), " +
" ParallelPeriod " +
" ( " +
" [Date].[Fiscal Time].[Fiscal Year], " +
" 1, " +
" [Date].[Fiscal Time].CurrentMember " +
" ) " +
" ) >.02 " +
" Then 1 " +
" Else -1 " +
"End";
#endregion
kpi.TrendGraphic = "Standard Arrow";
kpi.StatusGraphic = "Cylinder";
}.
Объекты Perspective
Объекты Perspective можно определять при помощи объектов AMO, но они используются из клиентского приложения, обозревающего данные.
Для создания объекта Perspective необходимо выполнить следующие действия.
Создайте объект Perspective и заполните основные атрибуты.
Список основных атрибутов: «Имя», «Мера по умолчанию», «Описание» и заметки.
Добавьте все объекты из родительского куба, которые должен видеть конечный пользователь.
Добавьте измерения куба (атрибуты и иерархии), группы мер (меру и группу мер), действия, ключевые индикаторы производительности и вычисления.
Добавьте перспективу в коллекцию кубов и обновите куб, так как перспектива не является обновляемым объектом.
Для проверки перспективы требуется другая прикладная программа. Проверить перспективу можно в среде Business Intelligence Development Studio.
Следующий образец кода создает для указанного куба перспективу «Прямые продажи».
static public void CreatePerspectives(Cube cube)
{
Perspective perspective = cube.Perspectives.Add("Direct Sales", "Direct Sales");
CubeDimension dim1 = cube.Dimensions.GetByName("Date");
PerspectiveDimension pdim1 = perspective.Dimensions.Add(dim1.DimensionID);
pdim1.Attributes.Add("Date");
pdim1.Attributes.Add("Calendar Year");
pdim1.Attributes.Add("Fiscal Year");
pdim1.Attributes.Add("Calendar Quarter");
pdim1.Attributes.Add("Fiscal Quarter");
pdim1.Attributes.Add("Calendar Month Number");
pdim1.Attributes.Add("Fiscal Month Number");
pdim1.Hierarchies.Add("Calendar Time");
pdim1.Hierarchies.Add("Fiscal Time");
CubeDimension dim2 = cube.Dimensions.GetByName("Product");
PerspectiveDimension pdim2 = perspective.Dimensions.Add(dim2.DimensionID);
pdim2.Attributes.Add("Product Name");
pdim2.Attributes.Add("Product Line");
pdim2.Attributes.Add("Model Name");
pdim2.Attributes.Add("List Price");
pdim2.Attributes.Add("Size");
pdim2.Attributes.Add("Weight");
pdim2.Hierarchies.Add("Product Model Categories");
pdim2.Hierarchies.Add("Product Categories");
PerspectiveMeasureGroup pmg = perspective.MeasureGroups.Add("Internet Sales");
pmg.Measures.Add("Internet Sales Amount");
pmg.Measures.Add("Internet Order Quantity");
pmg.Measures.Add("Internet Unit Price");
pmg = perspective.MeasureGroups.Add("Reseller Sales");
pmg.Measures.Add("Reseler Sales Amount");
pmg.Measures.Add("Reseller Order Quantity");
pmg.Measures.Add("Reseller Unit Price");
PerspectiveAction pact = perspective.Actions.Add("Drillthrough Action");
PerspectiveKpi pkpi = perspective.Kpis.Add("Internet Revenue");
Cube.Update();
}
Объекты ProactiveCaching
Объекты ProactiveCaching можно определять при помощи объектов AMO.
Для создания объекта ProactiveCaching необходимо выполнить следующие действия.
Создайте объект ProactiveCaching.
Для него не нужно определять основные атрибуты.
Добавьте спецификации кэша.
Спецификация |
Description |
---|---|
AggregationStorage |
Тип хранилища для агрегатов. Относится только к секции. В измерении значение должно быть Regular. |
SilenceInterval |
Минимальное количество времени существования кэша до начала создания образа MOLAP. |
Задержка |
Количество времени, которое проходит от момента самого раннего уведомления до момента удаления образов MOLAP. |
SilenceOverrideInterval |
Время после первоначального уведомления, по истечение которого создание образа MOLAP будет запущено безусловно. |
ForceRebuildInterval |
Время (начиная с момента удаления образа MOLAP), по истечении которого создание образа MOLAP начнется безусловно (без уведомлений). |
OnlineMode |
Когда имеется образ MOLAP. Может быть либо Immediate, либо OnCacheComplete. |
- Добавьте объект ProactiveCaching в родительскую коллекцию. Потребуется обновить родительскую коллекцию, так как объект ProactiveCaching не является обновляемым.
Следующий образец кода создает объект ProactiveCaching во всех секциях от группы мер «Продажи через Интернет» в кубе Adventure Works в указанной базе данных.
static public void SetProactiveCachingSettings(Database db)
{
ProactiveCaching pc;
if (db.Cubes.ContainsName("Adventure Works") && db.Cubes.FindByName("Adventure Works").MeasureGroups.ContainsName("Internet Sales"))
{
ProactiveCachingTablesBinding pctb;
TableNotification tn;
MeasureGroup mg = db.Cubes.FindByName("Adventure Works").MeasureGroups.FindByName("Internet Sales");
foreach(Partition part in mg.Partitions)
{
pc = new ProactiveCaching();
pc.AggregationStorage = ProactiveCachingAggregationStorage.MolapOnly;
pc.SilenceInterval = TimeSpan.FromSeconds(10);
pc.Latency = TimeSpan.FromSeconds(-1);
pc.SilenceOverrideInterval = TimeSpan.FromMinutes(10);
pc.ForceRebuildInterval = TimeSpan.FromSeconds(-1);
pc.Enabled = true;
pc.OnlineMode = ProactiveCachingOnlineMode.OnCacheComplete;
pctb = new ProactiveCachingTablesBinding();
pctb.NotificationTechnique = NotificationTechnique.Server;
tn = new TableNotification("[FactInternetSales]", "dbo");
pctb.TableNotifications.Add( tn);
pc.Source = pctb;
part.ProactiveCaching = pc;
part.Update();
}
}
}
Объекты Translation
Объекты переводов можно определять при помощи объектов AMO, но они используются из клиентского приложения, обозревающего данные. Объекты переводов просты в программировании. Переводы заголовков объектов обеспечиваются парами «Код языка» и «Переведенный заголовок». Для любого заголовка можно разрешить несколько переводов. Переводы можно обеспечить для большинства объектов служб Analysis Services, например измерений, атрибутов, иерархий, кубов, групп мер, мер и др.
Следующий образец кода обеспечивает перевод на испанский язык имени атрибута «Название продукта».
static public void CreateTranslations(Database db)
{
//Spanish Tranlations for Product Category in Product Dimension
Dimension dim = db.Dimensions["Product"];
DimensionAttribute atr = dim.Attributes["Product Name"];
Translation tran = atr.Translations.Add(3082);
tran.Caption = "Nombre Producto";
dim.Update(UpdateOptions.ExpandFull);
}
См. также