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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.10.2010, 16:31   #1  
RomanK is offline
RomanK
Участник
 
41 / 11 (1) +
Регистрация: 08.11.2006
Записей в блоге: 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  
AX2011
Гость
 
n/a
в 2009 тоже так
похоже на баг
За это сообщение автора поблагодарили: RomanK (1).
Старый 22.10.2010, 16:53   #3  
RomanK is offline
RomanK
Участник
 
41 / 11 (1) +
Регистрация: 08.11.2006
Записей в блоге: 1
Спасибо за ответ . очень жаль конечно, можно было один раз написать это дело в классе и потом вызывать для всех форм группы ledgerJournalTrans* , а так придется каждую из форм править
Старый 22.10.2010, 16:58   #4  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Это видимо, фича, а не баг. Эта линия для того, чтобы просто "inform users". По-моему, так всегда было.
Старый 22.10.2010, 17:01   #5  
RomanK is offline
RomanK
Участник
 
41 / 11 (1) +
Регистрация: 08.11.2006
Записей в блоге: 1
Подведя итог делаем вывод. Установить для поле обязательное заполнение можно способами:
1. На таблице
2. На датасоурсе
3. установка для контрола значение AutoDeclaration в Yes.
Старый 22.10.2010, 17:05   #6  
kornix is offline
kornix
MCP
MCBMSS
Злыдни
Ex AND Project
 
414 / 146 (5) +++++
Регистрация: 24.02.2009
Адрес: Санкт-Петербург
Lightbulb
Цитата:
Сообщение от RomanK Посмотреть сообщение
Подведя итог делаем вывод. Установить для поле обязательное заполнение можно способами:
1. На таблице
2. На датасоурсе
3. установка для контрола значение AutoDeclaration в Yes.
Можно попробовать перекрыть метод validateWrite на датасорсе и проверять заполнение поля программно, если пустое или заполнено некорректно - можно выбрасывать сообщение.
Старый 22.10.2010, 17:06   #7  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Цитата:
Сообщение от RomanK Посмотреть сообщение
1. На таблице
Самый правильный способ.

Цитата:
Сообщение от RomanK Посмотреть сообщение
2. На датасоурсе
Нехороший способ. Никогда его не использую. Вообще не люблю свойставами полей ДатаСорса пользоваться.

Цитата:
Сообщение от RomanK Посмотреть сообщение
3. установка для контрола значение AutoDeclaration в Yes.
Совсем плохо.

Если нельзя поставить мандатори на таблице, то лучше добавить проверку в коде. Может даже в каком-нибудь validateWrite например. Может даже на табличном. И передавать туда параметр. Зависит от задачи.
Старый 22.10.2010, 17:07   #8  
AX2011
Гость
 
n/a
Цитата:
Сообщение от kornix Посмотреть сообщение
Можно попробовать перекрыть метод validateWrite на датасорсе и проверять заполнение поля программно, если пустое или заполнено некорректно - можно выбрасывать сообщение.
тогда уж лучше на таблице/классе
но тогда красненьких волночек не будет
За это сообщение автора поблагодарили: kornix (1).
Старый 22.10.2010, 17:08   #9  
AlGol is offline
AlGol
Участник
 
277 / 93 (4) ++++
Регистрация: 24.12.2001
Адрес: Тверь.
Цитата:
Сообщение от RomanK Посмотреть сообщение
написать это дело в классе и потом вызывать для всех форм группы ledgerJournalTrans* , а так придется каждую из форм править
Допиши проверку на заполненность в тот же класс и вызывай для validateWrite всех форм той же группы.

Последний раз редактировалось AlGol; 22.10.2010 в 17:10.
Старый 22.10.2010, 17:08   #10  
kornix is offline
kornix
MCP
MCBMSS
Злыдни
Ex AND Project
 
414 / 146 (5) +++++
Регистрация: 24.02.2009
Адрес: Санкт-Петербург
Цитата:
Сообщение от AX2011 Посмотреть сообщение
тогда уж лучше на таблице
ой.. извиняюсь Согласен.
Старый 22.10.2010, 17:13   #11  
RomanK is offline
RomanK
Участник
 
41 / 11 (1) +
Регистрация: 08.11.2006
Записей в блоге: 1
Цитата:
Сообщение от AX2011 Посмотреть сообщение
тогда уж лучше на таблице/классе
но тогда красненьких волночек не будет
Ага, подкрашивание сделать способом на который были возложены надежды

И все таки раз зашел разговор о том что ставить свойство AutoDeclaration в Yes очень плохо, поясните почему.
На мой взгляд вполне неплохо потому что:
1. Уменьшается трудоемкость выполнения задачи
2. Код и поиск что же происходит с контролом более читабелен.

В чем минус? Противоречит Best practice?
Старый 22.10.2010, 17:16   #12  
AX2011
Гость
 
n/a
на формах вообще чем меньше меняешь, тем лучше.
с апгрейдом проблем меньше
Старый 22.10.2010, 17:17   #13  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Ставить Автодекларейшн в Yes - нормально во многих ситуациях. Но использовать свойство отдельновзятого контрола для недопущения незаполнения () поля уже неправильно. У вас поле на таблице должно быть заполнено в некотором случае, а не этот контрол. Вот придет кому-то в голову данное поле вынести еще и на другую закладку, например, и что? В одном случае оно будет мандатори, а в другом нет? Да и вообще на формах чем меньше меняешь, тем проще, лучше и правильнее.

