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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.11.2003, 13:02   #1  
sash_xp is offline
sash_xp
Участник
Аватар для sash_xp
 
274 / 9 (1) +
Регистрация: 18.07.2003
Адрес: Москва
Откат транзакции. Attain. C/Al
Ситуация примерно такая. Бухгалтер формирует операцию оплаты, в случае кредиты при этом должно сформироваться еще две проводки, на основе первой. Итого: 3. Я без проблем формирую все эти проводки, но может возникнуть такая ситуация, что некое ЧП помешало завершиться процедуре до конца. Скажем, прошло две проводки, и осталась еще одна. Для обеспечения корректности операции необходимо провести откат транзакции. Как это делается в Аттейне?

Есть еще такой вопрос: есть ли возможность получить текущую строку в фин. журнале (на которой усановлен курсор)?

Заранее благодарен.
__________________
Александр Игнатьев
Старый 27.11.2003, 14:23   #2  
Yoil is offline
Yoil
NavAx
NavAx Club
Лучший по профессии 2017
Лучший по профессии 2009
 
1,574 / 70 (6) ++++
Регистрация: 20.11.2002
Адрес: Msk
По идее, транзакция в Навыжне - это период между вызовами LOCKTABLE и COMMIT.
То и другое может быть вызвано как явным, так и неявным способом (например, MODIFY вызывает LOCKTABLE).
Если до COMMIT происходит ошибка, то транзакция откатывается. Ошибка при этом, опять же, может быть вызвана как явно (TESTFIELD, ERROR, FIELDERROR), так и неявно (скажем, вы пытаетесь заинсертить запись с уже существующим значением первичного ключа). Если же COMMIT уже произошел, то версия, с которой происходила работа, становится текущей и метаться уже поздняк...
Старый 27.11.2003, 15:00   #3  
sash_xp is offline
sash_xp
Участник
Аватар для sash_xp
 
274 / 9 (1) +
Регистрация: 18.07.2003
Адрес: Москва
Ага, отлично, протестировал то, что надо. Если возникает ошибка откат происходит. Однако новый глюк появляется в другом месте. Успешено учтенные проводки не удаляются из таблицы фин. журнала. Код примерно такой

locktable;
init;
...
"Account No.":='5010';
...

INSERT;
CODEUNIT.RUN(CODEUNIT::"Gen. Jnl.-Post Line",Rec);

init;
...
"Account No.":='6010';
...

INSERT;
CODEUNIT.RUN(CODEUNIT::"Gen. Jnl.-Post Line",Rec);
commit;

Как бы от этого избавиться?
__________________
Александр Игнатьев
Старый 27.11.2003, 16:51   #4  
Yoil is offline
Yoil
NavAx
NavAx Club
Лучший по профессии 2017
Лучший по профессии 2009
 
1,574 / 70 (6) ++++
Регистрация: 20.11.2002
Адрес: Msk
В данном случае - подозреваю, что никак.
То, что в начале кода стоит LOCKTABLE, а в конце кода стоит COMMIT совсем не означает, что весь код между ними - это одна транзакция =)
На самом деле INSERT - это отдельная транзация в данной ситуации, и
CODEUNIT.RUN(CODEUNIT::"Gen. Jnl.-Post Line",Rec) тоже выполняет какие-то там свои транзакции...

Как уговорить Навыжн считать все это одной большой транзакцией, которую при желании всю можно откатить, я не знаю
Старый 28.11.2003, 09:46   #5  
bascomo is offline
bascomo
Участник
 
51 / 10 (1) +
Регистрация: 11.02.2003
Адрес: Москва
Сначала сформируй строки финжурнала, а потом учти их все вместе, а не по одной.
Старый 28.11.2003, 13:20   #6  
sash_xp is offline
sash_xp
Участник
Аватар для sash_xp
 
274 / 9 (1) +
Регистрация: 18.07.2003
Адрес: Москва
А если скажем там уже есть неучтенные записи?
__________________
Александр Игнатьев
Старый 28.11.2003, 13:54   #7  
Yoil is offline
Yoil
NavAx
NavAx Club
Лучший по профессии 2017
Лучший по профессии 2009
 
