13.08.2012, 16:47 | #1 |
Участник
|
Изменить значение в форме с помощью другой формы
Добрый день. Поздравляю всех с успешным выступлением сборной России на олимпиаде!
Прошу помощи в следующем: Есть грид на нем есть поле типа ComboBox, мне необходимо, при изменении этого поля, вызывать какой-нибудь диалог, или форму, чтобы поменять значение одного из двух полей на этом Гриде. Сейчас сделал уведомление через Box::NoYes, т.е. выводится предупреждение. как такое реализовать? По сути нужно отрисовать некий диалог с полем для ввода даты и кнопкой ОК и Отмена, и устанавливать значение введенное в него - полю на гриде. Спасибо! |
|
13.08.2012, 17:16 | #2 |
Участник
|
В принципе, для этого используют класс на основе родительского класса RunBase. Примеры можно посмотреть в классах Tutorial_RunbaseBatch и Tutorial_RunbaseForm. Разве что в данном случае "Batch" - не нужен
Только сама идея - не правильная. Нельзя "бить по рукам" пользователя в процессе ввода. Подобный интерфейс крайне раздражает. Если нужен контроль ввода (в смысле, заполнение одних полей в зависимости от заполнения других полей), то этот контроль делается при попытке сохранить запись. Выводится сообщение вроде: Если Вы указали значение ХХХ, то должны указать значение УУУ. Поскольку Вы этого не сделали, то сохранение невозможно.
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
13.08.2012, 17:30 | #3 |
Участник
|
Они как раз сами, попросили именно таким образом это реализовать :-)
Я так понимаю что вы предлагаете передавать значение с формы в класс, а там уже менять занчение. В гриде присутствует еще одно поле которое тоже имеет такой же принцип изменения значения, только я так и не понял как он работает! Нашел в АОТ форму которая вызывается, но как она непосредственно из кода или из формы и .т.д вызывается не могу найти. Как это происходит, может кто подскажет? Ни на поле в гриде, ни на поле в datesource, ни на поле в самой таблице, нет ни каких методов, которые вызывают форму! такое ощущение что система сама контролирует изменение и автоматом выдает эту форму. P.S. форма RassetTable поле из таблицы Статус. Спасибо. |
|
13.08.2012, 18:24 | #4 |
Участник
|
Изменение поля 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".'); }
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
14.08.2012, 12:01 | #5 |
Участник
|
Спасибо, то что нужно: быстро и просто! А как сделать так чтобы при нажатии кнопки отмена, значение сщьищищч ткатывалось назад? Я так понимаю что не в методе modified т.к. он отрабатывает когда значение уже изменнено, а в selectionChange? наверно надо откат к последнему значению сделать или как??
|
|
14.08.2012, 19:20 | #6 |
Участник
|
Без разницы. Если НЕ выполнить метод 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;
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
За это сообщение автора поблагодарили: JuniorAx (1). |
14.08.2012, 20:14 | #7 |
Участник
|
Цитата:
В Аксапте очень редко применяется грид, не привязанный к базе данных. ОЧЕНЬ редко. следовательно, скорее всего: 1. у вас есть таблица 2. форма показывает в гриде записи этой таблицы 3. при изменении одного из полей ТАБЛИЦЫ(!) вам нужно изменять другие поля ТАБЛИЦЫ(!) а это сделать очень и очень просто X++: modify() { myTable.AnotherField = myTable.SourceField; myTable.update(); // обновим запись в базе myTable_ds.reread(); // заставим форму прочитать заново из базы } |
|
|
За это сообщение автора поблагодарили: JuniorAx (1). |
14.08.2012, 21:46 | #8 |
Участник
|
Добрый вечер, спасибо за то что уделили моему вопросу время. Грид привязан к Datasource под которым таблица, это так. Я это не отрицал, и вроде не писал, о том что грид не подвязан на таблицу :-) Просто мне надо изменять поля, не просто введя значение в в какое то поле, а именно чтобы появлялась некоторая форма на экране, как это происходит при изменнеии поля Status таблицы RassetTable. Вот собственно и всё))) Ещё раз спасибо.
Последний раз редактировалось JuniorAx; 14.08.2012 в 21:49. |
|
15.08.2012, 03:18 | #9 |
Участник
|
да, не писал. просто явно указал "значение в форме".
поэтому и отвечают про форму Цитата:
и смотрите tutorial-формы про Dialog |
|