|  22.10.2010, 16:31 | #1 | 
| Участник | Странное поведение свойства mandatory 
			
			Всем доброго вечера. Задача, при изменении одного из полей в форме(LedgerJournalTransCost) необходимо в зависимости от значения устанваливать обязательность заполнения другого поля. Сначала пошел первым путем ledgerJournalTrans_ds.object(fieldNum(LedgerJournalTrans, RContractAccountCredit)).mandatory(true); Каково было мое удивление, когда я обнаружил, что поле просто подсвечивается волнистой красной линией, при этом обязательность заполнения не проверяется, можно спокойно сохранить запись не заполняя его  Если пойти другим путем установив свойство AutoDeclaration у контрола в yes, то выполняя код RcontractCredit_RContractAccountCredit.mandatory(true); Все работает как надо. Это глюк или я что то не понимаю  П.с. kernel 4.0.2503.836 app 4.0.2501.347 Последний раз редактировалось RomanK; 22.10.2010 в 16:40. | 
|  | 
|  22.10.2010, 16:49 | #2 | 
| Гость | 
			
			в 2009 тоже так похоже на баг | 
|  | |
| За это сообщение автора поблагодарили: RomanK (1). | |
|  22.10.2010, 16:53 | #3 | 
| Участник | 
			
			Спасибо за ответ   . очень жаль конечно, можно было один раз написать это дело в классе и потом вызывать для всех форм группы ledgerJournalTrans*  , а так придется каждую из форм править   | 
|  | 
|  22.10.2010, 16:58 | #4 | 
| Axapta | 
			
			Это видимо, фича, а не баг. Эта линия для того, чтобы просто "inform users". По-моему, так всегда было.
		 | 
|  | 
|  22.10.2010, 17:01 | #5 | 
| Участник | 
			
			Подведя итог делаем вывод. Установить для поле обязательное заполнение можно способами: 1. На таблице 2. На датасоурсе 3. установка для контрола значение AutoDeclaration в Yes. | 
|  | 
|  22.10.2010, 17:05 | #6 | 
| MCP |   
			
			Можно попробовать перекрыть метод validateWrite на датасорсе и проверять заполнение поля программно, если пустое или заполнено некорректно - можно выбрасывать сообщение.
		 | 
|  | 
|  22.10.2010, 17:06 | #7 | 
| Axapta | 
			
			Самый правильный способ. Нехороший способ. Никогда его не использую. Вообще не люблю свойставами полей ДатаСорса пользоваться. Совсем плохо. Если нельзя поставить мандатори на таблице, то лучше добавить проверку в коде. Может даже в каком-нибудь validateWrite например. Может даже на табличном. И передавать туда параметр. Зависит от задачи. | 
|  | 
|  22.10.2010, 17:07 | #8 | 
| Гость | |
|  | |
| За это сообщение автора поблагодарили: kornix (1). | |
|  22.10.2010, 17:08 | #9 | 
| Участник | 
			
			Допиши проверку на заполненность в тот же класс и вызывай для validateWrite всех форм той же группы.
		 Последний раз редактировалось AlGol; 22.10.2010 в 17:10. | 
|  | 
|  22.10.2010, 17:08 | #10 | 
| MCP | |
|  | 
|  22.10.2010, 17:13 | #11 | 
| Участник | 
			
			Ага, подкрашивание сделать способом на который были возложены надежды   И все таки раз зашел разговор о том что ставить свойство AutoDeclaration в Yes очень плохо, поясните почему. На мой взгляд вполне неплохо потому что: 1. Уменьшается трудоемкость выполнения задачи 2. Код и поиск что же происходит с контролом более читабелен. В чем минус? Противоречит Best practice? | 
|  | 
|  22.10.2010, 17:16 | #12 | 
| Гость | 
			
			на формах вообще чем меньше меняешь, тем лучше. с апгрейдом проблем меньше | 
|  | 
|  22.10.2010, 17:17 | #13 | 
| Axapta | 
			
			Ставить Автодекларейшн в Yes - нормально во многих ситуациях. Но использовать свойство отдельновзятого контрола для недопущения незаполнения (  ) поля уже неправильно. У вас поле на таблице должно быть заполнено в некотором случае, а не этот контрол. Вот придет кому-то в голову данное поле вынести еще и на другую закладку, например, и что? В одном случае оно будет мандатори, а в другом нет? Да и вообще на формах чем меньше меняешь, тем проще, лучше и правильнее. Проверка должны быть в вашем случае в коде при сохранении записи. Вопрос только где этот код лучше писать. | 
|  | |
| За это сообщение автора поблагодарили: RomanK (1), (1). | |
|  22.10.2010, 17:21 | #14 | 
| Участник | 
			
			Отлично, спасибо за ясный ответ
		 | 
|  | 
|  22.10.2010, 22:02 | #15 | 
| Участник | Цитата: Цитата: Разве что для unbound-контролов  А для bound-контролов, по-моему, лучше всегда и везде использовать группы полей с AutoDataGroup = Yes.  На счет AutoDeclaration хочется (скромно так) еще раз пропиарить Итератор с поддержкой методов обратного вызова для обработки контролов на форме, который как минимум для тех контролов, которые могут располагаться в Grid'е, практически избавляет от необходимости обращения к ним "по имени"   | 
|  | 
|  23.10.2010, 07:39 | #16 | 
| Участник | 
			
			Уже было. formDataObject.mandatory(true) Скажите, а как можно передать параметр в validateWrite? | 
|  | 
|  23.10.2010, 11:37 | #17 | 
| Axapta | 
			
			Так же, как и в любой другой метод. Перекрываем табличный validateWrite (если он еще не перекрыт), добавляем в него необязательный параметр и все. Какие проблемы? Или я вопрос не понял? X++: public boolean validateWrite(boolean _validateField2 = false) { boolean ret; ret = super(); if (_validateField2 && !this.Field2) { ret = checkFailed(strfmt("@SYS26332", new DictField(this.TableId, fieldNum(Table1, Field2)).label())); } return ret; } | 
|  | 
|  25.10.2010, 02:35 | #18 | 
| Участник | 
			
			А чем тогда такой перекрытый метод будет лучше мктода с другим именем? Вызывать же его прийдётся в ручную? Даже такая конструкция вроде бы не доступна X++: //validateWrite источника данных формы boolean validateWrite() { boolean ret; // ret = super(true); //Для функции было указано неверное число аргументов. Table1.validateWrite(true) // если только так return ret; } | 
|  | 
|  25.10.2010, 02:38 | #19 | 
| Axapta | 
			
			Тем, что о данной возможности смогут узнать и другие разработчики, которые с этой таблицей будут работать в будущем. А если сделать какой-нибудь метод с названием mySuperMethod(), то уже через пару недель вы сами забудете, что он есть.
		 | 
|  | |
| За это сообщение автора поблагодарили: S.Kuskov (1). | |
|  25.10.2010, 12:59 | #20 | 
| Участник | 
			
			Спасибо всем кто отписался, не стал городить новые классы тем более нашел что класс LedgerJournalFormTrans как раз занимается нужными мне полями. Указание пользователю что поле является обязательным для заполнения(подчеркивание) реализовано в этом класее, а проверку вынес в таблицу в validateWrite.
		 | 
|  |