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