powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Не могу обработать ошибку
17 сообщений из 17, страница 1 из 1
Не могу обработать ошибку
    #34699456
Есть COM-сервер, у которого имеется метод сохранения накладных...
схематично он выглядит так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
ON ERROR ошибка = .T.
BEGIN TRANSACTION
*- 1 -ый этап - запись "шапки" накладной
INSERT INTO table1....
*- 2 -ой этап - запись "тела" накладной
INSERT INTO table2...
IF ошибка
    ROLLBACK
ELSE
    END TRANSACTION
    *- 3 -ий этап - запись журнала операций
    INSERT INTO table3....	
ENDIF

так вот, на втором этапе я сознательно генерю ошибку следующим образом: в таблице "тела" накладной есть поле id, которое уникально и в свойстве DEFAULT VALUE которого вызывается хранимая процедура newid().... она заполняет это поле инкрементными значениями, которые хранятся в таблице уникальных идентификаторов ids.dbf, и вот в эту таблицу я специально заношу номер, уже имеющийся в таблице table2... По идее здесь должно выдаться сообщение, что наружена уникальность номера....
НО НИЧЕГО НЕТ!!!
т.е. 1-ый этап проходит, "шапка" накладной записывается
2-ой этап не проходит, "тело" накладной не записывается, как и должно вобщем-то быть, но никакой ошибки не появляется!
3-ий этап проходит, в журнал операций записывается соответствующая запись....

Вот у меня вопрос: Как обработать ошибку добавления хранимой процедурой записи с уже имеющимся ID, так, чтобы произошёл откат всей транзакции COM-сервера, т.е. чтобы не записались ни "шапка" накладной, ни "тело" и не занеслась бы запись в журнал операций, а так же чтобы не увеличился на 1 номер в ids.dbf (что происходит)....
...
Рейтинг: 0 / 0
Не могу обработать ошибку
    #34699767
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя где-нибудь, например, в той же процедуре NewId() нет перекрытия обработчика ошибок? Выполни приведенный кусок в среде FoxPro расставив значение команды по обработке ошибок

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
ON ERROR ошибка = .T.
?"Установил ON ERROR ", ON("ERROR")

BEGIN TRANSACTION
*- 1 -ый этап - запись "шапки" накладной
INSERT INTO table1....

?"После 1 этапа ON ERROR ", ON("ERROR")
?ошибка

*- 2 -ой этап - запись "тела" накладной
INSERT INTO table2...

?"После 2 этапа ON ERROR ", ON("ERROR")
?ошибка

IF ошибка
    ROLLBACK
ELSE
    END TRANSACTION
    *- 3 -ий этап - запись журнала операций
    INSERT INTO table3....	
ENDIF
...
Рейтинг: 0 / 0
Не могу обработать ошибку
    #34700043
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
во-первых
пересмотреть бубны с newid() в сторону autoincr int

далее, есть ли индекс на поле id candidate ?

в третьих
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
local llError
BEGIN TRANSACTION
try
   *- 1 -ый этап - запись "шапки" накладной
   INSERT INTO table1....
   *- 2 -ой этап - запись "тела" накладной
   INSERT INTO table2...
catch
   llError = .t.
endtry
IF llError
    ROLLBACK
ELSE
    END TRANSACTION
    *- 3 -ий этап - запись журнала операций
    INSERT INTO table3....	
ENDIF
...
Рейтинг: 0 / 0
Не могу обработать ошибку
    #34700104
newid() один в один как в сэмплах, которые идут вместе с фоксом.... да и вся бизнес-логика добавления инкремента тоже такая же...

на id стоит индекс примари....

конструкция TRY не катит, т.к. версия фокса 6....

и главное: ON("ERROR") и в самом методе COM-сервера и в самой хранимой процедуре newid() возвращает ошибка = .T.

не пойму в чём дело????
...
Рейтинг: 0 / 0
Не могу обработать ошибку
    #34700129
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторверсия фокса 6....

а на дворе 2-я половина 2007 г.
...
Рейтинг: 0 / 0
Не могу обработать ошибку
    #34701262
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты не в COM-сервере тестируй, а в среде FoxPro. Просто "вырежи" этот кусок в файл PRG и запусти. Тогда можешь в отладчике пройтись внутрь команды Insert и посмотреть что там происходит.

Смотреть ON("ERROR") надо не внутри NewId, а непосредственно после каждой команды Insert. Есть ведь еще и триггеры и Rule.
...
Рейтинг: 0 / 0
Не могу обработать ошибку
    #34701503
