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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.02.2004, 19:03   #1  
bolt is offline
bolt
Участник
 
10 / 10 (1) +
Регистрация: 17.02.2004
Почему-то вылетает транзакция
В процессе открытия некой вспомогательной формы и её обработки почему-то происходит закрытие транзакции, хотя ни ttscommit ни ttsabort нет. Соответственно выдается ошибка. Как это обойти? Транзакцию прерывать специально нехочется очень-очень.
Старый 17.02.2004, 20:13   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
закрытие - это нормальный commit?
тогда странно. Барабашки нет - ищите ttscommit.

если под закрытием вы подразумеваете rollback, то rollback может автоматически делать возникшее исключение. Т.е. где то есть либо throw, либо нечто, что возбуждает исключение. Если нет обработчиков, то Аксапта сама откатывает транзакцию.
Старый 18.02.2004, 10:03   #3  
dirigente is offline
dirigente
Участник
 
50 / 10 (1) +
Регистрация: 19.11.2003
Адрес: Москва
Поясню
В коде:
....
PHP код:
ttsbegin;
    
SomeFunction();
ttscommit;
....
boolean SomeFunction()
{
     
//Создание FormRun, содержащей CommandButton OK. 
     //Далее init(), run(), wait();

В результате появляется на экране форма, при нажатии на OK вылетает ошибка контроля транзакций TTS - непарные транзакции.
При закрытии окна (используем кнопку окна x) - все нормально.
Таким образом, где-то в районе closeOK()/closeCancel() и возникает это самое "что-то", что вызывает исключение. Т.е. Аксапта "забывает" ttsbegin, видимо ...
Эксперимент повторяем с устойчивым результатом.

Как это можно обойти?
__________________
С уважением,
Dirigente
Старый 18.02.2004, 10:12   #4  
Garic is offline
Garic
NavAx
Аватар для Garic
NavAx Club
 
393 / 63 (3) ++++
Регистрация: 23.07.2002
Адрес: Москва
Ничего удивительного. Такого ни в коем случае нельзя делать.
Представте себе ситуацию - открывается транзакция, потом открывается форма. Сотрудник уходит на обед, а транзакция висит...
__________________
С уважением, Игорь Ласийчук.
Старый 18.02.2004, 13:03   #5  
dirigente is offline
dirigente
Участник
 
50 / 10 (1) +
Регистрация: 19.11.2003
Адрес: Москва
Идея понятна. Однако если внимательно прочитать мое пояснение, то станет ясно, что следуя Вашим рассуждениям, Аксапта не должна давать открывать форму, но это не так.
Решение уже найдено - мы просто меняем CommandButton на Button и в
Click() обрабатываем (в зависимости от кнопки) результат и закрываем форму close(), а не closeOK() или closeCancel(), которые вызываются в случае с CommandButton автоматически, - так работает.
А транзакции, IMHO, на то и есть чтобы обеспечивать целостность данных вне зависимости от причин прерывания.
Вас пугает возможность приостановить транзакцию на длительное время?
Но видите ли, все зависит от контекста. В нашем случае ЭТО НЕ КРИТИЧНО.
Вопрос-контраргумент: а как быть если в середине обычной (т.е. в Вашем понимании - программно непрерываемой) транзакции, время исполнения которой составляет доли секунды, происходит сбой?
Все же я склонен считать, что здесь какие-то другие причины или ошибка.

Спасибо.
__________________
С уважением,
Dirigente
Старый 18.02.2004, 14:08   #6  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Изначально опубликовано dirigente
Вас пугает возможность приостановить транзакцию на длительное время?
думается, Garic-а пугает возможность парализовать на длительное время работу БД (и предприятия)

Цитата:
Изначально опубликовано dirigente
Вопрос-контраргумент: а как быть если в середине обычной (т.е. в Вашем понимании - программно непрерываемой) транзакции, время исполнения которой составляет доли секунды, происходит сбой?
А никак - она будет откачена сервером. У него логика простая (железная), его дело не допустить нарушений целостности, он это и делает в меру возможностей, дискутировать с ним бесполезно

гадать о причинах такого поведения, не видя кода SomeFunction можно долго и безрезультатно. Внутри нее никаких исключений/ошибок не выбрасывается?
Старый 18.02.2004, 15:10   #7  
dirigente is offline
dirigente
Участник
 
50 / 10 (1) +
Регистрация: 19.11.2003
Адрес: Москва
По поводу остановки базы/предприятия я уже написал - в данном конкретном случае этого по логике не произойдет....

Я просто пытаюсь сказать, что,возможно, есть такая особенность: если внутри ttsbegin - ttscommit вызывается функция, в которой создается FormRun с минимум одной CommandButton (OK) И ВСЁ. Инициализируется и запускается, то при нажатии на ОК возникает ошибка непарных транзакций. Никаких исключений внутри самой функции не возникает и не выбрасывается. Нашу конкретную проблему мы решили, как я уже говорил, тем не менее сама проблема остается. Можно обойтись и без вызова функции,например:
PHP код:
static void Job3(Args _args)
{
    
Args args=new Args();
    
FormRun dialog;
    
ttsbegin;
    
args.name(formstr(TestForm));
    
dialog ClassFactory.formRunClass(args);
    
dialog.init();
    
dialog.run();
    
dialog.wait();
    
ttscommit;

При нажатии на ОК - ошибка.
Форма TestForm - обычная форма с CommandButton OK.
Все параметры - по-умолчанию.

Ну как?
__________________
С уважением,
Dirigente
Старый 18.02.2004, 15:43   #8  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Изначально опубликовано dirigente
Ну как?
аналогично
а если бы и работало, все равно не повод вызывать формы и диалоги внутри транзакции
Старый 18.02.2004, 15:48   #9  
Garic is offline
Garic
NavAx
Аватар для Garic
NavAx Club
 
393 / 63 (3) ++++
Регистрация: 23.07.2002
Адрес: Москва
Ну не умеет к сожалению система блокировать все ошибки программирования.
В данном случае вы допускаете грубую ошибку.
Подумайте ещё раз над задачей.
__________________
С уважением, Игорь Ласийчук.
Старый 18.02.2004, 16:02   #10  
dirigente is offline
dirigente
Участник
 
50 / 10 (1) +
Регистрация: 19.11.2003
Адрес: Москва
2Garic:
Вы понятия не имеете, уважаемый, что за задача стоит, я об этом и не говорил и не спрашивал, стоит ли мне еще раз подумать.
Если бы мы делали задачу "с нуля", то такого бы не допустили, однако ...
Если Вы видите здесь грубую ошибку - так скажите что же это за ошибка, а если не знаете - зачем ... говорить?
Если уж говорить о методике модификации функционала Аксапты, то об этом можно спорить долго и безрезультатно.
В данном случае альтернативой является изменения функционирования основных классов.
__________________
С уважением,
Dirigente
Старый 18.02.2004, 16:55   #11  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
А почему не сделать транзакцию внутри формы?
Старый 18.02.2004, 17:30   #12  
dirigente is offline
dirigente
Участник
 
50 / 10 (1) +
Регистрация: 19.11.2003
Адрес: Москва
Господа, я вас просто-таки очень прошу!
Выше приведен пример (Job с описанием).
Я не спрашиваю как обойти ошибку - будь то методологически или программно - МЫ УЖЕ ЕЕ ОБОШЛИ.
Я ПРАВДА НЕ ВИЖУ здесь ошибки программирования, как утверждает уважаемый Garic!

Просто объясните если знаете: ПОЧЕМУ ВОЗНИКАЕТ ОШИБКА? Почему ее нет в случае использования обычной кнопки (НЕ CommandButton) и метода close() по событию click().

Спасибо.
__________________
С уважением,
Dirigente
Старый 19.02.2004, 08:01   #13  
Антон Солдатов is offline
Антон Солдатов
Соучастник
Аватар для Антон Солдатов
 
386 / 27 (1) +++
Регистрация: 29.12.2002
Адрес: Новосибирск
Цитата:
Изначально опубликовано dirigente
Я ПРАВДА НЕ ВИЖУ здесь ошибки программирования, как утверждает уважаемый Garic!
Во время транзакции блокируются не только записи в таблицах, но и экстенты сегментов отката. Это такие логические группы блоков данных в механизме журналирования и отката изменений в Oracle. Если Ваша длительная транзакция и еще одна любая транзакция аксапты с записью большого объема данных будут привязаны к одному сегменту отката(такое вполне возможно), то может возникнуть ошибочная ситуация, в результате которой, транзакция с большим кол-вом записываемых данных будет отменена.
Вероятность того, что эта ситуация возникнет, растет с кол-вом таких ляпов в программировании, частотой использования Вашей формы и т.д.
Даже если ситуация, описанная выше, не произойдет - благодаря вашему стилю смешивать presentation и persistent логику, существенно возрастет ресурсопотребление СУБД. Если экстент занят вашей транзакцией долгое время, вместо переиспользования существующих, серверу понадобится производить операции создания новых экстентов, а в последствии их удаления.

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

Цитата:
Изначально опубликовано dirigente

Просто объясните если знаете: ПОЧЕМУ ВОЗНИКАЕТ ОШИБКА?
Точно не знаю, думаю процесс финализации формы происходит по-разному в этих случаях. И при использовании CommandButton OK происходит автоматический коммит.. После чего вы пытаетесь сделать коммит еще раз.. Это предположения, которые проверять абсолютно не хочется - для того, чтобы внутри транзакции работать с логикой верхних уровней - нет никаких оснований кроме лени.
Старый 19.02.2004, 10:24   #14  
ta_and is offline
ta_and
Участник
 
226 / 122 (5) +++++
Регистрация: 26.02.2002
Адрес: СПб
Полностью согласен с Антоном Солдатовым.

Недопустимо смешивать транзакционную с презентационной логикой для пользователя.
Все предварительные настройки и запросы пользователю должны быть сделаны ДО начала транзакции.
Старый 19.02.2004, 10:40   #15  
dirigente is offline
dirigente
Участник
 
50 / 10 (1) +
Регистрация: 19.11.2003
Адрес: Москва
Что ж, спасибо.
Я полностью согласен и понимаю, что так делать неправильно.
НО для нашей задачи этот вариант приемлем - детали выдавать долго и неинтересно.
И еще несколько замечаний, если позволите.
1. Я полностью согласен, что использование каких-бы то ни было прерываний между ttsbegin/ttscommit - плохая логика, однако еще раз хочу подчеркнуть: не стоит давать оценку стиля программирования, понимания задачи, если вы не знаете задачу и не видели код, все остальное - домыслы.
Цитата:
Изначально опубликовано Антоном Солдатовым

Вероятность того, что эта ситуация возникнет, растет с кол-вом таких ляпов в программировании, частотой использования Вашей формы и т.д.
Даже если ситуация, описанная выше, не произойдет - благодаря вашему стилю смешивать presentation и persistent логику, существенно возрастет ресурсопотребление СУБД.
Еще раз спасибо - это очевидные вещи.
А про автоматический Commit по OK - вот это действительно интересная мысль. Или это установленный факт?

P.S. Думаю не стоит давать оценки тому, о чем вы не имеете представления - это на тему причин такого решения и прочее.
P.P.S. На тему стиля - те кто присутствовал на встрече с клиентами MBS в декабре минувшего года - стали очевидцами ситуации, когда некий господит обвинил MBS в том, что самый известный партнер, в чьем профессионализме не приходится сомневаться, выкатил стоимость перехода с версии 2.5. на 3.0. = стоимости первоначального внедрения. При этом вскользь вышеупомянутый господин сообщил, что многое из того, что только в планах MBS они уже сами (т.е. партнер) реализовали. И для этого господина и Co такая цена стала абсолютным откровением .... но это уже была другая Аксапта.
__________________
С уважением,
Dirigente
Старый 19.02.2004, 10:50   #16  
Антон Солдатов is offline
Антон Солдатов
Соучастник
Аватар для Антон Солдатов
 
386 / 27 (1) +++
Регистрация: 29.12.2002
Адрес: Новосибирск
Цитата:
Изначально опубликовано dirigente
не стоит давать оценку стиля программирования, понимания задачи, если вы не знаете задачу и не видели код, все остальное - домыслы.
Мое(и не только мое) скромное мнение, проверенное не единожды: любая задача не оправдывает подобных действий.

Цитата:
Изначально опубликовано dirigente

А про автоматический Commit по OK - вот это действительно интересная мысль. Или это установленный факт?
это логически обоснованная догадка. нужно проверять...
Старый 19.02.2004, 11:09   #17  
dirigente is offline
dirigente
Участник
 
50 / 10 (1) +
Регистрация: 19.11.2003
Адрес: Москва
2Антон Солдатов

ОК. Спасибо большое.
__________________
С уважением,
Dirigente
Старый 24.02.2004, 09:48   #18  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Факт
Неоднакратно проверенный факт - НЕЛЬЗЯ открывать формы внутри транзакции. Аксапта выдаёт ту самую ошибку о нарушении парности - воспринимайте это сообщение как запрет на такие фокусы.
Старый 16.07.2004, 20:41   #19  
_A_ is offline
_A_
Участник
 
37 / 10 (1) +
Регистрация: 16.07.2004
Адрес: Минск
таки тоже факт...
ttsbegin;
...
if(box::yesno("", DialogButton::Yes, "", "") == DialogButton::No)
throw error("");

...
ttscommit;


Сие аксапта проглатывает запросто,
однако... вах - в сегменте отката у нас будет валяться всякий хлам пока не натиснем кнопочку Yes или No на Dialoge.

значит таки акса позволяет висеть транзакциям... и чудненько завершит или откатит по нажатию той или иной кнопки.
Старый 20.07.2004, 17:14   #20  
garu is offline
garu
Участник
 
33 / 21 (1) +++
Регистрация: 03.07.2003
Аксиома - НИКАКИХ ДИАЛОГОВ С ПОЛЬЗОВАТЕЛЕМ ВНУТРИ ТРАНЗАКЦИИ!!!!!!!
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Почему не дает проставлять инв.номер ОС через закупку? Pismarkina DAX: Функционал 5 03.11.2006 15:49
Почему loka DAX: Программирование 2 01.12.2005 17:36
Почему такое расхождение в скорости выполнения Владимир Максимов DAX: Программирование 28 11.09.2004 12:44
Почему при консолидации не консолидируются корр. счета? George V. Tavrizoff DAX: Функционал 4 15.05.2004 23:59
почему форма сразу закрывается ? puz DAX: Программирование 3 09.09.2003 11:56

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

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

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