Страница 1 из 1

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

Добавлено: 20 мар 2006, 16:46
Великий Пользователь
Подскажите название стандартного исключения для Атлантиса вер. 3.03.22, когда накладывается ограничение, но ни одной записи удовлетворяющей этому условию не находится. Исключение ExDbNotFound = "Запись не найдена" не обрабатывается.

Добавлено: 20 мар 2006, 17:07
Goblin
Отлавливать через IsValidAll(#Табличка) в cmSetDefault не пробовали ?
Записей нет по ограничению , система в любом случае в буфере создает новую, заполняя ее через вызов cmSetDefault - вот в нем и проверить стОит, а не единственная запись это у нас в текущий момент (просто IsValid при наличии записи в буфере даст True, чего нам не надо)

Добавлено: 20 мар 2006, 17:46
Великий Пользователь
Попробовал. Пахнет боольшим извращением. :? Обхожу пока c помощью GetFirst. Но хотелось бы сделать более грамотно и культурно, т.е. через обработку исключений.

Добавлено: 20 мар 2006, 18:47
WiRuc
Я сильно удивлюсь, если есть такое исключение. Надо понимать, что исключение - это нештатная ситуация, а отсутствие записей по фильтру является вполне нормальным явлением.

Добавлено: 21 мар 2006, 08:16
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.хх

Добавлено: 21 мар 2006, 10:24
Великий Пользователь
В том то и дело после вызова PushCondition(tcByCDForm), где Condition ByCDForm = (sbban.dform >= cpar3 and sbban.dform <= cpar4),
именно за тот период когда не было ни одного реестра, возникает "страшное для пользователя" сообщение об ошибке : 'Запись не найдена. Код ошибки: 4. Таблица №16060'. Информативности для пользователя в этом случае ноль по модулю, а страха.... А всего лишь надо сообщить ему (юзверю), что он дескать не прав, что за такой то период нет ни одно записи, и тут же снять фильтр. Вот такой код оказался рабочим:
-------
PushCondition(tcByCDForm);
if (GetFirst sbban <> tsOk)
{
PopCondition(tcByCDForm);
Message(' Юзер ты не прав! Фильтр будет снят!',Warning);
}
-------

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

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

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

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

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

  bounds WithinDateRange = cpar3 <<= sbban.dform(noindex) and cpar4 >>= sbban.dform(noindex)