|
![]() |
#1 |
Участник
|
эксперимент
Здравствуйте.
Решил возобновить тему, чтобы еще раз попытаться разобраться с FieldUpdate = Relative С помощью таких действий X++: static void Job_1(Args _args) { Ltable t_1; Ltable t_2; Ltable t_3;; // point_0 ttsbegin; {// block_1 select forupdate t_1 where t_1.id == 5; {// block_2 select forupdate t_2 where t_2.id == 5; { // block_3 select forupdate t_3 where t_3.id == 5; t_3.Val = 14; t_3.update(); } t_2.Val = 700; t_2.update(); } t_1.Val = 50000; t_1.update(); } ttscommit; } Код: W = V + (-V + U_1) + (-V + U_2) + ... + (-V + U_n), В частности, в самых интересных для практики случаях, которые обсуждались выше, получаем 1. i = 1 : W = U_1 (отличия от FieldUpdate = Absolute не видны). 2. i = 2 : после первого запуска джоба имеем W = U_1 + U_2 - V после второго запуска джоба имеем W = V (любители арифметики могут убедиться, что при других i подобных циклов нет). ---------------------- Надеюсь, кто-нибудь сможет пояснить, для чего заложена именно такая формула для Relative update, поскольку из предыдущего обсуждения мне показалось, что люди ожидали работы по формуле W = V + U_1 + U_2 + ... + U_n. В качестве офтопа еще хочу спросить, почему не возникает deadlock при выполнении block_2 после block_1.
__________________
Axapta 3.0 SP 4 Последний раз редактировалось bodeaux; 03.07.2013 в 14:53. |
|
![]() |
#2 |
Участник
|
Цитата:
Сообщение от bodeaux
![]() удалось установить, что в подобных случаях в таблице остается значение W = V + (-V + U_1) + (-V + U_2) + ... + (-V + U_n), где V - значение в точке point_0, U_i - значение, переданное в update номер i.
Надеюсь, кто-нибудь сможет пояснить, для чего заложена именно такая формула для Relative update, поскольку из предыдущего обсуждения мне показалось, что люди ожидали работы по формуле W = V + U_1 + U_2 + ... + U_n. X++: select forupdate t_1 where t_1.id == 5; {// block_2 select forupdate t_2 where t_2.id == 5; { // block_3 select forupdate t_3 where t_3.id == 5; t_3.Val += 14; t_3.update(); } t_2.Val += 700; t_2.update(); } t_1.Val += 50000; t_1.update(); ![]() Цитата:
Цитата:
...К счастью, среда времени выполнения Microsoft Dynamics AX управляет данной ситуацией. При исполнении оператора обновления среда времени выполнения находит все другие буфера записей, содержащие ту же запись, и если при этом они были извлечены с ключевым словом forupdate, то среда времени выполнения изменяет значение поля RecVersion данных буферов записей на новое значение из базы данных. Следовательно, второе обновление не вызовет ошибки.
|
|
|
За это сообщение автора поблагодарили: S.Kuskov (5). |
![]() |
#3 |
Участник
|
Цитата:
Так что, убедиться будет проблематично ![]()
__________________
Axapta v.3.0 sp5 kr2 |
|
Теги |
ledgerbalance, ledgerbalancesdimtrans, ledgerbalancestrans, главная книга, итоги, сальдо, crm2011 |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|