Модераторы: Akella
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вычисляемый столбец 
V
    Опции темы
TaNK
Дата 25.11.2010, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 669
Регистрация: 29.10.2006
Где: Краснодар

Репутация: нет
Всего: 1



Всм привет, прочитав тему http://forum.vingrad.ru/topic-208545.html решение все таки не такое как мне нужно.
Нужно вот что

Код

Create Table Discount
(
  discount_id   int not null
 ,discount_name varchar(50)
 ,percents      numeric(2,1)
);

Create table refuelling_auto
(
  refuel_id    int not null 
 ,beg_run      int
 ,end_run      int
 ,volume       numeric(3,2)
 ,run_diff     computed by (end_run - beg_run)
 ,averexp      computed by (volume*100/run_diff) --????
 ,date_refuel  timestamp
 ,tarif        numeric(5,2)
 ,total        computed by (tarif*volume) 
 ,discount_id  int not null -- FK 
);


так вот при вставке нужно поле total из refuelling_auto умножить на percents из таблицы Discount 
discount_id сделал как FK 
как написать триггер (или есть другой вариант) чтобы посчиталось total 


--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
Akina
Дата 25.11.2010, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 3
Всего: 454



Код

Create Table Discount
(
  discount_id   int not null
 ,discount_name varchar(50)
 ,percents      numeric(2,1)
);

Create table refuelling_auto
(
  refuel_id    int not null 
 ,beg_run      int
 ,end_run      int
 ,volume       numeric(3,2)
 ,date_refuel  timestamp
 ,tarif        numeric(5,2)
 ,discount_id  int not null
);

Create view v_refuelling_auto as
select
  refuel_id
 ,beg_run
 ,end_run
 ,volume
 ,(end_run - beg_run) as run_diff
 ,(volume*100/(end_run - beg_run)) as averexp
 ,date_refuel
 ,tarif
 ,(tarif*volume) as total
 ,d.discount_id
from 
  refuelling_auto as r
 ,Discount as d
where d.discount_id=r.discount_id;







--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
TaNK
Дата 25.11.2010, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 669
Регистрация: 29.10.2006
Где: Краснодар

Репутация: нет
Всего: 1



Akina  - ну если другого способа нет, будем вытаскивать данные из 2 таблиц
Спасибо.


--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
Akina
Дата 25.11.2010, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 3
Всего: 454



Цитата(TaNK @  25.11.2010,  17:40 Найти цитируемый пост)
ну если другого способа нет

Может, и есть. Не знаю, с FB/IB не работаю, написано из общих соображений.

Цитата(TaNK @  25.11.2010,  17:40 Найти цитируемый пост)
будем вытаскивать данные из 2 таблиц

Зачем? теперь ты просто из приложения обращаешься к v_refuelling_auto, как будто это статическая таблица.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
TaNK
Дата 25.11.2010, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 669
Регистрация: 29.10.2006
Где: Краснодар

Репутация: нет
Всего: 1



Akina  - я образно написал....можно и вьюху использовать и хранимку да хоть функцию...(если она есть в FIB)



--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
Gluttton
Дата 25.11.2010, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 7
Всего: 54



Akina, а зачем связывание двух таблиц, если используются поля только одного?

TaNK, так все таки, что требуется?
Цитата(TaNK @  25.11.2010,  15:23 Найти цитируемый пост)
так вот при вставке нужно поле total из refuelling_auto умножить на percents из таблицы Discount 


При выборке получать рассчитанные данные?
Или же при вставке изменять вставляемое значение?

Если при выборе, то решением может быть представление, а если при вставке, то триггер.
Я так понимаю, что требуется второе.


--------------------
Слава Україні!
PM MAIL   Вверх
Akina
Дата 25.11.2010, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 3
Всего: 454



Gluttton, а какая разница что ЛЕЖИТ в таблице? и в том, и в другом случае при ВЫБОРКЕ он получит расчётное значение - независимо от того, исправленное или нет лежит в таблице.

Цитата(Gluttton @  25.11.2010,  19:14 Найти цитируемый пост)
зачем связывание двух таблиц, если используются поля только одного?

Ну это не менее образно, чем у ТС... на самом деле это подведение к мысли, что там потребуется right join, чтобы не терять записи из discount, для которых пока нет записей в refuelling_auto 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Gluttton
Дата 25.11.2010, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 7
Всего: 54



Akina, 
Я думаю, что выбор может быть основан на анализе соотношения операций выборки к операциям изменения. А так же от того, в каком виде (модифицированном или не модифицированном) используются ещё данные.

Мне кажется, что если очень часто изменяется значение и крайне редко производится его выборка, а так же не модифицированное значение используется в других объектах БД, то лучше использовать представление. А в том случае, если данные изменяются крайне редко, но при этом очень часто осуществляется выборка и не модифицированные данные не используются другими объектами БД (или же более того используются модифицированные), то есть смысл использовать триггер.

Чистая теория... Могу заблуждаться...


--------------------
Слава Україні!
PM MAIL   Вверх
Akina
Дата 25.11.2010, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 3
Всего: 454



Да всё верно. Путей решения несколько, выбор оптимального - за ТС.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.0630 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.