![]() |
|
|
![]()
|
|
| Gamber |
|
||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 24.3.2008 Репутация: нет Всего: нет |
Всем доброго времени суток...
Возникла такая вот проблема, начну с самого начала... При удалении записей в справочных таблицах, необходимо было организовать проверку на то, не используются ли удаляемые записи в основной таблице и в случае если это так, вывести сообщение и прервать удаление... Первый вариант, который я реализовал - это SELECT запрос осуществляющий поиск в основной таблице по ключевому полю той записи, которая предполагается к удалению в справочной, т.е вот так:
Но все у кого не спрашивал, говорили что такое решение кривое по определению и необходимо решать задачу через триггеры... Второй вариант, выглядит так: Триггер:
Исключение:
Ну и сам, код (тут не суть важно, с перехватом или нет, результат один):
Ну и собственно, сам вопрос - проблема которая возникает при реализации второго варианта: При попытке удалить запись, имеющую связанные, из справочника (т.е. в том случае когда удаление записи прерывается exception), SumList используемый в гриде справочника (EhLib) для подсчета количества записей, все-равно изменяет свое значение (становится на единицу меньше, хотя ни из грида, ни из таблицы запись не удаляется)... Пробовал сделать RecalcAll на SumList не помогает, значение не обновляется, все приходит в норму только при повторном запуске приложения... Подскажите пожалуйста как можно решить эту проблему, придется отказаться от SumList и сделать внешний запрос, или все-таки можно обойтись и без этого? Это сообщение отредактировал(а) Gamber - 7.11.2008, 09:41 |
||||||||
|
|||||||||
| Deniz |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 8 Всего: 44 |
это тоже кривое решение. Только через внешние ключи, они работают вне контекста транзакции. Через какие компоненты работаешь? В IBX refresh обновляет только текущую запись, надо делать close open. Вероятно поможет RollbackRetaining -------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
|||
|
||||
| Gamber |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 24.3.2008 Репутация: нет Всего: нет |
Для взаимодействия с таблицами использую набор gbDataSets (в составе два компонента: gbTable и gbDataSet, использую второй)... Про Refresh, как я понял речь шла о gbAuthors.Refresh в обоих вариантах, учту, заменю на Close/Open... Теперь собственно по реализации варианта отличного от первого... Внешние ключи присутствуют, но фактически я перекрываю их работу триггером, т.е делаю то тоже самое, но только криво... Выходит, что необходимо сделать? 1. Убрал триггеры 2. На удаление поставил:
Это сообщение отредактировал(а) Gamber - 7.11.2008, 21:51 |
|||
|
||||
| Deniz |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 8 Всего: 44 |
После Delete Refresh не нужен.
-------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
|||
|
||||
| Gamber |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 24.3.2008 Репутация: нет Всего: нет |
Исправил... Спасибо за помощь! |
|||
|
||||
![]()
|
| Правила форума "Delphi: Базы данных и репортинг" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |