Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.064 c
15-1184735259
Notebook
2007-07-18 09:07
2007.08.19
Как перезагрузить ноутбук?


3-1178188976
zdm
2007-05-03 14:42
2007.08.19
Insert


9-1158607607
Nic
2006-09-18 23:26
2007.08.19
Разработка GUI


15-1184888238
Чаво
2007-07-20 03:37
2007.08.19
Как принудительно обновить курсор?


15-1184915044
Nic
2007-07-20 11:04
2007.08.19
Paradox : нужно ли ставить на компьютер BDE?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский