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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.11.2011, 19:23   #1  
AlexeyVS is offline
AlexeyVS
Участник
 
103 / 31 (2) +++
Регистрация: 02.04.2010
метод AfterUpdate
Возможно ли выполнить логику ПОСЛЕ того как зафиксируется транзакция метода Update?
Старый 30.11.2011, 19:28   #2  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
А зачем ?
Старый 30.11.2011, 20:58   #3  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Сообщение от AlexeyVS Посмотреть сообщение
Возможно ли выполнить логику ПОСЛЕ того как зафиксируется транзакция метода Update?
Возможно, см. Методы-события ttsNotify* на классе application/infolog
За это сообщение автора поблагодарили: ivas (2), AlexeyVS (1).
Старый 01.12.2011, 07:55   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
А автор вопроса случайно не это имел в виду?
X++:
public void update()
{
    ttsbegin;
    super();
    // TODO: AfterUpdate
    ttscommit;
}
Старый 01.12.2011, 09:57   #5  
shlyopin is offline
shlyopin
MCTS
MCBMSS
 
21 / 14 (1) ++
Регистрация: 05.09.2005
Адрес: Россия
может как-нить так:
X++:
public void update()
{
    ttsbegin;
    super();
    ttscommit;

   // TODO: AfterUpdate
}
Старый 01.12.2011, 10:17   #6  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,510 / 435 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Мне кажется, что ставить ttsbegin/ttscommit внутри update - не очень хорошая идея.
Как правило, исполнять в одной транзакции надо не только внутреннюю логику update, но и внешние действия. А если там транзакция уже открыта, то внутри update она не нужна.
Словом, автору бы лучше найти ttscommit, подтверждающий выполнение update, а уже после него делать действия. Хотя у меня есть сомнения, что ему на самом деле надо что-то делать именно после ttscommit, а не после update.
__________________
С уважением,
Вячеслав
Старый 01.12.2011, 10:41   #7  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Цитата:
Сообщение от pitersky Посмотреть сообщение
Мне кажется, что ставить ttsbegin/ttscommit внутри update - не очень хорошая идея.
При необходимости ставить ttsbegin/ttscommit внутри update это как раз хорошая идея. Никакой метод (update или любой другой) не должен думать о необходимости открытия транзакции при его вызове. Если логика самого метода предполагает, что некоторый код в нем должен выполняться в рамках транзакции, то ttsbegin/ttscommit там должен быть. Для примера см. InventTable.update(), InventTrans.update() и прочие таблицы. Правда к вопросу топикстартера это не относится.
Старый 01.12.2011, 13:24   #8  
egorych is offline
egorych
Участник
Самостоятельные клиенты AX
Oracle
 
761 / 154 (7) ++++++
Регистрация: 09.11.2006
Адрес: Краснодарский край
Цитата:
Сообщение от oip Посмотреть сообщение
При необходимости ставить ttsbegin/ttscommit внутри update это как раз хорошая идея.
То, что разработчики напихали во все возможные места ttsbegin не является правильным для использования! Это имело бы смысл, если бы СУБД поддерживали параллельные транзакции в 1 сессии! Но это не так!
У МССКЛ присутствую т.н. "именованные" транзакции, но логика их работы абсолютно не такая, как кажется - не получится откатить 1 транзакцию и оставить активными другие!
В Оракле есть т.н. автономные транзакции, которые работают независимо, но это опять же не наш случай!
Так что мая ИМХА - если update должен работать внутри транзакции, то об этом должен позаботиться ВЫЗЫВАЮЩИЙ, а не надеяться на то, что где-то, кто-то стартанёт её !
__________________
Axapta 3.0 sp - хз какой, kr2
Старый 01.12.2011, 11:01   #9  
AlexeyVS is offline
AlexeyVS
Участник
 
103 / 31 (2) +++
Регистрация: 02.04.2010
Приветствую! Спасибо за ответы, коллеги.

