Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с master-detail на сервере приложений [D5, IB6.x, Firebird 0.9.4]


--Reporter-- ©   (2002-01-17 13:16:00) 

Есть у меня в БД такие 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 подставлять значение ключевого поля родительской таблицы не в ключевое поле дочерней, а в поле, которое с ним связано.

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


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

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

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

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


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

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


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

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


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

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

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

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


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

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо