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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.08.2008, 20:44   #1  
Volodymyr is offline
Volodymyr
Участник
 
36 / 21 (1) +++
Регистрация: 03.11.2006
Адрес: Киев
ttsbegin ttscommit and changecompany()
Привет.
Кто подскажет что происходит при таких условиях:
X++:
 ttsbegin;
    changecompany("BAB")
    {
        ttsbegin;
        .....
        ttscommit;
    }
 ttscommit;
Не могу понять почему когда делается второй ttscommit, то вызывается ttsbegin.

Ниже можно не смотреть, просто привожу описания задачи, и появляющейся проблемы при вызове вторым ttscommit'ом ttsbegin'а.

Задача такая:
находимся в одной компании, при создании линии на форме у Юзера спрашивается из какой компании использовать номерную серию. Номерная серия из выбраной компании используется.

Решение:
создал класс NumberSeqFormHandlerMoe в нем перегрузил методы formMethodDataSourceDelete..... где просто добавил changecompany(Выбор Юзера).

Все вродебы хорошо работает. Только не все ) Так как второй ttscommit вызывает ttsbegin, то таблица NumberSequenceList не апдейтится на предмет использования номеров, так как ttsbegin сбрасывает параметры (resetAbort) необходимый для апдейта.

Если снимаю верхний ttsbegin-ttscommit, то все работае.
Но снять его я не могу потомучто
X++:
 void delete()
 {
    ttsbegin; -     ttsbegin
    element.numberSeqFormHandler().formMethodDataSourceDelete();
    super();
    ttscommit;
 }
Если кто дочитает буду рад =)
Всем спасибо!
Старый 29.08.2008, 09:21   #2  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
На сколько я знаю, аксатпа открывает транзакцию и закрывает только один раз. Т.е. в вот в таком коде:
X++:
ttsbegin;
  ttsbegin;
  ....
  ttscommit;
ttscommit;
транзакция уже открыта в первом ttsbegin, и внутри плодить ещё транзакции не имеет смысла.

Возможно я ошибаюсь, если да то поправьте.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 29.08.2008, 10:07   #3  
UNRW is offline
UNRW
Участник
 
383 / 67 (3) ++++
Регистрация: 16.09.2004
Адрес: Москва
вложенные транзакции фактически СУБД не выполняются

настоящий commit будет по последнему ttscommit
Старый 29.08.2008, 11:07   #4  
crazysolntse is offline
crazysolntse
Участник
Аватар для crazysolntse
 
21 / 11 (1) +
Регистрация: 24.07.2006
Адрес: Москва
Цитата:
Сообщение от UNRW Посмотреть сообщение
вложенные транзакции фактически СУБД не выполняются

настоящий commit будет по последнему ttscommit
не совсем так, транзакция фактически открывается не в момент вызова ttsbegin, а в момент первого запроса после него
например
X++:
ttsbegin; 
....
select custtrans where ... ;
ttscommit;
в примере транзакция откроется только в момент select - а
по моему так
Старый 29.08.2008, 11:17   #5  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
уж если вопрос зашел про вложенные транзакции, то вот примерчик многим знакомый
X++:
static void UpdateCustomers(Args _args)
{
    CustTable custTable;
    ;
    ttsbegin; // Уровень транзакции меняется с 0 на 1.
    while select forupdate custTable
        where custTable.CustGroup == '40' // SEIMPLICIT_TRANSACTIONS ON
    {
        ttsbegin; // Уровень транзакции меняется с 1 на 2.

        custTable.CreditMax = 1000;
        custTable.update();

        ttscommit; // Уровень транзакции меняется с 2 до 1.
    }

    ttscommit;// COMMIT TRANSACTION – Уровень транзакции меняется с 1 на 0.
}
__________________
Axapta book for developer
Старый 29.08.2008, 12:48   #6  
Volodymyr is offline
Volodymyr
Участник
 
36 / 21 (1) +++
Регистрация: 03.11.2006
Адрес: Киев
Получается такая ситуация, как ее преодолет незнаю.
Ниже приведена джоба, которая создает и освобождаем номер. Номерная серия должна быть Continious.
X++:
static void Job9(Args _args)
{
    NumberSeq numberSeq;
    Num       number;
    ;
    // Method DataSource.create() - craete the number
    numberSeq = NumberSeq::newGetNumFromCode('Acco_11',
                                             true);
    if (numberSeq)
    {
        number = numberSeq.num();
        info(number);
    }
 
    // Method DataSource.delete() - delete the number;
    ttsbegin;
    numberSeq.abort();
    //super() - delete line
    ttscommit;
}
Если мы работаем в одной компании то все ок.
Можно зайти в Basic->Setup->Number sequence->NumberSequence и посмотреть List.
На отркывшейся форме видно что номер имеет статус Free

