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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.12.2008, 14:32   #1  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
Закрыть на редактирование одну из фин аналитик в одном месте
Собственно сабж. Куда залезьть и что сделать для того, чтобы закрыть редактирование на формах одной из финансовых аналитик во всей системе?
Есть мысль залезьть в \Classes\SysSecurity*.
Ах 4.0; SP2

ЗЫ: ссылки внизу читал.
Старый 30.12.2008, 17:52   #2  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
? SysSetupFormRun
Вариант с навешиванием функциональности на SysSetupFormRun рассматривается?:

Classes\SysSetupFormRun\dimensionDenyEdit(...):
X++:
void dimensionDenyEdit( SysDimension _sysDimension )
{
    FormDataSource  formDataSource  ;
    FormDataObject  formDataObject  ;

    SysDictTable    sysDictTable    ;
    SysDictField    sysDictField    ;

    Counter         counterSource   ;
    Counter         counterFields   ;
    int             dimArrayIdx = Dimensions::code2ArrayIdx( _sysDimension ) ;
    ;

    for( counterSource=1; counterSource<=this.dataSourceCount(); counterSource++ )
    {
        formDataSource = this.dataSource( counterSource ) ;
        sysDictTable = new SysDictTable( formDataSource.table() ) ;

        for( counterFields=1; counterFields <= sysDictTable.fieldCntWithoutSys(); counterFields++ )
        {
            sysDictField = sysDictTable.fieldObject( sysDictTable.fieldCnt2Id( counterFields ) ) ;
            if( sysDictField.typeId() == extendedTypeNum( Dimension ) )
            {
                formDataObject = formDataSource.object( fieldId2Ext( sysDictField.id(), dimArrayIdx ) ) ;
                if( formDataObject )
                {
                    formDataObject.allowEdit( false ) ;
                    // formDataObject.enabled( false ) ;
                }
            }
        }
    }
}
Classes\SysSetupFormRun\init():
X++:
public void init()
{
    super();
    SysSecurityFormSetup::loadSecurity(this);

    this.dimensionDenyEdit( SysDimension::Department ) ;
}
За это сообщение автора поблагодарили: Sada (2).
Старый 31.12.2008, 17:08   #3  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
спасибо, после праздников попробую
Старый 10.01.2009, 15:14   #4  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
что то с LedgerJournalTrans не прокатывает((
Старый 10.01.2009, 15:25   #5  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
Хотя formDataObject.enabled( false ) ;
отрабатывает норм
Не хотелось бы так. Почему такое поведение может ктонить подсказать?

Последний раз редактировалось Sada; 10.01.2009 в 15:28.
Старый 10.01.2009, 17:36   #6  
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   #7  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 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, 13:38   #8  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
То, что нужно
Старый 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 Кб, 76 просмотров)
За это сообщение автора поблагодарили: 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, время: 19:18.