Проверка должны быть в вашем случае в коде при сохранении записи. Вопрос только где этот код лучше писать.
За это сообщение автора поблагодарили: RomanK (1),  (1).
Старый 22.10.2010, 17:21   #14  
RomanK is offline
RomanK
Участник
 
41 / 11 (1) +
Регистрация: 08.11.2006
Записей в блоге: 1
Отлично, спасибо за ясный ответ
Старый 22.10.2010, 22:02   #15  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от RomanK Посмотреть сообщение
можно было один раз написать это дело в классе и потом вызывать для всех форм группы ledgerJournalTrans* а так придется каждую из форм править
Ни в коем случае не надо править все формы подряд! Напишите (или допишите) движок управления формами (иерархию классов, если у вас несколько схожих "разновидностей" журналов) и движок с бизнес-логикой (тоже иерархию классов), который будет решать, когда поле обязательно к заполнению, а когда нет; в качестве основы можно взять LedgerJournalEngine, хотя в ряде случаев проще написать с нуля свое, чем вырезать из него "лишнее". Тогда движок управления формами будет получать от движка с бизнес-логикой данные о том, какие поля являются обязательными, и подсвечивать их для пользователя красной волнистой линией за счет изменения свойств полей DataSource'а, а движок с бизнес-логикой на validateWrite будет проверять, на самом ли деле обязательные поля заполнены. Причем заметьте: проверять заполненность полей только на записи строк журнала на форме недостаточно, потому что сегодня журнал создает пользователь, а завтра он будет создаваться из кода, так что как минимум все те же самые проверки нужно выполнять в классе разноски ваших журналов - тут вам опять пригодится движок, содержащий бизнес-логику.
Цитата:
Сообщение от AlGol Посмотреть сообщение
Допиши проверку на заполненность в тот же класс и вызывай для validateWrite всех форм той же группы.
Однозначно - и не только на формах.
Цитата:
Сообщение от oip Посмотреть сообщение
Ставить Автодекларейшн в Yes - нормально во многих ситуациях.
Разве что для unbound-контролов А для bound-контролов, по-моему, лучше всегда и везде использовать группы полей с AutoDataGroup = Yes. На счет AutoDeclaration хочется (скромно так) еще раз пропиарить Итератор с поддержкой методов обратного вызова для обработки контролов на форме, который как минимум для тех контролов, которые могут располагаться в Grid'е, практически избавляет от необходимости обращения к ним "по имени"
Старый 23.10.2010, 07:39   #16  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от RomanK Посмотреть сообщение
Странное поведение свойства mandatory
Уже было. formDataObject.mandatory(true)
Цитата:
Сообщение от oip Посмотреть сообщение
Если нельзя поставить мандатори на таблице, то лучше добавить проверку в коде. Может даже в каком-нибудь validateWrite например. Может даже на табличном. И передавать туда параметр. Зависит от задачи.
Скажите, а как можно передать параметр в validateWrite?
Старый 23.10.2010, 11:37   #17  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Скажите, а как можно передать параметр в validateWrite?
Так же, как и в любой другой метод. Перекрываем табличный 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;
}
В стандарте полно примеров. Первое, что приходит на ум - таблица InventJournalTable.
Старый 25.10.2010, 02:35   #18  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от oip Посмотреть сообщение
Какие проблемы? Или я вопрос не понял?
А чем тогда такой перекрытый метод будет лучше мктода с другим именем? Вызывать же его прийдётся в ручную? Даже такая конструкция вроде бы не доступна
X++:
//validateWrite источника данных формы
boolean validateWrite()
{
    boolean ret;

//    ret = super(true); //Для функции было указано неверное число аргументов.
    Table1.validateWrite(true) // если только так

    return ret;
}
Старый 25.10.2010, 02:38   #19  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
А чем тогда такой перекрытый метод будет лучше мктода с другим именем?
Тем, что о данной возможности смогут узнать и другие разработчики, которые с этой таблицей будут работать в будущем. А если сделать какой-нибудь метод с названием mySuperMethod(), то уже через пару недель вы сами забудете, что он есть.
За это сообщение автора поблагодарили: S.Kuskov (1).
Старый 25.10.2010, 12:59   #20  
RomanK is offline
RomanK
Участник
 
41 / 11 (1) +
Регистрация: 08.11.2006
Записей в блоге: 1
Спасибо всем кто отписался, не стал городить новые классы тем более нашел что класс LedgerJournalFormTrans как раз занимается нужными мне полями. Указание пользователю что поле является обязательным для заполнения(подчеркивание) реализовано в этом класее, а проверку вынес в таблицу в validateWrite.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Странное поведение функции "Отображение аналитик" Lelya DAX: Функционал 2 28.05.2009 19:36
Странное поведение ttsAbort Logger DAX: Программирование 6 28.05.2009 15:11
Объясните странное поведение enum'ов Deep Dreamer DAX: Программирование 6 09.04.2007 23:44
Поведение свойства Height в отчете KiselevSA DAX: Программирование 0 31.10.2006 15:32
Странное поведение резервирования после создания спланированной закупки. NEO DAX: Функционал 7 01.07.2004 14:03

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 09:35.