|  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 | |||
| 
 |