Запросы, планы, оптимизация запросов, ...
Модераторы: kdv, CyberMax
-
fmcoder
- Сообщения: 46
- Зарегистрирован: 24 сен 2007, 20:57
Сообщение
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 действительно помогли