Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.03.2011, 07:53   #1
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
Печаль Связи таблиц и обеспечение целостности FireBird

Здравствуйте.
У меня есть три таблички Tab1,Tab2,Tab3
у всех трех таблиц есть первичные ключи Id которые заполняются при помощи генераторов. Вопрос в следующем как обеспечить целостность данных в этих таблица то есть если данные добавляются в Tab1 то и должны добавляться в Tab2 и Tab3 если этого не происходит то транзакция не подтверждается. Я так понимаю что нужно установить отношения между таблицами и сделать внешние ключи но вот как это сделать в IBExpert? В Accese это просто. И как добавить данные в связные таблицы. Я так думаю делать это нужно одним запросом если можно пример.
Спасибо.
Lokos вне форума Ответить с цитированием
Старый 10.03.2011, 10:18   #2
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию

Сделал следующее создал 3 таблички
Tb1 поля ID, TB2_ID, TB3_ID
Tb2 поля Id, tel
Tb3 поля Id, name
Выставил в Tb1 внешние TB2_id и Tb3_Id b соответственно указал соответствующие поля id в табличках юзаю след код
Код:
pfbqry.Close;
   pfbqry.SQL.Text:='insert into Tb2 (tel,id) values(2,2)' ;
   pfbqry.ExecQuery;
   pfbqry.Transaction.Commit;
   pfbtrnsctn1.Active:=True;
    pfbqry.Close;
   pfbqry.SQL.Text:='insert into Tb3 (id,name) values(2,2)' ;
   pfbqry.ExecQuery;
   pfbqry.Transaction.Commit;
   pfbtrnsctn1.Active:=True;
    pfbqry.Close;
    pfbqry.SQL.Text:='insert into Tb1 (id,id_tb2,id_TB3) values(null,2,2)' ; ;
   pfbqry.ExecQuery;
   pfbqry.Transaction.Commit;
если первые две транзакции не выполняются 3 не выполняется так же соответственно это говорит об ошибке что какая то из транзакций не выполнилась как можно это все дело как то объединить или выполнять в одном запросе чтоб если что то не выполнилось то данные не добавлялись не в одну табличку в моем примере если выполнится одна из первых транзакций то данные запишется в табличку и произойдет ошибка
Lokos вне форума Ответить с цитированием
Старый 10.03.2011, 12:01   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,528
По умолчанию

ОДНА транзакция на все три запроса. Если во время выполнения что-то не так, то откат (rollback).

Код:
try
   pfbqry.Transaction.BegTransaction;
  pfbqry.SQL.Text:='insert into Tb2 (tel,id) values(2,2)' ;
   pfbqry.ExecQuery;
//   pfbqry.Transaction.Commit;
   pfbtrnsctn1.Active:=True;
    pfbqry.Close;
   pfbqry.SQL.Text:='insert into Tb3 (id,name) values(2,2)' ;
   pfbqry.ExecQuery;
//   pfbqry.Transaction.Commit;
   pfbtrnsctn1.Active:=True;
    pfbqry.Close;
    pfbqry.SQL.Text:='insert into Tb1 (id,id_tb2,id_TB3) values(null,2,2)' ; ;
   pfbqry.ExecQuery;
   pfbqry.Transaction.Commit;
except
   pfbqry.Transaction.rollBack;
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 10.03.2011 в 12:06.
evg_m вне форума Ответить с цитированием
Старый 10.03.2011, 12:07   #4
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию

Я правильно понимаю я могу хоть 10 запросов выполнить типо
Код:
pFIBQuery.Sql.text:='........';
pFibQuery.ExecQury;
........................................
pFIBQuery.Sql.text:='........';
pFibQuery.ExecQury;
//после чего подтвердить транзакцию и изменения вступят в силу
pFibQuery.Tranzaction.Commit;
Так?
Lokos вне форума Ответить с цитированием
Старый 10.03.2011, 12:08   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,528
По умолчанию

Цитата:
//после чего подтвердить транзакцию и изменения вступят в силу
pFibQuery.Tranzaction.Commit;
Именно так.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 11.03.2011, 02:18   #6
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию

нет такого метода
Код:
pfbqry.Transaction.BegTransaction;
Lokos вне форума Ответить с цитированием
Старый 11.03.2011, 03:08   #7
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию

Возникла следующая проблема.
Код
Код:
try
            AddNedObject_ARENDA_PARAM();
            AddObjectNed_UR_PARAM_TABLE();
            AddObjektNed_GEO_PARAM_TABLE();
            AddObjectNed_TECHNIKAL_PARAM();
            AddObjectNed_STAT_PARAM_TABLE();
            DM1.FIBT.Active:=True;
            DM1.FIBQ.Transaction.Commit;
            ShowMessage('Данные успешно добавлены!');
            OtchistkaNed();
         finally
            DM1.FIBT.Active:=True;
            DM1.FIBQ.Transaction.Rollback;
            ShowMessage('Произошла ошибка данные не добавлены!');
         end;
если в функциях возникает какая то ошибка то происходит откатка транзакции и данные в таблицы не добавляются но счетчик генераторов увеличивается(( Как это можно исправить.

если в функциях выполняется все нормально и данные добавляются то блок finally все равно выполняется и появляется сообщение о том что данные не добавлены(((
Lokos вне форума Ответить с цитированием
Старый 11.03.2011, 03:17   #8
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию

заменил finally на exept
Сообщение стало появляться только тогда когда происходит ошибка а не в любом случае. Но осталась проблема с счетчиками их индексы не откатываются как можно решить данный казус
Lokos вне форума Ответить с цитированием
Старый 11.03.2011, 08:22   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Но осталась проблема с счетчиками их индексы не откатываются как можно решить данный казус
Коллега, поверьте мне - никакой проблемы тут нет.
Счётчики можно использовать только для внутреннего употребления (например, в качестве ключей). При этом всё, что от них требуется - это уникальность в пределах таблицы. и всё.
Если же Вы привязались к этим счётчикам - то Вы сделали ошибку. меняйте свои алгоритмы (если это возможно)...

p.s. подумайте, например, а что будет с счётчиками, если пользователь добавил запись ошибочно и захочет её удалить...
Особенно, если это не крайняя запись...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бональные связи таблиц...:-(( Agapov_stas Microsoft Office Access 3 22.07.2010 08:10
Связи таблиц в ADO+Delphi? Baaandit БД в Delphi 3 20.05.2010 16:34
как указать на связи таблиц malayka БД в Delphi 4 22.04.2010 17:35
Связи таблиц Dima_mazhor Microsoft Office Access 2 23.12.2008 15:37