IMsCrossDimensionAggregationTransform.AppliesToExpression

Синтаксис Fore

AppliesToExpression: IExpression;

Синтаксис Fore.NET

AppliesToExpression: Prognoz.Platform.Interop.ForeSystem.IExpression;

Описание

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

Комментарии

Коллекцию элементов, которые могут быть использованы в выражении, возвращает свойство IMsCrossDimensionAggregationTransform.AppliesToOperands.

Пример Fore

Для выполнения примера предполагается наличие в репозитории базы данных временных рядов с идентификатором «FC». «COUNTRY» и «INDICATOR» - атрибуты показателей данной базы, ссылающиеся на справочники. В контейнере моделирования данной базы должны присутствовать:

Добавьте ссылки на системные сборки «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(NullAs IDimInstance);
    SelSet.Add(DictI.Open(NullAs IDimInstance);
    // Получаем элемент для выражения расчета агрегации 
    SelSet.Item(0).DeselectAll;
    SelSet.Item(1).DeselectAll;
    SelSet.Item(1).SelectElement(1False);
    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(2False);
    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(3False);
    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(1False);
    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.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(NullAs IDimInstance);
    SelSet.Add(DictI.Open(NullAs IDimInstance);
    // Получаем элемент для выражения расчета агрегации 
    SelSet.Item[0].DeselectAll();
    SelSet.Item[1].DeselectAll();
    SelSet.Item[1].SelectElement(1False);
    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(2False);
    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(3False);
    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(1False);
    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;

См. также:

IMsCrossDimensionAggregationTransform