Показать сообщение отдельно
Старый 18.03.2016, 08:32   #1  
Pandasama is offline
Pandasama
Участник
 
449 / 133 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
Баг или фича - неожиданное поведение метода 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.