15.03.2011, 04:55 | #1 |
Участник
|
Задача (может кому то будет интересно)
Есть форма с двумя контролами на ней. Например первый - string контрол (InventLocationId) из источника данных (InventLocation). Второй – неважно.
На первой контроле переопределен метод (validate) который выгдядит как: X++: public boolean validate() { InventLocation inventLocation; boolean ret; ; inventLocation = InventLocation::find(this.valueStr()); if (inventLocation) { ret = true; info('validation is OK'); } else { ret = checkFailed('validation failed'); } return ret; } Пользователь делает следущие шаги
__________________
Thx, Ievgenii Korovin| Dynamics Ax SCM| Microsoft Corp| http://blogs.msdn.com/DynamicsAxSCM/ |
|
15.03.2011, 07:51 | #2 |
Участник
|
Цитата:
вообще говоря, порядок вызовов задокументирован в хелпе (ключевое слово sequence - по нему много полезного) про форму http://msdn.microsoft.com/en-US/libr...(v=AX.10).aspx в частности про контрол http://msdn.microsoft.com/en-US/libr...(v=AX.10).aspx ******************* кстати, хочу заметить что старые хелпы были более наглядны - с картинками и более правильны |
|
15.03.2011, 08:32 | #3 |
MCP
|
Хм.. Прошу не топтать в случае ошибки, отвечаю честно, без примера. Вроде бы должно быть так:
1) Сработает перекрытый validate - выкинет ошибку 2) Сработает табличный validate, который тоже выкинет ошибку Вывод - валидаторы нужно писать не на контроле формы, а на датасорсе, причем желательно на датасорсе вызывать класс *type. |
|
15.03.2011, 08:55 | #4 |
Участник
|
ага. причем еще лучше на самой таблице
А можно чуть подробнее? |
|
15.03.2011, 09:02 | #5 |
MCP
|
Имел ввиду если проверка какая-то громоздкая, и таблица стандартная. Например если это salesLine, то из табличного validateField можно вызывать проверку в классе salesLineType.
Так удобно делать когда класс *type уже был написан в стандарте, его удобно инициализировать. Поправьте меня, если я ошибаюсь ЗЫ: Насчет проверки на датасорсе - извиняюсь, утро, имел ввиду размещать проверки на таблицах. Последний раз редактировалось kornix; 15.03.2011 в 09:15. |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
15.03.2011, 09:52 | #6 |
Участник
|
Люди! Вы чего, думали, вас проверяют на знание порядка вызова методов или способность слабать тестовую формочку? Мне лично этот вопрос до боли напомнил тему метод active() - когда он должен вызываться?:
Цитата:
|
|
15.03.2011, 10:32 | #7 |
MCP
|
Точно, наверно речь идет о различиях работы метода validate() в двух случаях:
Когда он привязан к датасорсу и когда он ни к чему не привязан? 2 Ievgenii: Почему в вашем примере нет вызова super()? Так задумано? Цитата:
Сообщения были датированы декабрем 2008-го, т.е. уже после официального выхода 2009-й, и относились, следовательно, к ядру AX 2012.
Последний раз редактировалось kornix; 15.03.2011 в 10:59. |
|
15.03.2011, 11:12 | #8 |
Участник
|
Ни в коей мере
Я, например, просто хотел обратить внимнаие на то, что в хелпе задокументировано. Поэтому: 1. Если будут изменения, то надо менять хелп 2. Хелп уже не торт добавил теги во все темы, связанные с этой Последний раз редактировалось mazzy; 15.03.2011 в 11:14. Причина: добавил теги. |
|
15.03.2011, 11:27 | #9 |
MCTS
|
Помниться была в четверке фича: если значение в контроле измененяется с помощью выбора из лукапа, то метод validate на этом контроле почему-то не отрабатывает. Может задача как-то связана с этой фичей?
__________________
Dynamics AX Experience Последний раз редактировалось CDR; 15.03.2011 в 11:30. |
|
15.03.2011, 11:39 | #10 |
Участник
|
Цитата:
Точно, наверно речь идет о различиях работы метода validate() в двух случаях:
В нашем сценарии пользователь два раза покинет контрол - то есть два раза вызавиться метод validate(). Вопрос был какие результаты он покажет (пройдет валидация или нет в обоих случиях) при данной реализации. Цитата:
?! Как должно быть или как будет в конкретной версии?
Цитата:
Хм.. Прошу не топтать в случае ошибки, отвечаю честно, без примера. Вроде бы должно быть так:
1) Сработает перекрытый validate - выкинет ошибку 2) Сработает табличный validate, который тоже выкинет ошибку
__________________
Thx, Ievgenii Korovin| Dynamics Ax SCM| Microsoft Corp| http://blogs.msdn.com/DynamicsAxSCM/ Последний раз редактировалось Ievgenii; 15.03.2011 в 11:43. |
|
15.03.2011, 11:56 | #11 |
MCP
|
Все-таки сделал пример:
1. Если контрол связан с источником данных - система запустит validate написанный на контроле, потом modified на контроле, потом validate на таблице. 2. Если контрол не привязан к источнику данных, но привязан к EDT, система запустит validate только в случае ручного ввода текста в поле. Если выбрать значение из лукапа - validate написанный на контроле вообще не отработает. И еще одна интересная особенность: ваш пример выкидывает 2 одинаковые ошибки: "validation failed". Причем, если поставить breakpoint на info.add() и пройтись отладчиком, то в система выкидывает только одну ошибку. Последний раз редактировалось kornix; 15.03.2011 в 11:59. |
|
15.03.2011, 12:26 | #12 |
Участник
|
Цитата:
1. Если контрол связан с источником данных - система запустит validate написанный на контроле.
Цитата:
, потом modified на контроле, потом validate на таблице.
Обратите внимание на:
__________________
Thx, Ievgenii Korovin| Dynamics Ax SCM| Microsoft Corp| http://blogs.msdn.com/DynamicsAxSCM/ |
|
15.03.2011, 12:59 | #13 |
MCP
|
Тогда получается совсем круто, выводится 2 сообщения:
1. "validation is ok" 2. "Значение не найдено.." Связано это вот с чем: сначала система попадает в validate на formStringControl'е, при первом вхождении в него метод valueStr() возвращает только то что было выбрано из лукапа. А потом система выполняет проверку уже по связям с источником данных, и причем в этой проверке сравнивается корректное введеное пользователем значение. А по поводу: Цитата:
4. Возращает курсор на поле первого контрола и вводит опять валидное значение (GW)
Версия DAX4.0 Kernel 4.0.2503.454 Последний раз редактировалось kornix; 15.03.2011 в 13:08. |
|
|
За это сообщение автора поблагодарили: Ievgenii (3). |
15.03.2011, 13:19 | #14 |
Участник
|
Цитата:
Тогда получается совсем круто, выводится 2 сообщения:
1. "validation is ok" 2. "Значение не найдено.." Связано это вот с чем: сначала система попадает в validate на formStringControl'е, при первом вхождении в него метод valueStr() возвращает только то что было выбрано из лукапа. А потом система выполняет проверку уже по связям с источником данных, и причем в этой проверке сравнивается корректное введеное пользователем значение. В Dynamics Ax2009 + в кастомизациях наших партнеров есть формы которые используют valueStr() при валидации, модификции контролов и так далее. Это приводит к очень странному поведению в более сложных случиях, по-этому следует использовать text() метод если нужна подобная валидация. В Dynamics Ax 2012 куча новых возможностей валидации контролов и такой проблемы быть не должно (очень редко)
__________________
Thx, Ievgenii Korovin| Dynamics Ax SCM| Microsoft Corp| http://blogs.msdn.com/DynamicsAxSCM/ |
|
|
За это сообщение автора поблагодарили: kornix (1). |
Теги |
validate, как правильно, метод |
|
|