27.11.2003, 13:02 | #1 |
Участник
|
Откат транзакции. Attain. C/Al
Ситуация примерно такая. Бухгалтер формирует операцию оплаты, в случае кредиты при этом должно сформироваться еще две проводки, на основе первой. Итого: 3. Я без проблем формирую все эти проводки, но может возникнуть такая ситуация, что некое ЧП помешало завершиться процедуре до конца. Скажем, прошло две проводки, и осталась еще одна. Для обеспечения корректности операции необходимо провести откат транзакции. Как это делается в Аттейне?
Есть еще такой вопрос: есть ли возможность получить текущую строку в фин. журнале (на которой усановлен курсор)? Заранее благодарен.
__________________
Александр Игнатьев |
|
27.11.2003, 14:23 | #2 |
NavAx
|
По идее, транзакция в Навыжне - это период между вызовами LOCKTABLE и COMMIT.
То и другое может быть вызвано как явным, так и неявным способом (например, MODIFY вызывает LOCKTABLE). Если до COMMIT происходит ошибка, то транзакция откатывается. Ошибка при этом, опять же, может быть вызвана как явно (TESTFIELD, ERROR, FIELDERROR), так и неявно (скажем, вы пытаетесь заинсертить запись с уже существующим значением первичного ключа). Если же COMMIT уже произошел, то версия, с которой происходила работа, становится текущей и метаться уже поздняк... |
|
27.11.2003, 15:00 | #3 |
Участник
|
Ага, отлично, протестировал то, что надо. Если возникает ошибка откат происходит. Однако новый глюк появляется в другом месте. Успешено учтенные проводки не удаляются из таблицы фин. журнала. Код примерно такой
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 |
NavAx
|
В данном случае - подозреваю, что никак.
То, что в начале кода стоит LOCKTABLE, а в конце кода стоит COMMIT совсем не означает, что весь код между ними - это одна транзакция =) На самом деле INSERT - это отдельная транзация в данной ситуации, и CODEUNIT.RUN(CODEUNIT::"Gen. Jnl.-Post Line",Rec) тоже выполняет какие-то там свои транзакции... Как уговорить Навыжн считать все это одной большой транзакцией, которую при желании всю можно откатить, я не знаю |
|
28.11.2003, 09:46 | #5 |
Участник
|
Сначала сформируй строки финжурнала, а потом учти их все вместе, а не по одной.
|
|
28.11.2003, 13:20 | #6 |
Участник
|
А если скажем там уже есть неучтенные записи?
__________________
Александр Игнатьев |
|
28.11.2003, 13:54 | #7 |
NavAx
|
Создай временную табличку, по ходу создания твоих неучтенных строк журнала записывай в эту временную табличку номера созданных тобою строк.
После того, как создал все нужные строки в журнале, пробеги циклом по временной табличке, находи в журнале строки по записям из временной таблички и учитывай их. |
|
28.11.2003, 14:08 | #8 |
Участник
|
Можно и так, но как же обеспечение целостности? Может, лучше записывать эти записи в спец. раздел журнала и потом учитывать его? Но как это реализовать, как учесть раздел журнала?
__________________
Александр Игнатьев |
|
28.11.2003, 14:15 | #9 |
NavAx
|
А причем здесь обеспечение целостности?
|
|
28.11.2003, 14:25 | #10 |
Участник
|
Ну как бы ворос изначально именно об этом ставился. Откат транзакций используется именно для обеспечения целостности.
__________________
Александр Игнатьев |
|
28.11.2003, 14:42 | #11 |
NavAx
|
Я не уверен, но можно попробовать создать под это дело специальный объект, например отчет.
Отчет работает со строками финжурнала и учитывает их. Есть у меня смутное подозрение, что если в отчете не ставить ручками COMMIT'ы, то все его выполнение будет одной большой транзакцией, которая, в случае возникновения ошибки по ходу выполнения отчета, откатится вся... Но это только подозрение, проверить времени нет пока. |
|
28.11.2003, 14:46 | #12 |
Участник
|
Ага, спасибо за идею, надо попробовать. Я еще думаю, раз locktable не дает внешним функциям удалять строки из таблицы, удалять их самому.
__________________
Александр Игнатьев |
|
28.11.2003, 17:19 | #13 |
Участник
|
Сделай так, чтобы в этом шаблоне и разделе фин. журнала не было других строк, кроме тех, что тебе нужны.
Либо фильтруй. Например, можно использовать MARK и MARKEDONLY. |
|
02.12.2003, 13:19 | #14 |
Участник
|
Стопудово
Используй MARK и потом MARKEDONLY. Создавай строки, а потом выцарапывай их из всех журнальных строк и маркируй. В результате у тебя в переменной Rec будут лежать только нужные записи. Ну и дело за малым - прогоняй переменную через Gen. Jnl Post Line!!
__________________
Вот такие, брат, дела! |
|
02.12.2003, 16:54 | #15 |
Участник
|
Да я тоже решил остановиться именно на этом варианте, спасибо.
__________________
Александр Игнатьев |
|
|
Похожие темы | ||||
Тема | Ответов | |||
Несколько вопросов по C/AL и C/SIDE начинающего | 1 | |||
Navision Attain через Citrix | 2 | |||
Переход на Navision Attain | 3 | |||
attain - Переход на attain | 8 | |||
работа с COM в C/AL | 0 |
|