IMetabaseUpdateContext.RegisterKeyChangeO

Синтаксис Fore

RegisterKeyChangeO(OwnObject: Integer;

                   ClassId: Integer;

                   oldKey: Integer;

                   newKey: Integer;

                   oldId: String;

                   newId: String;

                   Object: IMetabaseObject);

Синтаксис Fore.NET

RegisterKeyChangeO(OwnObject: uinteger;

                   ClassId: uinteger;

                   oldKey: uinteger;

                   newKey: uinteger;

                   oldId: string;

                   newId: string;

                   Object: Prognoz.Platform.Interop.Metabase.IMetabaseObject);

Параметры

OwnObject. Владелец объекта, ключ которого переопределяется;

ClassId. Идентификатор класса объекта репозитория-приемника, на который ссылается объект обновления;

oldKey. Ключ объекта репозитория-источника, на который ссылается объект до обновления;

newKey. Ключ объекта репозитория-приемника, на который ссылается объект после обновления;

oldId. Идентификатор объекта репозитория-источника, на который ссылается объект до обновления;

newId. Идентификатор объекта репозитория-приемника, на который ссылается объект после обновления;

Object. Объект репозитория-приемника, на который ссылается объект после обновления.

Описание

Метод RegisterKeyChangeO переопределяет ключ объекта репозитория, на который ссылается объект обновления, с учетом владельца.

Комментарии

В качестве значения параметра ClassId указывается одно из допустимых значений перечисления MetabaseObjectClass.

Пример Fore

Для выполнения примера в репозитории предполагается наличие табличных справочников НСИ с идентификаторами «MDM_HIE_INDICATOR_S», «MDM_HIE_INDICATOR_D» и «MDM_INDICATOR_D». Справочник «MDM_INDICATOR_D» должен быть родительским по отношению к справочнику «MDM_HIE_INDICATOR_D».

В файловой системе предполагается наличие файла обновления «C:\CustomObj.pefx», предназначенного для обновления объекта пользовательского класса, который зависит от справочника «MDM_HIE_INDICATOR_D» и его родителя.

Добавьте ссылку на системную сборку Metabase.

Sub UserUpd;
Var
    Mb: IMetabase;
    Update: IMetabaseUpdate;
    Context: IMetabaseUpdateContext;
    NewObj, OldObj: IMetabaseObject;
    Progress: MyUpdateProgress;
Begin
    // Получаем текущий репозиторий
    Mb := MetabaseClass.Active;
    // Создаем обновление
    Update := Mb.CreateUpdate;
    // Загружаем параметры обновления из файла
    Update.LoadFromFileNF("C:\CustomObj.pefx");
    // Получаем справочники
    NewObj := Mb.ItemById("MDM_HIE_INDICATOR_S").Bind;
    OldObj := Mb.ItemById("MDM_HIE_INDICATOR_D").Bind;
    // Создаем дополнительные настройки обновления
    Context := Update.CreateUpdateContext;
    // Переопределяем справочник, от которого зависит пользовательский объект в обновлении
    Context.RegisterKeyChangeO(Mb.ItemById("MDM_INDICATOR_D").key, MetabaseObjectClass.KE_CLASS_METADICTIONARYRDS,
        OldObj.key, NewObj.key, OldObj.Id, NewObj.Id, NewObj);
    // Создаем объект, реализующий события, которые происходят во время обновления  
    Progress := New MyUpdateProgress.Create;
    // Выполняем обновление
    Update.ApplyEx(Progress, Context);
End Sub UserUpd;

// Класс, реализующий события, которые происходят во время обновления
Class MyUpdateProgress: UpdateProgress
    // Событие, возникающее при наличии дополнительных настроек обновления
    Sub OnContext(Context: IMetabaseUpdateContext);
    Var
        i, j: Integer;
        KeyMap: IMetabaseUpdateKeyMap;
        UpdRemaps: IMetabaseUpdateRemappings;
        UpdObjRemap: IMetabaseUpdateObjectRemapping;
        UpdRemap: IMetabaseUpdateRemapping;
    Begin
        // Получаем карту ключей, используемых для повторного сопоставления объектов обновления
        KeyMap := Context.KeyMap;
        // Проверяем, не пустая ли карта
        If Not KeyMap.IsEmpty Then
            // Если карта содержит данные, то перебираем её элементы
            For j := 0 To KeyMap.Count - 1 Do
                UpdObjRemap := KeyMap.Item(j);
                // Получаем коллекцию параметров повторного сопоставления для объектов репозитория
                UpdRemaps := UpdObjRemap.Map(MetabaseUpdateRemappingType.Object);
                // Проверяем, содержит ли коллекция элементы
                If Not UpdRemaps.IsEmpty Then
                    // Если коллекция содержит данные, то перебираем её элементы
                    For i := 0 To UpdRemaps.Count - 1 Do
                        UpdRemap := UpdRemaps.Item(i);
                        // Выводим информацию о параметрах повторного сопоставления объекта
                        Debug.WriteLine("Идентификатор нового объекта: " + UpdRemap.NewId);
                        Debug.WriteLine("Идентификатор старого объекта: " + UpdRemap.OldId);
                        Debug.WriteLine("Ключ нового объекта: " + UpdRemap.NewKey.ToString);
                        Debug.WriteLine("Ключ старого объекта: " + UpdRemap.OldKey.ToString);
                        Debug.WriteLine("");
                    End For;
                End If;
            End For;
        End If;
    End Sub OnContext;
End Class MyUpdateProgress;

В результате выполнения примера будет обновлён пользовательский объект: теперь он будет зависеть от справочника «MDM_HIE_INDICATOR_S». Во время обновления будет обработано событие, возникающее при наличии дополнительных настроек обновления. В окно консоли будет выведена информация о повторном сопоставлении объектов, выполненном при обновлении.

Пример Fore.NET

Необходимые требования и результат выполнения примера Fore.NET совпадают с примером Fore.

Public Shared Sub Main(Params: StartParams);
Var
    Mb: IMetabase;
    Update: IMetabaseUpdate;
    Context: IMetabaseUpdateContext;
    NewObj, OldObj: IMetabaseObject;
    Progress: MyUpdateProgress;
Begin
    // Получаем текущий репозиторий
    Mb := Params.Metabase;
    // Создаем обновление
    Update := Mb.CreateUpdate();
    // Загружаем параметры обновления из файла
    Update.LoadFromFileNF("C:\CustomObj.pefx", UpdateLoadMode.ulmReplace);
    // Получаем справочники
    NewObj := Mb.ItemById["MDM_HIE_INDICATOR_S"].Bind();
    OldObj := Mb.ItemById["MDM_HIE_INDICATOR_D"].Bind();
    // Создаем дополнительные настройки обновления
    Context := Update.CreateUpdateContext();
    // Переопределяем справочник, от которого зависит пользовательский объект в обновлении
    Context.RegisterKeyChangeO(Mb.ItemById["MDM_INDICATOR_D"].key, MetabaseObjectClass.KE_CLASS_METADICTIONARYRDS As integer,
        OldObj.key, NewObj.key, OldObj.Id, NewObj.Id, NewObj);
    // Создаем объект, реализующий события, которые происходят во время обновления  
    Progress := New MyUpdateProgress.Create();
    // Выполняем обновление
    Update.ApplyEx(Progress, Context);
End Sub;

// Класс, реализующий события, которые происходят во время обновления
Public Class MyUpdateProgress: IMetabaseUpdateProgress
    // Событие, возникающее при наличии дополнительных настроек обновления
    Public Sub OnContext(Context: IMetabaseUpdateContext);
    Var
        i, j: Integer;
        KeyMap: IMetabaseUpdateKeyMap;
        UpdRemaps: IMetabaseUpdateRemappings;
        UpdObjRemap: IMetabaseUpdateObjectRemapping;
        UpdRemap: IMetabaseUpdateRemapping;
    Begin
        // Получаем карту ключей, используемых для повторного сопоставления объектов обновления
        KeyMap := Context.KeyMap;
        // Проверяем, не пустая ли карта
        If Not KeyMap.IsEmpty Then
            // Если карта содержит данные, то перебираем её элементы
            For j := 0 To KeyMap.Count - 1 Do
                UpdObjRemap := KeyMap.Item[j];
                // Получаем коллекцию параметров повторного сопоставления для объектов репозитория
                UpdRemaps := UpdObjRemap.Map[MetabaseUpdateRemappingType.murtObject];
                // Проверяем, содержит ли коллекция элементы
                If Not UpdRemaps.IsEmpty Then
                    // Если коллекция содержит данные, то перебираем её элементы
                    For i := 0 To UpdRemaps.Count - 1 Do
                        UpdRemap := UpdRemaps.Item[i];
                        // Выводим информацию о параметрах повторного сопоставления объекта
                        System.Diagnostics.Debug.WriteLine("Идентификатор нового объекта: " + UpdRemap.NewId);
                        System.Diagnostics.Debug.WriteLine("Идентификатор старого объекта: " + UpdRemap.OldId);
                        System.Diagnostics.Debug.WriteLine("Ключ нового объекта: " + UpdRemap.NewKey.ToString());
                        System.Diagnostics.Debug.WriteLine("Ключ старого объекта: " + UpdRemap.OldKey.ToString());
                        System.Diagnostics.Debug.WriteLine("");
                    End For;
                End If;
            End For;
        End If;
    End Sub;
    
    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 OnResolve(Node: IMetabaseUpdateNode; Resolver: IMetabaseUpdateResolver);
    Begin
    End Sub;
    
    Public Sub OnSkip(Data: IMetabaseUpdateProgressData);
    Begin
    End Sub OnSkip;
    
    Public Sub OnNullLinks(Node: IMetabaseUpdateNode; Links: IMetabaseUpdateNullLinks);
    Begin
    End Sub;
    
    Public Sub OnBeforeCustomObjectSaveToPef(Resolver: ICustomObjectResolver);
    Begin
    End Sub;
    
    Public Sub OnAfterApplyCustomObject(Resolver: ICustomObjectResolver);
    Begin
    End Sub;

End Class MyUpdateProgress;

См. также:

IMetabaseUpdateContext