Получение диапазона дат для найденных временных рядов

Приведен пример поиска временных рядов в базе данных временных рядов. Будут найдены все временные ряды, которые в названии содержат слово «млн». Затем для данных рядов будет получена информация: на какой первый и последний годы есть данные.

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

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

Пример Fore

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

Sub FactorsLookup;
Var
    mb: IMetabase;
    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: Array Of Integer;
    i: Integer;
    Loo: IMetaDictionaryLookup;
    Cond: IOrmCondition;
    resV: Array Of Variant;
    min, max: DateTime;
    v: Variant;
    Members: IMetaDataMembers;
Begin
    // Получаем репозиторий
    mb := MetabaseClass.Active;
    // Получаем экземпляр базы данных временных рядов «TSDB»
    RubI := mb.ItemById("TSDB").Open(NullAs 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
            // Преобразуем массив найденных ключей в массив типа Variant
            resV := New Variant[res.Length];
            For i := 0 To res.Length - 1 Do
                resV[i] := res[i];
            End For;
            // Создаем объект для поиска временных рядов по заданным значениям атрибутов
            Loo := RubI.Values.CreateLookup;
            // Указываем, что ищем по последней актуальной ревизии
            Loo.WhereRevisionKey := -1;
            // Указываем, что временные ряды не должны быть удалены
            Loo.WhereIsDeleted := TriState.OffOption;
            // Ограничиваем поиск временными рядами, содержащими в названии текст «млн»
            Cond := Loo.Where.Add;
            Cond.AttributeName := "FACTOR";
            Cond.Operator_ := OrmComparisonOperator.In_;
            Cond.Value := resV;
            // Получаем найденные временные ряды
            Loo.Open(DictionaryCursorOptions.None);
            // Получаем данные найденных рядов
            Members := Loo.Current.Record.Members;
            // Получаем дату наблюдения временного ряда
            min := Members.FindById("DT").Value;
            max := min;
            // Выбираем минимальную и максимальные даты временных рядов
            While Not Loo.Eof Do
                Members := Loo.Current.Record.Members;
                v := Members.FindById("DT").Value;
                If v <= min Then
                    min := v
                Else
                    max := v > max ? v : max;
                End If;
                Loo.Next;
            End While;
            // Закрываем объект для поиска временных рядов
            Loo.Close;
            // Выводим результаты в окно консоли
            Debug.WriteLine(" - минимальная дата: " + min.ToString);
            Debug.WriteLine(" - максимальная дата: " + max.ToString);
        End If;
    End If;
End Sub FactorsLookup;

Пример Fore.NET

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

Public Shared Sub Main(Params: StartParams);
Var
    mb: IMetabase;
    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: System.Array;
    i: Integer;
    Loo: IMetaDictionaryLookup;
    Cond: IOrmCondition;
    resV: Array Of object;
    min, max: DateTime;
    v: object;
    Members: IMetaDataMembers;
Begin
    // Получаем репозиторий
    mb := Params.Metabase;
    // Получаем экземпляр базы данных временных рядов «TSDB»
    RubI := mb.ItemById["TSDB"].Open(NullAs 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
            // Преобразуем массив найденных ключей в массив типа object
            resV := New Object[res.Length];
            For i := 0 To res.Length - 1 Do
                resV[i] := res[i];
            End For;
            // Создаем объект для поиска временных рядов по заданным значениям атрибутов
            Loo := RubI.Values.CreateLookup("");
            // Указываем, что ищем по последней актуальной ревизии
            Loo.WhereRevisionKey := -1 As uinteger;
            // Указываем, что временные ряды не должны быть удалены
            Loo.WhereIsDeleted := TriState.tsOffOption;
            // Ограничиваем поиск временными рядами, содержащими в названии текст «млн»
            Cond := Loo.Where.Add();
            Cond.AttributeName := "FACTOR";
            Cond.Operator := OrmComparisonOperator.ocoIn;
            Cond.Value := resV;
            // Получаем найденные временные ряды
            Loo.Open(DictionaryCursorOptions.dcuoNone);
            // Получаем данные найденных рядов
            Members := Loo.Current.Record.Members;
            // Получаем дату наблюдения временного ряда
            min := Members.FindById("DT").Value As DateTime;
            max := min;
            // Выбираем минимальную и максимальные даты временных рядов
            While Not Loo.Eof() Do
                Members := Loo.Current.Record.Members;
                v := Members.FindById("DT").Value;
                If (v As DateTime) <= min Then
                    min := v As DateTime;
                Else
                    max := (v As DateTime) > max ?(v As DateTime) : max;
                End If;
                Loo.Next();
            End While;
            // Закрываем объект для поиска временных рядов
            Loo.Close();
            // Выводим результаты в окно консоли
            System.Diagnostics.Debug.WriteLine(" - минимальная дата: " + min.ToString());
            System.Diagnostics.Debug.WriteLine(" - максимальная дата: " + max.ToString());
        End If;
    End If;
End Sub;

См. также:

Примеры