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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.08.2008, 09:35   #1  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Как правильно обновить.
Есть такая ситуация конструкция расположения ttsbegin\ttscommit.
X++:
static void Job21(Args _args)
{
    InventTable inventTable;
;
    inventTable = InventTable::find("какая-нибудь", true);
    ttsbegin;
    //inventTable = InventTable::findRecId(inventTable.recId, true);
    //inventTable.reread();
    inventTable.update();
    ttscommit;
}
Система естественно ругнёться.
Есть два выхода или перефайньдить или сделать reread.
Повремени выходит одинаково.
Вопрос может есть какие-нибудь структуры в Axapt-e которые позволят избежать перечтения.
Или может у кого есть какие-предложения как наиболее экономно это сделать?
Старый 27.08.2008, 09:55   #2  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Перед update() вызовите inventTable.skipTTSCheck(true);
__________________
Андрей.
За это сообщение автора поблагодарили: miklenew (5).
Старый 27.08.2008, 09:57   #3  
npokypatop is offline
npokypatop
Злыдни
Сотрудники компании It Box
Злыдни
 
60 / 14 (1) ++
Регистрация: 28.09.2005
Адрес: Нюрнберг
Странные вещи творятся.
На этот код система не ругается. Т.е. если мы сначала селектим, а потом открываем транзакцию, все нормально отрабатывает и даже обновляет.
Вот если true поменять на false - да, тогда ругнется.
Непонятно.
А если попробовать inventTable.selectForUpdate(true) уже в рамках транзакции поставить, то независимо от того, как мы find делали - все сработает.
__________________
Все может быть и быть все может, все может быть или не быть,
но быть того никак не может, чего совсем не может быть.
Старый 27.08.2008, 10:44   #4  
dreamer is offline
dreamer
Участник
Аватар для dreamer
 
53 / 15 (1) ++
Регистрация: 18.01.2007
Адрес: Киев
Цитата:
Сообщение от npokypatop Посмотреть сообщение
Странные вещи творятся.
На этот код система не ругается. Т.е. если мы сначала селектим, а потом открываем транзакцию, все нормально отрабатывает и даже обновляет.
Вот если true поменять на false - да, тогда ругнется.
Непонятно.
А если попробовать inventTable.selectForUpdate(true) уже в рамках транзакции поставить, то независимо от того, как мы find делали - все сработает.

Хм,странно... У меня ругается. AX 3.0 SP3
Старый 27.08.2008, 10:53   #5  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
В 3ке так нельзя было, в 4ке - у меня тоже ошибки не появляется.
Старый 27.08.2008, 10:53   #6  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от Dron AKA andy Посмотреть сообщение
Перед update() вызовите inventTable.skipTTSCheck(true);
Вот спасибо.
Чувствовал что-то должно быть, но не знал что.
Старый 27.08.2008, 11:21   #7  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Цитата:
Сообщение от Dron AKA andy Посмотреть сообщение
Перед update() вызовите inventTable.skipTTSCheck(true);
Пусть в table, условно, если Field1==true, то должно быть Field2 == 7, а если Field1==false, то Field2 == 8.

Пользователь1: select forupdate table...
Пользователь2: select forupdate table...
[table.Field1 == true]
Пользователь1:
if (table.Field1)
table.Field2 = 7;
else
table.Field2 = 8;
Пользователь2: table.Field1= false
Пользователь2: table.skipTTSCheck(true)
Пользователь1: table.skipTTSCheck(true)
Пользователь2: table.update();
Пользователь1: table.update();

Результат: table.Field1 == false && Field2 == 7.

Так что надо подумать, прежде чем использовать skipTTSCheck.
За это сообщение автора поблагодарили: miklenew (2).
Старый 27.08.2008, 11:31   #8  
madm is offline
madm
Участник
 
43 / 12 (1) ++
Регистрация: 21.11.2006
Мне почему-то всегда казалось что select forupdate надо делать внутри транзакции т.к. происходит блокировка записи таблицы. Как поведет себя СУБД в случае обрыва транзакции если блокировка была сделана вне этой транзакции?
Старый 27.08.2008, 11:31   #9  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от oip Посмотреть сообщение
Так что надо подумать, прежде чем использовать skipTTSCheck.
Спасибо за дополнение, но мне подойтёт это импорт на пакетчике и с этими таблицами работает только пакетчик.
Старый 27.08.2008, 14:56   #10  
crazysolntse is offline
crazysolntse
Участник
Аватар для crazysolntse
 
21 / 11 (1) +
Регистрация: 24.07.2006
Адрес: Москва
Цитата:
Сообщение от oip Посмотреть сообщение
В 3ке так нельзя было, в 4ке - у меня тоже ошибки не появляется.
между прочим : так можно делать не в 4 ке вообще а только на таблицах на которых установлено свойство occEnabled в yes!
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как правильно создать в коде X++ новый planned order (ReqPO, ReqTrans) rkorchagin DAX: Программирование 5 02.06.2016 18:00
Обновление перекрёстных ссылок - как правильно? Zeppelin DAX: Программирование 5 27.12.2007 14:50
aEremenko: Как правильно подобрать оборудование и понять, сколько оно будет стоить? Blog bot DAX Blogs 0 17.04.2007 12:00
Как правильно обращаться к элементам формы созданнй динамически из АОТ? 3oppo DAX: Программирование 2 29.11.2006 09:57
Как обновить форму из класса? Hidden DAX: Программирование 8 06.12.2005 11:30

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

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

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