Показать сообщение отдельно
Старый 24.03.2006, 13:17   #19  
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).