ON("ERROR") на протяжении всего метода не меняется и возвращает ошибка = .T.

но вот с самой переменной ОШИБКА никак не могу разобраться......
Если она объявлена как LOCAL или как PUBLIC, то ошибка о нарушении уникальности поля ID возникает сразу после окончания транзакции на строчке UNLOCK IN table2...
а если она объявлена как PRIVATE, то возникает другая ошибка сразу после первого инсёрта, что переменная ОШИБКА не найдена.....
...
Рейтинг: 0 / 0
Не могу обработать ошибку
    #34701545
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объяви ее глобальной

PUBLIC Ошибка
...
Рейтинг: 0 / 0
Не могу обработать ошибку
    #34701653
я уже написал, что и при LOCAL и при PUBLIC результат одинаковый и отличный от PRIVATE (???)

перенёс метод com-сервера в само приложение - всё работает (переменная объявлена как LOCAL), т.е. выдается сообщение о нарушении уникальности ID и делается откат транзакции...

ЗЫ. у меня уже моск рушится.....
...
Рейтинг: 0 / 0
Не могу обработать ошибку
    #34701821
но мне надо-то чтоб это всё на com-сервере работало....
...
Рейтинг: 0 / 0
Не могу обработать ошибку
    #34702470
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если использовать буферизацию?
...
Рейтинг: 0 / 0
Не могу обработать ошибку
    #34702487
а чего буферизировать в таком случае?
...
Рейтинг: 0 / 0
Не могу обработать ошибку
    #34702573
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КонецЦиклаа чего буферизировать в таком случае?
Таблицы, в которые происходит вставка.

Команда TableUpdate() вернет .F., что и будет означать ошибку. После чего и делать откат транзакции. Ну, примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
=CursorSetProp("buffering", 5 ,"Table1")
=CursorSetProp("buffering", 5 ,"Table2")

LOCAL llSuccess
llSuccess = .T.
BEGIN TRANSACTION

IF m.llSuccess
	*- 1 -ый этап - запись "шапки" накладной
	INSERT INTO table1....
	llSuccess = TableUpdate(.T.,.T.,"Table1")
ENDIF

IF m.llSuccess
	*- 2 -ой этап - запись "тела" накладной
	INSERT INTO table2...
	llSuccess = TableUpdate(.T.,.T.,"Table2")
ENDIF
	
IF m.llSuccess
	END TRANSACTION
	*- 3 -ий этап - запись журнала операций
	INSERT INTO table3....	
ELSE
	ROLLBACK
ENDIF
...
Рейтинг: 0 / 0
Не могу обработать ошибку
    #34703150
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 КонецЦикла

будьте готовы к головной боли
при появлении ошибочного счетчика в заголовках таблиц

ошибка исправлена в 9-й версии сп1
...
Рейтинг: 0 / 0
Не могу обработать ошибку
    #34703345
2 ВладимирМ
спасибо, вроде заработало....
только есть ещё один вопрос: если INSERT делается в цикле, то фиксировать изменения TableUpdate() лучше после всего цикла или после каждой итерации, т.е. после каждого инсёрта?
...
Рейтинг: 0 / 0
Не могу обработать ошибку
    #34703879
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КонецЦиклатолько есть ещё один вопрос: если INSERT делается в цикле, то фиксировать изменения TableUpdate() лучше после всего цикла или после каждой итерации, т.е. после каждого инсёрта?
Зависит от конкретной задачи. В какой момент Вы хотите отловить ошибку? По окончании цикла или после каждой команды вставки?

Ну, и еще влияет наличие уникальных индексов (Candidat, Primary), поскольку от них будет ругань в случае нарушения уникальности при попытке перехода на другую запись даже при табличной буферизации. Т.е. в этом случае нужен сброс буфера на каждой записи. После каждой команды Insert.
...
Рейтинг: 0 / 0
Не могу обработать ошибку
    #34704358
влияет наличие уникальных индексов (Candidat, Primary), поскольку от них будет ругань в случае нарушения уникальности при попытке перехода на другую запись даже при табличной буферизации


в том то и дело, что ругань именно на нарушение уникальности, возникала только после END TRANSACTION, когда происходило снятие блокировки..... Именно эта ругань меня и Вся тема-то как раз и была и заведена, что я не мог отловить эту ругань и откат транзакции не происходил...
поставил фиксацию изменений после цикла, и теперь, сообщение о нарушении уникальности возникает в момент фиксации всех инсёртов и если что не так, то происходит откат всей транзакции.... вобщем как мне и надо...

ещё раз благодарю....
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Не могу обработать ошибку
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]