ReadAttachments(Iterator: IMatrixModelIterator): ICubeAttachments;
ReadAttachments(Iterator: Prognoz.Platform.Interop.ForeSystem.IMatrixModelIterator): Prognoz.Platform.Interop.Cubes.ICubeAttachments;
Iterator. Итератор матрицы с вложениями.
Метод ReadAttachments возвращает коллекцию вложений, сохранённых в кубе.
Метод возвращает те значения, которые имеются по текущей позиции итератора. Полученные вложения будут доступны только на чтение. Для редактирования вложений используйте метод EditAttachments.
Для выполнения примера предполагается наличие в репозитории стандартного куба с идентификатором «STD_CUBE». В кубе настроена привязка фактов для хранения вложений. По каким-либо координатам куба сохранены вложения.
Добавьте ссылки на системные сборки: Cubes, Dal, Dimensions, Matrix, Metabase. В Fore.NET также добавьте ссылку на сборку ForeSystem.
Sub UserProc;
Var
MB: IMetabase;
CubeInst: ICubeInstance;
Dest: ICubeInstanceDestination;
Sels: IDimSelectionSet;
Sel: IDimSelection;
Exec: ICubeInstanceDestinationExecutor;
Mat: IMatrix;
MatEx: IMatrixEx;
Ite: IMatrixIterator;
ExecResult: ICubeExecuteResult;
Manager: ICubeAttachmentManager;
Ats: ICubeAttachments;
At: ICubeAttachment;
NameAttributeKey: Integer;
i: integer;
Begin
MB := MetabaseClass.Active;
CubeInst := MB.ItemById("STD_CUBE").Open(Null) As ICubeInstance;
Dest := CubeInst.Destinations.DefaultDestination;
//Отметка куба
Sels := Dest.CreateDimSelectionSet;
For Each Sel In Sels Do
Sel.SelectAll;
End For;
Exec := Dest.CreateExecutor;
Exec.IncludeAttachments := True;
Exec.PrepareExecute(Sels);
Exec.PerformExecute;
Mat := Exec.Matrix;
//Результирующая матрица куба
MatEx := Mat As IMatrixEx;
If MatEx.AttachmentValueIndex < 0 Then
Debug.WriteLine("AttachmentValueIndex <0. Aborted ");
Return;
End If;
ExecResult := CubeClass.ExecuteResult(Mat);
//Менеджер для работы с вложениями куба
Manager := ExecResult.CreateAttachmentManager;
//Итератор матрицы
Ite := Mat.CreateIterator;
Ite.Move(IteratorDirection.First);
While Ite.Valid Do
//Вложения по текущей координате
Ats := Manager.ReadAttachments(Ite);
If Ats <> Null Then
Debug.WriteLine("Имеется вложение. Количество = " + Ats.Count.ToString);
NameAttributeKey := Ats.Attributes.FindById("Name").Key;
For i := 0 To Ats.Count - 1 Do
At := Ats.Item(i);
Debug.WriteLine("Key= " + At.Key.ToString + " Name = " + At.AttributeValueByKey(NameAttributeKey) + " Type = " + At.Type.ToString);
End For;
Else
Debug.WriteLine("Нет вложений");
End If;
Debug.WriteLine(" ");
Ite.Move(IteratorDirection.Next);
End While;
End Sub UserProc;
Imports Prognoz.Platform.Interop.Cubes;
Imports Prognoz.Platform.Interop.Dal;
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;
Dest: ICubeInstanceDestination;
Sels: IDimSelectionSet;
Sel: IDimSelection;
Exec: ICubeInstanceDestinationExecutor;
Mat: IMatrix;
MatEx: IMatrixEx;
CubeCls: CubeClassClass = New CubeClassClass();
Ite: IMatrixIterator;
ExecResult: ICubeExecuteResult;
Manager: ICubeAttachmentManager;
Ats: ICubeAttachments;
At: ICubeAttachment;
NameAttributeKey: UInteger;
i: integer;
Begin
MB := Params.Metabase;
CubeInst := MB.ItemById["STD_CUBE"].Open(Null) As ICubeInstance;
Dest := CubeInst.Destinations.DefaultDestination;
//Отметка куба
Sels := Dest.CreateDimSelectionSet();
For Each Sel In Sels Do
Sel.SelectAll();
End For;
Exec := Dest.CreateExecutor();
Exec.IncludeAttachments := True;
Exec.PrepareExecute(Sels);
Exec.PerformExecute(False);
Mat := Exec.Matrix;
//Результирующая матрица куба
MatEx := Mat As IMatrixEx;
If MatEx.AttachmentValueIndex < 0 Then
System.Diagnostics.Debug.WriteLine("AttachmentValueIndex <0. Aborted ");
Return;
End If;
ExecResult := CubeCls.ExecuteResult[Mat];
//Менеджер для работы с вложениями куба
Manager := ExecResult.CreateAttachmentManager();
//Итератор матрицы
Ite := Mat.CreateIterator();
Ite.Move(IteratorDirection.itdFirst);
While Ite.Valid Do
//Вложения по текущей координате
Ats := Manager.ReadAttachments(Ite);
If Ats <> Null Then
System.Diagnostics.Debug.WriteLine("Имеются вложение. Количество = " + Ats.Count.ToString());
NameAttributeKey := Ats.Attributes.FindById("Name").Key;
For i := 0 To Ats.Count - 1 Do
At := Ats.Item[i];
System.Diagnostics.Debug.WriteLine("Key= " + At.Key.ToString() +
" Name = " + At.AttributeValueByKey[NameAttributeKey] + " Type = " + At.Type.ToString());
End For;
Else
System.Diagnostics.Debug.WriteLine("Нет вложений");
End If;
System.Diagnostics.Debug.WriteLine(" ");
Ite.Move(IteratorDirection.itdNext);
End While;
End Sub;
При выполнении примера будет вычислена результирующая матрица куба и получен менеджер для работы с вложениями. Будет создан итератор и осуществлён обход всех координат матрицы. Если по координате хранятся вложения, то информация о них (ключ, наименование и тип) будет выведены в консоль среды разработки.
См. также: