13.09.2011, 19:19 | #1 |
Участник
|
Бага в 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)); } |
|
13.09.2011, 22:45 | #2 |
Участник
|
Было чо-то похожее в 3-ке
Как работает queryRun |
|
14.09.2011, 08:49 | #3 |
Участник
|
Цитата:
Ещё, если я не ошибаюсь, на форуме как-то проскакивала информация о том что в случае использования QueryRun работа с курсором происходит через вспомогательные хранимые процедуры (попробую сейчас найти). Может это в них собака порылась? |
|
14.09.2011, 10:20 | #4 |
Участник
|
Цитата:
Сообщение от Logger
Было чо-то похожее в 3-ке
Как работает queryRun PS. Об этом приколе я помню PS2. А у кого нибудь еще воспроизвелась описанная выше бага ? Последний раз редактировалось Alexius; 14.09.2011 в 10:25. |
|
14.09.2011, 12:57 | #5 |
Участник
|
Цитата:
Цитата:
A dynamic cursor retrieves the same row two times when all the following conditions are true:
|
|
|
За это сообщение автора поблагодарили: Alexius (3). |
14.09.2011, 14:09 | #6 |
Участник
|
Цитата:
1.1 Update Field ItemName 1.1.1 Query False 1.1.2 while select forupdate False 1.2 Update Field NameAlias 1.2.1 Query False 1.2.2 while select forupdate OK 2. InventTable CacheLookup = None 2.1 Update Field ItemName 2.1.1 Query False 2.1.2 while select forupdate OK 2.2 Update Field NameAlias 2.2.1 Query False 2.2.2 while select forupdate OK Исходно база была на уровне совместимости 2008 (100) 1. Перевел базу на уровень совместимости 2000 (80) (остановил АОС, отсоединил/присоединил базу, стартанул АОС) Оба варианта ОК 2. Вернул аналогично на уровень 2008 (100) Оба варианта ОК Вот такое дежавю PS. Вечерочком попробую рестартовать полностью сервант и посмотреть |
|