28.08.2008, 20:44 | #1 |
Участник
|
ttsbegin ttscommit and changecompany()
Привет.
Кто подскажет что происходит при таких условиях: X++: ttsbegin; changecompany("BAB") { ttsbegin; ..... ttscommit; } ttscommit; Ниже можно не смотреть, просто привожу описания задачи, и появляющейся проблемы при вызове вторым 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 |
Ищущий знания...
|
На сколько я знаю, аксатпа открывает транзакцию и закрывает только один раз. Т.е. в вот в таком коде:
X++: ttsbegin; ttsbegin; .... ttscommit; ttscommit; Возможно я ошибаюсь, если да то поправьте.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
29.08.2008, 10:07 | #3 |
Участник
|
вложенные транзакции фактически СУБД не выполняются
настоящий commit будет по последнему ttscommit |
|
29.08.2008, 11:07 | #4 |
Участник
|
Цитата:
например X++: ttsbegin; .... select custtrans where ... ; ttscommit; по моему так |
|
29.08.2008, 11:17 | #5 |
MCT
|
уж если вопрос зашел про вложенные транзакции, то вот примерчик многим знакомый
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 |
Участник
|
Получается такая ситуация, как ее преодолет незнаю.
Ниже приведена джоба, которая создает и освобождаем номер. Номерная серия должна быть 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 будет проапдейтчена, если переменная 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 |
Участник
|
Цитата:
X++: changecompany('VVV') { ttsbegin; numberSeq.abort(); ttscommit; } |
|
29.08.2008, 14:01 | #8 |
Участник
|
Да так сработает, но так к сожалению нельзя.
Потомучто метод super() иnumberSeq.abort(); должны находится в одной транзакции. Table.Delete() X++: void delete() { ttsbegin; changecompany('VMI') { numberSeq.abort(); } super(); ttscommit; } |
|
29.08.2008, 14:14 | #9 |
Участник
|
Вообще как то все муторно получается...Насколько я понял, в момент удаления записи в текущей компании Вам нужно освободить номер сгенерированный в другой компании. Попробуйте посмотреть в сторону NumberSeq::release(); (только осторожней с ним, могут быть блокировки)
|
|
29.08.2008, 15:36 | #10 |
Участник
|
Да именно. Нужно удалить номер с другой компании, так как он сгенерировался в другой компании.
Форма работает с классом NumberSeqFormHandler, поэтому я хочу использовать стандартный подход Спасибо за участие |
|