Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.02.14;
Скачать: CL | DM;

Вниз

Проблема с 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.013 c
14-42847
Snake2000
2001-12-24 12:22
2002.02.14
... а при нем задача...


3-42641
wicked
2002-01-18 14:08
2002.02.14
тип TIMESTAMP


3-42653
aledo
2002-01-20 16:11
2002.02.14
Удаление нескольких записей


3-42707
Diver
2002-01-18 12:37
2002.02.14
блокировка таблиц Paradox


3-42689
ТеньЛуны
2002-01-18 11:40
2002.02.14
Что такое DataCube?