30.12.2008, 14:32 | #1 |
Программатор
|
Закрыть на редактирование одну из фин аналитик в одном месте
Собственно сабж. Куда залезьть и что сделать для того, чтобы закрыть редактирование на формах одной из финансовых аналитик во всей системе?
Есть мысль залезьть в \Classes\SysSecurity*. Ах 4.0; SP2 ЗЫ: ссылки внизу читал. |
|
30.12.2008, 17:52 | #2 |
Участник
|
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 ) ; } } } } } X++: public void init() { super(); SysSecurityFormSetup::loadSecurity(this); this.dimensionDenyEdit( SysDimension::Department ) ; } |
|
|
За это сообщение автора поблагодарили: Sada (2). |
31.12.2008, 17:08 | #3 |
Программатор
|
спасибо, после праздников попробую
|
|
10.01.2009, 15:14 | #4 |
Программатор
|
что то с LedgerJournalTrans не прокатывает((
|
|
10.01.2009, 15:25 | #5 |
Программатор
|
Хотя formDataObject.enabled( false ) ;
отрабатывает норм Не хотелось бы так. Почему такое поведение может ктонить подсказать? Последний раз редактировалось Sada; 10.01.2009 в 15:28. |
|
10.01.2009, 17:36 | #6 |
MCITP
|
Ну, предположу, что потому что на LedgerJournalTrans есть своё класс-движок (LegerJournalTransForm, или как его там - Аксапты нет под рукой), который в частности руководит и доступностью аналитик.
Нужно там тоже править логику, также как и в базовых классах форм складских журналов и ещё, возможно, где-то, где есть подобные конструкциии...
__________________
Zhirenkov Vitaly |
|
11.01.2009, 12:54 | #7 |
Участник
|
Можно попробывать следующее решение :
В классе 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). |
11.01.2009, 13:38 | #8 |
Программатор
|
То, что нужно
|
|
11.01.2009, 19:07 | #9 |
Участник
|
Небольшой штрих
Цитата:
При таком варианте решения задачи (с вызовом в методе 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). |