Вчера разрабатывая одну модификацию наткнулся на странный баг.
1) Берем запись таблицы.
2) Меняем в ней некоторые поля.
3) Затем отбираем для обновления эту же запись в другой курсор (отбирам по recid)
4) В запись для обновления записываем все поля измененной записи сразу – через метод .data()
5) Сохраняем запись, выбранную для обновления
6) Сохранилось все без ошибок, но запись в результате не изменяется.
Решилась проблема просто – вместо п.4 и использования метода .data() достаточно оказалось присвоить измененные поля напрямую.
Может быть кто-то знает, из-за какого механизма проявляется такое странное поведение при использовании метода data ?
Удалось повторить в виде джоба (баг замечен в 2009й и проверен в 4ке):
X++:
static void ButTestJob180316(Args _args)
{
CustTable custTable, custTable_upd;
;
select custTable
where custTable.accountNum == 'Иванов В.В.';
print strfmt("оригинальная запись %1, %2, %3", custTable.RecId, custTable.AccountNum, custTable.Name);
custTable.name += 'test';
print strfmt("изменили имя %1, %2, %3", custTable.RecId, custTable.AccountNum, custTable.Name);
ttsbegin;
select forupdate custTable_upd
where custTable_upd.RecId == custTable.RecId;
print strfmt("выбрали ту же запись forUpdate %1, %2, %3", custTable_upd.RecId, custTable_upd.AccountNum, custTable_upd.Name);
custTable_upd.data(custTable); //а это не работает
//custTable_upd.name = custTable.name; //это работает как надо
print strfmt("перезаписали поля %1, %2, %3", custTable_upd.RecId, custTable_upd.AccountNum, custTable_upd.Name);
custTable_upd.doUpdate();
print strfmt("после сохранения %1, %2, %3", custTable_upd.RecId, custTable_upd.AccountNum, custTable_upd.Name);
ttscommit;
select custTable
where custTable.accountNum == 'Иванов В.В.';
print strfmt("снова перевыбрали запись %1, %2, %3", custTable.RecId, custTable.AccountNum, custTable.Name);
pause;
}