LoadFromStreamNF(Reader: IIOStream; Mode: UpdateLoadMode);
Reader. Поток, из которого загружается обновление;
Mode. Метод загрузки объектов в обновление.
Метод LoadFromStreamNF загружает обновление из потока.
Для выполнения примера в репозитории предполагается наличие трёх различных репозиториев. В них имеются какие-либо объекты.
Добавьте ссылки на системные сборки: IO, Metabase.
Sub UserProc;
Var
Mb1, Mb2, Mb3: IMetabase;
Upd: WorkingWithUpdate;
Stream: IIOStream;
Begin
// ...
// Подключение к трём различным репозиториям,
инициализация переменных Mb1, Mb2, Mb3
// ...
// Создание обновления в первом репозитории
Upd.Initialize(Mb1, UpdSourceType._New);
Upd.AddObjectInUpdate(Mb1.ItemById("Obj1"));
// Сохранение обновления в файл
Upd.SaveToFile("D:\Upd1.pefx");
Upd.Flush;
//...
// Создание обновления во втором репозитории и восстановление его из файла
Upd.Initialize(Mb2, UpdSourceType.File, "D:\Upd1.pefx");
Upd.AddObjectInUpdate(Mb2.ItemById("Obj2"));
// Сохранение полученного обновления в поток
Stream := Upd.AsStream;
Upd.Flush;
// ...
// Создание обновления в третьем репозитории и восстановление его из потока
Upd.Initialize(Mb3, UpdSourceType.Stream, Stream);
Upd.AddObjectInUpdate(Mb3.ItemById("Obj3"));
// ...
// Какие-либо дальнейшие действия с обновлением
//...
Upd.Flush;
End Sub UserProc;
Enum UpdSourceType
_New = 1,
File = 2,
Stream = 3
End Enum UpdSourceType;
Class WorkingWithUpdate: Object
Shared _upd: IMetabaseUpdate;
Public Shared Sub Initialize(Mb: IMetabase; SourceType: UpdSourceType; UpdSource: Variant = Null);
Begin
// Инициализация обновления в зависимости от выбранного способа его получения
_upd := Mb.CreateUpdate;
// Загрузка из файла или потока, если выбран такой тип инициализации
If (SourceType <> UpdSourceType._New) And Not IsNull(UpdSource) Then
Select Case SourceType
Case UpdSourceType.File:
_upd.LoadFromFileNF(UpdSource);
Case UpdSourceType.Stream:
_upd.LoadFromStreamNF(UpdSource, UpdateLoadMode.Insert);
End Select;
End If;
End Sub Initialize;
Public Shared Sub AddObjectInUpdate(RepoObject: IMetabaseObjectDescriptor);
Var
UFN: IMetabaseUpdateFolderNode;
UON: IMetabaseUpdateObjectNode;
Begin
UFN := _Upd.RootFolder;
UON := UFN.Add(MetabaseUpdateNodeType.Object) As IMetabaseUpdateObjectNode;
UON.Object := RepoObject;
UON.BoundType := MetabaseObjectUpdateBoundType.ById;
End Sub AddObjectInUpdate;
Public Shared Sub SaveToFile(FileName: String);
Begin
// Сохранение обновления в файл
_upd.SaveToFileNF(FileName);
End Sub SaveToFile;
Public Shared Function AsStream: IIOStream;
Var
Result: IIOStream;
Begin
Result := New MemoryStream.Create;
// Сохранение обновления в поток
_upd.SaveToStreamNF(Result, Null);
Return Result;
End Function AsStream;
Public Shared Sub Flush;
Begin
// Очистка обновления
_upd := Null;
End Sub Flush;
End Class WorkingWithUpdate;
Указанный пример в общем виде демонстрирует каким образом один общий класс может последовательно использоваться для работы с обновлением в трёх разных репозиториях. В первом репозитории создаётся новое обновление, во втором обновление открывается из файла, в третьем обновление загружается из потока. На каждом этапе в обновление добавляется по одному объекту из каждого из репозиториев.
См. также: