|
![]() |
#1 |
MCITP
|
![]()
Ну, предположу, что потому что на LedgerJournalTrans есть своё класс-движок (LegerJournalTransForm, или как его там - Аксапты нет под рукой), который в частности руководит и доступностью аналитик.
Нужно там тоже править логику, также как и в базовых классах форм складских журналов и ещё, возможно, где-то, где есть подобные конструкциии... ![]()
__________________
Zhirenkov Vitaly |
|
![]() |
#2 |
Участник
|
Можно попробывать следующее решение :
В классе 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)); } } } |
|
|
За это сообщение автора поблагодарили: ZVV (1), Sada (3). |
![]() |
#3 |
Участник
|
Небольшой штрих
Цитата:
При таком варианте решения задачи (с вызовом в методе init() ) у пользователей остается ряд возможностей получить доступ 'на редактирование' полей аналитики использованием возможностей штатного функционала из контекстного меню 'Настройка' и далее:
X++: public void loadSetup(...) { ... // --> allowDimensionEdit SysSetupFormRun sysSetupFormRun ; // <-- allowDimensionEdit ... if (designName) { ... xSysLastValue::getLast(this); ... // --> allowDimensionEdit sysSetupFormRun = sysSetupForm.getFormRun() ; sysSetupFormRun.setDimensionAccess( SysDimension::Purpose ) ; sysSetupFormRun.redraw(); // <-- allowDimensionEdit } ... } 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: |
|
|
За это сообщение автора поблагодарили: SRF (1). |