Callback: IMetabaseUsersUpdateCallback;
Свойство Callback определяет объект, осуществляющий обработку ошибок, которые могут возникнуть при обновлении пользователей.
В качестве значения свойства необходимо указать экземпляр пользовательского класса, реализующего свойства и методы интерфейса IMetabaseUsersUpdateCallback.
Для выполнения примера убедитесь, что в менеджере безопасности содержатся пользователи.
Добавьте ссылки на системные сборки: Metabase, ForeSystem (для примера на Fore.NET).
Sub UserProc;
Var
MB: IMetabase;
Sec: IMetabaseSecurity;
Users: IMetabaseUsers;
User: IMetabaseUser;
UsUpdate: IMetabaseUsersUpdate;
UpdateCallback: IMetabaseUsersUpdateCallback;
Results: IMetabaseUsersUpdateErrors;
Error: IMetabaseUsersUpdateError;
Lic: Object;
Begin
MB := MetabaseClass.Active;
// Получим лицензию для возможности работы с менеджером безопасности
Lic := MB.RequestLicense(UiLicenseFeatureType.Adm);
Sec := MB.Security;
Users := Sec.Users;
// Создадим обновление
UsUpdate := Sec.CreateUsersUpdate;
For Each User In Users Do
UsUpdate.Add(User);
End For;
UpdateCallback := New UserUpdateClb.Create;
UpdateCallback.CallbackResult := MetabaseUsersUpdateCallbackResult.SilentContinue;
UsUpdate.Callback := UpdateCallback;
// Обновим всех пользователей
Sec.UpdateUsers(UsUpdate);
Results := UsUpdate.Errors;
// Зададим файл для выгрузки ошибок при обновлении
If Results.Count <> 0 Then
Results.SaveToFile("c:\UpdateUsersResult.txt", True);
End If;
For Each Error In Results Do
If Error.Type = MetabaseUsersUpdateErrorType.Error Then
Debug.WriteLine("Ошибка: " + Error.Message + ". Доп. информация: " + Error.DetailText);
Else
Debug.WriteLine("Предупреждение: " + Error.Message + ". Доп. информация: " + Error.DetailText);
End If;
End For;
// Сохраним изменения
Sec.Apply;
// Освободим лицензию
Lic := Null;
End Sub UserProc;
Class UserUpdateClb: Object, IMetabaseUsersUpdateCallback
_ClbResult: MetabaseUsersUpdateCallbackResult;
Sub Process(Subject: ISecuritySubject);
Begin
Debug.WriteLine("Обновление пользователя: " + Subject.Name);
End Sub Process;
Function RequestAction(Error: IMetabaseUsersUpdateError): MetabaseUsersUpdateCallbackResult;
Begin
Select Case Error.Type
Case MetabaseUsersUpdateErrorType.Warning:
Debug.WriteLine("Предупреждение: " + Error.Message);
Case MetabaseUsersUpdateErrorType.Error:
Debug.WriteLine("Ошибка: " + Error.Message);
End Select;
Return _ClbResult;
End Function RequestAction;
Function get_CallbackResult: MetabaseUsersUpdateCallbackResult;
Begin
Return _ClbResult;
End Function get_CallbackResult;
Sub set_CallbackResult(Result: MetabaseUsersUpdateCallbackResult);
Begin
_ClbResult := Result;
End Sub set_CallbackResult;
End Class UserUpdateClb;
Imports Prognoz.Platform.Interop.Metabase;
Imports Prognoz.Platform.Interop.ForeSystem;
…
Public Shared Sub Main(Params: StartParams);
Var
MB: IMetabase;
Sec: IMetabaseSecurity;
Users: IMetabaseUsers;
User: IMetabaseUser;
UsUpdate: IMetabaseUsersUpdate;
UpdateCallback: IMetabaseUsersUpdateCallback = New UserUpdateClb();
Results: IMetabaseUsersUpdateErrors;
Error: IMetabaseUsersUpdateError;
Lic: Object;
Begin
MB := Params.Metabase;
// Получим лицензию для возможности работы с менеджером безопасности
Lic := MB.RequestLicense(UiLicenseFeatureType.lftAdm);
Sec := MB.Security;
Users := Sec.Users;
// Создадим обновление
UsUpdate := Sec.CreateUsersUpdate();
For Each User In Users Do
UsUpdate.Add(User);
End For;
UpdateCallback.CallbackResult := MetabaseUsersUpdateCallbackResult.muucrSilentContinue;
UsUpdate.Callback := UpdateCallback;
// Обновим всех пользователей
Sec.UpdateUsers(UsUpdate);
Results := UsUpdate.Errors;
// Зададим файл для выгрузки ошибок при обновлении
If Results.Count <> 0 Then
Results.SaveToFile("c:\\UpdateUsersResult.txt", True);
End If;
For Each Error In Results Do
If Error.Type = MetabaseUsersUpdateErrorType.muuetError Then
System.Diagnostics.Debug.WriteLine("Ошибка: " + Error.Message + ". Доп. информация: " + Error.DetailText);
Else
System.Diagnostics.Debug.WriteLine("Предупреждение: " + Error.Message + ". Доп. информация: " + Error.DetailText);
End If;
End For;
// Сохраним изменения
Sec.Apply();
// Освободим лицензию
Lic := Null;
End Sub;
Class UserUpdateClb: IMetabaseUsersUpdateCallback
_ClbResult: MetabaseUsersUpdateCallbackResult;
Public Sub Process(Subject: ISecuritySubject);
Begin
System.Diagnostics.Debug.WriteLine("Обновление пользователя: " + Subject.Name);
End Sub;
Public Function RequestAction(Error: IMetabaseUsersUpdateError): MetabaseUsersUpdateCallbackResult;
Begin
Select Case Error.Type
Case MetabaseUsersUpdateErrorType.muuetWarning:
System.Diagnostics.Debug.WriteLine("Предупреждение: " + Error.Message);
Case MetabaseUsersUpdateErrorType.muuetError:
System.Diagnostics.Debug.WriteLine("Ошибка: " + Error.Message);
End Select;
Return _ClbResult;
End Function;
Public Property CallbackResult: MetabaseUsersUpdateCallbackResult
Get
Begin
Return _ClbResult;
End Get
Set
Begin
_ClbResult := Value;
End Set
End Property;
End Class;
После выполнения примера осуществляется обновление всех пользователей, созданных в менеджере безопасности репозитория. Для отслеживания процесса обновления создается объект пользовательского класса «UserUpdateClb». При возникновении каких-либо ошибок процесс обновления будет продолжен. После завершения, если во время обновления возникли ошибки/предупреждения, то информация о них будет выведена в консоль среды разработки, а также сохранена в файл.
См. также: