ICubeInstanceStorage.SaveMatrixEx

Синтаксис

SaveMatrixEx(Matrix: IMatrix; ValueFlags: Array);

SaveMatrixEx(Matrix: Prognoz.Platform.Interop.Matrix.IMatrix; ValueFlags: Array);

Параметры

Matrix. Матрица, содержащая значения, которые необходимо сохранить обратно в куб.

ValueFlags. Массив флагов элементов, содержащих изменённые значения. В куб будут сохраняться, только те элементы матрицы, флаг которых соответствует одному из значений данного массива.

Описание

Метод SaveMatrixEx осуществляет сохранение матрицы с данными в куб по нескольким флагам изменённых значений.

Пример

Для выполнения примера предполагается наличие в репозитории куба с идентификатором «STD_CUBE». В кубе имеются три измерения с идентификаторами «FACTS», «CALENDAR» и «COUNTRY».

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

Sub UserProc;
Var
    MB: IMetabase;
    CubInst: ICubeInstance;
    Des: ICubeInstanceDestination;
    Sels: IDimSelectionSet;
    Matr: IMatrix;
    Iter: IMatrixIterator;
    Coord: IMatrixCoord;
    Sto: ICubeInstanceStorage;
    i: Integer;
    ValueFlags: Array 
Of Integer;
Begin
    MB := MetabaseClass.Active;
    CubInst := MB.ItemById(
"STD_CUBE").Open(NullAs ICubeInstance;
    Des := CubInst.Destinations.DefaultDestination;
    
//Отметка куба
    Sels := Des.CreateDimSelectionSet;
    Sels.FindById(
"FACTS").SelectElement(0False); //Факт
    Sels.FindById("CALENDAR").SelectElement(0False); //Календарь
    Sels.FindById("COUNTRY").SelectAll; //Страны
    //Получение матрицы значений по указанной отметке
    Matr := Des.Execute(Sels);
    Iter := Matr.CreateIterator;
    Coord := Matr.CreateCoord;
    
For i := 0 To Matr.DimensionCount - 1 Do
        Coord.Item(i) := 
0;
    
End For;
    
//Изменение значения по первой стране
    Iter.PutCoord(Coord);
    Iter.Value := Iter.Value + 
1;
    Iter.ValueFlag := 
1;
    
//Изменение координаты
    Coord.Item(2) := 1;
    
//Изменение значения по второй стране
    Iter.PutCoord(Coord);
    Iter.Value := Iter.Value + 
2;
    Iter.ValueFlag := 
2;
    
//Массив флагов изменившихся данных, по которым производится сохранение
    ValueFlags := New Integer[2];
    ValueFlags[
0] := 1;
    ValueFlags[
1] := 2;
    
//Объект для сохранения данных в куб
    Sto := Des.CreateStorage(CubeInstanceStorageOptions.None);
    
//Обработчик процесса сохранения данных
    Sto.SaveMatrixCallback := New TCubeSaveCallback.Create;
    
//Сохранение значений
    Sto.SaveMatrixEx(Matr, ValueFlags);
End Sub UserProc;

Class TCubeSaveCallback: CubeCallback
    
Public Sub OnAfterSave(Argument: ICubeCallbackSaveArgument);
    
Var
        Matr: IMatrix;
        Iter: IMatrixIterator;
        i: Integer;
    
Begin
        Debug.WriteLine(
"---Данные сохранены---");
        Debug.WriteLine(
"Флаги изменённых данных, по которым производилось сохранение:");
        
For Each i In Argument.ValueFlags Do
            Debug.Write(i.ToString + 
" ");
        
End For;
        Debug.WriteLine(
"");
        Debug.WriteLine(
"Сохраняемая матрица:");
        Matr := Argument.ValueMatrix;
        Iter := Matr.CreateIterator;
        Iter.Move(IteratorDirection.First);
        
While Iter.Valid Do
            Debug.Write(iter.Value + 
" ");
            Iter.Move(IteratorDirection.Next);
        
End While;
        Debug.WriteLine(
"");
        Debug.WriteLine(
"Изменённые значения:");
        Matr := Argument.FilteredMatrix;
        Iter := Matr.CreateIterator;
        Iter.Move(IteratorDirection.First);
        
While Iter.Valid Do
            Debug.Write(iter.Value + 
" ");
            Iter.Move(IteratorDirection.Next);
        
End While;
        Debug.WriteLine(
"");
    
End Sub OnAfterSave;
End Class TCubeSaveCallback;

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;
    CubInst: ICubeInstance;
    Des: ICubeInstanceDestination;
    Sels: IDimSelectionSet;
    Matr: IMatrix;
    Iter: IMatrixIterator;
    Coord: IMatrixCoord;
    Sto: ICubeInstanceStorage;
    i: Integer;
    ValueFlags: Array 
Of Integer;
Begin
    MB := Params.Metabase;
    CubInst := MB.ItemById[
"STD_CUBE"].Open(NullAs ICubeInstance;
    Des := CubInst.Destinations.DefaultDestination;
    
//Отметка куба
    Sels := Des.CreateDimSelectionSet();
    Sels.FindById(
"FACTS").SelectElement(0False); //Факт
    Sels.FindById("CALENDAR").SelectElement(0False); //Календарь
    Sels.FindById("COUNTRY").SelectAll(); //Страны
    //Получение матрицы значений по указанной отметке
    Matr := Des.Execute(Sels, uinteger.MaxValue);
    Iter := Matr.CreateIterator();
    Coord := Matr.CreateCoord();
    
For i := 0 To Matr.DimensionCount - 1 Do
        Coord.Item[i] := 
0;
    
End For;
    
//Изменение значения по первой стране
    Iter.PutCoord(Coord);
    Iter.Value := (Iter.Value 
As Double) + 1;
    Iter.ValueFlag := 
1;
    
//Изменение координаты
    Coord.Item[2] := 1;
    
//Изменение значения по второй стране
    Iter.PutCoord(Coord);
    Iter.Value := (Iter.Value 
As Double) + 2;
    Iter.ValueFlag := 
2;
    
//Массив флагов изменившихся данных, по которым производится сохранение
    ValueFlags := New Integer[2];
    ValueFlags[
0] := 1;
    ValueFlags[
1] := 2;
    
//Объект для сохранения данных в куб
    Sto := Des.CreateStorage(CubeInstanceStorageOptions.cisoNone);
    
//Обработчик процесса сохранения данных
    Sto.SaveMatrixCallback := New TCubeSaveCallback();
    
//Сохранение значений
    Sto.SaveMatrixEx(Matr, ValueFlags);
End Sub;

Class TCubeSaveCallback: ICubeSaveMatrixCallback
    
Public Sub OnBeforeSave(Argument: ICubeCallbackBeforeSaveArgument);
    
Begin
    
End Sub;

    
Public Sub OnAfterSave(Argument: ICubeCallbackSaveArgument);
    
Var
        Matr: IMatrix;
        Iter: IMatrixIterator;
        i: Integer;
    
Begin
        System.Diagnostics.Debug.WriteLine(
"---Данные сохранены---");
        System.Diagnostics.Debug.WriteLine(
"Флаги изменённых данных, по которым производилось сохранение:");
        
For Each i In Argument.ValueFlags Do
            System.Diagnostics.Debug.Write(i.ToString() + 
" ");
        
End For;
        System.Diagnostics.Debug.WriteLine(
"");
        System.Diagnostics.Debug.WriteLine(
"Сохраняемая матрица:");
        Matr := Argument.ValueMatrix;
        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(
"");
        System.Diagnostics.Debug.WriteLine(
"Изменённые значения:");
        Matr := Argument.FilteredMatrix;
        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(
"");
    
End Sub;
End Class;

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

См. также:

ICubeInstanceStorage