Показать сообщение отдельно
Старый 13.09.2011, 19:19   #1  
Alexius is offline
Alexius
Участник
Аватар для Alexius
 
461 / 248 (9) ++++++
Регистрация: 13.12.2001
Бага в Query update(true)
AX2009 SP1 RU7 / MS SQL 2008 R2

При формировании обновляемого запроса в некоторых случаях происходит двойное обновление записи. Задваиваться могут как все записи, так и часть. Полной логики я не смог раскопать, но это как-то связано с индексами. Ниже привожу пример с которым я возился, вместо "Номенлатурная Группа" нужно подставить вашу группу с числом элементов не менее 20. Далее, если все индексы штатные, то у меня получается предсказуемый вариант поведения, т.е. кол-во обновляемых записей равно числу записей в запросе. Для получения задвоения необходимо в индексе InventTable / GroupItemIdx поле ItemId заменить на ItemName, после этого у меня на некоторых группах происходят двойные обновления. В 3-ке SP4 на аналогичных данных все ОК.

X++:
static void DEV_QueryUpdateBag(Args _args)
{
    Query                   query = new Query();
    QueryRun                queryRun;
    QueryBuildDataSource    qbds;
    InventTable             inventTable;
    int                     sel, upd, i;
    container               c;
    ;

    qbds = query.addDataSource(tablenum(InventTable));
    qbds.addRange(fieldnum(InventTable, ItemGroupId)).value("Номенлатурная Группа");
    qbds.update(true);

    queryRun = new QueryRun(query);

    while (queryRun.next())
    {
        sel++;
    }
    
    queryRun = new QueryRun(query);

    ttsbegin;
    
    while (queryRun.next())
    {
        inventTable = queryRun.get(tablenum(InventTable));

        if (confind(c, inventTable.ItemId))
            info (strfmt("%1 %2 %3", i, inventTable.ItemId, inventTable.ItemName));
        else
        {
            c += inventTable.ItemId;
            i++;
        }

        inventTable.ItemName  = inventTable.ItemName + ".";
        inventTable.doUpdate();

        upd++;
    }
    
    ttsabort;
    
    info(strfmt("SELECT %1 UPDATE %2 DELTA %3", sel, upd, upd-sel));
}