AppliesToExpression: IExpression;
AppliesToExpression: Prognoz.Platform.Interop.ForeSystem.IExpression;
Свойство AppliesToExpression определяет выражение для задания компонентов, которые будут агрегироваться без учета обработки пропусков.
Коллекцию элементов, которые могут быть использованы в выражении, возвращает свойство IMsCrossDimensionAggregationTransform.AppliesToOperands.
Для выполнения примера предполагается наличие в репозитории базы данных временных рядов с идентификатором «FC». «COUNTRY» и «INDICATOR» - атрибуты показателей данной базы, ссылающиеся на справочники. В контейнере моделирования данной базы должны присутствовать:
модель с идентификатором «CROSS_DIM_AGGR», рассчитываемая методом расширенной агрегации;
метамодель, содержащая параметр «Country_Param». Параметр должен ссылаться на тот же справочник, что и атрибут показателей «COUNTRY». Модель «CROSS_DIM_AGGR» должна входить в цепочку расчета данной метамодели.
Добавьте ссылки на системные сборки «Metabase», «Ms», «Cubes», «Dimensions», «Rds».
Sub UserProc;
Var
mb: IMetabase;
RubrDescr: IMetabaseObjectDescriptor;
Rubr: IRubricator;
msDescr: IMetabaseObjectDescriptor;
Model: IMsModel;
Transform: IMsFormulaTransform;
Formula: IMsFormula;
Aggr: IMsCrossDimensionAggregationTransform;
strsGen: IMsFormulaStringGenerator;
Term: IMsFormulaTerm;
selFactory: IDimSelectionSetFactory;
SelSet: IDimSelectionSet;
Attributes: IMetaAttributes;
DictC, DictI: IMetabaseObjectDescriptor;
SliceInp: IMsFormulaTransformSlice;
Options: IMsCrossDimensionAggregationOptions;
FiltesList: IMsAggregationFilterList;
Filter: IMsAggregationFilter;
Begin
mb := MetabaseClass.Active;
// Получаем БД временных рядов и её контейнер моделирования
RubrDescr := mb.ItemById("FC");
Rubr := RubrDescr.Bind As IRubricator;
msDescr := Rubr.ModelSpace;
// Получаем модель
Model := mb.ItemByIdNamespace("CROSS_DIM_AGGR", msDescr.Key).Edit As IMsModel;
Transform := Model.Transform;
Formula := Transform.FormulaItem(0);
// Настраиваем параметры расчета агрегации
Aggr := Formula.Method As IMsCrossDimensionAggregationTransform;
Aggr.AgregationMethod := MsAgregationMethodType.WeightedAverage;
selFactory := New DimSelectionSetFactory.Create;
SelSet := selFactory.CreateDimSelectionSet;
// Получаем атрибуты показателей и справочники, на которые они ссылаются
Attributes := Rubr.Facts.Attributes;
DictC := Attributes.FindById("COUNTRY").ValuesObject;
DictI := Attributes.FindById("INDICATOR").ValuesObject;
SelSet.Add(DictC.Open(Null) As IDimInstance);
SelSet.Add(DictI.Open(Null) As IDimInstance);
// Получаем элемент для выражения расчета агрегации
SelSet.Item(0).DeselectAll;
SelSet.Item(1).DeselectAll;
SelSet.Item(1).SelectElement(1, False);
SliceInp := Transform.Inputs.Add(RubrDescr.Bind As IVariableStub).Slices.Add(SelSet);
// Задаем выражение для расчета агрегации
Term := Aggr.Operands.Add(SliceInp);
Aggr.Expression.AsString := "Fill(" + Term.TermToInnerText + ", MsFillMethod.RandomValue)";
// Получаем элемент для выражения расчета весов
SelSet.Item(1).DeselectAll;
SelSet.Item(1).SelectElement(2, False);
SliceInp := Transform.Inputs.Add(RubrDescr.Bind As IVariableStub).Slices.Add(SelSet);
// Задаем выражение для расчета весов
Term := Aggr.WeightsOperands.Add(SliceInp);
Aggr.WeightsExpression.AsString := Term.TermToInnerText + "+2";
// Получаем элементы для выражения расчета релевантности структуры
SelSet.Item(1).DeselectAll;
SelSet.Item(1).SelectElement(3, False);
SliceInp := Transform.Inputs.Add(RubrDescr.Bind As IVariableStub).Slices.Add(SelSet);
// Задаем выражение для расчета релевантости структуры
Term := Aggr.CompositionRelevanceOperands.Add(SliceInp);
Aggr.CompositionRelevanceExpression.AsString := Term.TermToInnerText + "*2";
// Получаем элементы для выражения расчета элементов, которые будут агрегироваться без учета пропусков в данных
SelSet.Item(1).DeselectAll;
SelSet.Item(1).SelectElement(1, False);
SliceInp := Transform.Inputs.Add(RubrDescr.Bind As IVariableStub).Slices.Add(SelSet);
// Задаем выражение для расчета элементов, которые будут агрегироваться без учета пропусков в данных
Aggr.AppliesToOperands.Add(SliceInp);
Aggr.AppliesToExpression.AsString := Term.TermToInnerText;
// Задаем фильтр агрегации
FiltesList := Aggr.Filter;
Filter := FiltesList.Add(DictC.Bind As IDimensionModel);
Filter.AggregationParamID := "Country_Param";
Filter.UseParamAsGroup := True;
// Задаем дополнительные параметры расчета агрегации
Options := Aggr.Options;
Options.Threshold := 20;
Options.Percentile := 50;
Options.KeepSegment := True;
// Генерируем название модели
strsGen := Formula.CreateStringGenerator;
strsGen.ShowFullVariableNames := True;
Debug.WriteLine("Выражение агрегации: " + strsGen.Execute);
// Сохраняем модель
(Model As IMetabaseObject).Save;
End Sub UserProc;
После выполнения примера будет изменены следующие параметры модели:
метод агрегации - взвешенное среднее;
задано выражение агрегации;
заданы веса агрегации;
заданы параметры для расчёта релевантности структуры агрегации;
задана фильтрация агрегируемых значений.
В окно консоли будет выведено выражение, по которому рассчитывается агрегация, например:
Выражение агрегации: Afghanistan|BCA[t] = Сумма((fill(BCI[t], MsFillMethod.RandomValue)) * (BDS[t] + 2)) / Сумма(BDS[t] + 2)
Необходимые требования и результат выполнения примера Fore.NET совпадают с примером Fore.
Imports Prognoz.Platform.Interop.Cubes;
Imports Prognoz.Platform.Interop.Dimensions;
Imports Prognoz.Platform.Interop.ForeSystem;
Imports Prognoz.Platform.Interop.Ms;
Imports Prognoz.Platform.Interop.Rds;
…
[STAThread]
Public Shared Sub Main(Params: StartParams);
Var
mb: IMetabase;
RubrDescr: IMetabaseObjectDescriptor;
Rubr: IRubricator;
msDescr: IMetabaseObjectDescriptor;
Model: IMsModel;
Transform: IMsFormulaTransform;
Formula: IMsFormula;
Aggr: IMsCrossDimensionAggregationTransform;
strsGen: IMsFormulaStringGenerator;
Term: IMsFormulaTerm;
selFactory: IDimSelectionSetFactory;
SelSet: IDimSelectionSet;
Attributes: IMetaAttributes;
DictC, DictI: IMetabaseObjectDescriptor;
SliceInp: IMsFormulaTransformSlice;
Options: IMsCrossDimensionAggregationOptions;
FiltesList: IMsAggregationFilterList;
Filter: IMsAggregationFilter;
Begin
mb := Params.Metabase;
// Получаем БД временных рядов и её контейнер моделирования
RubrDescr := mb.ItemById["FC"];
Rubr := RubrDescr.Bind() As IRubricator;
msDescr := Rubr.ModelSpace;
// Получаем модель
Model := mb.ItemByIdNamespace["CROSS_DIM_AGGR", msDescr.Key].Edit() As IMsModel;
Transform := Model.Transform;
Formula := Transform.FormulaItem[0];
// Настраиваем параметры расчета агрегации
Aggr := Formula.Method As IMsCrossDimensionAggregationTransform;
Aggr.AgregationMethod := MsAgregationMethodType.mammtWeightedAverage;
selFactory := New DimSelectionSetFactory.Create();
SelSet := selFactory.CreateDimSelectionSet();
// Получаем атрибуты показателей и справочники, на которые они ссылаются
Attributes := Rubr.Facts.Attributes;
DictC := Attributes.FindById("COUNTRY").ValuesObject;
DictI := Attributes.FindById("INDICATOR").ValuesObject;
SelSet.Add(DictC.Open(Null) As IDimInstance);
SelSet.Add(DictI.Open(Null) As IDimInstance);
// Получаем элемент для выражения расчета агрегации
SelSet.Item[0].DeselectAll();
SelSet.Item[1].DeselectAll();
SelSet.Item[1].SelectElement(1, False);
SliceInp := Transform.Inputs.Add(RubrDescr.Bind() As IVariableStub).Slices.Add(SelSet);
// Задаем выражение для расчета агрегации
Term := Aggr.Operands.Add(SliceInp);
Aggr.Expression.AsString := "Fill(" + Term.TermToInnerText() + ", MsFillMethod.RandomValue)";
// Получаем элемент для выражения расчета весов
SelSet.Item[1].DeselectAll();
SelSet.Item[1].SelectElement(2, False);
SliceInp := Transform.Inputs.Add(RubrDescr.Bind() As IVariableStub).Slices.Add(SelSet);
// Задаем выражение для расчета весов
Term := Aggr.WeightsOperands.Add(SliceInp);
Aggr.WeightsExpression.AsString := Term.TermToInnerText() + "+2";
// Получаем элементы для выражения расчета релевантности структуры
SelSet.Item[1].DeselectAll();
SelSet.Item[1].SelectElement(3, False);
SliceInp := Transform.Inputs.Add(RubrDescr.Bind() As IVariableStub).Slices.Add(SelSet);
// Задаем выражение для расчета релевантости структуры
Term := Aggr.CompositionRelevanceOperands.Add(SliceInp);
Aggr.CompositionRelevanceExpression.AsString := Term.TermToInnerText() + "*2";
// Получаем элементы для выражения расчета элементов, которые будут агрегироваться без учета пропусков в данных
SelSet.Item[1].DeselectAll();
SelSet.Item[1].SelectElement(1, False);
SliceInp := Transform.Inputs.Add(RubrDescr.Bind() As IVariableStub).Slices.Add(SelSet);
// Задаем выражение для расчета элементов, которые будут агрегироваться без учета пропусков в данных
Aggr.AppliesToOperands.Add(SliceInp);
Aggr.AppliesToExpression.AsString := Term.TermToInnerText() + "-4";
// Задаем фильтр агрегации
FiltesList := Aggr.Filter;
Filter := FiltesList.Add(DictC.Bind() As IDimensionModel);
Filter.AggregationParamID := "Country_Param";
Filter.UseParamAsGroup := True;
// Задаем дополнительные параметры расчета агрегации
Options := Aggr.Options;
Options.Threshold := 20;
Options.Percentile := 50;
Options.KeepSegment := True;
// Генерируем название модели
strsGen := Formula.CreateStringGenerator();
strsGen.ShowFullVariableNames := True;
System.Diagnostics.Debug.WriteLine("Выражение агрегации: " + strsGen.Execute());
// Сохраняем модель
(Model As IMetabaseObject).Save();
End Sub;
См. также: