|
|
|
Не могу обработать ошибку
|
|||
|---|---|---|---|
|
#18+
Есть COM-сервер, у которого имеется метод сохранения накладных... схематично он выглядит так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. так вот, на втором этапе я сознательно генерю ошибку следующим образом: в таблице "тела" накладной есть поле id, которое уникально и в свойстве DEFAULT VALUE которого вызывается хранимая процедура newid().... она заполняет это поле инкрементными значениями, которые хранятся в таблице уникальных идентификаторов ids.dbf, и вот в эту таблицу я специально заношу номер, уже имеющийся в таблице table2... По идее здесь должно выдаться сообщение, что наружена уникальность номера.... НО НИЧЕГО НЕТ!!! т.е. 1-ый этап проходит, "шапка" накладной записывается 2-ой этап не проходит, "тело" накладной не записывается, как и должно вобщем-то быть, но никакой ошибки не появляется! 3-ий этап проходит, в журнал операций записывается соответствующая запись.... Вот у меня вопрос: Как обработать ошибку добавления хранимой процедурой записи с уже имеющимся ID, так, чтобы произошёл откат всей транзакции COM-сервера, т.е. чтобы не записались ни "шапка" накладной, ни "тело" и не занеслась бы запись в журнал операций, а так же чтобы не увеличился на 1 номер в ids.dbf (что происходит).... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2007, 19:54 |
|
||
|
Не могу обработать ошибку
|
|||
|---|---|---|---|
|
#18+
У тебя где-нибудь, например, в той же процедуре 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2007, 23:53 |
|
||
|
Не могу обработать ошибку
|
|||
|---|---|---|---|
|
#18+
во-первых пересмотреть бубны с newid() в сторону autoincr int далее, есть ли индекс на поле id candidate ? в третьих Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2007, 09:32 |
|
||
|
Не могу обработать ошибку
|
|||
|---|---|---|---|
|
#18+
newid() один в один как в сэмплах, которые идут вместе с фоксом.... да и вся бизнес-логика добавления инкремента тоже такая же... на id стоит индекс примари.... конструкция TRY не катит, т.к. версия фокса 6.... и главное: ON("ERROR") и в самом методе COM-сервера и в самой хранимой процедуре newid() возвращает ошибка = .T. не пойму в чём дело???? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2007, 09:51 |
|
||
|
Не могу обработать ошибку
|
|||
|---|---|---|---|
|
#18+
авторверсия фокса 6.... а на дворе 2-я половина 2007 г. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2007, 09:59 |
|
||
|
Не могу обработать ошибку
|
|||
|---|---|---|---|
|
#18+
Ты не в COM-сервере тестируй, а в среде FoxPro. Просто "вырежи" этот кусок в файл PRG и запусти. Тогда можешь в отладчике пройтись внутрь команды Insert и посмотреть что там происходит. Смотреть ON("ERROR") надо не внутри NewId, а непосредственно после каждой команды Insert. Есть ведь еще и триггеры и Rule. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2007, 14:09 |
|
||
|
Не могу обработать ошибку
|
|||
|---|---|---|---|
|
#18+
ON("ERROR") на протяжении всего метода не меняется и возвращает ошибка = .T. но вот с самой переменной ОШИБКА никак не могу разобраться...... Если она объявлена как LOCAL или как PUBLIC, то ошибка о нарушении уникальности поля ID возникает сразу после окончания транзакции на строчке UNLOCK IN table2... а если она объявлена как PRIVATE, то возникает другая ошибка сразу после первого инсёрта, что переменная ОШИБКА не найдена..... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2007, 15:09 |
|
||
|
Не могу обработать ошибку
|
|||
|---|---|---|---|
|
#18+
Объяви ее глобальной PUBLIC Ошибка ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2007, 15:19 |
|
||
|
Не могу обработать ошибку
|
|||
|---|---|---|---|
|
#18+
я уже написал, что и при LOCAL и при PUBLIC результат одинаковый и отличный от PRIVATE (???) перенёс метод com-сервера в само приложение - всё работает (переменная объявлена как LOCAL), т.е. выдается сообщение о нарушении уникальности ID и делается откат транзакции... ЗЫ. у меня уже моск рушится..... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2007, 15:43 |
|
||
|
Не могу обработать ошибку
|
|||
|---|---|---|---|
|
#18+
но мне надо-то чтоб это всё на com-сервере работало.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2007, 16:18 |
|
||
|
Не могу обработать ошибку
|
|||
|---|---|---|---|
|
#18+
А если использовать буферизацию? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2007, 18:52 |
|
||
|
Не могу обработать ошибку
|
|||
|---|---|---|---|
|
#18+
а чего буферизировать в таком случае? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2007, 18:55 |
|
||
|
Не могу обработать ошибку
|
|||
|---|---|---|---|
|
#18+
КонецЦиклаа чего буферизировать в таком случае? Таблицы, в которые происходит вставка. Команда 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2007, 19:54 |
|
||
|
Не могу обработать ошибку
|
|||
|---|---|---|---|
|
#18+
2 КонецЦикла будьте готовы к головной боли при появлении ошибочного счетчика в заголовках таблиц ошибка исправлена в 9-й версии сп1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2007, 09:49 |
|
||
|
Не могу обработать ошибку
|
|||
|---|---|---|---|
|
#18+
2 ВладимирМ спасибо, вроде заработало.... только есть ещё один вопрос: если INSERT делается в цикле, то фиксировать изменения TableUpdate() лучше после всего цикла или после каждой итерации, т.е. после каждого инсёрта? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2007, 10:46 |
|
||
|
Не могу обработать ошибку
|
|||
|---|---|---|---|
|
#18+
КонецЦиклатолько есть ещё один вопрос: если INSERT делается в цикле, то фиксировать изменения TableUpdate() лучше после всего цикла или после каждой итерации, т.е. после каждого инсёрта? Зависит от конкретной задачи. В какой момент Вы хотите отловить ошибку? По окончании цикла или после каждой команды вставки? Ну, и еще влияет наличие уникальных индексов (Candidat, Primary), поскольку от них будет ругань в случае нарушения уникальности при попытке перехода на другую запись даже при табличной буферизации. Т.е. в этом случае нужен сброс буфера на каждой записи. После каждой команды Insert. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2007, 13:02 |
|
||
|
Не могу обработать ошибку
|
|||
|---|---|---|---|
|
#18+
влияет наличие уникальных индексов (Candidat, Primary), поскольку от них будет ругань в случае нарушения уникальности при попытке перехода на другую запись даже при табличной буферизации в том то и дело, что ругань именно на нарушение уникальности, возникала только после END TRANSACTION, когда происходило снятие блокировки..... Именно эта ругань меня и Вся тема-то как раз и была и заведена, что я не мог отловить эту ругань и откат транзакции не происходил... поставил фиксацию изменений после цикла, и теперь, сообщение о нарушении уникальности возникает в момент фиксации всех инсёртов и если что не так, то происходит откат всей транзакции.... вобщем как мне и надо... ещё раз благодарю.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2007, 15:14 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=34702573&tid=1588925]: |
0ms |
get settings: |
7ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
81ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
70ms |
get tp. blocked users: |
2ms |
| others: | 233ms |
| total: | 435ms |

| 0 / 0 |
