17.02.2004, 19:03 | #1 |
Участник
|
Почему-то вылетает транзакция
В процессе открытия некой вспомогательной формы и её обработки почему-то происходит закрытие транзакции, хотя ни ttscommit ни ttsabort нет. Соответственно выдается ошибка. Как это обойти? Транзакцию прерывать специально нехочется очень-очень.
|
|
17.02.2004, 20:13 | #2 |
Участник
|
закрытие - это нормальный commit?
тогда странно. Барабашки нет - ищите ttscommit. если под закрытием вы подразумеваете rollback, то rollback может автоматически делать возникшее исключение. Т.е. где то есть либо throw, либо нечто, что возбуждает исключение. Если нет обработчиков, то Аксапта сама откатывает транзакцию. |
|
18.02.2004, 10:03 | #3 |
Участник
|
Поясню
В коде:
.... PHP код:
При закрытии окна (используем кнопку окна x) - все нормально. Таким образом, где-то в районе closeOK()/closeCancel() и возникает это самое "что-то", что вызывает исключение. Т.е. Аксапта "забывает" ttsbegin, видимо ... Эксперимент повторяем с устойчивым результатом. Как это можно обойти?
__________________
С уважением, Dirigente |
|
18.02.2004, 10:12 | #4 |
NavAx
|
Ничего удивительного. Такого ни в коем случае нельзя делать.
Представте себе ситуацию - открывается транзакция, потом открывается форма. Сотрудник уходит на обед, а транзакция висит...
__________________
С уважением, Игорь Ласийчук. |
|
18.02.2004, 13:03 | #5 |
Участник
|
Идея понятна. Однако если внимательно прочитать мое пояснение, то станет ясно, что следуя Вашим рассуждениям, Аксапта не должна давать открывать форму, но это не так.
Решение уже найдено - мы просто меняем CommandButton на Button и в Click() обрабатываем (в зависимости от кнопки) результат и закрываем форму close(), а не closeOK() или closeCancel(), которые вызываются в случае с CommandButton автоматически, - так работает. А транзакции, IMHO, на то и есть чтобы обеспечивать целостность данных вне зависимости от причин прерывания. Вас пугает возможность приостановить транзакцию на длительное время? Но видите ли, все зависит от контекста. В нашем случае ЭТО НЕ КРИТИЧНО. Вопрос-контраргумент: а как быть если в середине обычной (т.е. в Вашем понимании - программно непрерываемой) транзакции, время исполнения которой составляет доли секунды, происходит сбой? Все же я склонен считать, что здесь какие-то другие причины или ошибка. Спасибо.
__________________
С уважением, Dirigente |
|
18.02.2004, 14:08 | #6 |
Модератор
|
Цитата:
Изначально опубликовано dirigente
Вас пугает возможность приостановить транзакцию на длительное время? Цитата:
Изначально опубликовано dirigente
Вопрос-контраргумент: а как быть если в середине обычной (т.е. в Вашем понимании - программно непрерываемой) транзакции, время исполнения которой составляет доли секунды, происходит сбой? гадать о причинах такого поведения, не видя кода SomeFunction можно долго и безрезультатно. Внутри нее никаких исключений/ошибок не выбрасывается? |
|
18.02.2004, 15:10 | #7 |
Участник
|
По поводу остановки базы/предприятия я уже написал - в данном конкретном случае этого по логике не произойдет....
Я просто пытаюсь сказать, что,возможно, есть такая особенность: если внутри ttsbegin - ttscommit вызывается функция, в которой создается FormRun с минимум одной CommandButton (OK) И ВСЁ. Инициализируется и запускается, то при нажатии на ОК возникает ошибка непарных транзакций. Никаких исключений внутри самой функции не возникает и не выбрасывается. Нашу конкретную проблему мы решили, как я уже говорил, тем не менее сама проблема остается. Можно обойтись и без вызова функции,например: PHP код:
Форма TestForm - обычная форма с CommandButton OK. Все параметры - по-умолчанию. Ну как?
__________________
С уважением, Dirigente |
|
18.02.2004, 15:43 | #8 |
Модератор
|
Цитата:
Изначально опубликовано dirigente
Ну как? а если бы и работало, все равно не повод вызывать формы и диалоги внутри транзакции |
|
18.02.2004, 15:48 | #9 |
NavAx
|
Ну не умеет к сожалению система блокировать все ошибки программирования.
В данном случае вы допускаете грубую ошибку. Подумайте ещё раз над задачей.
__________________
С уважением, Игорь Ласийчук. |
|
18.02.2004, 16:02 | #10 |
Участник
|
2Garic:
Вы понятия не имеете, уважаемый, что за задача стоит, я об этом и не говорил и не спрашивал, стоит ли мне еще раз подумать. Если бы мы делали задачу "с нуля", то такого бы не допустили, однако ... Если Вы видите здесь грубую ошибку - так скажите что же это за ошибка, а если не знаете - зачем ... говорить? Если уж говорить о методике модификации функционала Аксапты, то об этом можно спорить долго и безрезультатно. В данном случае альтернативой является изменения функционирования основных классов.
__________________
С уважением, Dirigente |
|
18.02.2004, 16:55 | #11 |
NavAx
|
А почему не сделать транзакцию внутри формы?
|
|
18.02.2004, 17:30 | #12 |
Участник
|
Господа, я вас просто-таки очень прошу!
Выше приведен пример (Job с описанием). Я не спрашиваю как обойти ошибку - будь то методологически или программно - МЫ УЖЕ ЕЕ ОБОШЛИ. Я ПРАВДА НЕ ВИЖУ здесь ошибки программирования, как утверждает уважаемый Garic! Просто объясните если знаете: ПОЧЕМУ ВОЗНИКАЕТ ОШИБКА? Почему ее нет в случае использования обычной кнопки (НЕ CommandButton) и метода close() по событию click(). Спасибо.
__________________
С уважением, Dirigente |
|
19.02.2004, 08:01 | #13 |
Соучастник
|
Цитата:
Изначально опубликовано dirigente
Я ПРАВДА НЕ ВИЖУ здесь ошибки программирования, как утверждает уважаемый Garic! Вероятность того, что эта ситуация возникнет, растет с кол-вом таких ляпов в программировании, частотой использования Вашей формы и т.д. Даже если ситуация, описанная выше, не произойдет - благодаря вашему стилю смешивать presentation и persistent логику, существенно возрастет ресурсопотребление СУБД. Если экстент занят вашей транзакцией долгое время, вместо переиспользования существующих, серверу понадобится производить операции создания новых экстентов, а в последствии их удаления. Следуя традиции сравнивать аксапту с автомобилями - представьте, как на хорошей скоростной дороге, предназначенной для грамотных автомобилистов с исправными автомобилями, Вы перекрыли полосу движения только потому, что пользуетесь механикой и не умеете переключать скорости. Цитата:
Изначально опубликовано dirigente
Просто объясните если знаете: ПОЧЕМУ ВОЗНИКАЕТ ОШИБКА?
__________________
View Anton Soldatov's LinkedIn profile |
|
19.02.2004, 10:24 | #14 |
Участник
|
Полностью согласен с Антоном Солдатовым.
Недопустимо смешивать транзакционную с презентационной логикой для пользователя. Все предварительные настройки и запросы пользователю должны быть сделаны ДО начала транзакции. |
|
19.02.2004, 10:40 | #15 |
Участник
|
Что ж, спасибо.
Я полностью согласен и понимаю, что так делать неправильно. НО для нашей задачи этот вариант приемлем - детали выдавать долго и неинтересно. И еще несколько замечаний, если позволите. 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 |
Соучастник
|
Цитата:
Изначально опубликовано dirigente
не стоит давать оценку стиля программирования, понимания задачи, если вы не знаете задачу и не видели код, все остальное - домыслы. Цитата:
Изначально опубликовано dirigente
А про автоматический Commit по OK - вот это действительно интересная мысль. Или это установленный факт?
__________________
View Anton Soldatov's LinkedIn profile |
|
19.02.2004, 11:09 | #17 |
Участник
|
2Антон Солдатов
ОК. Спасибо большое.
__________________
С уважением, Dirigente |
|
24.02.2004, 09:48 | #18 |
----------------
|
Факт
Неоднакратно проверенный факт - НЕЛЬЗЯ открывать формы внутри транзакции. Аксапта выдаёт ту самую ошибку о нарушении парности - воспринимайте это сообщение как запрет на такие фокусы.
|
|
16.07.2004, 20:41 | #19 |
Участник
|
таки тоже факт...
ttsbegin;
... if(box::yesno("", DialogButton::Yes, "", "") == DialogButton::No) throw error(""); ... ttscommit; Сие аксапта проглатывает запросто, однако... вах - в сегменте отката у нас будет валяться всякий хлам пока не натиснем кнопочку Yes или No на Dialoge. значит таки акса позволяет висеть транзакциям... и чудненько завершит или откатит по нажатию той или иной кнопки. |
|
20.07.2004, 17:14 | #20 |
Участник
|
Аксиома - НИКАКИХ ДИАЛОГОВ С ПОЛЬЗОВАТЕЛЕМ ВНУТРИ ТРАНЗАКЦИИ!!!!!!!
|
|