Объясню зачем все это необходимо. Данные по некоторым сущностям аксы должны быть интегрированы с другими системами. Интеграция происходит в реальном времени через веб-сервис. Даже если выполнять процедуру интеграции после инструкции ttscommit; в перекрытом методе update() и в результате вызова этой процедуры произойдет ошибка (например, сервис недоступен), то все транзакции update() будут отменены. Мне же надо произвести интеграционную процедуру именно после окончательной фиксации метода update().
Старый 01.12.2011, 12:51   #10  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от AlexeyVS Посмотреть сообщение
Даже если выполнять процедуру интеграции после инструкции ttscommit; в перекрытом методе update() и в результате вызова этой процедуры произойдет ошибка (например, сервис недоступен), то все транзакции update() будут отменены.
Ну этого можно избежать если ловить прерывания от процедуры интеграции и не позволять им откатывать транзакцию.

Здесь я вижу проблему в другом. Если проводить интеграцию внутри транзакции то появляется вероятность того что операция чисто теоретически может начать откатываться уже после того как отработает операция интеграции.

Поэтому, сами данные конечно могут передаваться во внешнюю систему и во время работы транзакции (т.е из метода update), но окончательное подтверждение того что эти данные вылидны должно происходить только после завершения транзакции (т.е. из метода Application.ttsNotifyCommit())

А вообще, имхо, интеграция на уровне транзакций - это задача уровня СУБД, а не AOS.

Последний раз редактировалось S.Kuskov; 01.12.2011 в 12:55.
Старый 01.12.2011, 12:49   #11  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Сделайте таблицу с двумя полями RefTableId и RefRecId и пипшите в нее после update ссылку на обновленную запись. А в интеграции бегайте по этой таблице, находите нужную запись, передавайте данные и удаляйте записи с переданными сылками.
За это сообщение автора поблагодарили: lev (2).
Старый 01.12.2011, 13:11   #12  
AlexeyVS is offline
AlexeyVS
Участник
 
103 / 31 (2) +++
Регистрация: 02.04.2010
raz, S.Kuskov, именно так и задумывается!

С учетом того, что интеграция должна работать в реальном времени и позволять "догружать" записи при ошибках, будет реализована следующая схема.

В перекрытых методах CUD будет производится запись в некую таблицу (типа очереди интеграции). Куда будут записаны TableId-RecId. Это позволит нам ставить в очередь интеграции записи, транзакции которых были зафиксированы и данные валидны. Плюс в специальный List класса Application будут записаны ссылки на записи, которые надо интегрировать после ttscommit;

Затем в методе Application.ttsNotifyCommit будет производится сама процедура интеграции по совету DSPIC.
Старый 01.12.2011, 15:18   #13  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Цитата:
Сообщение от AlexeyVS Посмотреть сообщение
Затем в методе Application.ttsNotifyCommit будет производится сама процедура интеграции по совету DSPIC.
А нельзя вынести интеграцию за скобки? Т.е. пакетный сервер анализирует таблицу ссылок и передает актуальные данные. Поскольку он работает в своих транзакциях, то (при определенных настройках) будет видеть ссылки только с закоммиченными данными.
Старый 01.12.2011, 13:20   #14  
ivas is offline
ivas
Участник
Аватар для ivas
 
252 / 68 (3) ++++
Регистрация: 22.12.2005
В методе update создаете тред, а уже в этом треде запускаете то, что должно отработать после метода update. Управление в новый тред перейдет после того как отработает вся текущая логика.

ttsNotifyCommit конечно хорошо, однако в общем случае в этот метод вы можете и не попасть например если вызов update и транзакции живут в другом соединении например: \Classes\NumberSeq\reserveNumInternal
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy
Старый 01.12.2011, 15:26   #15  
AlexeyVS is offline
AlexeyVS
Участник
 
103 / 31 (2) +++
Регистрация: 02.04.2010
raz, тоже вариант. Как запасной, если не удастся реализовать через ttsNotifyCommit()
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Display метод временной таблицы выполняется в компании DAT S.Kuskov DAX: Программирование 4 15.04.2011 20:11
DAX 2009,5.0.1000.52 SP1 в таблице smmBusRelTable отсутствует метод convert2Customer Murlin DAX: Программирование 8 11.11.2009 16:23
Дисплей метод таблицы который вызывается из ГРИДА 3oppo DAX: Программирование 10 23.05.2006 06:47
display метод с параметром Андре DAX: Программирование 5 11.01.2006 19:04
Передача массива VARIANTов в Automation метод Maximin DAX: Программирование 0 09.10.2002 19:31

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

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

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