Обработка исключений при работе с БД
Модераторы: m0p3e, edward_K, Модераторы
-
- Постоянный гость
- Сообщения: 56
- Зарегистрирован: 25 июл 2005, 16:42
Обработка исключений при работе с БД
Подскажите название стандартного исключения для Атлантиса вер. 3.03.22, когда накладывается ограничение, но ни одной записи удовлетворяющей этому условию не находится. Исключение ExDbNotFound = "Запись не найдена" не обрабатывается.
-
- Местный житель
- Сообщения: 474
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Сибирь-матушка
- Контактная информация:
Отлавливать через IsValidAll(#Табличка) в cmSetDefault не пробовали ?
Записей нет по ограничению , система в любом случае в буфере создает новую, заполняя ее через вызов cmSetDefault - вот в нем и проверить стОит, а не единственная запись это у нас в текущий момент (просто IsValid при наличии записи в буфере даст True, чего нам не надо)
Записей нет по ограничению , система в любом случае в буфере создает новую, заполняя ее через вызов cmSetDefault - вот в нем и проверить стОит, а не единственная запись это у нас в текущий момент (просто IsValid при наличии записи в буфере даст True, чего нам не надо)
Питаю патологические отвращение и ненависть в особо тяжелой и крайне запущенной формах к семейству программ Microsoft Business Solution !
Восславим господа Кришну за то, что у нас есть ГАЛАКТИКА !
Восславим господа Кришну за то, что у нас есть ГАЛАКТИКА !
-
- Постоянный гость
- Сообщения: 56
- Зарегистрирован: 25 июл 2005, 16:42
-
- Местный житель
- Сообщения: 474
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Сибирь-матушка
- Контактная информация:
Совсем не извращение ...
В осколках исходников, завалявшихся у меня по первой версии 5.85.01, в интефейсе оборотов при наложении фильтра именно так же, как и происходит у вас - наложение фильтров/ограничений, затем GetLast'ом проверка, в случае отсутсвия наличия присутсвия - ругань и вопросы
вообще список список исключений по работе с БД :
ExDbNotFound Запись не найдена
ExDbDuplicateKey Дублированное значение уникального ключа
ExDbModifiableKeyValueError Модификация ключевого поля
ExDbTransactionError Ошибка во время транзакции
ExDbTransactionIsActive Транзакция уже открыта
ExDbInvalidRecordAddress Ошибочный адрес записи
ExDbLockError Ошибка блокировки
ExDbRecordInUse Запись используется
ExDbSurrKeyZero Обновление записи с нулевым суррогатным ключом
ExDbInvalidIndexNumber Ошибочный номер индекса
ExDbNoPosition Ошибочная позиция
ExDbInvalidRelation Ошибочная связь
ExDbAccessToFieldDenied Доступ запрещен
ExDbFileInTransaction Файл используется транзакцией
ExDbSemaphorNotExist Семафор не существует
ExDbSemaphorIsBusy Семафор занят
ExDbSemaphorModeError Ошибка задания параметра установки семафора
ExDbSemaphorError Ошибка работы с семафорами
ExDbInvalidField Передано неправильное поле в метод File.OpenMemo
Вываливаются они при позиционировании программном. Как раз ваш GetFirst/GetLast и порождать должен ExDbNotFound.
Работает это с Атлантиса 3.02.хх
В осколках исходников, завалявшихся у меня по первой версии 5.85.01, в интефейсе оборотов при наложении фильтра именно так же, как и происходит у вас - наложение фильтров/ограничений, затем GetLast'ом проверка, в случае отсутсвия наличия присутсвия - ругань и вопросы
вообще список список исключений по работе с БД :
ExDbNotFound Запись не найдена
ExDbDuplicateKey Дублированное значение уникального ключа
ExDbModifiableKeyValueError Модификация ключевого поля
ExDbTransactionError Ошибка во время транзакции
ExDbTransactionIsActive Транзакция уже открыта
ExDbInvalidRecordAddress Ошибочный адрес записи
ExDbLockError Ошибка блокировки
ExDbRecordInUse Запись используется
ExDbSurrKeyZero Обновление записи с нулевым суррогатным ключом
ExDbInvalidIndexNumber Ошибочный номер индекса
ExDbNoPosition Ошибочная позиция
ExDbInvalidRelation Ошибочная связь
ExDbAccessToFieldDenied Доступ запрещен
ExDbFileInTransaction Файл используется транзакцией
ExDbSemaphorNotExist Семафор не существует
ExDbSemaphorIsBusy Семафор занят
ExDbSemaphorModeError Ошибка задания параметра установки семафора
ExDbSemaphorError Ошибка работы с семафорами
ExDbInvalidField Передано неправильное поле в метод File.OpenMemo
Вываливаются они при позиционировании программном. Как раз ваш GetFirst/GetLast и порождать должен ExDbNotFound.
Работает это с Атлантиса 3.02.хх
Питаю патологические отвращение и ненависть в особо тяжелой и крайне запущенной формах к семейству программ Microsoft Business Solution !
Восславим господа Кришну за то, что у нас есть ГАЛАКТИКА !
Восславим господа Кришну за то, что у нас есть ГАЛАКТИКА !
-
- Постоянный гость
- Сообщения: 56
- Зарегистрирован: 25 июл 2005, 16:42
В том то и дело после вызова PushCondition(tcByCDForm), где Condition ByCDForm = (sbban.dform >= cpar3 and sbban.dform <= cpar4),
именно за тот период когда не было ни одного реестра, возникает "страшное для пользователя" сообщение об ошибке : 'Запись не найдена. Код ошибки: 4. Таблица №16060'. Информативности для пользователя в этом случае ноль по модулю, а страха.... А всего лишь надо сообщить ему (юзверю), что он дескать не прав, что за такой то период нет ни одно записи, и тут же снять фильтр. Вот такой код оказался рабочим:
-------
PushCondition(tcByCDForm);
if (GetFirst sbban <> tsOk)
{
PopCondition(tcByCDForm);
Message(' Юзер ты не прав! Фильтр будет снят!',Warning);
}
-------
именно за тот период когда не было ни одного реестра, возникает "страшное для пользователя" сообщение об ошибке : 'Запись не найдена. Код ошибки: 4. Таблица №16060'. Информативности для пользователя в этом случае ноль по модулю, а страха.... А всего лишь надо сообщить ему (юзверю), что он дескать не прав, что за такой то период нет ни одно записи, и тут же снять фильтр. Вот такой код оказался рабочим:
-------
PushCondition(tcByCDForm);
if (GetFirst sbban <> tsOk)
{
PopCondition(tcByCDForm);
Message(' Юзер ты не прав! Фильтр будет снят!',Warning);
}
-------
-
- Слесарь-системщик
- Сообщения: 304
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
- Контактная информация:
Убедительно предлагаю не пользоваться фильтрами логической таблицы - уж слишком трудно предсказать их поведение. Вместо этого используйте фильтры на узлы (PushConditionForLeave). Это существенно облегчит вам жизнь.
Кроме того, приведенный в мессаге фильтр может быть записан в виде ограничения:
Если подходящего к ситуации индекса в таблице не найдется, можно ограничение сделать безындексным:
Кроме того, приведенный в мессаге фильтр может быть записан в виде ограничения:
Код: Выделить всё
bounds WithinDateRange = cpar3 <<= sbban.dform and cpar4 >>= sbban.dform
Код: Выделить всё
bounds WithinDateRange = cpar3 <<= sbban.dform(noindex) and cpar4 >>= sbban.dform(noindex)
Виталий