Переделаем джобу, для вытягивания номерной серии из другой компании.
X++:
static void Job9(Args _args)
{
    NumberSeq numberSeq;
    Num       number;
    ;
    // Method DataSource.create() - craete the number
    changecompany('VVV')
    {
        numberSeq = NumberSeq::newGetNumFromCode('Acco_11',
                                             true);
        if (numberSeq)
        {
            number = numberSeq.num();
            info(number);
        }
    }
    // Method DataSource.delete() - delete the number;
    ttsbegin;
    changecompany('VVV')
    {
        numberSeq.abort();
    }
    //super() - delete line
    ttscommit;
}
Перейдем в другую компани и посмотрим там NumberSequenceList, там номер имеет тип Active-Undecided.

Таблица NumberSequenceList будет проапдейтчена, если переменная abortIdx больше нуля. При вызове numberSeq.abort();
происходить увеличение abortIdx на единицу, т.е. все ок вродебы.

Но последний ttscommit для апдейта таблици NumberSequenceList, должен переключится в компанию VVV, но при переключении в эту компанию вызывается ttsbegin, который сбрасывает переменную abortIdx.

Application->ttsNotifyCommit()->this.numberSeqGlobal().ttsNotifyCommit();->this.runAutoClean();->Line 23

В результате маемо те що маемо =), т.е. Undecided.

Убрать просто ttsbegin-ttscommit я не могу потомучто если у нас не выполнится удаление линии на форме, то и номерная серия должна вернутся в исходное положение, откатится =)
Старый 29.08.2008, 12:59   #7  
Lemming is offline
Lemming
Участник
Аватар для Lemming
 
1,144 / 343 (14) ++++++
Регистрация: 20.04.2004
Адрес: Москва, Чайнатаун в Люблино
Записей в блоге: 10
Цитата:
Сообщение от Volodymyr Посмотреть сообщение
...
Но последний ttscommit для апдейта таблици NumberSequenceList, должен переключится в компанию VVV, но при переключении в эту компанию вызывается ttsbegin, который сбрасывает переменную abortIdx.
...
На вскидку, а если так попробовать:

X++:
    changecompany('VVV')
    {
        ttsbegin;

        numberSeq.abort();

        ttscommit;

    }
Старый 29.08.2008, 14:01   #8  
Volodymyr is offline
Volodymyr
Участник
 
36 / 21 (1) +++
Регистрация: 03.11.2006
Адрес: Киев
Да так сработает, но так к сожалению нельзя.
Потомучто метод super() иnumberSeq.abort(); должны находится в одной транзакции.
Table.Delete()
X++:
void delete()
{
    ttsbegin;
        changecompany('VMI')
        {
            numberSeq.abort();
        }
        super();
    ttscommit;
}
Старый 29.08.2008, 14:14   #9  
Lemming is offline
Lemming
Участник
Аватар для Lemming
 
1,144 / 343 (14) ++++++
Регистрация: 20.04.2004
Адрес: Москва, Чайнатаун в Люблино
Записей в блоге: 10
Цитата:
Сообщение от Volodymyr Посмотреть сообщение
Да так сработает, но так к сожалению нельзя.
Потомучто метод super() иnumberSeq.abort(); должны находится в одной транзакции.
Table.Delete()
Вообще как то все муторно получается...Насколько я понял, в момент удаления записи в текущей компании Вам нужно освободить номер сгенерированный в другой компании. Попробуйте посмотреть в сторону NumberSeq::release(); (только осторожней с ним, могут быть блокировки)
Старый 29.08.2008, 15:36   #10  
Volodymyr is offline
Volodymyr
Участник
 
36 / 21 (1) +++
Регистрация: 03.11.2006
Адрес: Киев
Да именно. Нужно удалить номер с другой компании, так как он сгенерировался в другой компании.
Форма работает с классом NumberSeqFormHandler, поэтому я хочу использовать стандартный подход
Спасибо за участие
 


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

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

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