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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.04.2009, 15:38   #1  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
update_recordset. Бага или фича?
Есть код:

X++:
ttsbegin;
Table1 table1;
;
select forupdate table1 where table1.filed2 == value;

table1.Field1 = true;
table1.update();
ttscommit;
Данный код обновляет поле и, в случае, если изменяется значение поля, меняет поля ModifiedDate/Time

Следующий код:
X++:
Table1 table1;
;
update_recordset table1 setting field1 = true where table1.field2 = value;
Делает то же самое, но в отличии от предыдущего обновляет ModifiedDate/Time всегда, независимо от того изменилось значение поля или нет.

По-моему это неправильно, поля modified должны меняться только тогда, когда изменилось значение какого-нибудь поля.

Пытался отучить update_recordset от такой привычки

Этот код не меняет поля ModifiedDate/Time :
X++:
ttsbegin;
Table1 table1;
;
table1.overwriteSystemfields(true);

select forupdate table1 where table1.filed2 == value;

table1.Field1 = true;
table1.update();
ttscommit;

А этот сбрасывает в 0 оба поля
X++:
Table1 table1;
;
table1.overwriteSystemfields(true);

update_recordset table1setting field1 = true where table1.field2 = value;
В общем получилось даже хуже чем было

Ax 3.0 SP3

Последний раз редактировалось Lucky13; 07.04.2009 в 15:42.
За это сообщение автора поблагодарили: aidsua (1).
Старый 07.04.2009, 16:04   #2  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Цитата:
Пытался отучить update_recordset от такой привычки
ну и логично, все строки обновляются, удовлетворяющие условию. Если не надо те, которые не изменились:
X++:
update_recordset table1 setting field1 = true where table1.field2 == value && table1.Field1 != true;
Старый 07.04.2009, 16:28   #3  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
ну и логично, все строки обновляются, удовлетворяющие условию. Если не надо те, которые не изменились:
X++:
update_recordset table1 setting field1 = true where table1.field2 == value && table1.Field1 != true;
Это понятно. Проблему это решит, но не поможет понять почему update_recordset работает не так, как обычный update.
Я имею в виду если поле было равно true и update хочет сделать true. Следовательно ничего не изменилось и modifieddate/time меняться не должны по идее, а они меняются.
Старый 07.04.2009, 18:15   #4  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Lucky13 Посмотреть сообщение
Это понятно. Проблему это решит, но не поможет понять почему update_recordset работает не так, как обычный update.
Я имею в виду если поле было равно true и update хочет сделать true. Следовательно ничего не изменилось и modifieddate/time меняться не должны по идее, а они меняются.
По-моему причины данного поведения достаточно очевидны.
Если делается обычный update() то Акса проверяет, что хоть какое-то поле поменялось и если нет, то реального Апдэйта в БД не уходит.
В случае же update_recordset если выполняются все необходимые условия (типа отсутствия перекрытого метода update(), отсутствия Лога БД или же если есть соответсвующие skipXXX()... это я думаю понятно....) на сервер БД сразу отправляется update вида:
X++:
UPDATE ... 
SET FIELD=:in1,MODIFIEDDATE=:in2,MODIFIEDTIME=:in3
WHERE ...
Соответсвенно и поля меняются всегда для попадающих под запрос строк.
Всё логично... С точки зрения БД - это номальное как раз поведение, т.к. обновление реальное было.

Перекройте метод Update() на таблице и получится первый вариант поведения (Аксаптовский)...
Со всеми вытекающими по скорости.
__________________
Zhirenkov Vitaly
Старый 07.04.2009, 18:20   #5  
Михаил Андреев is offline
Михаил Андреев
Участник
Компания АМАНД
Лучший по профессии 2009
 
1,296 / 239 (10) ++++++
Регистрация: 09.11.2001
Адрес: Химки, Московская область
Цитата:
Сообщение от ZVV Посмотреть сообщение
Перекройте метод Update() на таблице и получится первый вариант поведения (Аксаптовский)...
Со всеми вытекающими по скорости.
Тогда и update_recordset реально не работает
__________________
Михаил Андреев
https://www.amand.ru
Старый 07.04.2009, 18:31   #6  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Михаил Андреев Посмотреть сообщение
Тогда и update_recordset реально не работает
Естественно не работает, об этом написано мною выше...

PS
Я не собирался здесь писать развёрнутый доклад на тему как и когда работает update_recordset...
А толику юморf могли бы и включить...
__________________
Zhirenkov Vitaly
Старый 08.04.2009, 10:31   #7  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
Цитата:
Сообщение от ZVV Посмотреть сообщение
По-моему причины данного поведения достаточно очевидны.
Если делается обычный update() то Акса проверяет, что хоть какое-то поле поменялось и если нет, то реального Апдэйта в БД не уходит.
В случае же update_recordset если выполняются все необходимые условия (типа отсутствия перекрытого метода update(), отсутствия Лога БД или же если есть соответсвующие skipXXX()... это я думаю понятно....) на сервер БД сразу отправляется update вида:
X++:
UPDATE ... 
SET FIELD=:in1,MODIFIEDDATE=:in2,MODIFIEDTIME=:in3
WHERE ...
Соответсвенно и поля меняются всегда для попадающих под запрос строк.
Всё логично... С точки зрения БД - это номальное как раз поведение, т.к. обновление реальное было.

Перекройте метод Update() на таблице и получится первый вариант поведения (Аксаптовский)...
Со всеми вытекающими по скорости.
Согласен. Но почему тогда, когда указываешь overridesystemfields(true) обычный запрос не обновляет поля Modified, а update_recordset обнуляет их?
Старый 08.04.2009, 17:33   #8  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Lucky13 Посмотреть сообщение
Согласен. Но почему тогда, когда указываешь overridesystemfields(true) обычный запрос не обновляет поля Modified, а update_recordset обнуляет их?
Да действительно, судя по трейсу update_recordset в этом лучае просто посылает апдэйт вида
X++:
UPDATE ... 
SET FIELD=:in1,MODIFIEDDATE=01/01/1900,MODIFIEDTIME=0
WHERE ...
Сложно найти этому логическое объяснение - скорее всего банальный баг... По идее не должны были их трогать...
__________________
Zhirenkov Vitaly
Теги
modifieddate, modifiedtime, recordset, update_recordset, баг

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Бага в сопоставлении «Максимальная переплата или недоплата». Starling DAX: Функционал 1 03.04.2009 17:16
Баг или фича в правах доступа raz DAX: Администрирование 6 17.03.2009 10:51
Есть ли фича для вставки комментариев ? Zabr DAX: Программирование 14 08.09.2008 09:58
Бага во внешнем польском складе Андре DAX: Функционал 0 24.03.2008 10:14
Бага или фича в модуле Расчеты с персоналом? katja DAX: Функционал 3 13.09.2004 18:10

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

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

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