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

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

Как реализовать на уровне SQL? [D6, IB6.x]


off ©   (2003-03-20 08:20:00) 

Добрый день мастера. Ситуация такая:
На форме имеются DataSet - 2 шт., DBGrid - 2 шт. и прочие компоненты необходимые для работы с IB.
Таблица DRIVER имеет поля DriverID и FIO, таблица CARS - поля CODECAR, DriverID и CAR.
При выборе в DBGrid1 какой либо строки в DBGrid2 появляются все записи соответствующие данному DriverID. Вопрос же заключается в следующем - как реализовать, что бы при вставке нового значения в DBGrid2 полю CARS.DriverID присваивалось соответствующее значение DRIVER.DriverID?
Пока мне удалось реализовать это только на уровне приложения следующим образом:

procedure TForm1.IBDataSet2BeforePost(DataSet: TDataSet);
begin
IBDataSet2DriverID.Value := IBDataSet1DriverID.Value;
end;

А как это можно реализовать иначе? Желательно не на уровне приложения.


Жук   (2003-03-20 11:36:00) [1]

Такой флейм развели !!!
Всё это можно реализовать стандартными способами в трёх вариантах. Но, по логике, DRIVER.DriverID - это PK. Зачем его менять ?!


Alexxxxx   (2003-03-20 11:24:00) [2]


> Пока мне удалось реализовать это только на уровне приложения
> следующим образом...
>
> А как это можно реализовать иначе?

Иначе, точнее правильнее тот же код нужно поместить в обработчик события OnNewRecord.

Потом, Вы придете к тому, что нужно писать свой компонент (точнее наследник от имеющихся). И в этот компонент заложить функциональность авотоматической простановки значений в связанные поля добавляемой записи подчиненного набора данных из соответствующих полей главного.


Жук   (2003-03-20 10:48:00) [3]


> off © (20.03.03 08:20)
> при вставке нового значения в DBGrid2 полю CARS.DriverID

Это update or insert ?


zacho   (2003-03-20 10:43:00) [4]


> Roki (20.03.03 10:40)

Тогда получишь нарушение ссылочной целостности, т.е. в cars будет куча записей привязанных непонятно к чему


Roki   (2003-03-20 10:40:00) [5]

2 zacho ©
не делать связи по ключю...


Johnmen   (2003-03-20 10:37:00) [6]

>Roki (20.03.03 10:04)

Большими буквами - еще ничего, а маленькими - просто бред...:)


zacho   (2003-03-20 10:14:00) [7]


> Roki (20.03.03 10:04)

И получишь ты PK violation


Roki   (2003-03-20 10:04:00) [8]

А почему не триггер?

SET SQL DIALECT 3;
SET NAMES WIN1251;
SET TERM ^ ;

CREATE TRIGGER "ai_cars_id" FOR "cars"
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW."driverId" IS NULL) THEN
NEW."driverId" = GEN_ID("cars_id_GEN", 1);
update "driver" o
set o."driverId"=new."driverId"
END


Johnmen   (2003-03-20 09:47:00) [9]

В InsertSQL :
INSERT ... (DriverID,...) VALUES(:DriverID,...В SelectSQL :
SELECT ... WHERE (DriverID=:DriverID)
При этом детальному НД указываем DataSource на мастера...


off   (2003-03-20 09:37:00) [10]

Понял, все понял, продолжаю писать на клиенте.


zacho   (2003-03-20 09:33:00) [11]


> Жук © (20.03.03 08:34)
> Триггером

Причем здесь триггер ? Ну откуда в триггере возьмуться данные из другой таблицы ? В общем, кроме как на клиенте, это сделать нельзя.


ЮЮ   (2003-03-20 09:32:00) [12]

Триггер понятия не имеет, что у тебя выбрано в DBGrid1 :-)


off   (2003-03-20 09:27:00) [13]

Все же хотелось ыб по подробнее услышать про триггер!


ЮЮ   (2003-03-20 08:44:00) [14]

>Я еще пытался засунуть в InsertSQL
Вот туда лазить с неумелыми руками не надо, запрос как раз и будет содержать нужное значение, которое тв присваиваешь оператором
IBDataSet2DriverID.Value := IBDataSet1DriverID.Value;

Можно ещё организовать связь Master-Detail на уровне приложения, что избавит тебя от этой строчки кода. А это нужно?


ЮЮ   (2003-03-20 08:39:00) [15]

>А как это можно реализовать иначе? Желательно не на уровне приложения.

Интересно, а где ещё, если не в приложении, решать какое значение (из множества возможных) должно стоять в поле DriverID ? :-)


off   (2003-03-20 08:36:00) [16]

>Жук
А можно с примером?


Жук   (2003-03-20 08:34:00) [17]

Триггером


off   (2003-03-20 08:31:00) [18]

Я еще пытался засунуть в InsertSQL, но не знаю правильно как его(ее) - ЫЙД(SQL) грамотно написать.


Виталий Панасенко   (2003-03-20 08:27:00) [19]

Теоретически можно, но практически - сложно, т.к. в SQL нет понятия текущей записи и он (или оно ?;-)) не знает, на какой записи находится указатель. Можно это реализовать использую ХП, но, опять же, вызывать ее надо из клиента, передав в качестве параметра DriverID. Может, я конечно и ошибаюсь...


Наверх

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