Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.19;
Скачать: CL | DM;

Вниз

Добавление записей.   Найти похожие ветки 

 
Sapos ©   (2007-05-04 14:21) [0]

День добрый!

Подскажите, пожалуйста, что может быть не так.

Есть база данных из 2-ух таблиц связанных между собой.
Добавляю запись в первую таблицу, сохраняю, затем сразу же додбавляю запись во 2-ую таблицу в сопоставление первой и у меня появляется ошибка: Form1.Dataset1.InsertQuery:
violation oа FOREGN KEY constraint. Если сделать Reconnect к базе, то тогда все нормально - есть возможность в сопоставление внесенной записи в первую таблицу добачить запись во вторую.
Использую набор компонентов FIBPlus


 
ANB ©   (2007-05-04 14:48) [1]

Скорее всего наборы данных работают в разных коннектах (сессиях). А добавление записи в родительскую таблицу незакоммичено.


 
Sergey13 ©   (2007-05-04 15:00) [2]

> [0] Sapos ©   (04.05.07 14:21)

А что ты пишешь в поле связи второй таблицы?


 
Desdechado ©   (2007-05-04 15:26) [3]

>  в разных коннектах (сессиях)
Или транзакциях.
Или FK прямо на лету сделали.


 
Sapos ©   (2007-05-04 15:46) [4]


> Скорее всего наборы данных работают в разных коннектах (сессиях).
>  А добавление записи в родительскую таблицу незакоммичено.
>

Вообще должно быть закоммичено, использую сво-во AutoCommit в компоненте Transaction библиотеки FIBPlus.


 
Sapos ©   (2007-05-04 15:47) [5]


> А что ты пишешь в поле связи второй таблицы?

значение я беру из первой таблицы и пишу его во вторую.


 
Sapos ©   (2007-05-04 16:34) [6]


> Или FK прямо на лету сделали.

Да, сделан на лету: в первой таблице он генерится с помощью GEN_ID после чего он вставляется во вторую атоматом (из первой).
Подскажите способы решения?


 
Sergey13 ©   (2007-05-04 16:47) [7]

> [6] Sapos ©   (04.05.07 16:34)
> вставляется во вторую атоматом

Хотелось бы посмотреть на конструкцию этого автомата. 8-)
Проверь перед записью что ты туда (в поле связи) реально пишешь. Потом проверь что пишется после рестарта проги.

Обычно при вставке в М-Д связанные таблицы получают новое значение ключа ПЕРЕД вставкой.


 
Desdechado ©   (2007-05-04 16:54) [8]

> Или FK прямо на лету сделали.
Здесь имелось в виду не значение поля, а само ограничение.
Метаданные кэшируются при подключении, поэтому если делать винегрет из команд DDL и DML, то проблемы обеспечены.


 
Sapos ©   (2007-05-04 16:59) [9]


> Хотелось бы посмотреть на конструкцию этого автомата. 8-
> )
> Проверь перед записью что ты туда (в поле связи) реально
> пишешь. Потом проверь что пишется после рестарта проги.
>
> Обычно при вставке в М-Д связанные таблицы получают новое
> значение ключа ПЕРЕД вставкой.


INSERT INTO NE(
   NE_ID,
   NENAME
   
)
VALUES(
   :NE_ID,
   :NENAME
   
)
перед вставкой (Before Insert) работает триггер:
NEW.NE_ID=GEN_ID(GEN_NE,1);

Если у меня не завершается транзакция, я не пойму почему!? FIBDataSet позволяет использовать AutoCommit...


 
Desdechado ©   (2007-05-04 17:08) [10]

> перед вставкой (Before Insert) работает триггер:
Это здорово, вот только твоя программа об этом триггере знает? Результат присвоения триггером знаяения полю она достает, или ты надеешься, что само подставится?


 
Sapos ©   (2007-05-04 17:17) [11]


> Это здорово, вот только твоя программа об этом триггере
> знает? Результат присвоения триггером знаяения полю она
> достает, или ты надеешься, что само подставится?

