OnSkip(Data: IMetabaseUpdateProgressData);
OnSkip(Data: Prognoz.Platform.Interop.Metabase.IMetabaseUpdateProgressData);
Data. Информация о ходе синхронизации объектов.
Метод OnSkip реализует событие пропуска элемента обновления при установке обновления.
Для выполнения примера добавьте ссылку на системную сборку «Metabase». Предполагается наличие файла обновления «D:\Update.pefx».
Sub Main;
Var
Mb: IMetabase;
Upd: IMetabaseUpdate;
Progress: MyUpdateProgress;
Begin
MB := MetabaseClass.Active;
Upd := Mb.CreateUpdate;
Upd.LoadFromFileNF("D:\Update.pefx");
Progress := New MyUpdateProgress.Create(Upd);
Upd.Apply(Progress);
Upd.SaveToFileNF("D:\Update.pefx");
End Sub Main;
Public Class MyUpdateProgress: UpdateProgress
update: IMetabaseUpdate;
Public Constructor Create(update_ : IMetabaseUpdate);
Begin
update := update_;
End Constructor Create;
Public Sub OnProgress(Data: IMetabaseUpdateProgressData);
Var ObjectNode : IMetabaseUpdateObjectNode;
Begin
Select Case Data.Stage
Case MetabaseUpdateProgressStage.Start:
Debug.WriteLine("Начало обновления объектов");
Debug.WriteLine("лог конфликтов обновления:");
Debug.WriteLine(update.SecurityConflictsLog);
Case MetabaseUpdateProgressStage.Prepare: Debug.WriteLine("Подготовка объекта");
Case MetabaseUpdateProgressStage.Apply: Debug.WriteLine("Обновление объекта");
Case MetabaseUpdateProgressStage.AfterApply:
If Data.Node Is IMetabaseUpdateObjectNode Then
Debug.WriteLine("Объект сохранен");
ObjectNode:= Data.Node As IMetabaseUpdateObjectNode;
Debug.WriteLine("лог изменения прав:");
Debug.WriteLine(ObjectNode.SDApplyLog);
End If;
Case MetabaseUpdateProgressStage.Finish: Debug.WriteLine("Обновления объектов завершено");
End Select;
Debug.WriteLine("Текущее " + Data.Current.ToString + " из " + Data.Total.ToString + " Объект " + Data.Node.Label);
End Sub OnProgress;
Public Sub OnSkip(Data: IMetabaseUpdateProgressData);
Begin
Debug.WriteLine("OnSkip " + Data.Node.Label);
End Sub OnSkip;
End Class MyUpdateProgress;
После выполнения примера в окне консоли будет выдано сообщение, содержащее информацию о процессе обновления, лог конфликтов обновления и лог изменения прав.
Для выполнения примера добавьте ссылку на системную сборку «Metabase». Предполагается наличие файла обновления «D:\Update.pefx».
В связи с тем, что в Fore.NET отсутствует класс UpdateProgress, данный пример выполняется с использованием пользовательского класса UpdateProgress, который унаследован от интерфейса IMetabaseUpdateProgress.
Sub Main(Params: StartParams);
Var
Mb: IMetabase;
Upd: IMetabaseUpdate;
Progress: UpdateProgress;
Begin
MB := Params.Metabase;
Upd := Mb.CreateUpdate();
Upd.LoadFromFileNF("D:\"+ "Update.pefx",UpdateLoadMode.ulmReplace);
Progress := New UpdateProgress.Create(Upd);
Upd.Apply(Progress);
Upd.SaveToFileNF("D:\"+ "Update.pefx");
End Sub Main;
Public Class UpdateProgress: IMetabaseUpdateProgress
update: IMetabaseUpdate;
Public Constructor Create(update_ : IMetabaseUpdate);
Begin
update := update_;
End Constructor Create;
Public Sub OnProgress(Data: IMetabaseUpdateProgressData);
Var ObjectNode : IMetabaseUpdateObjectNode;
Begin
Select Case Data.Stage
Case MetabaseUpdateProgressStage.mupsStart:
System.Diagnostics.Debug.WriteLine("Начало обновления объектов");
System.Diagnostics.Debug.WriteLine("лог конфликтов обновления:");
System.Diagnostics.Debug.WriteLine(update.SecurityConflictsLog);
Case MetabaseUpdateProgressStage.mupsPrepare: System.Diagnostics.Debug.WriteLine("Подготовка объекта");
Case MetabaseUpdateProgressStage.mupsApply: System.Diagnostics.Debug.WriteLine("Обновление объекта");
Case MetabaseUpdateProgressStage.mupsAfterApply:
If Data.Node Is IMetabaseUpdateObjectNode Then
System.Diagnostics.Debug.WriteLine("Объект сохранен");
ObjectNode:= Data.Node As IMetabaseUpdateObjectNode;
System.Diagnostics.Debug.WriteLine("лог изменения прав:");
System.Diagnostics.Debug.WriteLine(ObjectNode.SDApplyLog);
End If;
Case MetabaseUpdateProgressStage.mupsFinish: System.Diagnostics.Debug.WriteLine("Обновления объектов завершено");
End Select;
System.Diagnostics.Debug.WriteLine("Текущее " + Data.Current.ToString() + " из " + Data.Total.ToString() + " Объект " + Data.Node.Label);
End Sub OnProgress;
Public Sub OnError(Data: IMetabaseUpdateProgressData; Var Ignore: Boolean);
Begin
System.Diagnostics.Debug.WriteLine("Ошибка синхронизации объекта обновления '" + Data.Node.Label + "'");
System.Diagnostics.Debug.WriteLine("Текст ошибки: " + Data.Error.Message);
If Data.Object <> Null Then
System.Diagnostics.Debug.WriteLine("Источник ошибки: " + Data.Object.Id);
System.Diagnostics.Debug.WriteLine("Ключ объекта: " + Data.Object.Key.ToString());
End If;
System.Diagnostics.Debug.WriteLine("Объект будет пропущен");
Ignore := True;
End Sub OnError;
Public Sub OnSkip(Data: IMetabaseUpdateProgressData);
Begin
System.Diagnostics.Debug.WriteLine("OnSkip " + Data.Node.Label);
End Sub OnSkip;
Public Sub OnAskConstraintsHandling(Node: IMetabaseUpdateNode; Details: String; Var Handling: UpdateDataConstraintsHandlingType);
Begin
Handling := UpdateDataConstraintsHandlingType.udchtKeepTableUnchanged;
End Sub OnAskConstraintsHandling;
Public Sub OnAskReflectRights(Var Cancel: Boolean);
Begin
Cancel := True;
End Sub OnAskReflectRights;
Public Sub OnResolve(Node: IMetabaseUpdateNode; Resolver: IMetabaseUpdateResolver);
Var
Unresolv: IMetabaseUpdateUnresolved;
i: Integer;
Begin
System.Diagnostics.Debug.WriteLine("OnResolve");
For i := 0 To Resolver.Count - 1 Do
If Unresolv.ClassId = 2822 Then
Unresolv := Resolver.Item[i];
System.Diagnostics.Debug.WriteLine("Id: " + Unresolv.Id);
System.Diagnostics.Debug.WriteLine("Name: " + Unresolv.Name);
System.Diagnostics.Debug.WriteLine("Key: " + Unresolv.Key.ToString());
System.Diagnostics.Debug.WriteLine("Description: " + Unresolv.Description);
System.Diagnostics.Debug.WriteLine("KeepResolve: " + Unresolv.KeepResolve.ToString());
End If;
End For;
End Sub OnResolve;
End Class UpdateProgress;
После выполнения примера в окне консоли будет выдано сообщение, содержащее информацию о процессе обновления, лог конфликтов обновления и лог изменения прав.
См. также: