Поиск временных рядов

Приведен пример поиска временных рядов в базе данных временных рядов, являющейся источником данных для экспресс-отчета. Будут найдены все временные ряды, которые имеют данные и в названии содержат слово «млн».

Для выполнения примера в репозитории предполагается наличие экспресс-отчета с идентификатором «REPORT_LOOKUP». Источником данных для отчета является база данных временных рядов, содержащая пользовательские атрибуты временных рядов с идентификаторами «INDICATOR» и «CITY». Данные атрибуты являются ссылками на справочники.

В результате выполнения примера в окно консоли будут выведены наименования найденных рядов.

Пример Fore

Добавьте ссылки на системные сборки: Cubes, Dimensions, Express, Metabase, Orm, Pivot, Rds.

Sub FactorsLookup;
Var
    mb: IMetabase;
    Eax: IEaxAnalyzer;
    Cube: ICubeInstance;
    RubI: IRubricatorInstance;
    Rub: IRubricator;
    DictionaryInstance: IMetaDictionaryInstance;
    resSelSet,SelectionSet: IDimSelectionSet;
    factLookup: IRubricatorFactsLookup;
    criteria: IDimTextCriteria;
    factory: IDimSelectionSetFactory;
    selection: IDimSelection;
    attributes: IMetaAttributes;
    attr: IMetaAttribute;
    id: string;
    IsSelectionSetEmpty: Boolean;
    res, Arr: array Of Integer;
    i: Integer;
    isFind: Boolean = False;
    Loo: IMetaDictionaryLookup;
    Cond: IOrmCondition;
Begin
    // Получаем репозиторий
    mb := MetabaseClass.Active;
    // Получаем экспресс-отчет «REPORT_LOOKUP»
    Eax := mb.ItemById("REPORT_LOOKUP").Bind As IEaxAnalyzer;
    // Получаем источник данных экспресс-отчета в виде куба
    Cube := (Eax.Pivot.DataSource As ICubeInstanceDestination).Cube;
    // Если источником данных экспресс-отчета является база данных
    // временных рядов, то выполняем поиск
    If Cube Is IRubricatorInstance Then
        // Получаем экземпляр базы данных временных рядов
        RubI := Cube As IRubricatorInstance;
        Rub := RubI.Rubricator;
        Debug.WriteLine("Поиск в базе данных временных рядов '" + (Rub As IMetabaseObject).Name + "':");
        // Получаем справочник временных рядов
        DictionaryInstance := RubI.GetDictionary(RubricatorDictionary.Facts);
        // Создаем объект для поиска временных рядов
        factLookup := RubI.CreateFactsLookup;
        // Задаем критерии поиска
        criteria := New DimTextCriteria.Create;
        // Выполняем поиск вхождения искомого слова в значения строковых атрибутов
        criteria.CriteriaOptions := TextCriteriaOptions.SearchStringAttributes Or TextCriteriaOptions.FreeText;
        // Задаем искомое слово
        criteria.Text := "млн";
        // Выполняем поиск среди элементов, отмеченных в измерениях базы данных временных рядов
        criteria.SelectOptions := ConditionSelectOptions.SelectedOnly;
        // Создаем отметку в измерениях базы данных временных рядов
        factory := New DimSelectionSetFactory.Create;
        SelectionSet := factory.CreateDimSelectionSet;
        // Получаем все атрибуты временных рядов
        attributes := Rub.Facts.Attributes;
        // Перебираем все атрибуты временных рядов
        For Each Attr In attributes Do
            id := Attr.Id;
            // Если это атрибут «INDICATOR» или «CITY»,
            // то отмечаем все элементы в измерении, основанном на данном атрибуте
            If (Id = "INDICATOR"Or (Id = "CITY"Then
                selection := SelectionSet.Add(Attr.ValuesObject.Open(NullAs IDimInstance);
                selection.SelectAll;
            End If;
        End For;
        // Выполняем фильтрацию атрибутов по заданным параметрам
        resSelSet := factLookup.SetTextCriteria(criteria, SelectionSet);
        // Проверяем, найдены ли временные ряды с соответствующим текстом
        selection := Null;
        For Each selection In resSelSet Do
            If selection.SelectedCount > 0 Then
                IsSelectionSetEmpty := False;
                Else IsSelectionSetEmpty := True;
            End If;
        End For;
        // Если временные ряды найдены, то проверяем, содержат ли они данные
        If Not IsSelectionSetEmpty Then
            // Получаем ключи найденных временных рядов
            res := factLookup.LookupFactors;
            If (Not IsNULL(res)) And (res.Length <> 0Then
                // Создаем объект для поиска временных рядов по заданным значениям атрибутов
                Loo := RubI.Values.CreateLookup;
                // Указываем, что ищем по последней актуальной ревизии
                Loo.WhereRevisionKey := -1;
                // Указываем, что временные ряды не должны быть удалены
                Loo.WhereIsDeleted := TriState.OffOption;
                // Указываем, что у временных рядов должны быть данные
                Cond := Loo.Where.Add;
                Cond.AttributeName := "VL";
                Cond.Operator_ := OrmComparisonOperator.IsNotNull;
                // Ограничиваем поиск временными рядами, содержащими в названии текст «млн»
                Cond := Loo.Where.Add;
                Cond.AttributeName := "FACTOR";
                Cond.Operator_ := OrmComparisonOperator.In_;
                //Cond.Value := arr2;
                Cond.Value := res;
                // Получаем ключи найденных временных рядов
                arr := Loo.LookupKeys("FACTOR");
                // Получаем признак того, найдены ли временные ряды
                isFind := (Not isNULL(arr) And (arr.Length > 0));
                // Выводим в окно консоли мнемоники найденных временных рядов
                For i := 0 To arr.Length - 1 Do
                    Debug.WriteLine(#9 + RubI.GetFactData(arr[i]).Mnemo);
                End For;
            End If;
        End If;
        // Если временные ряды не найдены, то выводим в окно консоли соответствующее сообщение
        If Not isFind Then
            Debug.WriteLine(#9 + "Временные ряды не найдены или найденные временные ряды не содержат данных");
        End If;
    End If;
End Sub FactorsLookup;

Пример Fore.NET

Imports Prognoz.Platform.Interop.Cubes;
Imports Prognoz.Platform.Interop.Dimensions;
Imports Prognoz.Platform.Interop.Express;
Imports Prognoz.Platform.Interop.ForeSystem;
Imports Prognoz.Platform.Interop.Metabase;
Imports Prognoz.Platform.Interop.Orm;
Imports Prognoz.Platform.Interop.Pivot;
Imports Prognoz.Platform.Interop.Rds;

Public Shared Sub Main(Params: StartParams);
Var
    mb: IMetabase;
    Eax: IEaxAnalyzer;
    Cube: ICubeInstance;
    RubI: IRubricatorInstance;
    Rub: IRubricator;
    DictionaryInstance: IMetaDictionaryInstance;
    resSelSet, SelectionSet: IDimSelectionSet;
    factLookup: IRubricatorFactsLookup;
    criteria: DimTextCriteria;
    factory: IDimSelectionSetFactory;
    selection: IDimSelection;
    attributes: IMetaAttributes;
    attr: IMetaAttribute;
    id: string;
    IsSelectionSetEmpty: Boolean;
    res, Arr: System.Array;
    i: Integer;
    isFind: Boolean = False;
    Loo: IMetaDictionaryLookup;
    Cond: IOrmCondition;
    key: uinteger;
Begin
    // Получаем репозиторий
    mb := Params.Metabase;
    // Получаем экспресс-отчет «REPORT_LOOKUP»
    Eax := mb.ItemById["REPORT_LOOKUP"].Bind() As IEaxAnalyzer;
    // Получаем источник данных экспресс-отчета в виде куба
    Cube := (Eax.Pivot.DataSource As ICubeInstanceDestination).Cube;
    // Если источником данных экспресс-отчета является база данных
    // временных рядов, то выполняем поиск
    If Cube Is IRubricatorInstance Then
        // Получаем экземпляр базы данных временных рядов
        RubI := Cube As IRubricatorInstance;
        Rub := RubI.Rubricator;
        System.Diagnostics.Debug.WriteLine("Поиск в базе данных временных рядов '" + (Rub As IMetabaseObject).Name + "':");
        // Получаем справочник временных рядов
        DictionaryInstance := RubI.GetDictionary(RubricatorDictionary.rubdicFacts);
        // Создаем объект для поиска временных рядов
        factLookup := RubI.CreateFactsLookup();
        // Задаем критерии поиска
        criteria := New DimTextCriteria.Create();
        // Выполняем поиск вхождения искомого слова в значения строковых атрибутов
        criteria.CriteriaOptions := TextCriteriaOptions.tecropSearchStringAttributes Or TextCriteriaOptions.tecropFreeText;
        // Задаем искомое слово
        criteria.Text := "млн";
        // Выполняем поиск среди элементов, отмеченных в измерениях базы данных временных рядов
        criteria.SelectOptions := ConditionSelectOptions.coseopSelectedOnly;
        // Создаем отметку в измерениях базы данных временных рядов
        factory := New DimSelectionSetFactory.Create();
        SelectionSet := factory.CreateDimSelectionSet();
        // Получаем все атрибуты временных рядов
        attributes := Rub.Facts.Attributes;
        // Перебираем все атрибуты временных рядов
        For Each Attr In attributes Do
            id := Attr.Id;
            // Если это атрибут «INDICATOR» или «CITY»,
            // то отмечаем все элементы в измерении, основанном на данном атрибуте
            If (Id = "INDICATOR"Or (Id = "CITY"Then
                selection := SelectionSet.Add(Attr.ValuesObject.Open(NullAs IDimInstance);
                selection.SelectAll();
            End If;
        End For;
        // Выполняем фильтрацию атрибутов по заданным параметрам
        resSelSet := factLookup.SetTextCriteria(criteria, SelectionSet);
        // Проверяем, найдены ли временные ряды с соответствующим текстом
        selection := Null;
        For Each selection In resSelSet Do
            If selection.SelectedCount > 0 Then
                IsSelectionSetEmpty := False;
                Else IsSelectionSetEmpty := True;
            End If;
        End For;
        // Если временные ряды найдены, то проверяем, содержат ли они данные
        If Not IsSelectionSetEmpty Then
            // Получаем ключи найденных временных рядов
            res := factLookup.LookupFactors();
            If (res <> NullAnd (res.Length <> 0Then
                // Создаем объект для поиска временных рядов по заданным значениям атрибутов
                Loo := RubI.Values.CreateLookup("");
                // Указываем, что ищем по последней актуальной ревизии
                Loo.WhereRevisionKey := -1 As uinteger;
                // Указываем, что временные ряды не должны быть удалены
                Loo.WhereIsDeleted := TriState.tsOffOption;
                // Указываем, что у временных рядов должны быть данные
                Cond := Loo.Where.Add();
                Cond.AttributeName := "VL";
                Cond.Operator := OrmComparisonOperator.ocoIsNotNull;
                // Ограничиваем поиск временными рядами, содержащими в названии текст «млн»
                Cond := Loo.Where.Add();
                Cond.AttributeName := "FACTOR";
                Cond.Operator := OrmComparisonOperator.ocoIn;
                //Cond.Value := arr2;
                Cond.Value := res;
                // Получаем ключи найденных временных рядов
                arr := Loo.LookupKeys("FACTOR");
                // Получаем признак того, найдены ли временные ряды
                isFind := ((arr <> NullAnd (arr.Length > 0));
                // Выводим в окно консоли мнемоники найденных временных рядов
                For i := 0 To arr.Length - 1 Do
                    key := integer.Parse(arr[i].ToString()) As uinteger;
                    System.Diagnostics.Debug.WriteLine(char.ConvertFromUtf32(9) +
                        RubI.GetFactData(key, DictionaryGetDataOptions.dgdoNone).Mnemo);
                End For;
            End If;
        End If;
        // Если временные ряды не найдены, то выводим в окно консоли соответствующее сообщение
        If Not isFind Then
            System.Diagnostics.Debug.WriteLine(char.ConvertFromUtf32(9) +
                "Временные ряды не найдены или найденные временные ряды не содержат данных");
        End If;
    End If;
End Sub;

См. также:

Примеры