Форум: "Базы";
Текущий архив: 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...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.02.14;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c