![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как реализовать на уровне 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. Может, я конечно и ошибаюсь...