Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.01 c
7-19891
Stan
2003-02-11 00:33
2003.04.07
Работа с реестром


14-19785
Феликс
2003-03-19 01:04
2003.04.07
Почему?


3-19469
Alek Aaz
2003-03-19 06:38
2003.04.07
ODBC Exel драйвер


1-19625
Someone
2003-03-25 13:23
2003.04.07
Толщина линии Zoom a у TChart


1-19581
relaxoid
2003-03-28 15:08
2003.04.07
Динамическое изменение Glyph у SpeedButton





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский