18.03.2016, 08:32 | #1 |
Участник
|
Баг или фича - неожиданное поведение метода xRecord.data()
Вчера разрабатывая одну модификацию наткнулся на странный баг.
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; } Последний раз редактировалось Pandasama; 18.03.2016 в 08:44. |
|
18.03.2016, 09:47 | #2 |
Участник
|
Встречал ситуацию, когда расходились данные в серверном и клиентском экземпляре одного и того же курсора. оригинальный orig
Может здесь что-то похожее. Попробуйте выполнить свой код на серверной стороне |
|
18.03.2016, 10:25 | #3 |
Участник
|
Потому что в вашем случае курсор через data() затирает инструкцию forupdate для курсора, выбранного для обновления,(В AX 3.0 об этом появляется соответствующее сообщение). Правильнее использовать buf2buf() класса Global.
Последний раз редактировалось _AV_; 18.03.2016 в 10:33. Причина: внес подробности |
|
|
За это сообщение автора поблагодарили: S.Kuskov (2). |
21.03.2016, 13:01 | #4 |
Участник
|
|
|
Теги |
ax2009, баг, метод data, фича, ax4.0 |
|
|