IMetabaseUpdateUserEvents.OnBeforeApplyUpdate

Синтаксис

OnBeforeApplyUpdate(Update: IMetabaseUpdate);

Параметры

Update - обновление, применяемое к текущему репозиторию.

Описание

Метод OnBeforeApplyUpdate реализует событие, возникающее после подготовки объектов к обновлению.

Данное событие может использоваться для проверки готовности объектов к обновлению и разрешения каких-либо конфликтов.

Пример

Public Class CUpdateEvents: UpdateEvents

Public Sub OnBeginUpdate(Update: IMetabaseUpdate);

Begin

Debug.WriteLine("Начало обновления объектов репозитория");

End Sub OnBeginUpdate;

 

Public Sub OnBeforeApplyUpdate(Update: IMetabaseUpdate);

Var

Root: IMetabaseUpdateFolderNode;

Node: IMetabaseUpdateNode;

ObjectNode: IMetabaseUpdateObjectNode;

State: IMetabaseUpdateObjectApplyState;

MB: IMetabase;

CrInfo: IMetabaseObjectCreateInfo;

MObj: IMetabaseObject;

i: Integer;

Begin

MB := MetabaseClass.Active;

Root := Update.RootFolder;

For i := 0 To Root.Count - 1 Do

Node := Root.Item(i);

If Node.NodeType = MetabaseUpdateNodeType.Object Then

ObjectNode := Node As IMetabaseUpdateObjectNode;

State := ObjectNode.ApplyState;

Select Case State.State

Case MetabaseUpdateObjectApplyState.Conflict Or MetabaseUpdateObjectApplyState.ConflictObjectNotFound:

CrInfo := MB.CreateCreateInfo;

CrInfo.ClassID := ObjectNode.Object.ClassId;

CrInfo.Id := MB.GenerateId(ObjectNode.Object.Id);

CrInfo.Name := ObjectNode.Object.Name;

CrInfo.Parent := MB.Root;

CrInfo.SkipIdFormatCheck := True;

MObj := MB.CreateObject(CrInfo).Edit;

MObj.Save;

State.UpdateObject := MObj;

State.State := MetabaseUpdateObjectApplyState.EditExisting;

End Select;

End If;

End For;

End Sub OnBeforeApplyUpdate;

 

Public Sub OnEndUpdate(Update: IMetabaseUpdate);

Begin

Debug.WriteLine("Обновление объектов окончено");

End Sub OnEndUpdate;

End Class CUpdateEvents;

Данный пример является шаблоном для модуля обновления. При применении обновления, содержащего данный модуль, будет осуществляться проверка готовности объектов, соответствующих объектам репозитория. В частности будет разрешаться конфликт, если в репозитории отсутствует объект, для которого в обновлении установлен тип - Только обновление.

Для решения конфликта в репозитории будет создан новый пустой объект того же класса. Данный объект будет установлен в качестве обновляемого объекта. Состояние готовности объекта обновления будет изменено на Обновление существующего объекта (MetabaseUpdateObjectApplyState.EditExisting).

Примечание. Необходимо помнить, что не все конфликты доступно разрешить. В указанном примере будет игнорироваться условие обновления объекта по ключу. Если объект в репозитории отсутствует, то он все равно будет создан. Ключи объекта в репозитории и в обновлении будут различаться.

См. также:

IMetabaseUpdateUserEvents