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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.06.2008, 11:31   #1  
breakpoint is offline
breakpoint
Участник
 
77 / 10 (1) +
Регистрация: 05.03.2008
Почему не отрабатывает update_recordset?
Добрый день!
Хотелось бы понять почему не отрабатывает 2й вар-т, причем 1й работает... Типы совпадают.

X++:
        while select forupdate inventJournalTrans
            where inventJournalTrans.JournalId == this.JournalId
        {
 
            inventJournalTrans.Dimension = dimension;
            inventJournalTrans.update();
 
        }
 
 
        update_recordset inventJournalTrans
            setting Dimension = dimension
                where inventJournalTrans.JournalId == this.JournalId;
3.0, sp3.
Старый 05.06.2008, 11:44   #2  
Maximin is offline
Maximin
NavAx
NavAx Club
 
412 / 346 (12) ++++++
Регистрация: 09.10.2002
Адрес: Москва
Потому что это известный баг.
Надо в промежутке перед update_recordset написать

X++:
inventJournalTrans = null;
Не любит он грязных переменных, любит мытых и чистеньких.

Вообще, это даже, кажется, в "Полезных материалах" было...
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты...

Последний раз редактировалось Maximin; 05.06.2008 в 11:47.
За это сообщение автора поблагодарили: breakpoint (1).
Старый 05.06.2008, 11:51   #3  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
X++:
update_recordset inventJournalTrans
            setting Dimension = dimension
                where inventJournalTrans.JournalId == this.JournalId;
А у вас компиляция этого вообще проходит?
Попробуйте так:
X++:
update_recordset inventJournalTrans
            setting Dimension[1] = dimension[1],
                       Dimension[2] = dimension[2],
                       Dimension[3] = dimension[3]
                where inventJournalTrans.JournalId == this.JournalId;
Старый 05.06.2008, 12:05   #4  
breakpoint is offline
breakpoint
Участник
 
77 / 10 (1) +
Регистрация: 05.03.2008
2Maximin
переменная итак null...
Старый 05.06.2008, 12:05   #5  
breakpoint is offline
breakpoint
Участник
 
77 / 10 (1) +
Регистрация: 05.03.2008
Цитата:
Сообщение от _scorp_ Посмотреть сообщение
X++:
update_recordset inventJournalTrans
            setting Dimension = dimension
                where inventJournalTrans.JournalId == this.JournalId;
А у вас компиляция этого вообще проходит?
Попробуйте так:
X++:
update_recordset inventJournalTrans
            setting Dimension[1] = dimension[1],
                       Dimension[2] = dimension[2],
                       Dimension[3] = dimension[3]
                where inventJournalTrans.JournalId == this.JournalId;
так я думаю сработает, нехочется все поля перечислять...
Старый 05.06.2008, 12:06   #6  
breakpoint is offline
breakpoint
Участник
 
77 / 10 (1) +
Регистрация: 05.03.2008
скорей всего не дружит update_recordset с dimension
Старый 05.06.2008, 12:07   #7  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Цитата:
Сообщение от breakpoint Посмотреть сообщение
2Maximin
переменная итак null...
Да у Вас вообще не должен компилироваться Ваш вариант. Он должен ругаться на несовместимость типов. В update_recordset нельзя так писать. Нужно перечислять все Dimension по очереди.
Старый 05.06.2008, 13:30   #8  
breakpoint is offline
breakpoint
Участник
 
77 / 10 (1) +
Регистрация: 05.03.2008
все верно, ругается на совместимость типов
надеюсь в следующих версиях будет исправлено это недоразумение
Старый 05.06.2008, 15:56   #9  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
Цитата:
Сообщение от _scorp_ Посмотреть сообщение
Нужно перечислять все Dimension по очереди.
А какой код должен быстрее работать?
X++:
while select forupdate inventJournalTrans
    where inventJournalTrans.JournalId == this.JournalId
{
    inventJournalTrans.Dimension = dimension;
    inventJournalTrans.doUpdate();
}
или
X++:
update_recordset inventJournalTrans
    setting Dimension[1] = dimension[1],
            Dimension[2] = dimension[2],
            Dimension[3] = dimension[3],
            Dimension[4] = dimension[4]
    where inventJournalTrans.JournalId == this.JournalId;
