Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Релизация связи один ко многим


Автор: NonStopAaa 17.6.2009, 18:28
Значит маленькое описание: не ругайтесь на непродуманную реализацию, ибо курсовой проект и требования не мои)) тема инф. система футбольного сезона, так уж получилось  smile
   Изначально БД исп. технологию ADO, состоящая из 5-6 таблиц с разными связями (1-1, 1-*, *-* и т.д.). Интересуют собственно ттолько 3 таблицы назовем их Clubs, Clubs_Matches и Matches. Соответственно каждому клубу из табл Clubs соответствуют к-либо записи из таблицы Matches, что фиксируется связующей Clubs_Matches (состоит из трех полей id_club, id_matcha, id_sv).  
 В Clubs_Matches они добавляются методом AfterPost у набора данных Matches, то есть если мы добавляем матч, то в связующую добавляется две связи, т.к. два клуба.
  
 Собственно проблема: добавляется все отлично, но при редактировании записи в Matches (меняем клуб: там поле выбора) в связующей таблице запись не редактируется! необходимо чтобы она сама автоматически исправляла id_club на тот что мы поменяли.

 Было два варианта: 1 - добавить в таблицу Матчи два поля которые будут отвечать за айди связи, потом локейтом перемещаться на них и перезаписывать, но получается что в методе AfterPost табл Matches нам необходимо сохранить эту же таблицу после добавление айди связи => бесконечный цикл)) уже пробовала)
   
Код

procedure TDM.MatchesBeforePost(DataSet: TDataSet);
begin
 If DM.Matches.State=dsInsert then
  Dobavit_v_Clubs_Matches:=true;
  end;

procedure TDM.MatchesAfterPost(DataSet: TDataSet);
begin
       with DM do begin
  if Dobavit_v_Clubs_Matches=true then begin
     Clubs_Matches.Append;
     Clubs_Matches.FieldByName('id_club').AsVariant:=Matches.FieldByName('id_club1').AsVariant;
     Clubs_Matches.FieldByName('id_matcha').AsVariant:=Matches.FieldByName('id_matcha').AsVariant;
     Clubs_Matches.Post;
     Matches.Append;
     Matches.FieldByName('id_sv1').AsVariant:=Clubs_Matches.FieldByName('id_sv').AsVariant;
     Matches.Post;
     Clubs_Matches.Append;
     Clubs_Matches.FieldByName('id_club').AsVariant:=Matches.FieldByName('id_club2').AsVariant;
     Clubs_Matches.FieldByName('id_matcha').AsVariant:=Matches.FieldByName('id_matcha').AsVariant;
     Clubs_Matches.Post;
     Matches.Append;
     Matches.FieldByName('id_sv2').AsVariant:=Clubs_Matches.FieldByName('id_sv').AsVariant;
     Matches.Post;
     end
  else begin

  Clubs_Matches.Locate('id_sv',Matches.FieldByName('id_sv1').AsVariant,[]);
  Clubs_Matches.FieldByName('id_club').AsVariant:=Matches.FieldByName('id_club1').AsVariant;
  Clubs_Matches.Locate('id_sv',Matches.FieldByName('id_sv2').AsVariant,[]);
  Clubs_Matches.FieldByName('id_club').AsVariant:=Matches.FieldByName('id_club2').AsVariant;
  Clubs_Matches.Post;
          Dobavit_v_Clubs_Matches:=false;
  end;
end; end;

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

Каким еще образоам можно заставить связующую таблицу автоматически редактироваться при изменении таблицы Матчи????
Помогите плз, завтра курсач сдавать :(

Автор: Keeper89 17.6.2009, 19:24
Вообще ключевые поля не должны редактироваться. Если же это приходится делать, надо пройтись по всем таблицам и заменить старый индекс на новый.

Автор: NonStopAaa 17.6.2009, 19:29
хм. редактируется не ключевое поле. редактируется содержимое связи. то есть а таблице Клубы_Матчи заменяется айди клуба на другой айди, а ключевое поле остается тем же. так вот этого сделать не получается.

Автор: Keeper89 17.6.2009, 19:37
Стоп, глюкануло. Связи точно проставлены в таблицах?

Добавлено через 5 минут и 59 секунд
Прикрепи саму БД на всякий случай, если она в Эксесе.

Автор: NonStopAaa 17.6.2009, 20:05
бд прикреплена через адо, сделана в аксесе. - связи все там проставлены, собственно бд генерировалась из ер-вина, так что связи там стопроцентно правильные.. собственно проблема в том что запись просто сохраняется в таблице связующей, что позволяет сделать динамический запрос для отображения данных. но не меняется запись при изменении данных которые она должна связывать. 

Автор: Keeper89 17.6.2009, 20:15
Цитата(NonStopAaa @  17.6.2009,  21:05 Найти цитируемый пост)
собственно проблема в том что запись просто сохраняется в таблице связующей, что позволяет сделать динамический запрос для отображения данных. но не меняется запись при изменении данных которые она должна связывать.  

что значит ПРОСТО сохраняется? ErWin Erwin'ом, но еще раз советую проверить схему данных Access, только что проверил у себя БД - есть связи, все меняется.

Автор: NonStopAaa 17.6.2009, 20:28
проверила. связи стоят, целостность и каскадное обновление стоит.  smile 

Автор: Keeper89 17.6.2009, 20:53
Прикрепи базу+проект здесь к посту, я посмотрю.

Автор: NonStopAaa 17.6.2009, 21:06
он весит пять метров(( плюс для отображения таблиц нужен QuantumGrid. Если б меньше весил, я бы скинула smile

Автор: Keeper89 17.6.2009, 21:09
Вообще странно...
попробуй так: при обновлении поля в главной таблице, меняй его во всех сводных. Простым запросом UPDATE можно.

Автор: flomaster 18.6.2009, 18:12
Вы явно накосячили со структурой базы и со связями.
Даже хорошим инструментом можно по пальцу садануть.
Архиватором пользоватья умеете?
Ваш 5Мб-й мдб-шник в архиве превратится в 20кб. Сожмите и выкладывайте. 
С телепатами сегодня туго.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)