OnBeforeCustomObjectSaveToPef(Resolver: ICustomObjectResolver);
OnBeforeCustomObjectSaveToPef(Resolver: Prognoz.Platform.Interop.Metabase.ICustomObjectResolver);
Resolver. Объект, предназначенный для работы с пользовательским объектом.
Метод OnBeforeCustomObjectSaveToPef реализует событие, возникающее перед сохранением пользовательского объекта в pef-файл.
Событие возникает для каждого пользовательского объекта, присутствующего в обновлении.
Также событие возникает при репликации базы данных временных рядов, содержащих пользовательские объекты, в zip-файл.
Для выполнения примера в репозитории предполагается наличие базы данных временных рядов с идентификатором «TSDB_PEF». Данная база данных должна содержать дочерний пользовательский объект, в котором записаны какие-либо данные в формате XML.
Добавьте ссылки на системные сборки: Cubes, Metabase, Xml.
Sub UserProc;
Var
Mb: IMetabase;
metaUpdate: ICubeMetaUpdateEx;
Rub: IRubricator;
Progress: MyUpdateProgress;
objects: ICubeMetaUpdateAdditionalObjects;
object: ICubeMetaUpdateAdditionalObject;
Begin
// Получаем текущий репозиторий
Mb := MetabaseClass.Active;
// Создаем объект для репликации
metaUpdate := New CubeMetaUpdateClass.Create As ICubeMetaUpdateEx;
// Указываем репозиторий в который будет выполняться репликация
metaUpdate.Metabase := Mb;
// Получаем базу данных временных рядов
rub := mb.ItemById("TSDB_PEF").Bind As IRubricator;
// Указываем, что полученная база данных временных рядов будет реплицироваться
metaUpdate.Rubricator := rub;
// Указываем репозиторий НСИ, используемый для репликации
metaUpdate.RdsDatabase := rub.Database;
// Указываем, что данные не будут реплицированы
metaUpdate.CopyData := False;
// Указываем, что репликация будет выполняться с дочерними объектами
metaUpdate.CopyExtraObjects := True;
// Создаем объект для обработки событий, возникающих во время репликации
Progress := New MyUpdateProgress.Create;
// Выполняем репликацию в файл
metaUpdate.SaveEx("C:\Replication.zip", Progress);
End Sub UserProc;
// Класс, реализующий события, которые происходят во время репликации
Class MyUpdateProgress: UpdateProgress
// Событие, возникающее до сохранения пользовательских объектов в файл
Sub OnBeforeCustomObjectSaveToPef(Resolver: ICustomObjectResolver);
Var
i: Integer;
Refs: IMetabaseCustomObjectReferences;
Ref: IMetabaseCustomObjectReference;
XmlVar: Variant;
xmlDE: IXmlDomElement;
XmlDoc: IXmlDomDocument;
Begin
// Выводим базовую информацию о пользовательском объекте
Debug.WriteLine("Класс объекта: " + Resolver.ClassId.ToString);
Debug.WriteLine("Наименование: " + Resolver.Name);
Debug.WriteLine("Описание: " + Resolver.Description);
Debug.WriteLine("Идентификатор: " + Resolver.Id);
Debug.WriteLine("Ключ: " + Resolver.Key.ToString);
// Выводим информацию о зависимостях объекта
Refs := Resolver.References;
For i := 0 To Refs.Count - 1 Do
Ref := Refs.Item(i);
Debug.WriteLine("Объект :" + Ref.Object.Name);
Debug.WriteLine("Владелец :" + Ref.Owner.Name);
End For;
// Читаем данные из объекта в формат XML
Resolver.ReadToXML(XmlVar);
// Представляем считанные данные в виде документа
XmlDoc := XmlVar As IXmlDomDocument;
// Если документ содержит данные, то выводим их в окно консоли
If (XmlDoc <> Null) Then
Debug.WriteLine("До:");
Debug.WriteLine(XmlDoc.xml);
// Формируем новые данные в формате XML
XmlDoc.loadXML("<nodes> <node1>ITEM1=13</node1> <node2>ITEM2=10</node2> </nodes>");
Debug.WriteLine("После:");
// Выводим сформированные данные в окно консоли
Debug.WriteLine(XmlDoc.xml);
// Записываем обновленные данные в пользовательский объект
Resolver.WriteFromXML(XmlDoc);
End If;
End Sub OnBeforeCustomObjectSaveToPef;
End Class MyUpdateProgress;
В результате выполнения примера база данных временных рядов «TSDB_PEF» будет реплицирована в файл «C:\Replication.zip». Будет обработано событие, возникающее перед сохранением пользовательского объекта. Для каждого пользовательского объекта в окно консоли будет выведена базовая информация о нём, информация о зависимостях. Также будут изменены данные в формате XML, содержащиеся в пользовательском объекте.
Необходимые требования и результат выполнения примера Fore.NET совпадают с примером Fore. Вместо компонентов Fore используйте их Fore.NET аналоги.
Imports Prognoz.Platform.Interop.Cubes;
Imports Prognoz.Platform.Interop.MsXml2;
…
Public Shared Sub Main(Params: StartParams);
Var
Mb: IMetabase;
metaUpdate: ICubeMetaUpdateEx;
Rub: IRubricator;
Progress: MyUpdateProgress;
objects: ICubeMetaUpdateAdditionalObjects;
object: ICubeMetaUpdateAdditionalObject;
Begin
// Получаем текущий репозиторий
Mb := Params.Metabase;
// Создаем объект для репликации
metaUpdate := New CubeMetaUpdateClass.Create() As ICubeMetaUpdateEx;
// Указываем репозиторий в который будет выполняться репликация
metaUpdate.Metabase := Mb;
// Получаем базу данных временных рядов
rub := mb.ItemById["TSDB_PEF"].Bind() As IRubricator;
// Указываем, что полученная база данных временных рядов будет реплицироваться
metaUpdate.Rubricator := rub;
// Указываем репозиторий НСИ, используемый для репликации
metaUpdate.RdsDatabase := rub.Database;
// Указываем, что данные не будут реплицированы
metaUpdate.CopyData := False;
// Указываем, что репликация будет выполняться с дочерними объектами
metaUpdate.CopyExtraObjects := True;
// Создаем объект для обработки событий, возникающих во время репликации
Progress := New MyUpdateProgress.Create();
// Выполняем репликацию в файл
metaUpdate.SaveEx("C:\Replication.zip", Progress);
End Sub;
…
// Класс, реализующий события, которые происходят во время репликации
Public Class MyUpdateProgress: IMetabaseUpdateProgress
// Событие, возникающее до сохранения пользовательских объектов в файл
Public Sub OnBeforeCustomObjectSaveToPef(Resolver: ICustomObjectResolver);
Var
i: Integer;
Refs: IMetabaseCustomObjectReferences;
Ref: IMetabaseCustomObjectReference;
XmlVar: object;
xmlDE: IXmlDomElement;
XmlDoc: IXmlDomDocument;
Begin
// Выводим базовую информацию о пользовательском объекте
System.Diagnostics.Debug.WriteLine("Класс объекта: " + Resolver.ClassId.ToString());
System.Diagnostics.Debug.WriteLine("Наименование: " + Resolver.Name);
System.Diagnostics.Debug.WriteLine("Описание: " + Resolver.Description);
System.Diagnostics.Debug.WriteLine("Идентификатор: " + Resolver.Id);
System.Diagnostics.Debug.WriteLine("Ключ: " + Resolver.Key.ToString());
// Выводим информацию о зависимостях объекта
Refs := Resolver.References;
For i := 0 To Refs.Count - 1 Do
Ref := Refs.Item[i];
System.Diagnostics.Debug.WriteLine("Объект :" + Ref.Object.Name);
System.Diagnostics.Debug.WriteLine("Владелец :" + Ref.Owner.Name);
End For;
// Читаем данные из объекта в формат XML
Resolver.ReadToXML(Var XmlVar);
// Представляем считанные данные в виде документа
XmlDoc := XmlVar As IXmlDomDocument;
// Если документ содержит данные, то выводим их в окно консоли
If (XmlDoc <> Null) Then
System.Diagnostics.Debug.WriteLine("До:");
System.Diagnostics.Debug.WriteLine(XmlDoc.xml);
// Формируем новые данные в формате XML
XmlDoc.loadXML("<nodes> <node1>ITEM1=13</node1> <node2>ITEM2=10</node2> </nodes>");
System.Diagnostics.Debug.WriteLine("После:");
// Выводим сформированные данные в окно консоли
System.Diagnostics.Debug.WriteLine(XmlDoc.xml);
// Записываем обновленные данные в пользовательский объект
Resolver.WriteFromXML(XmlDoc);
End If;
End Sub OnBeforeCustomObjectSaveToPef;
Public Sub OnProgress(Data: IMetabaseUpdateProgressData);
Begin
End Sub;
Public Sub OnError(Data: IMetabaseUpdateProgressData; Var Ignore: Boolean);
Begin
End Sub;
Public Sub OnAskConstraintsHandling(Node: IMetabaseUpdateNode; Details: String; Var Handling: UpdateDataConstraintsHandlingType);
Begin
End Sub;
Public Sub OnAskReflectRights(Var Cancel: Boolean);
Begin
End Sub;
Public Sub OnContext(Context: IMetabaseUpdateContext);
Begin
End Sub;
Public Sub OnResolve(Node: IMetabaseUpdateNode; Resolver: IMetabaseUpdateResolver);
Begin
End Sub;
Public Sub OnSkip(Data: IMetabaseUpdateProgressData);
Begin
End Sub;
Public Sub OnNullLinks(Node: IMetabaseUpdateNode; Links: IMetabaseUpdateNullLinks);
Begin
End Sub;
Public Sub OnAfterApplyCustomObject(Resolver: ICustomObjectResolver);
Begin
End Sub;
End Class;
См. также: