Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2009, 13:09   #1
kate158
Форумчанин
 
Регистрация: 01.08.2008
Сообщений: 383
По умолчанию вычисляемые столбцы/хранимая процедура

Привет. Мне нужен Ваш совет. В общем задача такова.

Есть таблица:
Date_____|Name___|Sum
01.05.2009|Отдел 1|100
01.05.2009|Отдел 2|200

в ктр нужно добавить поля 'Х-1' и 'Х-7', содержащие значения Sum с таким же Полем Name, только дата минус 1 день назад и минус 7 дней назад от представленной (01.05.2009). Для каждой даты в таблице существует только однo значение поля sum.

Т.Е. таблица примет вид:
Date_____|Name___|Sum_|X-1_|X-7
01.05.2009|Отдел 1|100__|50__|5
01.05.2009|Отдел 2|200__|50__|5

Текущая дата может быть изменена пользователем. Вот, думаю, что без ХП не обойтись. На входе будут Name и Data, на выходе 'X-1' 'X-7'.
Но, может можно и по-другому?

Последний раз редактировалось kate158; 22.05.2009 в 15:02.
kate158 вне форума Ответить с цитированием
Старый 22.05.2009, 13:25   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Но, может можно и по-другому?
Ну дык вычисляемым полем...
Умеешь его создавать?
Какими средствами с БД общаешься?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.05.2009, 14:15   #3
kate158
Форумчанин
 
Регистрация: 01.08.2008
Сообщений: 383
По умолчанию

query,sql server 2000
Цитата:
Сообщение от Stilet
Умеешь его создавать?
adoquery->new field->calculated
это понятно.
затем обработать событие oncalcfield. вот тока пока не догоняю что должно быть в месте
Код:
procedure TMainForm.sum_objectsCalcFields(DataSet: TDataSet);
begin
sum_objects.DataSource.DataSet.FieldByName('X-1').Value:=???
end;

Последний раз редактировалось kate158; 22.05.2009 в 16:26.
kate158 вне форума Ответить с цитированием
Старый 22.05.2009, 14:46   #4
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

если речь про данные, которые имеют на каждую пару дата-объект одну строчку и не надо ничего агрегировать, то можно воспользоваться такой фишкой
Код:
select 
  t.*,
  lag(sum, 1) over(partition by name order by name, date) f_lag_x_1,
  lag(sum, 7) over(partition by name order by name, date) f_lag_x_7
from your_table t
where name = 'Отдел 1'
но она удобна именно для запроса многих данных

если конечно в 2000м скл сервере есть такая фишка
либо написать простенькую функу (все равно она быстрее отработает чем то же самое реализованное в коде)

Последний раз редактировалось soleil@mmc; 22.05.2009 в 15:14.
soleil@mmc вне форума Ответить с цитированием
Старый 22.05.2009, 15:04   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
kate158
Знач смотри.
В той процедуре попробуй применить метод lookup чтоб без переходов по базе найти нужное name с нужной датой, и то что оно вернет вставляй в
.Value

Если не ясно прикрепи БД, попробую написать
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.05.2009, 15:40   #6
kate158
Форумчанин
 
Регистрация: 01.08.2008
Сообщений: 383
По умолчанию

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
lag в 2000 есть, но почему то в делфи
еррор 'lag is not a recognized function name'
Цитата:
Сообщение от Stilet
базу прикрепить не могу, но тема понятна.
пробую писать хп.

Последний раз редактировалось kate158; 22.05.2009 в 15:44.
kate158 вне форума Ответить с цитированием
Старый 22.05.2009, 16:12   #7
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Сообщение от kate158 Посмотреть сообщение
lag в 2000 есть, но почему то в делфи
еррор 'lag is not a recognized function name'
а что ты делаешь в дельфи
кусок кода ведь можешь привести
soleil@mmc вне форума Ответить с цитированием
Старый 22.05.2009, 16:18   #8
kate158
Форумчанин
 
Регистрация: 01.08.2008
Сообщений: 383
По умолчанию

Код:
procedure TMainForm.sum_objectsCalcFields(DataSet: TDataSet);
begin
sum_objects.SQL.Clear;
sum_objects.SQL.Add('select date,name,sum,');
sum_objects.SQL.Add('(lag(sum, 1) over(partition by idobject order by name, date)) X-1,');
sum_objects.SQL.Add('(lag(sum, 7) over(partition by idobject order by name, date)) X-7');
sum_objects.SQL.Add('from mytable t');
sum_objects.SQL.Add('where name = ''Объект 1''');
sum_objects.Open;
end;
+ в adoquery добавлено два поля с именами X-1 и X-7'....

Последний раз редактировалось kate158; 22.05.2009 в 16:28.
kate158 вне форума Ответить с цитированием
Старый 22.05.2009, 16:49   #9
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

чота у меня подозрение, что это
Код:
X-1
и вызывает смущение при выполнении запроса (это же разность)
так что сделай лучше как у меня через подчеркивание
и эттаа... опять у тебя в условии задачи не все поля, по сравнению с тем что ты юзаешь в решении
soleil@mmc вне форума Ответить с цитированием
Старый 25.05.2009, 09:12   #10
kate158
Форумчанин
 
Регистрация: 01.08.2008
Сообщений: 383
По умолчанию

кажется до меня дошло. нет в 2000 lag.

Последний раз редактировалось kate158; 25.05.2009 в 09:55.
kate158 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вычисляемые поля Nikola БД в Delphi 4 19.11.2008 13:26
Хранимая процедура не работает! Только_Учусь SQL, базы данных 6 08.09.2008 09:22
Хранимая процедура. nimf БД в Delphi 2 22.04.2008 13:16
не работает хранимая процедура yulia БД в Delphi 11 28.05.2007 19:00
Вычисляемые поля Defort БД в Delphi 0 03.12.2006 11:18