1,574 / 70 (6) ++++
Регистрация: 20.11.2002
Адрес: Msk
Создай временную табличку, по ходу создания твоих неучтенных строк журнала записывай в эту временную табличку номера созданных тобою строк.
После того, как создал все нужные строки в журнале, пробеги циклом по временной табличке, находи в журнале строки по записям из временной таблички и учитывай их.
Старый 28.11.2003, 14:08   #8  
sash_xp is offline
sash_xp
Участник
Аватар для sash_xp
 
274 / 9 (1) +
Регистрация: 18.07.2003
Адрес: Москва
Можно и так, но как же обеспечение целостности? Может, лучше записывать эти записи в спец. раздел журнала и потом учитывать его? Но как это реализовать, как учесть раздел журнала?
__________________
Александр Игнатьев
Старый 28.11.2003, 14:15   #9  
Yoil is offline
Yoil
NavAx
NavAx Club
Лучший по профессии 2017
Лучший по профессии 2009
 
1,574 / 70 (6) ++++
Регистрация: 20.11.2002
Адрес: Msk
А причем здесь обеспечение целостности?
Старый 28.11.2003, 14:25   #10  
sash_xp is offline
sash_xp
Участник
Аватар для sash_xp
 
274 / 9 (1) +
Регистрация: 18.07.2003
Адрес: Москва
Ну как бы ворос изначально именно об этом ставился. Откат транзакций используется именно для обеспечения целостности.
__________________
Александр Игнатьев
Старый 28.11.2003, 14:42   #11  
Yoil is offline
Yoil
NavAx
NavAx Club
Лучший по профессии 2017
Лучший по профессии 2009
 
1,574 / 70 (6) ++++
Регистрация: 20.11.2002
Адрес: Msk
Я не уверен, но можно попробовать создать под это дело специальный объект, например отчет.
Отчет работает со строками финжурнала и учитывает их.
Есть у меня смутное подозрение, что если в отчете не ставить ручками COMMIT'ы, то все его выполнение будет одной большой транзакцией, которая, в случае возникновения ошибки по ходу выполнения отчета, откатится вся...
Но это только подозрение, проверить времени нет пока.
Старый 28.11.2003, 14:46   #12  
sash_xp is offline
sash_xp
Участник
Аватар для sash_xp
 
274 / 9 (1) +
Регистрация: 18.07.2003
Адрес: Москва
Ага, спасибо за идею, надо попробовать. Я еще думаю, раз locktable не дает внешним функциям удалять строки из таблицы, удалять их самому.
__________________
Александр Игнатьев
Старый 28.11.2003, 17:19   #13  
bascomo is offline
bascomo
Участник
 
51 / 10 (1) +
Регистрация: 11.02.2003
Адрес: Москва
Сделай так, чтобы в этом шаблоне и разделе фин. журнала не было других строк, кроме тех, что тебе нужны.
Либо фильтруй. Например, можно использовать MARK и MARKEDONLY.
Старый 02.12.2003, 13:19   #14  
Yuriy is offline
Yuriy
Участник
 
150 / 10 (1) +
Регистрация: 25.02.2003
Адрес: Москва
-> Стопудово
Используй MARK и потом MARKEDONLY. Создавай строки, а потом выцарапывай их из всех журнальных строк и маркируй. В результате у тебя в переменной Rec будут лежать только нужные записи. Ну и дело за малым - прогоняй переменную через Gen. Jnl Post Line!!
__________________
Вот такие, брат, дела!
Старый 02.12.2003, 16:54   #15  
sash_xp is offline
sash_xp
Участник
Аватар для sash_xp
 
274 / 9 (1) +
Регистрация: 18.07.2003
Адрес: Москва
Да я тоже решил остановиться именно на этом варианте, спасибо.
__________________
Александр Игнатьев
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Несколько вопросов по C/AL и C/SIDE начинающего gennady NAV: Программирование 1 10.11.2004 09:17
Navision Attain через Citrix Alex_V NAV: Администрирование 2 15.12.2003 17:43
Переход на Navision Attain Makc_1 NAV: Прочие вопросы 3 30.07.2003 14:36
attain - Переход на attain Helen NAV: Прочие вопросы 8 04.06.2003 20:34
работа с COM в C/AL Alex_V NAV: Программирование 0 30.05.2003 13:43

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

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

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