![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Добавление записей. [D7, IB6.x]
Sapos © (2007-05-04 14:21:00)День добрый!
Подскажите, пожалуйста, что может быть не так.
Есть база данных из 2-ух таблиц связанных между собой.
Добавляю запись в первую таблицу, сохраняю, затем сразу же додбавляю запись во 2-ую таблицу в сопоставление первой и у меня появляется ошибка: Form1.Dataset1.InsertQuery:
violation oа FOREGN KEY constraint. Если сделать Reconnect к базе, то тогда все нормально - есть возможность в сопоставление внесенной записи в первую таблицу добачить запись во вторую.
Использую набор компонентов FIBPlus
Johnmen (2007-05-05 13:13:00) [1]
> Пока нашел выход: делаю реконнект к базе после вставки записи
> в Мастер таблицу...
Самое бредовое "решение" из всех возможных.
Срочно читать теорию! Потом программировать...
Desdechado (2007-05-04 18:49:00) [2]> Таблица Детэйл берет значение уже из мастер таблицы с помощью префикса MAS_.
Чего-чего? Как таблица может что-то брать, да еще и с помощью какого-то префикса? Что, если я назову поле "TUDIT_EGO_V_KACHEL", что у меня мастер-детальной связки не получится?
Ты бы почитал теорию, что ли. FK означает всего лишь контроль целостности данных, проверку наличия вставляемого в детальную таблицу значения в мастер-таблице. Но FK не вставляет ничего самостоятельно, потому как ни сервер, ни FK не имеет ни малейшего представления, какое из сотен тысяч первичных ключей в мастер-таблице нужно использовать для твоего нового детального запроса.
Sapos (2007-05-04 18:21:00) [3]Пока нашел выход: делаю реконнект к базе после вставки записи в Мастер таблицу... Неужели по-другому никак!?((((
Sapos (2007-05-04 17:58:00) [4]
> Кто сказал, что триггер что то знает о твоих параметрах
> и пытается их заполнять ?
О каком тригере ты говоришЬ? В мастер таблицу значение этого триггера уже попало и сохранилось. Таблица Детэйл берет значение уже из мастер таблицы с помощью префикса MAS_.
Я склоняюсь к тому, что у меня не завершается транзакция, но как ее завершить используя FIBPlus я никак не пойму...
ANB (2007-05-04 17:51:00) [5]
> :MAS_NE_ID, - берем из мастер таблицы
Кто сказал, что триггер что то знает о твоих параметрах и пытается их заполнять ?
Посмотри отладчиком, что конретно идет на запись в детал-табличку.
Скорее всего, твоя конструкция с триггером неработоспособна. Нужно дергать генератор не из триггера а из делфового клиента. До вставки в мастер-таблицу.
Sapos (2007-05-04 17:42:00) [6]В мастер и детэйл таблицах это поле называется одинаково.
Sapos (2007-05-04 17:41:00) [7]Вот он:
VALUES(
:MAS_NE_ID,- берем из мастер таблицы
:ALARM_ID,
:ALARMTEXT,
:DESCRIPTION,
:REQACT
)
Val (2007-05-04 17:36:00) [8]>говорит о том
судя по возникшему топику - не говорит.
Desdechado (2007-05-04 17:35:00) [9]> я беру значение из мастер таблицы
Это слова. Где код?
Sapos (2007-05-04 17:34:00) [10]
> Каким боком? Кода не видно
Не понял... Не видно что?
MAS_- говорит о том, что я беру значение из мастер таблицы. В Мастер таблице оно уже есть.
Desdechado (2007-05-04 17:30:00) [11]> берем из мастер таблицы
Каким боком? Кода не видно.
Sapos (2007-05-04 17:17:00) [12]
> Это здорово, вот только твоя программа об этом триггере
> знает? Результат присвоения триггером знаяения полю она
> достает, или ты надеешься, что само подставится?
По моему достает:
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:08:00) [13]> перед вставкой (Before Insert) работает триггер:
Это здорово, вот только твоя программа об этом триггере знает? Результат присвоения триггером знаяения полю она достает, или ты надеешься, что само подставится?
Sapos (2007-05-04 16:59:00) [14]
> Хотелось бы посмотреть на конструкцию этого автомата. 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 16:54:00) [15]> Или FK прямо на лету сделали.
Здесь имелось в виду не значение поля, а само ограничение.
Метаданные кэшируются при подключении, поэтому если делать винегрет из команд DDL и DML, то проблемы обеспечены.
Sergey13 (2007-05-04 16:47:00) [16]> [6] Sapos © (04.05.07 16:34)
> вставляется во вторую атоматом
Хотелось бы посмотреть на конструкцию этого автомата. 8-)
Проверь перед записью что ты туда (в поле связи) реальнопишешь. Потом проверь что пишется после рестарта проги.
Обычно при вставке в М-Д связанные таблицы получают новое значение ключа ПЕРЕД вставкой.
Sapos (2007-05-04 16:34:00) [17]
> Или FK прямо на лету сделали.
Да, сделан на лету: в первой таблице он генерится с помощью GEN_ID после чего он вставляется во вторую атоматом (из первой).
Подскажите способы решения?
Sapos (2007-05-04 15:47:00) [18]
> А что ты пишешь в поле связи второй таблицы?
значение я беру из первой таблицы и пишу его во вторую.
Sapos (2007-05-04 15:46:00) [19]
> Скорее всего наборы данных работают в разных коннектах (сессиях).
> А добавление записи в родительскую таблицу незакоммичено.
>
Вообще должно быть закоммичено, использую сво-во AutoCommit в компоненте Transaction библиотеки FIBPlus.
Desdechado (2007-05-04 15:26:00) [20]> в разных коннектах (сессиях)
Или транзакциях.
Или FK прямо на лету сделали.