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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.09.2020, 18:02   #1  
Metrofun is offline
Metrofun
Участник
 
72 / 10 (1) +
Регистрация: 27.04.2020
? Проверка вводимого значения в управляющем элементе
Здравствуйте.
Axapta 3.0.
Задача проверять вводимое значение пользователем в управляющий элемент, например в IntEdit, и в случае выполнения определенного условия запрещать изменения значения.
Перекрыл метод modified, управляющего элемента.
Введённое значение не сохраняется, как и надо.
А как сделать чтобы значение было как до ввода пользователем?
public boolean modified()
{
boolean ret;

ret = super();

if (MyIntEdit.value() < 0)
{
ret = false;
info('Введённое значение меньше нуля!')
}

return ret;

}
Старый 28.09.2020, 18:27   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Metrofun Посмотреть сообщение
Задача проверять вводимое значение пользователем в управляющий элемент
Начнем с того, что задача в принципе неправильно поставлена.

1.
неправильно проверять вводимое пользователем в контрол
поскольку вводить значения могут не только пользователи через формы, но и роботы через сервисы, и сам код через методы.

проверять нужно значение, вводимое любым способом.

2.
неправильно проверять ОДНО отдельное значение.
часто в бизнес-логике есть взаимосвязанные значения.
например, при вводе строки общего журнала нужно выбрать тип счета и счет.
проверять счет без типа не имеет смысла

бывают более сложные случаи - параметры на вкладке Fixed Asset имеют смысл только если выбран тип Fixed Asset и код Fixed Asset.
Но вводить параметры на вкладках можно в любом порядке.

Нажмите на изображение для увеличения
Название: 1.PNG
Просмотров: 65
Размер:	104.6 Кб
ID:	12945

3.
Поэтому в Аксапте есть метод ValidateWrite на таблице.
Этот метод срабатывает, когда пользователь делает попытку сохранить запись (Ctrl+S, переход на другую строку в форме или закрыть форму),
когда программа вызывает ValidateWrite

В этом методе и нужно выполнить бизнес-проверку записи.

4.
если вам уж совсем надо проверить одно поле
то воспользуйтесь методом validateField на таблице.
там вам доступен this.orig() с оригинальными значениями полей

==============
не работайте с контролами формы - работайте с таблицами.
не предполагайте, что вводит только пользователь - боты работают с бизнес-логикой также часто, как и люди
__________________
полезное на axForum, github, vk, coub.

Последний раз редактировалось mazzy; 29.09.2020 в 13:25. Причина: исправил опечатку
Старый 29.09.2020, 10:51   #3  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от mazzy Посмотреть сообщение
4.
если вам уж совсем надо проверить одно поле
то воспользуйтесь методом modifiedField на таблице.
там вам доступен this.orig() с оригинальными значениями полей
Здесь опечатка Для проверки используются методы ValidateXXX. Для проверки одного поля ValidateField()


Общая логика работы с данным заключается в том, что коды проверки и изменения данных не должны физически находится в одном методе. Отдельный метод для проверок и отдельный метод для изменений. Ни в коем случае не смешивать!

При этом методы на таблице-источнике ValidateXXX() будут вызваны автоматически если работа выполняется из формы. Однако не будут вызваны автоматически, если работа с данными выполняется программно. В этом и смысл. Проверка выполняется не всегда, а лишь тогда, когда в этом есть необходимость.

В объектах на форме это, соответственно, метод Validate() для проверки и Modified() для действий при изменении значения.

Где именно делать контроль - на форме или в методах таблицы - зависит от конкретной постановки задачи. Если предполагается, что при прямой модификации данных в коде или в других формах этот контроль не нужен, то можно оставить в форме. Если же контроль нужен вне зависимости от того, как именно выполнят модификацию, то контроль следует перенести в табличные методы


PS: Насчет значений меньше нуля для чисел есть настройка в свойствах ExtendedDataType с именем AllowNegative. Если там поставить No, то запрет отрицательных значений будет выполняться автоматически
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: mazzy (2).
Старый 29.09.2020, 13:29   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Опечатку исправил. Спасибо!

Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Общая логика работы с данным заключается в том, что коды проверки и изменения данных не должны физически находится в одном методе. Отдельный метод для проверок и отдельный метод для изменений. Ни в коем случае не смешивать!
полностью согласен.

Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Где именно делать контроль - на форме или в методах таблицы - зависит от конкретной постановки задачи.
Дык, проблема в том, что обычно задачу неправильно ставят.
Программисту деваться уже некуда.

Если вам пришла такая поставнока, обязательно переспросите вашего постановщика о ботах, пакетных заданиях и надо ли выполнять проверку из кода. 99% - из кода проверять тоже надо.

Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
PS: Насчет значений меньше нуля для чисел есть настройка в свойствах ExtendedDataType с именем AllowNegative. Если там поставить No, то запрет отрицательных значений будет выполняться автоматически
Точно. Если можно сделать свойствами, а не проверкой - сделайте свойствами объекта в АОТ.
__________________
полезное на axForum, github, vk, coub.
Старый 02.10.2020, 12:39   #5  
Perc is offline
Perc
Участник
 
194 / 57 (2) ++++
Регистрация: 05.03.2005
Два развернутых ответа, без ответа)
Очень здорово, что дали базовую теорию. А вот я например сталкивался с формой EcoResProductCreate от MS в акс2012. Там нет DS и полно validate и modified на контролах.

Я тоже сталкивался проблемой, что не мог добраться до начального значения контрола, в случае если validate не прошел. Огород и доп. переменных на форме городить не захотелось. И осталось на совести пользователя возвращаться к валидному значению.
Старый 02.10.2020, 19:08   #6  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Еще один ответ без ответа Вкратце, собственно ответ на задаваемый вопрос

Если метод Validate вернет false, то введенное значение будет отменено. Будет восстановлено значение, которое было до изменения

Modified - это действия после внесения изменений. Вернуть false он может. Но ведь значение уже изменено, поэтому на факт изменения это уже не повлияет. Хотя, конечно, можно поиграться контролем до и после super(), но лучше этого избегать
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 03.10.2020, 09:51   #7  
Perc is offline
Perc
Участник
 
194 / 57 (2) ++++
Регистрация: 05.03.2005
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Еще один ответ без ответа
Если метод Validate вернет false, то введенное значение будет отменено. Будет восстановлено значение, которое было до изменения
Что касается акс4, то зависит от того validate на контроле или на датасорсе.
Если на контроле, то в случае возврата false просто не выпускает. К первоначальному значению НЕ возвращает.

В акс2012 validate на conrol при возврате false тоже не выпускает, но возвращает первоначальное значение.

Так что автору с акс3, не факт что повезет с validate.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Сохранение и подстановка значения multi-select control с последующим использованием в запросах Cardagant DAX: Программирование 1 05.04.2015 22:58
где хранятся значения полей удаленных строк? chanchala DAX: Программирование 16 04.09.2008 10:45
Проверка значения CheckBox объявленного на форме в Grid mallard DAX: Программирование 3 03.05.2007 16:49
Как получить значения полей (modifiedDate, modifiedTime, modifiedBy и др.) при работе с объектами AOT типа Map? LRA DAX: База знаний и проекты 15 02.04.2007 13:37
Проверка целостности coja DAX: Администрирование 6 06.09.2006 13:14

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

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

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