AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Администрирование
NAV
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.03.2006, 13:17   #1  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 868 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
версия 2 - продвинутая
Добавлена возможность автоматического исправления ошибок и удаления мусора.
Как любое автоматическое исправления, имеет свои "особенности". Если будете использовать, то сначала потестируйте внимательно.
PHP код:
static void CheckAccess(Args _args)
{
    
SysSecurityFormControlTable     SysSecurityFormControlTable;
    
SysSecurityFormTable            SysSecurityFormTable;
    
FormRun                         fr;
    
FormBuildDesign                 fbd;
    
Args                            args = new Args();
    
Map                             name2id;
    
Map                             name2label;
    
Dialog                          d = new Dialog('Проверка прав на формах');
    
DialogField                     dfShow;
    
DialogField                     dfUpdate;
    
DialogField                     dfClear;

    
str 30 getLabel(Object _control)
    {
        switch (
classIdGet(_control))
        {
            case 
classnum(FormBuildStringControl):
            case 
classnum(FormBuildCheckBoxControl):
            case 
classnum(FormBuildGroupControl):
            case 
classNum(FormBuildRealControl):
            case 
classNum(FormBuildIntControl):
            case 
classNum(FormBuildComboBoxControl):
            case 
classNum(FormBuildWindowControl):
            case 
classNum(FormBuildDateControl):
            case 
classNum(FormBuildListBoxControl):
            case 
classNum(FormBuildTimeControl):
                return 
_control.label();
            case 
classNum(FormBuildRadioControl):
            case 
classNum(FormBuildTabPageControl):
                return 
_control.caption();
            case 
classNum(FormBuildButtonControl):
            case 
classNum(FormBuildCommandButtonControl):
            case 
classNum(FormBuildMenuButtonControl):
            case 
classNum(FormBuildFunctionButtonControl):
                return 
_control.text();
            default :
                return 
_control.name();
        }
        return 
_control.name();
    }

    
void fillMap(Object _containerControl)
    {
        
int     i;
        
Object  fbc;

        for( 
1<= _containerControl.controlCount(); ++)
        {
            
fbc _containerControl.controlNum(i);
            if(
fbc.isContainer())
                
fillMap(fbc);
            else
            {
                
name2id.insert(fbc.name(), fbc.id());
                
name2label.insert(fbc.name(), getLabel(fbc));
            }
        }
    }

    
dfShow   d.addFieldValue(typeId(NoYesId), true'Отображать сведения в инфолог',
                                                      
'info - корректные права, warning - известен новый id объекта, error - непонятно что');
    
dfUpdate d.addField(typeId(NoYesId), 'Исправлять ID, если найден правильный',
                                           
'Попытка восстановить права на "измененные" объекты формы');
    
dfClear  d.addField(typeId(NoYesId), 'Удалять ссылки на неверный ID (и неисправленные)',
                                           
'Если не стоит "Исправлять..", то удалятся все некорректные настройки');

    if(! 
d.run() || (dfShow.value()   != NoYes::Yes &&
                     
dfUpdate.value() != NoYes::Yes &&
                     
dfClear.value()  != NoYes::Yes)  )
        return;

    
SetPrefix('Проверка прав на контролы');
    
startLengthyOperation();

    while 
select SysSecurityFormTable
        order by DomainId
FormNameUserGroupId
    
{
        
args.name(SysSecurityFormTable.FormName);
        
fr ClassFactory::formRunClassOnClient(args);
        
fbd fr.form().design();

        
name2id = new Map(Types::StringTypes::Integer);
        
name2label = new Map(Types::StringTypes::String);
        
fillMap(fbd);

        
SetPrefix(strFmt("%2 (%1)\t %3"fr.name(), fbd.caption(), SysSecurityFormTable.UserGroupId));

        try
        {
            
ttsbegin;
            
SysSecurityFormControlTable.selectForUpdate(dfClear.value() || dfUpdate.value());

            while 
select SysSecurityFormControlTable
                order by FormControlId DESC
FormControlName
                where SysSecurityFormControlTable
.SysSecurityFormId == SysSecurityFormTable.RecId
            
{
                if(
name2id.exists(SysSecurityFormControlTable.FormControlName) &&
                   
name2id.lookup(SysSecurityFormControlTable.FormControlName) == SysSecurityFormControlTable.FormControlId)
                {
                    if(
dfShow.value() == NoYes::Yes)
                        
info(strFmt("%1 (%2) - %3"name2label.lookup(SysSecurityFormControlTable.FormControlName),
                                                
SysSecurityFormControlTable.FormControlNameSysSecurityFormControlTable.AccessType));
                }
                else
                {
                    if(
name2label.exists(SysSecurityFormControlTable.FormControlName))
                    {
                        if(
dfShow.value() == NoYes::Yes)
                            
warning(strFmt("%1 (%2) - %3"name2label.lookup(SysSecurityFormControlTable.FormControlName),
                                                     
SysSecurityFormControlTable.FormControlNameSysSecurityFormControlTable.AccessType));
                        if(
dfUpdate.value() == NoYes::Yes)
                        {
                            
SysSecurityFormControlTable.FormControlId name2id.lookup(SysSecurityFormControlTable.FormControlName);
                            
SysSecurityFormControlTable.update();
                        }
                        else if(
dfClear.value() == NoYes::Yes)
                            
SysSecurityFormControlTable.delete();
                    }
                    else
                    {
                        if(
dfShow.value() == NoYes::Yes)
                            
error(strFmt("%1 - %2"SysSecurityFormControlTable.FormControlNameSysSecurityFormControlTable.AccessType));

                        if(
dfClear.value() == NoYes::Yes)
                            
SysSecurityFormControlTable.delete();
                    }
                }
            }

            
ttscommit;
        }
        catch
        {
            
error("Исправление не удалось!");
            
// Если исправление для некоторых форм-групп не удалось, то можно
            // исправить сортировку order by FormControlId на ASC и запустить еще раз
        
}
    }

    
ttsbegin;

    
SetPrefix('Права на контролы без привязок к формам');
    while 
select forupdate SysSecurityFormControlTable
    notexists join SysSecurityFormTable
        where SysSecurityFormTable
.RecId == SysSecurityFormControlTable.SysSecurityFormId
    
{
        if(
dfShow.value() == NoYes::Yes)
            
error(strFmt("%1 (%2) %3"SysSecurityFormControlTable.FormControlNameSysSecurityFormControlTable.FormControlIdSysSecurityFormControlTable.FormControlType));
        if(
dfClear.value() == NoYes::Yes)
            
SysSecurityFormControlTable.delete();
    }

    
SetPrefix('Ссылка на формы без настроек на контролы');
    while 
select forupdate SysSecurityFormTable
    notexists join SysSecurityFormControlTable
        where SysSecurityFormControlTable
.SysSecurityFormId == SysSecurityFormTable.RecId
    
{
        if(
dfShow.value() == NoYes::Yes)
            
error(strFmt("%1 (%2) %3"SysSecurityFormTable.FormNameSysSecurityFormTable.DomainIdSysSecurityFormTable.UserGroupId));
        if(
dfClear.value() == NoYes::Yes)
            
SysSecurityFormTable.delete();
    }

    
ttscommit;
    
endLengthyOperation();

За это сообщение автора поблагодарили: glibs (4), George Nordic (5), Qaz Qwerty (1).
Теги
ax3.0, id объекта, xpo, законченный пример, импорт, права доступа

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Бага при импорте проекта Logger DAX: Программирование 0 09.12.2008 13:57
Сколько процентов от стоимости проекта идет на ФОТ? (анонимный опрос) Spider DAX: Прочие вопросы 1 27.09.2006 08:22
Проблемы при импорте и экспорте проекта FiGr DAX: Прочие вопросы 0 23.05.2006 16:41
Удаление проекта Maxim Gorbunov DAX: Программирование 0 24.12.2001 23:04

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 04:43.