Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.14;
Скачать: [xml.tar.bz2];




Вниз

Проблема с master-detail на сервере приложений 


--Reporter--   (2002-01-17 13:16) [0]

Есть у меня в БД такие 2 таблицы - Direction и Speciality, и между ними существует связь одна Direction -> много Speciality. Их структура такова (в общих чертах):

CREATE TABLE DIRECTION (
ID INTEGER NOT NULL,
DIRECTION VARCHAR(255) NOT NULL COLLATE PXW_CYRL
);
ALTER TABLE DIRECTION ADD PRIMARY KEY (ID);
CREATE TABLE SPECIALITY (
ID INTEGER NOT NULL,
DIRECTION INTEGER NOT NULL,
SPECIALITY VARCHAR(255) NOT NULL
);
ALTER TABLE SPECIALITY ADD PRIMARY KEY (ID);
ALTER TABLE SPECIALITY ADD CONSTRAINT SPECIALITY2DIRECTION FOREIGN KEY (DIRECTION) REFERENCES DIRECTION (ID) ON DELETE CASCADE ON UPDATE CASCADE;


Делаю я на сервере приложений два TIBQuery: Direction и Speciality:


Direction:
SQL = select * from direction
UpdateObject = UpDirection

где:
UpDirection - TIBUpdateSQL

UpDirection:
InsertSQL = insert into direction (ID, DIRECTION) values (:ID, :DIRECTION)

К Direction подключаю DataSource - DSDirection

DSDirection:
DataSet = Direction

Speciality - это TIBQuery

Speciality:
DataSource = DSDirection
SQL = select * from speciality where direction=:id
UpdateObject = UpSpeciality

где
UpSpeciality - TIBUpdateSQL

InsertSQL = insert into speciality
(ID, DIRECTION, SPECIALITY)
values
(:ID, :DIRECTION, :SPECIALITY)


К запросу Direction подключаю TDataSetProvider, с помощью которого и передаю клиенту эти две таблицы.

На клиенте ловлю их TClientDataSet-ом CDSDirection
И через DataSetField подключаю к нему CDSSpeciality

При перемещении по этим таблицам все нормально: становится активной какая-оибо запись в CDSDirection - появляются только те записи, в CDSSpeciality, у которых поле Direction равно полю ID выделенной записи в CDSDirection...

Проблема происходит только при применении метода INSERT в компоненте CDSSpeciality. В новой записи, которая появляется сразу послек применения данного метода заполнено не поле DIRECTION, что следовало бы ожидать, значением ID текущей записи в CDSDirection. Нет... Этим значением заполняется поле ID из CDSSpeciality, и в результате, поскольку оно является у меня первичным ключом, я не могу добавить введенное значение в базу данных...

В чем я ошибся, что я сделал не так, и как заставить Delphi подставлять значение ключевого поля родительской таблицы не в ключевое поле дочерней, а в поле, которое с ним связано.

Буду благодарен любым советам.



Romkin   (2002-01-17 14:11) [1]

1. Для MIDAS необходим IBX4.52 (www.borland.com), более старшие версии не подходят
2. Заполняй поля ручками на cdsDirection.OnNewRecord, если первичный ключ cdsSpeciality заполняется на сервере, то зачем тебе это поле на клиенте?

А так, все, что написано, практически корректно.



--Reporter--   (2002-01-17 14:38) [2]

1. У меня самый первый release Delphi 5. Я не знаю, какие там IBX...

2. Попробую... Спасибо

Но почему он все таки заполняет ID а не DIRECTION непонятно...



Romkin   (2002-01-17 14:40) [3]

Поставь Update pack & IBX 4.52 - все у Borland



--Reporter--   (2002-01-19 09:40) [4]

Поставил, не помогло...

Но проблему решил. Сделал в AddSpeciality:

Select ID as IDS, DIRECTION, SPECIALITY FROM SPECIALITY WHERE Direction=:ID


И соответственно везде поменял ID на IDS в UpSpeciality

Я так понял, он перепутывал параметры :ID...




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.14;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.013 c
6-42819           _Voodsboro_           2001-11-25 13:55  2002.02.14  
NMSMTP/ КАК написать анонимный маил


4-42899           Вовка                 2001-12-16 21:37  2002.02.14  
WinAPI


3-42693           ТеньЛуны              2002-01-22 10:57  2002.02.14  
dbExpress - поможите люди добрые!


1-42811           Эндрю2                2002-01-30 21:43  2002.02.14  
Определение цвета в любой части экрана мышкой


14-42831          lel                   2001-12-24 12:48  2002.02.14  
Где в Москве выпить?