10.02.2011, 10:51 | #1 |
Участник
|
обязательное для заполнения поле в уже созданной записи
Есть запись в некоторой таблице (создаваемая в коде, без участия пользователя), у которой не заполнено одно поле, скажем Комментарий. Запись показывается в гриде на форме пользователю и требуется, чтобы он ее обязательно (!) заполнил. То есть не позволять переходить на другие записи и контролы.
Естественно, поле помечено как обязательное (Mandatory). Но если пользователь ничего в записи не трогает, то оно так и остается незаполненным. Пробовал перекрывать leaveRecord и вызывать в нем validateWrite, получил странный эффект - дает переходить на другие контролы, а эту запись как раз не дает редактировать, каждый раз вываливаясь с ошибкой, что поле не заполнено... Единственный пока найденный вариант - в active, если поле не заполнено, заполнять его пробелом, тогда запись становится измененной и вызывается validateWrite. Но это как-то криво... Собственно вопрос, вернее один из двух: 1. Как не давать переходить на другие записи/контролы, если не проходит validateWrite? 2. Как сделать запись измененной, фактически не меняя поля? В этом случае сработает validateWrite, что и надо. |
|
10.02.2011, 11:22 | #2 |
Участник
|
зачем вам сохранять запись если она не изменена? а если вы уже создали строки и потом сделали поле обязательным, то создайте job по заполнению этого поля значением по умолчанию. А заставлять пользователя заполнять принудительно поля к которым он не имеет никакого отношения не нужно
Последний раз редактировалось ice; 10.02.2011 в 11:27. |
|
10.02.2011, 11:29 | #3 |
северный Будда
|
У меня была похожая задача, надо было программно создать строку в таблице (не заполняя mandatory-поле), а потом стребовать с пользователя его заполнение. Решено было перпендикулярным способом - запись нельзя было никак обработать дальше, выскакивал error "Поле такое-то не заполнено".
__________________
С уважением, Вячеслав |
|
10.02.2011, 11:31 | #4 |
Участник
|
Цитата:
Последний раз редактировалось vanokh; 10.02.2011 в 11:40. |
|
10.02.2011, 11:32 | #5 |
Участник
|
Цитата:
Сообщение от pitersky
У меня была похожая задача, надо было программно создать строку в таблице (не заполняя mandatory-поле), а потом стребовать с пользователя его заполнение. Решено было перпендикулярным способом - запись нельзя было никак обработать дальше, выскакивал error "Поле такое-то не заполнено".
|
|
10.02.2011, 11:47 | #6 |
Участник
|
Цитата:
Сообщение от vanokh
Нет, поле обязательное с самого начала. Просто запись создается без участия пользователя - в коде, по нажатию кнопки. Причем не одна, а с подчиненными - шапка и строки. И нужно, чтобы пользователь заполнил поле Комментарий в шапке. Последовательность такая - Создал-Открыл, Заполнил либо Удалил.
|
|
10.02.2011, 12:22 | #7 |
северный Будда
|
Цитата:
2) очень просто - перед началом обработки вызывался специальный validate (включающий validateWrite на таблице, так как после обработки должен меняться статус). Если всё ОК, тогда можно запускать класс обработки.
__________________
С уважением, Вячеслав |
|
10.02.2011, 13:31 | #8 |
Участник
|
Цитата:
|
|
|
За это сообщение автора поблагодарили: ivas (2), vanokh (1). |
11.02.2011, 02:41 | #9 |
Участник
|
Вы не поняли - при создании нельзя, потому что это комментарий от пользователя (!), а все записи создаются автоматически в коде без его участия.
Можно, конечно, при создании выбрасывать диалог и спрашивать Комментарий до показа формы пользователю - оставлял на крайний случай, если совсем ничего не получится на форме. Цитата:
Сообщение от pitersky
1) да, сохранена. Там было нельзя иначе - операция могла создать много строк
2) очень просто - перед началом обработки вызывался специальный validate (включающий validateWrite на таблице, так как после обработки должен меняться статус). Если всё ОК, тогда можно запускать класс обработки. Цитата:
Сообщение от S.Kuskov
Используйте forceWrite
Последний раз редактировалось vanokh; 11.02.2011 в 02:45. |
|
27.09.2011, 03:06 | #10 |
Участник
|
Набрел на похожую проблему, но 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 |
Участник
|
Цитата:
У вас сама вставка записи в t2 происходит? Метод t2_ds.write() не перекрыт? |
|
27.09.2011, 20:18 | #12 |
Участник
|
Цитата:
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" ; // так валидация будет вызвана } } |
|
27.09.2011, 22:09 | #13 |
Участник
|
Интересно, сделал ForceWrite() вместо t2_DS на t1_DS, в результате теперь t2.validateWrite() тоже вызывается автоматически.
Меня устроило. |
|