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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.12.2004, 08:32   #1  
Greggy_imported is offline
Greggy_imported
Участник
Аватар для Greggy_imported
 
291 / 10 (1) +
Регистрация: 24.09.2004
Здравствуйте - подскажите - насколько я понял COMMIT используется в кодеюнитах для создания нескольких пишущих транзакций. То есть после COMMIT стартуется еще одна транзакция - у меня вопрос - если я посреди кодеюнита после определенных действий поставил COMMIT - а в дальнейшем COMMIT не поставил - те действий которые после первого коммита они не создадут изменений в базе???
Старый 28.12.2004, 09:47   #2  
johndoe is offline
johndoe
Участник
 
88 / 10 (1) +
Регистрация: 15.10.2004
Адрес: Москва
:(
Создадут, разумеется. Как и в том случае, как если бы Вы писали, не используя COMMIT вовсе.

Цитата:
By issuing the command COMMIT(), you tell the system that the first write transaction has ended, and you prepare the system for the second. As the execution of the C/AL code has been completed, the system automatically ends the second write transaction. (AT-360-DVG-001-v01.00-W1W1, p. 431)
Старый 28.12.2004, 09:55   #3  
Greggy_imported is offline
Greggy_imported
Участник
Аватар для Greggy_imported
 
291 / 10 (1) +
Регистрация: 24.09.2004
А откатить в таком случае можно как нибудь - вроде RollBack я не видел?
Старый 28.12.2004, 10:30   #4  
Wizard_imported is offline
Wizard_imported
Участник
 
157 / 10 (1) +
Регистрация: 25.11.2004
не совсем так....
COMMIT - завершает явно (подтверждением) транзакцию. Транзакция завершается также при окончании "процесса", т.е. при возвращении управления пользователю - неявно.
В учетных модулях явное подтверждение транзакции используется (имхо) для того, чтобы в пакетном режиме (репорты по фильтру Batch Post*) учет документов происходил "по одному" (транзакция укорачивается) и чтобы возможное возникновение ошибки не вызывало откат учета.
Для явного отката транзакции (RollBack) использовать надо ERROR('errMsg'). При этом если errMsg - пустая строка, то откат произойдет "молча".
И ещё одно замечание...
будьте внимательны с использованием CONFIRM. Эта функция работает в контексте транзакции. Таким образом, если транзакция стартовала, и тем более заблокировала таблицы, то она не закончится, пока пользователь не ответит на ваш вопрос. Примерно вот так НЕ НАДО делать (сам столкнулся однажды с подобным кодом):
TB.LOCKTABLE;
IF FIND('-') THEN
IF CONFIRM('DELETE?') THEN
TB.DELETEALL;

Однако, такая особенность этой функции позволяет на время отладки применять конструкцию
IF NOT CONFIRM('COMMIT?')
THEN ERROR('');
что позволяет избежать многократной подготовки тестовых данных для проверки их обработки какой-нибудь сложной функцией (тем же учетом, например).
Старый 28.12.2004, 10:54   #5  
Greggy_imported is offline
Greggy_imported
Участник
Аватар для Greggy_imported
 
291 / 10 (1) +
Регистрация: 24.09.2004
Wizard спасибо большое
 


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

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

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