|  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). | |