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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.08.2012, 16:47   #1  
JuniorAx is offline
JuniorAx
Участник
 
134 / 20 (1) +++
Регистрация: 20.07.2011
Адрес: Санкт-Петербург
Изменить значение в форме с помощью другой формы
Добрый день. Поздравляю всех с успешным выступлением сборной России на олимпиаде!
Прошу помощи в следующем: Есть грид на нем есть поле типа ComboBox, мне необходимо, при изменении этого поля, вызывать какой-нибудь диалог, или форму, чтобы поменять значение одного из двух полей на этом Гриде.
Сейчас сделал уведомление через Box::NoYes, т.е. выводится предупреждение. как такое реализовать? По сути нужно отрисовать некий диалог с полем для ввода даты и кнопкой ОК и Отмена, и устанавливать значение введенное в него - полю на гриде. Спасибо!
Старый 13.08.2012, 17:16   #2  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
В принципе, для этого используют класс на основе родительского класса RunBase. Примеры можно посмотреть в классах Tutorial_RunbaseBatch и Tutorial_RunbaseForm. Разве что в данном случае "Batch" - не нужен

Только сама идея - не правильная. Нельзя "бить по рукам" пользователя в процессе ввода. Подобный интерфейс крайне раздражает. Если нужен контроль ввода (в смысле, заполнение одних полей в зависимости от заполнения других полей), то этот контроль делается при попытке сохранить запись. Выводится сообщение вроде: Если Вы указали значение ХХХ, то должны указать значение УУУ. Поскольку Вы этого не сделали, то сохранение невозможно.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 13.08.2012, 17:30   #3  
JuniorAx is offline
JuniorAx
Участник
 
134 / 20 (1) +++
Регистрация: 20.07.2011
Адрес: Санкт-Петербург
Они как раз сами, попросили именно таким образом это реализовать :-)
Я так понимаю что вы предлагаете передавать значение с формы в класс, а там уже менять занчение.
В гриде присутствует еще одно поле которое тоже имеет такой же принцип изменения значения, только я так и не понял как он работает! Нашел в АОТ форму которая вызывается, но как она непосредственно из кода или из формы и .т.д вызывается не могу найти. Как это происходит, может кто подскажет? Ни на поле в гриде, ни на поле в datesource, ни на поле в самой таблице, нет ни каких методов, которые вызывают форму! такое ощущение что система сама контролирует изменение и автоматом выдает эту форму. P.S. форма RassetTable поле из таблицы Статус.
Спасибо.
Старый 13.08.2012, 18:24   #4  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Изменение поля RassetTable.Status контролируется в табличном методе RassetTable.ValidateField(), который автоматически вызывается при изменении любого поля таблицы, если это изменение выполняется пользователем на форме.

Ну, а вызов RunBase можно осуществить как полноценный класс через его статический метод main, а можно вызвать только собственно класса Dialog, "выковырив" его из "оболочки" RunBase примерно так

X++:
Dialog 	dialog = new Dialog("Внимание");
DialogField 	dfTransDate;
TransDate 	transDate;

dfTransDate = dialog.addFieldValue(typeId(TransDate),systemDateGet(),'Дата','Дата, которую надо изменить');
dialog.addText('Продолжить выполнение?');

if (dialog.run())
{
	info('Пользователь ответил "Ok".');
	// Новое значение даты
	transDate = dfTransDate.value();
}
else
{
	info('Пользователь ответил "Cancel".');
}
По перекрестным ссылкам посмотри использование класса Dialog. Много подобных примеров "раскидано".
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 14.08.2012, 12:01   #5  
JuniorAx is offline
JuniorAx
Участник
 
134 / 20 (1) +++
Регистрация: 20.07.2011
Адрес: Санкт-Петербург
Спасибо, то что нужно: быстро и просто! А как сделать так чтобы при нажатии кнопки отмена, значение сщьищищч ткатывалось назад? Я так понимаю что не в методе modified т.к. он отрабатывает когда значение уже изменнено, а в selectionChange? наверно надо откат к последнему значению сделать или как??
Старый 14.08.2012, 19:20   #6  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Без разницы. Если НЕ выполнить метод super() либо в методе modified(), либо в методе selectionChange(), то значение останется без изменений. Просто сам по себе метод modified() вызывается изнутри super() метода selectionChange().

Т.е. код (не важно, в selectionChange или в modified) будет выглядеть примерно так

X++:
if (dialog.run())
{
	info('Пользователь ответил "Ok".');
	// Новое значение даты
	transDate = dfTransDate.value();

	// Вызываем super(), только если пользователь нажал Ok
	ret = super();
}
else
{
	info('Пользователь ответил "Cancel".');
	// Метод super() НЕ вызываем. Значение ret остается "пустым"
	// 0 для selectionChange и false для modified 
}

return ret;
Только следует иметь в виду, что если анализ значения выполняется ДО вызова super(), то новое значение пока не попало в поле таблицы. Оно существует только в объекте формы. Поэтому анализировать как выбранное надо значение this.selection() внутри методов selectionChange или modified
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: JuniorAx (1).
Старый 14.08.2012, 20:14   #7  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от JuniorAx Посмотреть сообщение
Есть грид на нем есть поле типа ComboBox, мне необходимо, при изменении этого поля, вызывать какой-нибудь диалог, или форму, чтобы поменять значение одного из двух полей на этом Гриде.
Цитата:
Сообщение от JuniorAx Посмотреть сообщение
Они как раз сами, попросили именно таким образом это реализовать :-)
Стопудов вы неправильно (или не до конца поняли задачу)

В Аксапте очень редко применяется грид, не привязанный к базе данных.
ОЧЕНЬ редко.

следовательно, скорее всего:
1. у вас есть таблица
2. форма показывает в гриде записи этой таблицы
3. при изменении одного из полей ТАБЛИЦЫ(!) вам нужно изменять другие поля ТАБЛИЦЫ(!)

а это сделать очень и очень просто
X++:
modify()
{
   myTable.AnotherField = myTable.SourceField;
   myTable.update();  // обновим запись в базе
   myTable_ds.reread(); // заставим форму прочитать заново из базы
}
забудьте C#-повский подход работы с данными. Работайте с записями таблиц. Форма обновится сама, если в базе правильные данные.
За это сообщение автора поблагодарили: JuniorAx (1).
Старый 14.08.2012, 21:46   #8  
JuniorAx is offline
JuniorAx
Участник
 
134 / 20 (1) +++
Регистрация: 20.07.2011
Адрес: Санкт-Петербург
Добрый вечер, спасибо за то что уделили моему вопросу время. Грид привязан к Datasource под которым таблица, это так. Я это не отрицал, и вроде не писал, о том что грид не подвязан на таблицу :-) Просто мне надо изменять поля, не просто введя значение в в какое то поле, а именно чтобы появлялась некоторая форма на экране, как это происходит при изменнеии поля Status таблицы RassetTable. Вот собственно и всё))) Ещё раз спасибо.

Последний раз редактировалось JuniorAx; 14.08.2012 в 21:49.
Старый 15.08.2012, 03:18   #9  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от JuniorAx Посмотреть сообщение
и вроде не писал, о том что грид не подвязан на таблицу :-)
да, не писал. просто явно указал "значение в форме".
поэтому и отвечают про форму

Цитата:
Сообщение от JuniorAx Посмотреть сообщение
чтобы появлялась некоторая форма на экране, как это происходит при изменнеии поля Status таблицы RassetTable.
Курите в сторону Dialog
и смотрите tutorial-формы про Dialog
Теги
dialog

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как мне обновить Grid расположенный на другой форме? Yuri Safronov DAX: Программирование 17 22.01.2013 14:18
Открытие формы с MouseDoubleClick из другой формы Dima_Dima DAX: Программирование 18 19.11.2008 23:22
Создание Lookup формы Maxim Gorbunov DAX: База знаний и проекты 9 26.06.2007 16:44
Не берется значение контрола Sada DAX: Программирование 11 21.06.2006 10:24
Как получить значение поля Datasource на динамически созданной форме? storer DAX: Программирование 2 14.11.2003 16:41
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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