Показать сообщение отдельно
Старый 11.01.2009, 19:07   #9  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
Небольшой штрих
Цитата:
Сообщение от SRF Посмотреть сообщение
Можно попробывать следующее решение :
В классе SysSetuFormRun пишем метод setAccessDimension(), код которого приведен ниже и вызываем его в методе init() того же класса, аналогично тому как описал petergunn
Вызывать "его в методе init() того же класса, аналогично тому как описал petergunn" все же будет не совсем достаточно.
При таком варианте решения задачи (с вызовом в методе init() ) у пользователей остается ряд возможностей получить доступ 'на редактирование' полей аналитики использованием возможностей штатного функционала из контекстного меню 'Настройка' и далее:
  1. кнопка 'Загрузка' ранее сохраненных конфигураций
  2. кнопка 'Добавление полей'
В первом случае дополнительно потребуется модифицировать функционал в Forms\SysSetupForm\Methods\loadSetup():
X++:
public void loadSetup(...)
{
    ...
    //  --> allowDimensionEdit
    SysSetupFormRun sysSetupFormRun ;
    //  <-- allowDimensionEdit
    ...
    if (designName)
    {
        ...
        xSysLastValue::getLast(this);
        ...
       
        //  --> allowDimensionEdit
        sysSetupFormRun = sysSetupForm.getFormRun() ;
        sysSetupFormRun.setDimensionAccess( SysDimension::Purpose ) ;
        sysSetupFormRun.redraw();
        //  <-- allowDimensionEdit
    }
    ...
}
Во втором случае нужно смотреть в сторону класса SysSetupForm\Methods\formControlTreeUserAdd(), например:
X++:
public FormControl formControlTreeUserAdd(...)
{
    ...
    if (typeof(dragItem.data()) == Types::Integer)
    {
        fieldId         = dragItem.data();
        newControl      = parentControl.addDataField(formDataSource.id(), fieldId, insertAfterControl);

        //  --> allowDimensionEdit
        SysSetupFormRun::setDimensionAccessByField( editFormRun, newControl, Dimensions::code2ArrayIdx( SysDimension::Purpose ) ) ;
        editFormRun.redraw() ;
        //  <-- allowDimensionEdit
    }
    ...
}

P.S. В качестве 'экзотической' альтернативы модификаций SysSetupFormRun.init() + SysSetupForm можно рассмотреть вариант перекрытия метода SysSetupFormRun.activate( true ), т.е. обновлять уровень доступа к полям при получении формой фокуса ввода:
X++:
public void activate(boolean _active)
{
    super(_active);

    //  --> allowDimensionEdit
    if( _active )
    {
        this.setDimensionAccess( SysDimension::Purpose ) ;
        this.redraw() ;  //  перерисовать форму
    }
    //  <-- allowDimensionEdit
}

P.P.S. С учетом вышеизложенного, немного модифицировал вариант предложенный SRF и выкладываю в виде небольшого проекта (для примера 'заблокирована' аналитика 'Цель' - способ реализации зависит от значения макроопределения #allowEditVersion) - выгружено с DAX 4.0 SP2:
Вложения
Тип файла: zip AllowDimensionEdit.zip (22.1 Кб, 80 просмотров)
За это сообщение автора поблагодарили: SRF (1).