По моему достает:

INSERT INTO ALARMS(
   NE_ID,
   ALARM_ID,
   ALARMTEXT,
   DESCRIPTION,
   REQACT

)
VALUES(
   :MAS_NE_ID, - берем из мастер таблицы
   :ALARM_ID,
   :ALARMTEXT,
   :DESCRIPTION,
   :REQACT
)

Я посмотрел, после поста новой записи в Мастер таблицу поле NE_ID принимает новое значение.


 
Desdechado ©   (2007-05-04 17:30) [12]

>  берем из мастер таблицы
Каким боком? Кода не видно.


 
Sapos ©   (2007-05-04 17:34) [13]


> Каким боком? Кода не видно

Не понял... Не видно что?
MAS_ - говорит о том, что я беру значение из мастер таблицы. В Мастер таблице оно уже есть.


 
Desdechado ©   (2007-05-04 17:35) [14]

>  я беру значение из мастер таблицы
Это слова. Где код?


 
Val ©   (2007-05-04 17:36) [15]

>говорит о том
судя по возникшему топику - не говорит.


 
Sapos ©   (2007-05-04 17:41) [16]

Вот он:

VALUES(
  :MAS_NE_ID, - берем из мастер таблицы
  :ALARM_ID,
  :ALARMTEXT,
  :DESCRIPTION,
  :REQACT
)


 
Sapos ©   (2007-05-04 17:42) [17]

В мастер и детэйл таблицах это поле называется одинаково.


 
ANB ©   (2007-05-04 17:51) [18]


>  :MAS_NE_ID, - берем из мастер таблицы

Кто сказал, что триггер что то знает о твоих параметрах и пытается их заполнять ?
Посмотри отладчиком, что конретно идет на запись в детал-табличку.
Скорее всего, твоя конструкция с триггером неработоспособна. Нужно дергать генератор не из триггера а из делфового клиента. До вставки в мастер-таблицу.


 
Sapos ©   (2007-05-04 17:58) [19]


> Кто сказал, что триггер что то знает о твоих параметрах
> и пытается их заполнять ?


О каком тригере ты говоришЬ? В мастер таблицу значение этого триггера уже попало и сохранилось. Таблица Детэйл берет значение уже из мастер таблицы с помощью префикса MAS_.
Я склоняюсь к тому, что у меня не завершается транзакция, но как ее завершить используя FIBPlus я никак не пойму...


 
Sapos ©   (2007-05-04 18:21) [20]

Пока нашел выход: делаю реконнект к базе после вставки записи в Мастер таблицу... Неужели по-другому никак!?((((


 
Desdechado ©   (2007-05-04 18:49) [21]

> Таблица Детэйл берет значение уже из мастер таблицы с помощью  префикса MAS_.
Чего-чего? Как таблица может что-то брать, да еще и с помощью какого-то префикса? Что, если я назову поле "TUDIT_EGO_V_KACHEL", что у меня мастер-детальной связки не получится?

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


 
Johnmen ©   (2007-05-05 13:13) [22]


> Пока нашел выход: делаю реконнект к базе после вставки записи
> в Мастер таблицу...

Самое бредовое "решение" из всех возможных.
Срочно читать теорию! Потом программировать...



Страницы: 1 вся ветка

Текущий архив: 2007.08.19;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.023 c
2-1185350713
Боб
2007-07-25 12:05
2007.08.19
Компоненты из пакета deSound от www.droopyeyes.com


1-1181207576
StriderMan
2007-06-07 13:12
2007.08.19
Как отключить вызов по F12 CPU Window?


2-1185113973
Гость_1
2007-07-22 18:19
2007.08.19
проблема с числами или у меня :)


2-1185130508
copron
2007-07-22 22:55
2007.08.19
GetNextItem


2-1185351496
CODeRUS
2007-07-25 12:18
2007.08.19
Перехват нажатий на клавиатуру