Обработка исключений при работе с БД

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Великий Пользователь
Постоянный гость
Сообщения: 56
Зарегистрирован: 25 июл 2005, 16:42

Обработка исключений при работе с БД

Сообщение Великий Пользователь »

Подскажите название стандартного исключения для Атлантиса вер. 3.03.22, когда накладывается ограничение, но ни одной записи удовлетворяющей этому условию не находится. Исключение ExDbNotFound = "Запись не найдена" не обрабатывается.
Goblin
Местный житель
Сообщения: 474
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Сибирь-матушка
Контактная информация:

Сообщение Goblin »

Отлавливать через IsValidAll(#Табличка) в cmSetDefault не пробовали ?
Записей нет по ограничению , система в любом случае в буфере создает новую, заполняя ее через вызов cmSetDefault - вот в нем и проверить стОит, а не единственная запись это у нас в текущий момент (просто IsValid при наличии записи в буфере даст True, чего нам не надо)
Питаю патологические отвращение и ненависть в особо тяжелой и крайне запущенной формах к семейству программ Microsoft Business Solution !
Восславим господа Кришну за то, что у нас есть ГАЛАКТИКА !
Великий Пользователь
Постоянный гость
Сообщения: 56
Зарегистрирован: 25 июл 2005, 16:42

Сообщение Великий Пользователь »

Попробовал. Пахнет боольшим извращением. :? Обхожу пока c помощью GetFirst. Но хотелось бы сделать более грамотно и культурно, т.е. через обработку исключений.
WiRuc
Местный житель
Сообщения: 414
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж

Сообщение WiRuc »

Я сильно удивлюсь, если есть такое исключение. Надо понимать, что исключение - это нештатная ситуация, а отсутствие записей по фильтру является вполне нормальным явлением.
Goblin
Местный житель
Сообщения: 474
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Сибирь-матушка
Контактная информация:

Сообщение Goblin »

Совсем не извращение ...
В осколках исходников, завалявшихся у меня по первой версии 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);
}
-------
Screw
Слесарь-системщик
Сообщения: 304
Зарегистрирован: 29 мар 2005, 17:49
Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
Контактная информация:

Сообщение Screw »

Убедительно предлагаю не пользоваться фильтрами логической таблицы - уж слишком трудно предсказать их поведение. Вместо этого используйте фильтры на узлы (PushConditionForLeave). Это существенно облегчит вам жизнь.

Кроме того, приведенный в мессаге фильтр может быть записан в виде ограничения:

Код: Выделить всё

  bounds WithinDateRange = cpar3 <<= sbban.dform and cpar4 >>= sbban.dform
Если подходящего к ситуации индекса в таблице не найдется, можно ограничение сделать безындексным:

Код: Выделить всё

  bounds WithinDateRange = cpar3 <<= sbban.dform(noindex) and cpar4 >>= sbban.dform(noindex)
Виталий
Ответить