03.02.2012, 09:36 | #1 |
Участник
|
Фиксация изменённых данных вызывающей формы до её обновления
Добрый день!
Ситуация: есть основная форма - т.н. форма "шапки" документа, и форма строк, вызываемая из неё. При изменениях в строках происходит переформирование текстового поля с комментарием в таблице шапки. Сразу после изменения этого поля форма шапки (вызывающая) обновляется. Но при этом возникает проблема: иногда пользователь, не закрывая формы строк, переключается из неё в форму шапки и производит в ней изменения. А после правки данных в форме строк шапка обновляется, и последние изменения теряются. Каким образом можно перед обновлением шапки зафиксировать её изменения? X++: void updateTableForm(bom _bom) { args args; FormObjectSet fos; BOMTable bt; ; if (_bom.dataSource()) { if (_bom.dataSource().formRun().args()) { args = _bom.dataSource().formRun().args(); fos = args.record().dataSource(); bt = args.record();//здесь неизменённые значения, как и в fos.cursor() bt.reread(); fos.refresh(); } } } |
|
03.02.2012, 10:00 | #2 |
Участник
|
Зачем изменять шапку до сохранения изменений на строках?
|
|
03.02.2012, 10:07 | #3 |
Участник
|
Шапку изменяют, если забыли заполнить/неправильно заполнили какое-либо поле.
|
|
03.02.2012, 10:49 | #4 |
Участник
|
при открытой формы строк блокируйте изменения в шапке как в складских журналах
|
|
03.02.2012, 10:52 | #5 |
Участник
|
По идее при потере гридом фокуса ввода изменённые данные должны сохранится в БД. В случае ошибки сохранения фокус ввода должен остатся на несохранённых данных.
Каким образом у вас пользователь после редактирования шапки документа переходит на форму строк без сохранения изменённых данных? |
|
03.02.2012, 10:58 | #6 |
Участник
|
Пользователь не открывает форму строк - она уже открыта. Он переключается из одной открытой формы (строк) вначале в форму шапки, не закрывая строки. Потом обратно, из шапки в форму строк. Запись при этом не сохраняется - никаких попыток сохранения не происходит, соответственно и ошибок тоже нет. Фокус в форме шапки остаётся там, где он был до переключения в строки.
|
|
03.02.2012, 11:03 | #7 |
Участник
|
Как мне кажется, ответ очевиден. Сначала выполнить сохранение в родительской форме, и только потом обновление. Примерно так
X++: fos.write(); // Вот это добавить
fos.reread();
fos.refresh(); X++: Object callerForm; callerForm = args.caller(); if (formHasMethod(callerForm,"MyMethod")) { callerForm.MyMethod(); }
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
За это сообщение автора поблагодарили: S.Kuskov (1). |
03.02.2012, 11:19 | #8 |
Участник
|
Это было первое, что я попробовала, до того как открыла эту ветку на форуме. Эффекта ни write на DS, ни update на record не имеют. Т.к. новые - т.е. изменённые пользователем данные - в них не попадают.
Последний раз редактировалось DesertBrowser; 03.02.2012 в 11:25. |
|
03.02.2012, 13:28 | #9 |
MCTS
|
В вызываемой дочерней форме строк объявите табличную переменную parentTable того же типа, что и главная таблица из родительской формы. При открытии дочерней формы в inite свяжите ее с курсором родительской формы (parentTable = element.args().record() ).
Обязательно проверьте, чтобы в дочерней форме эта переменная больше нигде не переприсваивалась и не перевыбиралась из БД, это важно! При сохранении текущей записи (именно при сохранении, а не при изменении поля !!!) в дочерней форме формируйте нужный комментарий, просто записывайте его в поле табличной переменной (parentTable.comment = 'comment'), а затем parentTable.dataSource().write(). parentTable.dataSource().refresh(). Естественно, запись в оба датасоурса должна быть в одной транзакции. Если сделаете все правильно, то все должно работать.
__________________
Dynamics AX Experience |
|
Теги |
datasource, form, formrun, update, write, как правильно |
|
|