Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [InterBase] Удаление записи, Проблема с SumList в DBGridEh 
V
    Опции темы
Gamber
Дата 7.11.2008, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 24.3.2008

Репутация: нет
Всего: нет



Всем доброго времени суток...
Возникла такая вот проблема, начну с самого начала...

При удалении записей в справочных таблицах, необходимо было организовать проверку на то, не используются ли удаляемые записи в основной таблице и в случае если это так, вывести сообщение и прервать удаление...

Первый вариант, который я реализовал - это SELECT запрос осуществляющий поиск в основной таблице по ключевому полю той записи, которая предполагается к удалению в справочной, т.е вот так:

Код

  IBQTest.SQL.Text:='SELECT * FROM books WHERE kod_avt=:kod_avt';
  IBQTest.ParamByName('kod_avt').AsInteger := gbAuthors.FieldByName('kod_avt').AsInteger;
  IBQTest.Prepare;
  IBQTest.Open;
  if IBQTest.IsEmpty then
  begin
  gbAuthors.Delete;
  gbAuthors.Refresh;
  end
  else
  ShowMessage('Запись используется в основной базе. Удаление невозможно!');


Но все у кого не спрашивал, говорили что такое решение кривое по определению и необходимо решать задачу через триггеры...

Второй вариант, выглядит так:

Триггер:
Код

CREATE TRIGGER FIRMS_BD FOR FIRMS
ACTIVE BEFORE DELETE POSITION 0
AS
begin
    if (exists (select * FROM BOOKS WHERE books.kod_firm=old.kod_firm)) then exception NO_DEL;
end


Исключение:
Код

CREATE EXCEPTION NO_DEL 'Удаление невозможно';


Ну и сам, код (тут не суть важно, с перехватом или нет, результат один):
Код

  gbAuthors.Delete;
  gbAuthors.Refresh;


Ну и собственно, сам вопрос - проблема которая возникает при реализации второго варианта:

При попытке удалить запись, имеющую связанные, из справочника (т.е. в том случае когда удаление записи прерывается exception), SumList используемый в гриде справочника (EhLib) для подсчета количества записей, все-равно изменяет свое значение (становится на единицу меньше, хотя ни из грида, ни из таблицы запись не удаляется)...

Пробовал сделать RecalcAll на SumList не помогает, значение не обновляется, все приходит в норму только при повторном запуске приложения...

Подскажите пожалуйста как можно решить эту проблему, придется отказаться от SumList и сделать внешний запрос, или все-таки можно обойтись и без этого?

Это сообщение отредактировал(а) Gamber - 7.11.2008, 09:41
PM MAIL   Вверх
Deniz
Дата 7.11.2008, 12:23 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Цитата(Gamber @  7.11.2008,  12:38 Найти цитируемый пост)
Но все у кого не спрашивал, говорили что такое решение кривое по определению...
правильно говорили
Цитата(Gamber @  7.11.2008,  12:38 Найти цитируемый пост)
... и необходимо решать задачу через триггеры...
это тоже кривое решение.
Только через внешние ключи, они работают вне контекста транзакции.
Через какие компоненты работаешь? В IBX refresh обновляет только текущую запись, надо делать close open.
Вероятно поможет RollbackRetaining


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Gamber
Дата 7.11.2008, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 24.3.2008

Репутация: нет
Всего: нет



Цитата(Deniz @ 7.11.2008,  12:23)
Цитата(Gamber @  7.11.2008,  12:38 Найти цитируемый пост)
Но все у кого не спрашивал, говорили что такое решение кривое по определению...
правильно говорили
Цитата(Gamber @  7.11.2008,  12:38 Найти цитируемый пост)
... и необходимо решать задачу через триггеры...
это тоже кривое решение.
Только через внешние ключи, они работают вне контекста транзакции.
Через какие компоненты работаешь? В IBX refresh обновляет только текущую запись, надо делать close open.
Вероятно поможет RollbackRetaining

Для взаимодействия с таблицами использую набор gbDataSets (в составе два компонента: gbTable и gbDataSet, использую второй)...

Про Refresh, как я понял речь шла о gbAuthors.Refresh в обоих вариантах, учту, заменю на Close/Open...

Теперь собственно по реализации варианта отличного от первого...
Внешние ключи присутствуют, но фактически я перекрываю их работу триггером, т.е делаю то тоже самое, но только криво...

Выходит, что необходимо сделать?

1. Убрал триггеры
2. На удаление поставил:
Код

procedure TdmBase.aDeletePublishesExecute(Sender: TObject);
var pos:integer;
begin
  try
  gbPublishes.Delete;
  gbPublishes.Refresh;
  except
     on Exception do
     begin
     pos:=fmPublishes.ehPublishes.Row;
     gbPublishes.Close;
     gbPublishes.Open;
     fmPublishes.ehPublishes.SumList.RecNo := pos;
     ShowMessage('Удаление данной записи невозможно');
     end;
  end;
end;


Это сообщение отредактировал(а) Gamber - 7.11.2008, 21:51
PM MAIL   Вверх
Deniz
Дата 8.11.2008, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



После Delete Refresh не нужен.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Gamber
Дата 8.11.2008, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 24.3.2008

Репутация: нет
Всего: нет



Цитата(Deniz @ 8.11.2008,  11:01)
После Delete Refresh не нужен.

Исправил...
Спасибо за помощь!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0491 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.