IVirtualCubeInstance.ExecuteCallback

Синтаксис

ExecuteCallback: IVirtualCubeExecuteCallback;

ExecuteCallback: Prognoz.Platform.Interop.Cubes.IVirtualCubeExecuteCallback;

Описание

Свойство ExecuteCallback определяет обработчик событий, наступающих при расчёте виртуального куба.

Комментарии

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

Расчёт куба производится в соответствии с отметкой, которая передаётся в метод ICubeInstanceDestinationExecutor.PrepareExecute. В событиях можно задать дополнительную отметку по каждому источнику, а также получить матрицы, рассчитанные для источников.

Пример

Для выполнения примера предполагается наличие в репозитории виртуального куба с идентификатором «VIRT_CUBE». Куб построен на нескольких источниках данных.

Добавьте ссылки на системные сборки: Cubes, Dimensions, Matrix, Metabase. В Fore.NET также добавьте ссылку на сборку ForeSystem.

Sub UserProc;
Var
    Mb: IMetabase;
    Cube: ICubeInstance;
    CubeDest: ICubeInstanceDestination;
    Sels: IDimSelectionSet;
    Sel: IDimSelection;
    CubeExec: ICubeInstanceDestinationExecutor;
    MatrixVirtual : IMatrix;
Begin
    Mb := MetabaseClass.Active;
    
