Не обновляется detail таблица... И получаю FOREIGN KEY vio..

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
fmcoder
Сообщения: 46
Зарегистрирован: 24 сен 2007, 20:57

Не обновляется detail таблица... И получаю FOREIGN KEY vio..

Сообщение fmcoder » 07 дек 2007, 18:38

Что то не пойму в чем может быть дело.
Есть detail таблица, добавляем в нее новую запись:

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

DataSet.Insert;
DataSet.FieldValues[...] := ...
DataSet.FieldValues['id'] := xxx;
DataSet.Post;
Затем в master делаю

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

MDS.FieldValues['det_id'] := xxx; //тоже значение что и выше для только что добавленной записи
MDS.Post; //а здесь эксепшн
 "---------------------------
Debugger Exception Notification
---------------------------
Project BaseP.exe raised exception class EFIBInterBaseError with message 'DM.DataSet.UpdateQuery:
Violation of FOREIGN KEY constraint "".
Violation of FOREIGN KEY constraint "INTEG_15" on table "Tracks".
Foreign key reference target does not exist.
'. Process stopped. Use Step or Run to continue.
---------------------------
OK   Help   
---------------------------
"
Причем, если перезапустить программу, и назначить тот же ID, То все нормально отрабатывает. Не работает только если добаывить новую запись и использовать ее в этом же сеансе работы с программой. Может, надо как-то явно обновить таблицу, или еще что то сделать?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 07 дек 2007, 19:03

1. Не путать слова мастер и деталь.
2. Почетать што-небудь про транзакции.

fmcoder
Сообщения: 46
Зарегистрирован: 24 сен 2007, 20:57

Сообщение fmcoder » 07 дек 2007, 19:41

Да я уже читал... Создана одна транзакция и внесена в св-ва компонентов fibplus (Transaction и UpdateTransaction). У датасетов также установлено св-во AutoCommit.
Если запустить программу 2 раза, в одной из них добавить запись, в другой - ее использовать то все нормально. Если же использовать ее в той же программе где создали, то получаю ошибку.
Уже не знаю что и делать.

И насчет терминов, я это понимаю так:
Detail - это в моем случае таблица где есть поле id - primary key и описание самого объекта (еще несколько полей).
Master - таблица с кучей других полей, среди которых есть например g_id references ... - ссылка на Detail.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 08 дек 2007, 03:20

наоборот. деталь имеет ссылку на таблицу мастер.
см. www.ibase.ru/devinfo/joins.htm
заказы - мастер. клиент - деталь. клиент делает заказЫ.
заказы - мастер, товары в заказе - деталь. в заказЕ присутствуют товарЫ.
Создана одна транзакция и внесена в св-ва компонентов
см примеры по мастер-детали в примерах FIBPlus и в
www.ibase.ru/devinfo/ibx.htm

fmcoder
Сообщения: 46
Зарегистрирован: 24 сен 2007, 20:57

Сообщение fmcoder » 11 дек 2007, 03:03

Спасибо всем за ответы! Проблема решена, статьи, приведенные kdv действительно помогли :)

Ответить