Получение и работа с данными объектов

После создания и настройки объектов можно перейти к наполнению их данными или получению уже имеющихся в них данных. Для получения данных объекта его необходимо открыть, для этого используется метод IMetabaseObjectDescriptor.Open или IMetabaseObjectDescriptor.OpenWithParam. Методы возвращают интерфейс IMetabaseObjectInstance, который является общим для всех открываемых объектов.

При открытии различных объектов под термином «данные» будут пониматься различные сущности. Для таблиц, запросов и представлений данными будет являться плоская таблица со значениями; при работе со справочниками под данными понимается набор элементов, каждый элемент характеризуется набором значений каких-либо атрибутов; при открытии куба, данные - это матрица значений, размер которой определяется количеством измерений куба; данными отчётов будет совокупный набор данных всех открываемых источников, на базе которых построен отчёт.

Интерфейсы, предназначенные для работы с данными различных объектов репозитория, описаны в разных сборках, например:

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

Рассмотрим примеры просмотра данных таблицы, справочника и куба:

Sub TableData;
Var
    Mb: IMetabase;
    MObjInst: IMetabaseObjectInstance;
    TableInst: IDatasetInstance;
    Fields: IDatasetInstanceFields;
    Field1, Field2, Field3: IDatasetInstanceField;
Begin
    Mb := MetabaseClass.Active;
    
// Открытие таблицы
    MObjInst := Mb.ItemById("TABLE").Open(Null);
    
// Приведение к интерфейсу, предназначенному для работы с данными таблицы
    TableInst := MObjInst As IDatasetInstance;
    
// Получение полей
    Fields := TableInst.Fields;
    Field1 := Fields.FindById(
"ID");
    Field2 := Fields.FindById(
"NAME");
    Field3 := Fields.FindById(
"VALUE");
    
// Проход всех записей и просмотр значений полей
    While Not TableInst.Eof Do
        Debug.Write(
"Идентификатор: " + Field1.Value);
        Debug.Write(
". Наименование: " + Field2.Value);
        Debug.WriteLine(
". Значение: " + Field3.Value);
        TableInst.Next;
    
End While;
End Sub TableData;

Sub DictionaryData;
Var
    Mb: IMetabase;
    MObjInst: IMetabaseObjectInstance;
    DictInst: IDimInstance;
    Elements: IDimElements;
    Attribute: IDimAttributeInstance;
    i: Integer;
Begin
    Mb := MetabaseClass.Active;
    
// Открытие справочника
    MObjInst := Mb.ItemById("DICTIONARY").Open(Null);
    
// Приведение к интерфейсу, предназначенному для работы с данными справочников
    DictInst := MObjInst As IDimInstance;
    
// Получение списка элементов
    Elements := DictInst.Elements;
    
// Получение атрибута VALUE
    Attribute := DictInst.Attributes.FindById("VALUE");
    
// Просмотр значений атрибутов для каждого элемента справочника
    For i := 0 To Elements.Count - 1 Do
        Debug.Write(
"Идентификатор: " + Elements.Id(i));
        Debug.Write(
". Наименование: " + Elements.Name(i));
        Debug.WriteLine(
". Значение: " + Elements.AttributeValueO(i, Attribute));
    
End For;
End Sub DictionaryData;

Sub CubeData;
Var
    Mb: IMetabase;
    MObjInst: IMetabaseObjectInstance;
    CubeInst: ICubeInstance;
    Destination: ICubeInstanceDestination;
    SelSet: IDimSelectionSet;
    Matr: IMatrix;
    Iter: IMatrixIterator;
Begin
    Mb := MetabaseClass.Active;
    
// Открытие справочника
    MObjInst := Mb.ItemById("STANDART_CUBE").Open(Null);
    
// Приведение к интерфейсу, предназначенному для работы с данными кубов
    CubeInst := MObjInst As ICubeInstance;
    Destination := CubeInst.Destinations.DefaultDestination;
    
// Создание и формирование отметки, по которой будет вычислена матрица значений
    SelSet := Destination.CreateDimSelectionSet;
    SelSet.FindById(
"COUNTRY").SelectElement(0False);
    SelSet.FindById(
"CALENDAR").SelectAll;
    
// Вычисление матрицы значений
    Matr := Destination.Execute(SelSet);
    
// Итератор для прохода по полученным значениям
    Iter := Matr.CreateIterator;
    Iter.Move(IteratorDirection.First);
    