// Открываем куб
    Cube := Mb.ItemById("VIRT_CUBE").Open(NullAs ICubeInstance;
    CubeDest := Cube.Destinations.DefaultDestination;
    
// Обработчик событий
    (Cube As IVirtualCubeInstance).ExecuteCallback := New VirtualCubeExecCallback.Create;
    
// Отметка для выполнения
    Sels := CubeDest.CreateDimSelectionSet;
    
For Each Sel In Sels Do
        Sel.SelectElement(
0False);
    End For;
    
// Создаём объект для расчёта куба с флагом доступа к матрицам источников
    CubeExec := CubeDest.CreateExecutorO(CubeInstanceDestinationExecutorOptions.KeepSourceMatrices);
    
// Выполняем куб
    CubeExec.PrepareExecute(Sels);
    CubeExec.PerformExecute;
    
// Получаем рассчитанную матрицу с данными
    MatrixVirtual := CubeExec.Matrix;
    ShowMatrix(
"Матрица виртуального куба", MatrixVirtual);
End Sub UserProc;

Public Class VirtualCubeExecCallback: Object, IVirtualCubeExecuteCallback
    
Public Sub OnBeforeExecuteSources(Value: IVirtualCubeSourceSelections);
    
Var
        i: Integer;
        Sels: IDimSelectionSet;
        Sel: IDimSelection;
    
Begin
        
For i := 0 To Value.Count - 1 Do
            Sels := Value.Item(i).Selection;
            
// Изменение отметки для расчёта источников
            For Each Sel In Sels Do
                Sel.SelectAll;
            
End For;
        
End For;
    
End Sub OnBeforeExecuteSources;

    
Public Sub OnAfterExecuteSources(Value: IVirtualCubeSourceMatricesList);
    
Var
        i, j: Integer;
        SourceMatrix: IVirtualCubeSourceMatrix;
    
Begin
        j := Value.Count;
        Debug.WriteLine(
"Количество источников: " + j.ToString);
        
// Просмотр матриц, полученных при расчёте источников
        For i := 0 To j - 1 Do
            SourceMatrix := Value.Item(i);
            ShowMatrix(SourceMatrix.SourceKey.ToString, SourceMatrix.Matrix);
        
End For;
    
End Sub OnAfterExecuteSources;
End Class VirtualCubeExecCallback;

Sub ShowMatrix(Title: String; Matr: IMatrix);
Var
    Iter: IMatrixIterator;
Begin
    Debug.Write(Title + 
" : ");
    
If Matr.Count <> 0 Then
        Iter := Matr.CreateIterator;
        Iter.Move(IteratorDirection.First);
        
While Iter.Valid Do
            Debug.Write(Iter.Value + 
" ");
            Iter.Move(IteratorDirection.Next);
        
End While;
        Debug.WriteLine(
"");
    
Else
        Debug.WriteLine(
"Empty");
    
End If;
End Sub ShowMatrix;

Imports Prognoz.Platform.Interop.Cubes;
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;
    Cube: ICubeInstance;
    CubeDest: ICubeInstanceDestination;
    Sels: IDimSelectionSet;
    Sel: IDimSelection;
    CubeExec: ICubeInstanceDestinationExecutor;
    MatrixVirtual: IMatrix;
Begin
    Mb := Params.Metabase;
    
// Открываем куб
    Cube := Mb.ItemById["VIRT_CUBE"].Open(NullAs ICubeInstance;
    CubeDest := Cube.Destinations.DefaultDestination;
    
// Обработчик событий
    (Cube As IVirtualCubeInstance).ExecuteCallback := New VirtualCubeExecCallback();
    
// Отметка для выполнения
    Sels := CubeDest.CreateDimSelectionSet();
    
For Each Sel In Sels Do
        Sel.SelectElement(
0False);
    End For;
    
// Создаём объект для расчёта куба с флагом доступа к матрицам источников
    CubeExec := CubeDest.CreateExecutorO(CubeInstanceDestinationExecutorOptions.cideoKeepSourceMatrices As Integer);
    
// Выполняем куб
    CubeExec.PrepareExecute(Sels);
    CubeExec.PerformExecute(
False);
    
// Получаем рассчитанную матрицу с данными
    MatrixVirtual := CubeExec.Matrix;
    ShowMatrix(
"Матрица виртуального куба", MatrixVirtual);
End Sub;

Public Class VirtualCubeExecCallback: IVirtualCubeExecuteCallback
    
Public Sub OnBeforeExecuteSources(Value: IVirtualCubeSourceSelections);
    
Var
        i: Integer;
        Sels: IDimSelectionSet;
        Sel: IDimSelection;
    
Begin
        
For i := 0 To Value.Count - 1 Do
            Sels := Value.Item[i].Selection;
            
// Изменение отметки для расчёта источников
            For Each Sel In Sels Do
                Sel.SelectAll();
            
End For;
        
End For;
    
End Sub;

    
Public Sub OnAfterExecuteSources(Value: IVirtualCubeSourceMatricesList);
    
Var
        i, j: Integer;
        SourceMatrix: IVirtualCubeSourceMatrix;
    
Begin
        j := Value.Count;
        System.Diagnostics.Debug.WriteLine(
"Количество источников: " + j.ToString());
        
// Просмотр матриц, полученных при расчёте источников
        For i := 0 To j - 1 Do
            SourceMatrix := Value.Item[i];
            ShowMatrix(SourceMatrix.SourceKey.ToString(), SourceMatrix.Matrix);
        
End For;
    
End Sub;
End Class;

Sub ShowMatrix(Title: String; Matr: IMatrix);
Var
    Iter: IMatrixIterator;
Begin
    System.Diagnostics.Debug.Write(Title + 
" : ");
    
If Matr.Count <> 0 Then
        Iter := Matr.CreateIterator();
        Iter.Move(IteratorDirection.itdFirst);
        
While Iter.Valid Do
            System.Diagnostics.Debug.Write(Iter.Value + 
" ");
            Iter.Move(IteratorDirection.itdNext);
        
End While;
        System.Diagnostics.Debug.WriteLine(
"");
    
Else
        System.Diagnostics.Debug.WriteLine(
"Empty");
    
End If;
End Sub;

При выполнении примера будет осуществлён расчёт виртуального куба. Сам виртуальный куб рассчитывается по единичной отметке в измерениях, а его источники будут рассчитаны по максимальным отметкам. Результирующие матрицы источников и виртуального куба будут выведены в консоль среды разработки.

См. также:

IVirtualCubeInstance