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

Вниз

Как реализовать на уровне SQL?   Найти похожие ветки 

 
off ©   (2003-03-20 08:20) [0]

Добрый день мастера. Ситуация такая:
На форме имеются 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 08:27) [1]

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


 
off ©   (2003-03-20 08:31) [2]

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


 
Жук ©   (2003-03-20 08:34) [3]

Триггером


 
off ©   (2003-03-20 08:36) [4]

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


 
ЮЮ ©   (2003-03-20 08:39) [5]

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

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


 
ЮЮ ©   (2003-03-20 08:44) [6]

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

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


 
off ©   (2003-03-20 09:27) [7]

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


 
ЮЮ ©   (2003-03-20 09:32) [8]

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


 
zacho ©   (2003-03-20 09:33) [9]


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

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


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

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


 
Johnmen ©   (2003-03-20 09:47) [11]

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


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

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

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



 
zacho ©   (2003-03-20 10:14) [13]


> Roki (20.03.03 10:04)

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



 
Johnmen ©   (2003-03-20 10:37) [14]

>Roki (20.03.03 10:04)

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


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

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


 
zacho ©   (2003-03-20 10:43) [16]


> Roki (20.03.03 10:40)

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


 
Жук ©   (2003-03-20 10:48) [17]


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

Это update or insert ?


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


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

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

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


 
Жук ©   (2003-03-20 11:36) [19]

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



Страницы: 1 вся ветка

Текущий архив: 2003.04.07;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.012 c
6-19731
Stan
2003-02-08 13:19
2003.04.07
Соединение по номеру телефона


14-19783
AVR
2003-03-18 10:07
2003.04.07
Delphi -> Kylix ?


1-19587
msoftware
2003-03-27 03:35
2003.04.07
FileStream не сохраняет обновленный файл


14-19807
бомонд
2003-03-19 09:03
2003.04.07
эссе


1-19559
Артём
2003-03-27 07:19
2003.04.07
Работа с приложением