While Iter.Valid Do
        Debug.Write(Iter.Value + 
" ");
        Iter.Move(IteratorDirection.Next);
    
End While;
End Sub CubeData;

Imports Prognoz.Platform.Interop.Cubes;
Imports Prognoz.Platform.Interop.Db;
Imports Prognoz.Platform.Interop.Dimensions;
Imports Prognoz.Platform.Interop.ForeSystem;
Imports Prognoz.Platform.Interop.Matrix;
Imports Prognoz.Platform.Interop.Metabase;

Public Shared Sub Main(Params: StartParams);
Var
    Mb: IMetabase;
    MObjInst: IMetabaseObjectInstance;
    TableInst: IDatasetInstance;
    Fields: IDatasetInstanceFields;
    Field1, Field2, Field3: IDatasetInstanceField;
Begin
    Mb := Params.Metabase;
    
// Открытие таблицы
    MObjInst := Mb.ItemById["TABLE"].Open(Null);
    
// Приведение к интерфейсу, предназначенному для работы с данными таблицы
    TableInst := MObjInst As IDatasetInstance;
    
// Получение полей
    Fields := TableInst.Fields;
    Field1 := Fields.FindById(
"ID");
    Field2 := Fields.FindById(
"NAME");
    Field3 := Fields.FindById(
"VALUE");
    
// Проход всех записей и просмотр значений полей
    While Not TableInst.Eof() Do
        System.Diagnostics.Debug.Write(
"Идентификатор: " + Field1.Value);
        System.Diagnostics.Debug.Write(
". Наименование: " + Field2.Value);
        System.Diagnostics.Debug.WriteLine(
". Значение: " + Field3.Value);
        TableInst.Next();
    
End While;
End Sub;

Public Shared Sub Main1(Params: StartParams);
Var
    Mb: IMetabase;
    MObjInst: IMetabaseObjectInstance;
    DictInst: IDimInstance;
    Elements: IDimElements;
    Attribute: IDimAttributeInstance;
    i: UInteger;
Begin
    Mb := Params.Metabase;
    
// Открытие справочника
    MObjInst := Mb.ItemById["DICTIONARY"].Open(Null);
    
// Приведение к интерфейсу, предназначенному для работы с данными справочников
    DictInst := MObjInst As IDimInstance;
    
// Получение списка элементов
    Elements := DictInst.Elements;
    
// Получение атрибута VALUE
    Attribute := DictInst.Attributes.FindById("VALUE");
    
// Просмотр значений атрибутов для каждого элемента справочника
    For i := 0 To Elements.Count - 1 Do
        System.Diagnostics.Debug.Write(
"Идентификатор: " + Elements.Id[i]);
        System.Diagnostics.Debug.Write(
". Наименование: " + Elements.Name[i]);
        System.Diagnostics.Debug.WriteLine(
". Значение: " + Elements.AttributeValueO[i, Attribute]);
    
End For;
End Sub;

Public Shared Sub Main2(Params: StartParams);
Var
    Mb: IMetabase;
    MObjInst: IMetabaseObjectInstance;
    CubeInst: ICubeInstance;
    Destination: ICubeInstanceDestination;
    SelSet: IDimSelectionSet;
    Matr: IMatrix;
    Iter: IMatrixIterator;
Begin
    Mb := Params.Metabase;
    
// Открытие справочника
    MObjInst := Mb.ItemById["STANDART_CUBE"].Open(Null);
    
// Приведение к интерфейсу, предназначенному для работы с данными кубов
    CubeInst := MObjInst As ICubeInstance;
    Destination := CubeInst.Destinations.DefaultDestination;
    
// Создание и формирование отметки, по которой будет вычислена матрица значений
    SelSet := Destination.CreateDimSelectionSet();
    SelSet.FindById(
"COUNTRY").SelectElement(0False);
    SelSet.FindById(
"CALENDAR").SelectAll();
    
// Вычисление матрицы значений
    Matr := Destination.Execute(SelSet, UInteger.MaxValue);
    
// Итератор для прохода по полученным значениям
    Iter := Matr.CreateIterator();
    Iter.Move(IteratorDirection.itdFirst);
    
While Iter.Valid Do
        System.Diagnostics.Debug.Write(Iter.Value + 
" ");
        Iter.Move(IteratorDirection.itdNext);
    
End While;
End Sub;

См. также:

Разработка прикладного приложения