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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 10.01.2009, 17:36   #1  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Sada Посмотреть сообщение
..... Почему такое поведение может ктонить подсказать?
Ну, предположу, что потому что на LedgerJournalTrans есть своё класс-движок (LegerJournalTransForm, или как его там - Аксапты нет под рукой), который в частности руководит и доступностью аналитик.

Нужно там тоже править логику, также как и в базовых классах форм складских журналов и ещё, возможно, где-то, где есть подобные конструкциии...
__________________
Zhirenkov Vitaly
Старый 11.01.2009, 12:54   #2  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
376 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Можно попробывать следующее решение :
В классе SysSetuFormRun пишем метод setAccessDimension(), код которого приведен ниже и вызываем его в методе init() того же класса, аналогично тому как описал petergunn
X++:
void setAccessDimension(SysDimension    _sysDimension, AccessType   _accessType = AccessType::View)
{
    FormBuildDataSource formDataSource;
    FormControl         formControl;
    SysDictTable        sysDictTable;
    SysDictField        sysDictField;
    int                 dimArrayIdx = Dimensions::code2ArrayIdx(_sysDimension);
    FormBuildDesign     design = this.form().design();
    Counter             curControl;
 
    void setSecurityLevelOnDimensions(FormBuildControl _control)
    {
        int                         currentControl;
        FormBuildStringControl      stringControl;
        SysDictField                dictField;
        if (_control.isContainer())
        {
            for(currentControl = 1; currentControl <= _control.controlCount(); currentControl++)
            {
                setSecurityLevelOnDimensions(_control.controlNum(currentControl));
            }
        }
        else if (_control.handle() == classNum(FormBuildStringControl))
        {
            stringControl   = _control;
            if (stringControl.dataField())
            {
                formDataSource  = this.form().dataSource(stringControl.dataSource());
                dictField       = new SysDictField(formDataSource.table(), stringControl.dataField());
 
 
                if (dictField.typeId() == extendedTypeNum(Dimension) && dictField.arrayIndex() == dimArrayIdx)
                {
                    formControl    = this.control(stringControl.id());
                    formControl.userSecurityLevel(_accessType + 1);
                }
            }
        }
    }
    ;
 
    if (design)
    {
        for(curControl = 1; curControl <= design.controlCount(); curControl++)
        {
            setSecurityLevelOnDimensions(design.controlNum(curControl));
        }
    }
}
Преимущество или недостаток данного способа заключается в том, что если после вызова init() формы, написать код, который выставляет в allowEdit(true) для поля типа Dimension, то в отличии от способа предложенного petergunn (пример, вы привели сами - строки журнала ГК), аналитика все равно останется только с тем доступом, который вы установили.
За это сообщение автора поблагодарили: ZVV (1), Sada (3).
Старый 11.01.2009, 19:07   #3  
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).
Теги
финансовая аналитика

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Аксапта 4.0 - иерархия фин. аналитик. slava09 DAX: Функционал 12 04.07.2006 10:04
Убрать одну из аналитик в отчете DTD DAX: Программирование 2 26.01.2006 16:52
Запрет на редактирование аналитик Deep Dreamer DAX: Программирование 10 17.06.2005 11:52
Ограничение на количество фин. аналитик sever DAX: Программирование 0 13.01.2004 08:03
Совместная работа пользователей на одном рабочем месте Pavlo AKA Panok DAX: Программирование 9 26.11.2003 12:53

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

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

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