Старый 05.06.2008, 16:20   #10  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Цитата:
А какой код должен быстрее работать?
А Вы сами как думаете? Например, в журнале 5 строк. У всех у них нужно поменять аналитику. В первом случае сколько запросов уйдет на сервер? И сколько во втором?
Старый 05.06.2008, 16:47   #11  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
Я недавно профайлером подобный пример с dimensions тестировал, результат был неоднозначный, потому и спросил.
Возможно на малом количестве записей это не играет большой роли.
Старый 05.06.2008, 17:29   #12  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
Кроме того если в процессе разработки добавится новый dimension, подобные варианты с update_recordset придется отыскивать и модифицировать.
Старый 05.06.2008, 18:36   #13  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Hyper Посмотреть сообщение
Я недавно профайлером подобный пример с dimensions тестировал, результат был неоднозначный, потому и спросил.
Возможно на малом количестве записей это не играет большой роли.
это сильно депендс в зависимости от ситуации.
см. пример
Вложения
Тип файла: xpo ZVV_SmallTest.xpo (4.2 Кб, 214 просмотров)
__________________
Zhirenkov Vitaly
Старый 25.06.2008, 15:04   #14  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
Кстати да, поскольку update_recordset в любом случае вызывает метод update(), который может быть сколь угодно тяжеловесным, то while select вкупе с doUpdate() во многих случаях будет отрабатывать быстрее.
Старый 25.06.2008, 15:10   #15  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Hyper Посмотреть сообщение
во многих случаях будет отрабатывать быстрее.
Предупреждение: Но при этом во многих случаях может нарушить целостность базы.

Советчики... Блин...
__________________
полезное на axForum, github, vk, coub.
Старый 25.06.2008, 15:31   #16  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Сравнение некорректное.
Если делаете doUpdate в первом случае, то и во втором случае тоже надо пропускать update() на таблице.

Делается это вызовом метода skipDataMethods() на курсоре inventJournalTrans, в данном случае.

update_recordset всегда будет работать быстрее, если правильно сравнивать.
За это сообщение автора поблагодарили: Hyper (1).
Старый 25.06.2008, 16:26   #17  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
Цитата:
Сообщение от mazzy Посмотреть сообщение
Но при этом во многих случаях может нарушить целостность базы.

Советчики... Блин...
Во-первых, целостность базы будет нарушена далеко не в каждом случае; к применению doUpdate() надо подходить осторожно. Во-вторых, в данном посте я ничего никому не советовал.
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Делается это вызовом метода skipDataMethods() на курсоре inventJournalTrans, в данном случае.
Спасибо, взял на заметку.

Последний раз редактировалось Hyper; 25.06.2008 в 16:28.
Старый 25.06.2008, 18:27   #18  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Hyper Посмотреть сообщение
Кстати да, поскольку update_recordset в любом случае вызывает метод update(), который может быть сколь угодно тяжеловесным, то while select вкупе с doUpdate() во многих случаях будет отрабатывать быстрее.
Цитата:
Сообщение от Hyper Посмотреть сообщение
Во-первых, целостность базы будет нарушена далеко не в каждом случае; к применению doUpdate() надо подходить осторожно. Во-вторых, в данном посте я ничего никому не советовал.
Дык и производительность вырастет тоже не в каждом случае, а согласно вашим словам только если есть "тяжеловесный update". Именно в таких случаях воспользовавшийся вашим "не советом" скорее всего и нарушит целостность. Но вы об этом не предупредили, поскольку "ничего никому не советовал".

Цитата:
Сообщение от Hyper Посмотреть сообщение
Спасибо, взял на заметку.
__________________
полезное на axForum, github, vk, coub.
Теги
ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Почему join запрос разбивается на подзапросы!? 3oppo DAX: Программирование 59 28.06.2007 11:52
Долго отрабатывает запрос по таблице InventItemLocation AlexeyBP DAX: Администрирование 1 30.05.2007 17:33
не отрабатывает запрос к View LedgerBalances loka DAX: Программирование 4 31.05.2006 16:01
Почему loka DAX: Программирование 2 01.12.2005 17:36
Почему такое расхождение в скорости выполнения Владимир Максимов DAX: Программирование 28 11.09.2004 12:44

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

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

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