RegisterHierarchyChange(oldObjKey: Integer;
oldHieKey: Integer;
oldHieId: String;
newHieKey: Integer;
newHieId: String;
newObject: IMetabaseObject);
RegisterHierarchyChange(oldObjKey: uinteger;
oldHieKey: uinteger;
oldHieId: string;
newHieKey: uinteger;
newHieId: string;
newObject: Prognoz.Platform.Interop.Metabase.IMetabaseObject);
oldObjKey. Ключ справочника-источника;
oldHieKey. Ключ альтернативной иерархии в справочнике-источнике;
oldHieId. Идентификатор альтернативной иерархии в справочнике-источнике;
newHieKey. Ключ альтернативной иерархии в справочнике-приемнике;
newHieId. Идентификатор альтернативной иерархии в справочнике-приемнике;
newObject. Справочник-приемник.
Метод RegisterHierarchyChange переопределяет альтернативную иерархию, на которую ссылается обновляемый объект.
Для переопределения альтернативной иерархии с учетом владельца обновляемого объекта используйте метод IMetabaseUpdateContext.RegisterHierarchyChangeO.
Для выполнения примера в репозитории предполагается наличие табличных справочников НСИ с идентификаторами «MDM_INDICATOR_S» и «MDM_INDICATOR_D». Данные справочники должны содержать аналогичные альтернативные иерархии. В файловой системе предполагается наличие файла обновления «C:\RegHieChng.pefx», предназначенного для обновления справочника «MDM_INDICATOR_S».
Добавьте ссылки на системные сборки: Dimensions, Metabase.
Sub UserProc;
Var
MB: IMetabase;
Update: IMetabaseUpdate;
Context: IMetabaseUpdateContext;
sourceDim, targetDim: IMetabaseObject;
sourceHieSrc, targetHieSrc: IMetabaseObject;
sourceHierarchies, targetHierarchies: IDimHierarchies;
sourceHierarchy, targetHierarchy: IDimHierarchy;
i: Integer;
KeyMap: IMetabaseUpdateKeyMap;
UpdObjRemap: IMetabaseUpdateObjectRemapping;
Begin
// Получаем текущий репозиторий
MB := MetabaseClass.Active;
// Создаем обновление
Update := Mb.CreateUpdate;
// Загружаем параметры обновления из файла
Update.LoadFromFileNF("C:\RegHieChng.pefx", UpdateLoadMode.Replace);
// Создаем дополнительные настройки обновления
Context := Update.CreateUpdateContext;
// Получаем справочники
sourceDim := MB.ItemById("MDM_INDICATOR_S").Bind;
targetDim := MB.ItemById("MDM_INDICATOR_D").Bind;
// Получаем иерархии справочников
sourceHierarchies := (sourceDim As IDimensionModel).Hierarchies;
targetHierarchies := (targetDim As IDimensionModel).Hierarchies;
// Перебираем иерархии справочника-источника
For i := 0 To sourceHierarchies.Count - 1 Do
// Получаем текущую иерархию справочника-источника
sourceHierarchy := sourceHierarchies.Item(i);
// Ищем аналогичную иерархию в справочнике-приемнике
targetHierarchy := targetHierarchies.FindById(sourceHierarchy.Id);
// Если такая иерархия найдена
If (targetHierarchy <> Null) Then
// Переопределяем альтернативную иерархию на которую ссылается справочник-источник.
// Она будет ссылаться на альтернативную иерархию в справочнике-приёмнике
context.RegisterHierarchyChange(sourceDim.Key, sourceHierarchy.Key, sourceHierarchy.Id,
targetHierarchy.Key, targetHierarchy.Id, targetDim);
// Получаем справочник, используемый для альтернативной иерархии в справочнике-источнике
sourceHieSrc := sourceHierarchy.Source As IMetabaseObject;
// Получаем справочник, используемый для альтернативной иерархии в справочнике-приёмнике
targetHieSrc := targetHierarchy.Source As IMetabaseObject;
// Переопределяем справочник, используемый для построения альтернативной иерархии в справочнике-источнике.
// Будет использоваться справочник для построения альтернативной иерархии в справочнике приёмнике
context.RegisterKeyChange(sourceHieSrc.ClassId, sourceHieSrc.Key, targetHieSrc.Key,
sourceHieSrc.Id, targetHieSrc.Id, targetHieSrc);
End If;
End For;
// Получаем карту ключей, используемых для повторного сопоставления объектов обновления
KeyMap := Context.KeyMap;
// Проверяем, не пустая ли карта
If Not KeyMap.IsEmpty Then
// Если карта содержит данные, то перебираем её элементы
For i := 0 To KeyMap.Count - 1 Do
// Получаем параметры повторного сопоставления объекта обновления
UpdObjRemap := KeyMap.Item(i);
// Выводим информацию о параметрах повторного сопоставления объекта
Debug.WriteLine("Тип объекта репозитория: " + UpdObjRemap.ClassID.ToString);
Debug.WriteLine("Допускается ли для объекта несколько повторных сопоставлений: " + UpdObjRemap.HasMultiValues.ToString);
Debug.WriteLine("Идентификатор нового объекта: " + UpdObjRemap.NewId);
Debug.WriteLine("Идентификатор старого объекта: " + UpdObjRemap.OldId);
Debug.WriteLine("Ключ нового объекта: " + UpdObjRemap.NewKey.ToString);
Debug.WriteLine("Ключ старого объекта: " + UpdObjRemap.OldKey.ToString);
Debug.WriteLine("Используется нулевое сопоставление: " + UpdObjRemap.NullRemapping.ToString);
If UpdObjRemap.Object <> Null Then
Debug.WriteLine("Объект приёмника, используемый для повторного сопоставления: " + UpdObjRemap.Object.Name);
End If;
Debug.Write("Тип повторного сопоставления: ");
Select Case UpdObjRemap.Type
Case MetabaseUpdateRemappingType.Unknown: Debug.WriteLine("неизвестный тип");
Case MetabaseUpdateRemappingType.Object: Debug.WriteLine("объект репозитория");
Case MetabaseUpdateRemappingType.Hierarchy: Debug.WriteLine("альтернативная иерархия");
Case MetabaseUpdateRemappingType.MetafactsAttribute: Debug.WriteLine("атрибуты временных рядов");
Case MetabaseUpdateRemappingType.MetavalsAttribute: Debug.WriteLine("атрибуты наблюдений");
Case MetabaseUpdateRemappingType.None: Debug.WriteLine("тип не задан");
End Select;
Debug.WriteLine("");
End For;
End If;
// Применяем обновление
Update.ApplyEx(Null, Context);
End Sub UserProc;
В результате выполнения примера будет выполнено обновление справочника «MDM_INDICATOR_S». Он будет настроен на использование альтернативных иерархий справочника «MDM_INDICATOR_D».
Imports Prognoz.Platform.Interop.Dimensions;
…
Public Shared Sub Main(Params: StartParams);
Var
MB: IMetabase;
Update: IMetabaseUpdate;
Context: IMetabaseUpdateContext;
sourceDim, targetDim: IMetabaseObject;
sourceHieSrc, targetHieSrc: IMetabaseObject;
sourceHierarchies, targetHierarchies: IDimHierarchies;
sourceHierarchy, targetHierarchy: IDimHierarchy;
i: Integer;
KeyMap: IMetabaseUpdateKeyMap;
UpdObjRemap: IMetabaseUpdateObjectRemapping;
Begin
// Получаем текущий репозиторий
MB := Params.Metabase;
// Создаем обновление
Update := Mb.CreateUpdate();
// Загружаем параметры обновления из файла
Update.LoadFromFileNF("C:\RegHieChng.pefx", UpdateLoadMode.ulmReplace);
// Создаем дополнительные настройки обновления
Context := Update.CreateUpdateContext();
// Получаем справочники
sourceDim := MB.ItemById["MDM_INDICATOR_S"].Bind();
targetDim := MB.ItemById["MDM_INDICATOR_D"].Bind();
// Получаем иерархии справочников
sourceHierarchies := (sourceDim As IDimensionModel).Hierarchies;
targetHierarchies := (targetDim As IDimensionModel).Hierarchies;
// Перебираем иерархии справочника-источника
For i := 0 To sourceHierarchies.Count - 1 Do
// Получаем текущую иерархию справочника-источника
sourceHierarchy := sourceHierarchies.Item[i];
// Ищем аналогичную иерархию в справочнике-приемнике
targetHierarchy := targetHierarchies.FindById(sourceHierarchy.Id);
// Если такая иерархия найдена
If (targetHierarchy <> Null) Then
// Переопределяем альтернативную иерархию на которую ссылается справочник-источник.
// Она будет ссылаться на альтернативную иерархию в справочнике-приёмнике
context.RegisterHierarchyChange(sourceDim.Key, sourceHierarchy.Key, sourceHierarchy.Id,
targetHierarchy.Key, targetHierarchy.Id, targetDim);
// Получаем справочник, используемый для альтернативной иерархии в справочнике-источнике
sourceHieSrc := sourceHierarchy.Source As IMetabaseObject;
// Получаем справочник, используемый для альтернативной иерархии в справочнике-приёмнике
targetHieSrc := targetHierarchy.Source As IMetabaseObject;
// Переопределяем справочник, используемый для построения альтернативной иерархии в справочнике-источнике.
// Будет использоваться справочник для построения альтернативной иерархии в справочнике приёмнике
context.RegisterKeyChange(sourceHieSrc.ClassId, sourceHieSrc.Key, targetHieSrc.Key,
sourceHieSrc.Id, targetHieSrc.Id, targetHieSrc);
End If;
End For;
// Получаем карту ключей, используемых для повторного сопоставления объектов обновления
KeyMap := Context.KeyMap;
// Проверяем, не пустая ли карта
If Not KeyMap.IsEmpty Then
// Если карта содержит данные, то перебираем её элементы
For i := 0 To KeyMap.Count - 1 Do
// Получаем параметры повторного сопоставления объекта обновления
UpdObjRemap := KeyMap.Item[i];
// Выводим информацию о параметрах повторного сопоставления объекта
System.Diagnostics.Debug.WriteLine("Тип объекта репозитория: " + UpdObjRemap.ClassID.ToString());
System.Diagnostics.Debug.WriteLine("Допускается ли для объекта несколько повторных сопоставлений: " + UpdObjRemap.HasMultiValues.ToString());
System.Diagnostics.Debug.WriteLine("Идентификатор нового объекта: " + UpdObjRemap.NewId);
System.Diagnostics.Debug.WriteLine("Идентификатор старого объекта: " + UpdObjRemap.OldId);
System.Diagnostics.Debug.WriteLine("Ключ нового объекта: " + UpdObjRemap.NewKey.ToString());
System.Diagnostics.Debug.WriteLine("Ключ старого объекта: " + UpdObjRemap.OldKey.ToString());
System.Diagnostics.Debug.WriteLine("Используется нулевое сопоставление: " + UpdObjRemap.NullRemapping.ToString());
If UpdObjRemap.Object <> Null Then
System.Diagnostics.Debug.WriteLine("Объект приёмника, используемый для повторного сопоставления: " + UpdObjRemap.Object.Name);
End If;
System.Diagnostics.Debug.Write("Тип повторного сопоставления: ");
Select Case UpdObjRemap.Type
Case MetabaseUpdateRemappingType.murtUnknown: System.Diagnostics.Debug.WriteLine("неизвестный тип");
Case MetabaseUpdateRemappingType.murtObject: System.Diagnostics.Debug.WriteLine("объект репозитория");
Case MetabaseUpdateRemappingType.murtHierarchy: System.Diagnostics.Debug.WriteLine("альтернативная иерархия");
Case MetabaseUpdateRemappingType.murtMetafactsAttribute: System.Diagnostics.Debug.WriteLine("атрибуты временных рядов");
Case MetabaseUpdateRemappingType.murtMetavalsAttribute: System.Diagnostics.Debug.WriteLine("атрибуты наблюдений");
Case MetabaseUpdateRemappingType.murtNone: System.Diagnostics.Debug.WriteLine("тип не задан");
End Select;
System.Diagnostics.Debug.WriteLine("");
End For;
End If;
// Применяем обновление
Update.ApplyEx(Null, Context);
End Sub;Public Shared Sub Main(Params: StartParams);
Var
MB: IMetabase;
Update: IMetabaseUpdate;
Context: IMetabaseUpdateContext;
sourceDim, targetDim: IMetabaseObject;
sourceHieSrc, targetHieSrc: IMetabaseObject;
sourceHierarchies, targetHierarchies: IDimHierarchies;
sourceHierarchy, targetHierarchy: IDimHierarchy;
i: Integer;
KeyMap: IMetabaseUpdateKeyMap;
UpdObjRemap: IMetabaseUpdateObjectRemapping;
Begin
// Получаем текущий репозиторий
MB := Params.Metabase;
// Создаем обновление
Update := Mb.CreateUpdate();
// Загружаем параметры обновления из файла
Update.LoadFromFileNF("C:\RegHieChng.pefx", UpdateLoadMode.ulmReplace);
// Создаем дополнительные настройки обновления
Context := Update.CreateUpdateContext();
// Получаем справочники
sourceDim := MB.ItemById["MDM_INDICATOR_S"].Bind();
targetDim := MB.ItemById["MDM_INDICATOR_D"].Bind();
// Получаем иерархии справочников
sourceHierarchies := (sourceDim As IDimensionModel).Hierarchies;
targetHierarchies := (targetDim As IDimensionModel).Hierarchies;
// Перебираем иерархии справочника-источника
For i := 0 To sourceHierarchies.Count - 1 Do
// Получаем текущую иерархию справочника-источника
sourceHierarchy := sourceHierarchies.Item[i];
// Ищем аналогичную иерархию в справочнике-приемнике
targetHierarchy := targetHierarchies.FindById(sourceHierarchy.Id);
// Если такая иерархия найдена
If (targetHierarchy <> Null) Then
// Переопределяем альтернативную иерархию на которую ссылается справочник-источник.
// Она будет ссылаться на альтернативную иерархию в справочнике-приёмнике
context.RegisterHierarchyChange(sourceDim.Key, sourceHierarchy.Key, sourceHierarchy.Id,
targetHierarchy.Key, targetHierarchy.Id, targetDim);
// Получаем справочник, используемый для альтернативной иерархии в справочнике-источнике
sourceHieSrc := sourceHierarchy.Source As IMetabaseObject;
// Получаем справочник, используемый для альтернативной иерархии в справочнике-приёмнике
targetHieSrc := targetHierarchy.Source As IMetabaseObject;
// Переопределяем справочник, используемый для построения альтернативной иерархии в справочнике-источнике.
// Будет использоваться справочник для построения альтернативной иерархии в справочнике приёмнике
context.RegisterKeyChange(sourceHieSrc.ClassId, sourceHieSrc.Key, targetHieSrc.Key,
sourceHieSrc.Id, targetHieSrc.Id, targetHieSrc);
End If;
End For;
// Получаем карту ключей, используемых для повторного сопоставления объектов обновления
KeyMap := Context.KeyMap;
// Проверяем, не пустая ли карта
If Not KeyMap.IsEmpty Then
// Если карта содержит данные, то перебираем её элементы
For i := 0 To KeyMap.Count - 1 Do
// Получаем параметры повторного сопоставления объекта обновления
UpdObjRemap := KeyMap.Item[i];
// Выводим информацию о параметрах повторного сопоставления объекта
System.Diagnostics.Debug.WriteLine("Тип объекта репозитория: " + UpdObjRemap.ClassID.ToString());
System.Diagnostics.Debug.WriteLine("Допускается ли для объекта несколько повторных сопоставлений: " + UpdObjRemap.HasMultiValues.ToString());
System.Diagnostics.Debug.WriteLine("Идентификатор нового объекта: " + UpdObjRemap.NewId);
System.Diagnostics.Debug.WriteLine("Идентификатор старого объекта: " + UpdObjRemap.OldId);
System.Diagnostics.Debug.WriteLine("Ключ нового объекта: " + UpdObjRemap.NewKey.ToString());
System.Diagnostics.Debug.WriteLine("Ключ старого объекта: " + UpdObjRemap.OldKey.ToString());
System.Diagnostics.Debug.WriteLine("Используется нулевое сопоставление: " + UpdObjRemap.NullRemapping.ToString());
If UpdObjRemap.Object <> Null Then
System.Diagnostics.Debug.WriteLine("Объект приёмника, используемый для повторного сопоставления: " + UpdObjRemap.Object.Name);
End If;
System.Diagnostics.Debug.Write("Тип повторного сопоставления: ");
Select Case UpdObjRemap.Type
Case MetabaseUpdateRemappingType.murtNone: System.Diagnostics.Debug.WriteLine("тип не задан");
Case MetabaseUpdateRemappingType.murtObject: System.Diagnostics.Debug.WriteLine("объект репозитория");
Case MetabaseUpdateRemappingType.murtHierarchy: System.Diagnostics.Debug.WriteLine("альтернативная иерархия");
Case MetabaseUpdateRemappingType.murtMetafactsAttribute: System.Diagnostics.Debug.WriteLine("атрибуты временных рядов");
Case MetabaseUpdateRemappingType.murtMetavalsAttribute: System.Diagnostics.Debug.WriteLine("атрибуты наблюдений");
End Select;
System.Diagnostics.Debug.WriteLine("");
End For;
End If;
// Применяем обновление
Update.ApplyEx(Null, Context);
End Sub;
См. также: