IMatrixEx.CreateWritableProxyO

Синтаксис

CreateWritableProxyO(Options: Integer): IMatrix;

CreateWritableProxyO(Options: integer): Prognoz.Platform.Interop.Matrix.IMatrix;

Параметры

Options. Параметры создания объекта-посредника матрицы данных.

Описание

Метод CreateWritableProxyO создает объект-посредник матрицы данных.

Комментарии

В параметре Options используйте значение «0». Создаваемый объект посредник позволяет раздельно работать с исходными и изменёнными данными матрицы. Для управления данными приведите результат метода CreateWritableProxyO к интерфейсу IMatrixWritableProxy.

Пример

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

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

Sub UserProc;
Var
    MB: IMetabase;
    CubeInst: ICubeInstance;
    DefDest: ICubeInstanceDestination;
    SelSet: IDimSelectionSet;
    i: integer;
    DestExec: ICubeInstanceDestinationExecutor;
    Proxy: IMatrix;
    Wp: IMatrixWritableProxy;
    Iter: IMatrixIterator;
    Mc: IMatrixCoord;
Begin
    MB := MetabaseClass.Active;
    CubeInst := MB.ItemById(
"CUBE").Open(NullAs ICubeInstance;
    DefDest := CubeInst.Destinations.DefaultDestination;
    SelSet := DefDest.CreateDimSelectionSet;
    
For i := 0 To SelSet.Count - 1 Do
        SelSet.Item(i).SelectAll;
    
End For;
    DestExec := DefDest.CreateExecutorO(CubeInstanceDestinationExecutorOptions.MatrixProxy);
    DestExec.PrepareExecute(SelSet);
    DestExec.PerformExecute(
False);
    Proxy := (DestExec.Matrix 
As IMatrixEx).CreateWritableProxyO(0);
    Wp := Proxy 
As IMatrixWritableProxy;
    Debug.WriteLine(
"---------------Исходные значения в матрице и матрице-посреднике-------------------");
        ShowMatrix(
"Proxy", Proxy);
        ShowMatrix(
"BaseMatrix", Wp.BaseMatrix);
        ShowMatrix(
"ChangeMatrix", Wp.ChangeMatrix);
    Debug.WriteLine(
"---------------Добавление нового значения-----------------------------------------");
    Mc := Proxy.CreateCoord;
    Iter := Proxy.CreateIterator;
    Iter.Move(IteratorDirection.First);
    Iter.PutCurrentPos(Mc);
    
For i := 0 To Mc.Count - 1 Do
        Mc.Item(i) := Mc.Item(i) + 
1
    
End For;
    
//Проверка, существует ли координата
    Iter.Goto(Mc);
    
If Iter.Valid Then
        Debug.WriteLine(
"Координата уже существует.");
    
Else
        Debug.WriteLine(
"Координата еще не существует.");
    
End If;
    
//Переход к координате и задание значения. Если координата еще не существует, то матрица будет расширена
    Iter.PutCoord(Mc);
    Iter.Value := 
100500;
    Debug.WriteLine(
"Новое значение = " + Iter.Value);
    Debug.WriteLine(
"---------------Изменённые/добавленные значения------------------------------------");
        ShowMatrix(
"Proxy", Proxy);
        ShowMatrix(
"BaseMatrix", Wp.BaseMatrix);
        ShowMatrix(
"ChangeMatrix", Wp.ChangeMatrix);
    Debug.WriteLine(
"---------------после ApplyChanges-------------------------------------------------");
    Wp.ApplyChanges;
        ShowMatrix(
"Proxy", Proxy);
        ShowMatrix(
"BaseMatrix", Wp.BaseMatrix);
        ShowMatrix(
"ChangeMatrix", Wp.ChangeMatrix);
    Debug.WriteLine(
"---------------Повторное изменение значения по координате-------------------------");
    Iter.PutCoord(Mc);
    Iter.Value := -Iter.Value;
    Debug.WriteLine(
"Новое значение = " + Iter.Value);
    Debug.WriteLine(
"---------------Изменённые/добавленные значения------------------------------------");
        ShowMatrix(
"Proxy", Proxy);
        ShowMatrix(
"BaseMatrix", Wp.BaseMatrix);
        ShowMatrix(
"ChangeMatrix", Wp.ChangeMatrix);
    Debug.WriteLine(
"---------------после RevertChanges------------------------------------------------");
    Wp.RevertChanges;
        ShowMatrix(
"Proxy", Proxy);
        ShowMatrix(
"BaseMatrix", Wp.BaseMatrix);
        ShowMatrix(
"ChangeMatrix", Wp.ChangeMatrix);
End Sub UserProc;

Sub ShowMatrix(MatrixName: String; Matr: IMatrix);
Var
    Iter: IMatrixIterator;
Begin
    Debug.Write(MatrixName + 
" : ");
    
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;
    CubeInst: ICubeInstance;
    DefDest: ICubeInstanceDestination;
    SelSet: IDimSelectionSet;
    i: integer;
    DestExec: ICubeInstanceDestinationExecutor;
    Proxy: IMatrix;
    Wp: IMatrixWritableProxy;
    Iter: IMatrixIterator;
    Mc: IMatrixCoord;
    d: double;
Begin
    MB := Params.Metabase;
    CubeInst := MB.ItemById[
"CUBE"].Open(NullAs ICubeInstance;
    DefDest := CubeInst.Destinations.DefaultDestination;
    SelSet := DefDest.CreateDimSelectionSet();
    
For i := 0 To SelSet.Count - 1 Do
        SelSet.Item[i].SelectAll();
    
End For;
    DestExec := DefDest.CreateExecutorO(CubeInstanceDestinationExecutorOptions.cideoMatrixProxy 
As Integer);
    DestExec.PrepareExecute(SelSet);
    DestExec.PerformExecute(
False);
    Proxy := (DestExec.Matrix 
As IMatrixEx).CreateWritableProxyO(0);
    Wp := Proxy 
As IMatrixWritableProxy;
    System.Diagnostics.Debug.WriteLine(
"---------------Исходные значения в матрице и матрице-посреднике-------------------");
        ShowMatrix(
"Proxy", Proxy);
        ShowMatrix(
"BaseMatrix", Wp.BaseMatrix);
        ShowMatrix(
"ChangeMatrix", Wp.ChangeMatrix);
    System.Diagnostics.Debug.WriteLine(
"---------------Добавление нового значения-----------------------------------------");
    Mc := Proxy.CreateCoord();
    Iter := Proxy.CreateIterator();
    Iter.Move(IteratorDirection.itdFirst);
    Iter.PutCurrentPos(Mc);
    
For i := 0 To Mc.Count - 1 Do
        Mc.Item[i] := Mc.Item[i] + 
1
    
End For;
    
//Проверка, существует ли координата
    Iter.Goto(Mc);
    
If Iter.Valid Then
        System.Diagnostics.Debug.WriteLine(
"Координата уже существует.");
    
Else
        System.Diagnostics.Debug.WriteLine(
"Координата еще не существует.");
    
End If;
    
//Переход к координате и задание значения. Если координата еще не существует, то матрица будет расширена
    Iter.PutCoord(Mc);
    Iter.Value := 
100500;
    System.Diagnostics.Debug.WriteLine(
"Новое значение = " + Iter.Value);
    System.Diagnostics.Debug.WriteLine(
"---------------Изменённые/добавленные значения------------------------------------");
        ShowMatrix(
"Proxy", Proxy);
        ShowMatrix(
"BaseMatrix", Wp.BaseMatrix);
        ShowMatrix(
"ChangeMatrix", Wp.ChangeMatrix);
    System.Diagnostics.Debug.WriteLine(
"---------------после ApplyChanges-------------------------------------------------");
    Wp.ApplyChanges();
        ShowMatrix(
"Proxy", Proxy);
        ShowMatrix(
"BaseMatrix", Wp.BaseMatrix);
        ShowMatrix(
"ChangeMatrix", Wp.ChangeMatrix);
    System.Diagnostics.Debug.WriteLine(
"---------------Повторное изменение значения по координате-------------------------");
    Iter.PutCoord(Mc);
    d := double.Parse(Iter.Value.ToString());
    Iter.Value := -d;
    System.Diagnostics.Debug.WriteLine(
"Новое значение = " + Iter.Value);
    System.Diagnostics.Debug.WriteLine(
"---------------Изменённые/добавленные значения------------------------------------");
        ShowMatrix(
"Proxy", Proxy);
        ShowMatrix(
"BaseMatrix", Wp.BaseMatrix);
        ShowMatrix(
"ChangeMatrix", Wp.ChangeMatrix);
    System.Diagnostics.Debug.WriteLine(
"---------------после RevertChanges------------------------------------------------");
    Wp.RevertChanges();
        ShowMatrix(
"Proxy", Proxy);
        ShowMatrix(
"BaseMatrix", Wp.BaseMatrix);
        ShowMatrix(
"ChangeMatrix", Wp.ChangeMatrix);
End Sub;

Shared Sub ShowMatrix(MatrixName: String; Matr: IMatrix);
Var
    Iter: IMatrixIterator;
Begin
    System.Diagnostics.Debug.Write(MatrixName + 
" : ");
    
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;

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

См. также:

IMatrixEx