AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 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));
}
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
AIF: OData Query Service Blog bot DAX Blogs 0 24.08.2011 09:11
fatihdemirci: CrossCopmany ile query yazmak Blog bot DAX Blogs 0 17.08.2010 16:05
jinx: Dynamics AX – Query-Ranges und Filtereinstellungen des Benutzers Blog bot DAX auf Deutsch 0 04.02.2010 00:05
Dynamics AX Geek: Using query() Blog bot DAX Blogs 0 04.05.2009 14:05
update_recordset. Бага или фича? Lucky13 DAX: Программирование 7 08.04.2009 17:33

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 11:39.