Показать сообщение отдельно
Старый 21.11.2011, 16:34   #10  
Predatore is offline
Predatore
Участник
 
163 / 17 (1) ++
Регистрация: 29.09.2010
Цитата:
Сообщение от AlexB Посмотреть сообщение
Цитата:
Сообщение от Predatore Посмотреть сообщение
В том то и засада, что транзакция не отменится, если быть ещё точнее, то если начать транзакцию до запуска кодеюнита, то в случае вызова ERROR выскочит ошибка выполнения (во время транзакции нельзя использовать CU.RUN с возвращаемым значением отличным от Ok). Т.е. надо попробовать переписать код так, что бы транзакция стартовала в случае удачного выполнения кодеюнита (IF CU50xx.RUN THEN). Это было бы не проблемой, если бы проверка была всего одна. Но если у меня десятки проверок, причём вложенных... тут я уже даже боюсь браться за подобную реализацию, лучше уж через файлы...
Пока писал, придумал что можно сделать. Фактически это вариация на тему того, что предложил InTacto. Пока разбираем входящие данные, пишем всё во временные таблицы (кроме Лога). При этом после каждой записи в Лог (или перед потенциальными вызовами ERROR) делаем COMMIT. Ну и в самом конце, сливаем данные из временных таблиц в обычные. В итоге у нас и ERROR нормально отработает и Лог запишется и данные никуда не попадут, если встретится хотя бы один ERROR.
Я пишу лог в зависимости от того, был ли при работе codeunit'a ERROR или нет таким образом:

Код:
CLEARLASTERROR;
textLoc := '';
COMMIT;

IF Codeunit5xxx.RUN() THEN;

textLoc := COPYSTR(GETLASTERRORTEXT,1,MAXSTRLEN(textLoc));
if  textLoc <> '' THEN BEGIN
  WriteLog(textLoc);
END;
Спасибо за идею, хотя работоспособна она только от 5-ой версии и выше. В будущем может пригодится, а сейчас я уже сделал как выше описал, тем паче, у меня и так временные таблицы используются, и изменения пришлось внести минимальные.