EditAttachments(Iterator: IMatrixModelIterator): ICubeAttachmentsEdited;
EditAttachments(Iterator: Prognoz.Platform.Interop.ForeSystem.IMatrixModelIterator): Prognoz.Platform.Interop.Cubes.ICubeAttachmentsEdited;
Iterator. Итератор матрицы с вложениями.
Метод EditAttachments открывает список вложений на редактирование.
Для выполнения примера предполагается наличие в репозитории стандартного куба с идентификатором «STD_CUBE». В кубе настроена привязка фактов для хранения вложений. Справочник, в который сохраняются вложения, в своей структуре имеет дополнительный атрибут с идентификатором «OBJ_KEY». Данный атрибут имеет целый тип данных, также для него выставлен признак ссылки на объект репозитория. В кубе по каким-либо координатам имеются данные или вложения. В репозитории должен быть создан документ с идентификатором «DOC», а в файловой системе должен иметься файл «C:\File.txt».
Добавьте ссылки на системные сборки: Cubes, Dal, Dimensions, Fore, IO, Matrix, Metabase. В Fore.NET также добавьте ссылку на сборки ForeIO, ForeSystem, KeFore.
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: ICubeAttachmentsEdited;
At: ICubeAttachmentEdited;
NameAttributeKey, FileNameAttributeKey, UrlAttributeKey, TimeStampKey, AttachmentKey, ObjKey: Integer;
FStream: IFileStream;
Doc: IMetabaseObjectDescriptor;
Sto: ICubeInstanceStorage;
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;
//Итератор матрицы
Mat.ValueFlag := Mat.ValueFlag + 10;
Ite := Mat.CreateIterator;
Ite.Move(IteratorDirection.First);
If Manager.SupportWriteAttachments(Ite) Then
Ats := Manager.EditAttachments(Ite);
NameAttributeKey := Ats.Attributes.FindById("NAME").Key;
FileNameAttributeKey := Ats.Attributes.FindById("FILE_NAME").Key;
UrlAttributeKey := Ats.Attributes.FindById("URL").Key;
TimeStampKey := Ats.Attributes.FindById("TIMESTAMP").Key;
AttachmentKey := Ats.Attributes.FindById("ATTACHMENT").Key;
ObjKey := Ats.Attributes.FindById("OBJ_KEY").Key;
//Создание вложений
//Файл
At := Ats.AddNew;
FStream := New FileStream.Create("C:\File.txt", FileOpenMode.Read, FileShare.DenyNone);
At.Type := CubeAttachmentType.Value;
At.AttributeValueByKey(AttachmentKey) := FStream;
At.AttributeValueByKey(FileNameAttributeKey) := "File.txt";
At.AttributeValueByKey(NameAttributeKey) := "File.txt";
At.AttributeValueByKey(TimeStampKey) := DateTime.Now;
//Документ репозитория
At := Ats.AddNew;
Doc := MB.ItemById("DOC");
At.Type := CubeAttachmentType.Document;
At.AttributeValueByKey(ObjKey) := Doc.Key;
At.AttributeValueByKey(FileNameAttributeKey) := (Doc.Bind As IDocument).FileName;
At.AttributeValueByKey(NameAttributeKey) := Doc.Name;
At.AttributeValueByKey(TimeStampKey) := DateTime.Now;
//Ссылка
At := Ats.AddNew;
At.Type := CubeAttachmentType.URL;
At.AttributeValueByKey(UrlAttributeKey) := "http://localhost/";
At.AttributeValueByKey(NameAttributeKey) := "localhost";
At.AttributeValueByKey(TimeStampKey) := DateTime.Now;
//Просмотр списка вложений
For i := 0 To Ats.Count - 1 Do
At := Ats.Edit(i);
Debug.WriteLine("Key= " + At.Key.ToString +
" Name = " + (At As ICubeAttachment).AttributeValueByKey(NameAttributeKey) +
" Type = " + (At As ICubeAttachment).Type.ToString);
End For;
//Сохранение изменений
Manager.Post(Ite, Ats);
Sto := Dest.CreateStorage(CubeInstanceStorageOptions.Attachments);
Sto.AttachmentManager := Manager;
Sto.SaveMatrix(Mat, Mat.ValueFlag);
End If;
End Sub UserProc;
Imports Prognoz.Platform.Interop.Cubes;
Imports Prognoz.Platform.Interop.Dal;
Imports Prognoz.Platform.Interop.Dimensions;
Imports Prognoz.Platform.Interop.KeFore;
Imports Prognoz.Platform.Interop.ForeIO;
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: ICubeAttachmentsEdited;
At: ICubeAttachmentEdited;
NameAttributeKey, FileNameAttributeKey, UrlAttributeKey, TimeStampKey, AttachmentKey, ObjKey: Uinteger;
FStream: IFileStream = New FileStreamClass();
Doc: IMetabaseObjectDescriptor;
Sto: ICubeInstanceStorage;
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();
//Итератор матрицы
Mat.ValueFlag := Mat.ValueFlag + 10;
Ite := Mat.CreateIterator();
Ite.Move(IteratorDirection.itdFirst);
If Manager.SupportWriteAttachments(Ite) Then
Ats := Manager.EditAttachments(Ite);
NameAttributeKey := Ats.Attributes.FindById("NAME").Key;
FileNameAttributeKey := Ats.Attributes.FindById("FILE_NAME").Key;
UrlAttributeKey := Ats.Attributes.FindById("URL").Key;
TimeStampKey := Ats.Attributes.FindById("TIMESTAMP").Key;
AttachmentKey := Ats.Attributes.FindById("ATTACHMENT").Key;
ObjKey := Ats.Attributes.FindById("OBJ_KEY").Key;
//Создание вложений
//Файл
At := Ats.AddNew();
FStream.Create("C:\File.txt", FileOpenMode.frRead, FileShare.frDenyNone);
At.Type_2 := CubeAttachmentType.catValue;
At.AttributeValueByKey_2[AttachmentKey] := FStream;
At.AttributeValueByKey_2[FileNameAttributeKey] := "File.txt";
At.AttributeValueByKey_2[NameAttributeKey] := "File.txt";
At.AttributeValueByKey_2[TimeStampKey] := DateTime.Now;
//Документ репозитория
At := Ats.AddNew();
Doc := MB.ItemById["DOC"];
At.Type_2 := CubeAttachmentType.catDocument;
At.AttributeValueByKey_2[ObjKey] := Doc.Key;
At.AttributeValueByKey_2[FileNameAttributeKey] := (Doc.Bind() As IDocument).FileName;
At.AttributeValueByKey_2[NameAttributeKey] := Doc.Name;
At.AttributeValueByKey_2[TimeStampKey] := DateTime.Now;
//Ссылка
At := Ats.AddNew();
At.Type_2 := CubeAttachmentType.catURL;
At.AttributeValueByKey_2[UrlAttributeKey] := "http://localhost/";
At.AttributeValueByKey_2[NameAttributeKey] := "localhost";
At.AttributeValueByKey_2[TimeStampKey] := DateTime.Now;
//Просмотр списка вложений
For i := 0 To Ats.Count - 1 Do
At := Ats.Edit(i);
System.Diagnostics.Debug.WriteLine("Key= " + At.Key.ToString() +
" Name = " + (At As ICubeAttachment).AttributeValueByKey[NameAttributeKey] +
" Type = " + (At As ICubeAttachment).Type.ToString());
End For;
//Сохранение изменений
Manager.Post(Ite, Ats);
Sto := Dest.CreateStorage(CubeInstanceStorageOptions.cisoAttachments);
Sto.AttachmentManager := Manager;
Sto.SaveMatrix(Mat, Mat.ValueFlag);
End If;
End Sub;
При выполнении примера будет вычислена результирующая матрица куба и получен менеджер для работы с вложениями. Будет создан итератор для навигации по матрице. По первой доступной координате будут созданы три различных вложения. Информация обо всех вложениях, которые имеются по этой координате, будет выведена в консоль среды разработки. После этого все изменения будут сохранены обратно в куб.
См. также: