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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 10.02.2011, 10:51   #1  
vanokh is offline
vanokh
Участник
 
108 / 63 (3) ++++
Регистрация: 23.10.2008
обязательное для заполнения поле в уже созданной записи
Есть запись в некоторой таблице (создаваемая в коде, без участия пользователя), у которой не заполнено одно поле, скажем Комментарий. Запись показывается в гриде на форме пользователю и требуется, чтобы он ее обязательно (!) заполнил. То есть не позволять переходить на другие записи и контролы.

Естественно, поле помечено как обязательное (Mandatory). Но если пользователь ничего в записи не трогает, то оно так и остается незаполненным.

Пробовал перекрывать leaveRecord и вызывать в нем validateWrite, получил странный эффект - дает переходить на другие контролы, а эту запись как раз не дает редактировать, каждый раз вываливаясь с ошибкой, что поле не заполнено...

Единственный пока найденный вариант - в active, если поле не заполнено, заполнять его пробелом, тогда запись становится измененной и вызывается validateWrite. Но это как-то криво...

Собственно вопрос, вернее один из двух:
1. Как не давать переходить на другие записи/контролы, если не проходит validateWrite?
2. Как сделать запись измененной, фактически не меняя поля? В этом случае сработает validateWrite, что и надо.
Старый 10.02.2011, 11:22   #2  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,732 / 406 (17) +++++++
Регистрация: 23.03.2006
зачем вам сохранять запись если она не изменена? а если вы уже создали строки и потом сделали поле обязательным, то создайте job по заполнению этого поля значением по умолчанию. А заставлять пользователя заполнять принудительно поля к которым он не имеет никакого отношения не нужно

Последний раз редактировалось ice; 10.02.2011 в 11:27.
Старый 10.02.2011, 11:29   #3  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,510 / 435 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
У меня была похожая задача, надо было программно создать строку в таблице (не заполняя mandatory-поле), а потом стребовать с пользователя его заполнение. Решено было перпендикулярным способом - запись нельзя было никак обработать дальше, выскакивал error "Поле такое-то не заполнено".
__________________
С уважением,
Вячеслав
Старый 10.02.2011, 11:31   #4  
vanokh is offline
vanokh
Участник
 
108 / 63 (3) ++++
Регистрация: 23.10.2008
Цитата:
Сообщение от ice Посмотреть сообщение
зачем вам сохранять запись если она не изменена? а если вы уже создали строки и потом сделали поле обязательным, то создайте job по заполнению этого поля значением по умолчанию. А заставлять пользователя заполнять принудительно поля к которым он не имеет никакого отношения не нужно
Нет, поле обязательное с самого начала. Просто запись создается без участия пользователя - в коде, по нажатию кнопки. Причем не одна, а с подчиненными - шапка и строки. И нужно, чтобы пользователь заполнил поле Комментарий в шапке. Последовательность такая - Создал-Открыл, Заполнил либо Удалил.

Последний раз редактировалось vanokh; 10.02.2011 в 11:40.
Старый 10.02.2011, 11:32   #5  
vanokh is offline
vanokh
Участник
 
108 / 63 (3) ++++
Регистрация: 23.10.2008
Цитата:
Сообщение от pitersky Посмотреть сообщение
У меня была похожая задача, надо было программно создать строку в таблице (не заполняя mandatory-поле), а потом стребовать с пользователя его заполнение. Решено было перпендикулярным способом - запись нельзя было никак обработать дальше, выскакивал error "Поле такое-то не заполнено".
Ага, очень похоже. А запись перед требованием уже сохранена? Как именно было реализовано то, что "запись нельзя было никак обработать дальше"?
Старый 10.02.2011, 11:47   #6  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,732 / 406 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от vanokh Посмотреть сообщение
Нет, поле обязательное с самого начала. Просто запись создается без участия пользователя - в коде, по нажатию кнопки. Причем не одна, а с подчиненными - шапка и строки. И нужно, чтобы пользователь заполнил поле Комментарий в шапке. Последовательность такая - Создал-Открыл, Заполнил либо Удалил.
ну так заполняйте при создании, какие проблемы?
Старый 10.02.2011, 12:22   #7  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,510 / 435 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Цитата:
Сообщение от vanokh Посмотреть сообщение
Ага, очень похоже. А запись перед требованием уже сохранена? Как именно было реализовано то, что "запись нельзя было никак обработать дальше"?
1) да, сохранена. Там было нельзя иначе - операция могла создать много строк
2) очень просто - перед началом обработки вызывался специальный validate (включающий validateWrite на таблице, так как после обработки должен меняться статус). Если всё ОК, тогда можно запускать класс обработки.
__________________
С уважением,
Вячеслав
Старый 10.02.2011, 13:31   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от vanokh Посмотреть сообщение
Как сделать запись измененной, фактически не меняя поля? В этом случае сработает validateWrite, что и надо.
Используйте forceWrite
За это сообщение автора поблагодарили: ivas (2), vanokh (1).
Старый 11.02.2011, 02:41   #9  
vanokh is offline
vanokh
Участник
 
108 / 63 (3) ++++
Регистрация: 23.10.2008
Цитата:
Сообщение от ice Посмотреть сообщение
ну так заполняйте при создании, какие проблемы?
Вы не поняли - при создании нельзя, потому что это комментарий от пользователя (!), а все записи создаются автоматически в коде без его участия.
Можно, конечно, при создании выбрасывать диалог и спрашивать Комментарий до показа формы пользователю - оставлял на крайний случай, если совсем ничего не получится на форме.

Цитата:
Сообщение от pitersky Посмотреть сообщение
1) да, сохранена. Там было нельзя иначе - операция могла создать много строк
2) очень просто - перед началом обработки вызывался специальный validate (включающий validateWrite на таблице, так как после обработки должен меняться статус). Если всё ОК, тогда можно запускать класс обработки.
А, у вас это все в обработке... Не подходит - у меня пользователь может не вводить комментарий, а удалить запись.

Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Используйте forceWrite
Вот это как раз то, что нужно! Как-то я его пропустил... Спасибо! Поставил на active и заработало!

Последний раз редактировалось vanokh; 11.02.2011 в 02:45.
Старый 27.09.2011, 03:06   #10  
coolibin is offline
coolibin
Участник
 
264 / 68 (3) ++++
Регистрация: 07.04.2005
Набрел на похожую проблему, но forceWrite() почему-то не помогает.

Сценарий такой:

На форме две таблицы: t1 и t2.
t2 подцепленна по InnerJoin к t1. Связь - 1:1.
Навигация в форме идет по таблице t1.
В событии t1.create() идет вызов класса, где после диалога пишутся модификации в обе таблицы. При этом mandatory поле в t2 класс не заполняет. Заканчивается работа класса вызовом t1.reread(); t1.refresh();

В конце t1.create() делаю вызов t2_ds.forceWrite(true) - никаких эмоций, то есть, t2.validatewrite() не отрабатывает.

Если же вместо этого сделать любое присвоение любого поля в t2, то проверка отработает. Как заставить проверить mandatory поля в t2 без изменения полей?

AX2009
Старый 27.09.2011, 09:03   #11  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от coolibin Посмотреть сообщение
В конце t1.create() делаю вызов t2_ds.forceWrite(true) - никаких эмоций, то есть, t2.validatewrite() не отрабатывает.
По идее, если речь идёт не о изменении записи, а о её вставке (create же у вас создаёт новую запись?), то никакого forceWrite вообще не должно требоваться. Менялись ли значения или не менялись вставка даже пустых данных должна происходить в любом случае, а следовательно должнен вызываться и validatewrite.

У вас сама вставка записи в t2 происходит? Метод t2_ds.write() не перекрыт?
Старый 27.09.2011, 20:18   #12  
coolibin is offline
coolibin
Участник
 
264 / 68 (3) ++++
Регистрация: 07.04.2005
Navision
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
У вас сама вставка записи в t2 происходит? Метод t2_ds.write() не перекрыт?
Вставка записи происходит в коде, напрямую в таблицу без участия датасорса. Потом датасорс основной таблицы, t1 в форме рефрешится (дерганием метода формы из класса), так что новая запись t2 тоже перерисовывается. Но после завершения работы класса в create() курсор t2 уже не имеет признака модификации (что вполне логично).

X++:
public void create(boolean _append = false) //create a rec in t1
{
    super(_append);
 
    SomeRunBaseClass::DoWork(...);
 
    if (t2.RecId != 0)
    {
        t2_DS.forceWrite(true); // не вызывает валидации при последующем уходе с записи t1
        //t2.SoeField = "blablabla" ; // так валидация будет вызвана
    }
}
Я же хочу этот признак ему выставить принудительно, чтобы попытка уйти с текущей записи основной таблицы (t1) сопровождалась вызовом valildatewrite() для записи подцепленной (t2) таблицы. Не понятно, почему переприсвоение значения любого поля выставляет признак модификации, а forseWrite() - нет.
Старый 27.09.2011, 22:09   #13  
coolibin is offline
coolibin
Участник
 
264 / 68 (3) ++++
Регистрация: 07.04.2005
Интересно, сделал ForceWrite() вместо t2_DS на t1_DS, в результате теперь t2.validateWrite() тоже вызывается автоматически.
Меня устроило.
Теги
заполнение, проверка

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Обязательное поле фин.аналитика в жуналах ГК tolstjak DAX: Программирование 2 21.09.2009 13:48
сопоставление оплат клиента, переносов сальдо-поле накладная в общем журнале? Aquarius DAX: Функционал 3 28.01.2009 12:51
Дублирование записи Axaptus DAX: Программирование 12 16.11.2007 12:33
вычисляемое поле ZhanR DAX: Программирование 8 28.09.2006 10:25
Автоматическое увеличение значения поля при создании новой записи. sguryev DAX: Программирование 3 06.02.2003 14:00

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

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

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