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).
Примечание. Необходимо помнить, что не все конфликты доступно разрешить. В указанном примере будет игнорироваться условие обновления объекта по ключу. Если объект в репозитории отсутствует, то он все равно будет создан. Ключи объекта в репозитории и в обновлении будут различаться.
См. также: