Проблема жива и в Ax2012, хотя тянется еще с ранних версий
Форма, источником данных которой является таблица, одно из полей которой формируется из номерной серии. Записи отображены списком в Grid и создание новой записи происходит там же в Grid без вызова дополнительной формы. Выполняем следующие действия
1. Создаем новую запись, заполняем все поля, обязательные к заполнению
2. Не сохраняя запись, пытаемся создать новую запись
Получаем исключение с сообщением об ошибке
Цитата:
Не удается назначить новый номер журнала, так как %1 не был сохранен или удален.
Причина ошибки очевидная. При создании новой записи сначала выполняется метод DataSource.create(), и только внутри этого метода (внутри super()) выполняются все остальные методы по сохранению текущей записи. Но! Стандартный код метода DataSource.create() на форме, если используется номерная серия имеет вид
X++:
// Form\DataSource\MyTable\create
void create(boolean append = false)
{
;
element.numberSeqFormHandler().formMethodDataSourceCreatePre();
super(append);
element.numberSeqFormHandler().formMethodDataSourceCreate();
}
И вот в методе formMethodDataSourceCreatePre() и стоит проверка
X++:
void formMethodDataSourceCreatePre()
{
;
validateWriteCalled = false;
validateWriteFailed = false;
if (lastNumber)
{
throw(error(strfmt("@SYS85169", lastNumber)));
}
}
Но поскольку DataSource.create() оказался вызван до DataSource.write(), то номерная серия не была сохранена и значение переменной lastNumber не очищено.
В качестве решения проблемы напрашивается перемещение вызова formMethodDataSourceCreatePre() после вызова super()
X++:
void create(boolean append = false)
{
;
// Переносим после super()
// element.numberSeqFormHandler().formMethodDataSourceCreatePre();
super(append);
element.numberSeqFormHandler().formMethodDataSourceCreatePre();
element.numberSeqFormHandler().formMethodDataSourceCreate();
}
Насколько данное решение корректно? Есть ли другие варианты решения проблемы, кроме "забить"?