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

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

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.09.2009, 09:36   #1
FreshBreeze
Пользователь
 
Аватар для FreshBreeze
 
Регистрация: 04.05.2009
Сообщений: 12
По умолчанию Хранимые процедуры SQL Server

Уже писала в этот раздел с этой же проблемой. Для базы данных нужно создать хранимые процедуры. Их несколько, но мне бы хотя бы эти реализовать:
- Хранимая процедура, реализующая стирание всех записей о продажах с датой, предшествующей указанной;
- Хранимая процедура, реализующая расчет премии продавца (3% стоимости товара (товар дешевле 1000 у.е.) или 5% стоимости товара (товар дороже 1000 у.е.));
- Х.п., реализующая расчет скидки покупателю (1% за каждую 1000 у.е.).
Помогите, пожалуйста. Очень срочно... В прошлой созданной мной теме мне написали запросы, но ведь это не сама процедура. Я просто не понимаю, как написать процедуры с параметрами SQL - не мой конек
Буду очень благодарна за помощь.
FreshBreeze вне форума Ответить с цитированием
Старый 06.09.2009, 10:11   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) СУБД то какая ? MS SQL ?

2) без Ваших структур данных написать хранимые процедуры не очень получится.

3) насколько я понимаю, это учёбная задача? и сроки какие?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.09.2009, 11:09   #3
FreshBreeze
Пользователь
 
Аватар для FreshBreeze
 
Регистрация: 04.05.2009
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
1) СУБД то какая ? MS SQL ?

2) без Ваших структур данных написать хранимые процедуры не очень получится.

3) насколько я понимаю, это учёбная задача? и сроки какие?
Да, Microsoft SQL Server. Сдавать через три дня...
Вот код моей базы данных:

create table TOVAR (
tov_id varchar(4) not null,
naimen varchar(20) not null,
ed_izm varchar(20) not null,
cena_ed varchar (20) not null,
kolvo_na_sklade varchar (20) not null
);

alter table TOVAR add constraint pk1 primary key (tov_id);

Тем же образом созданы таблицы SALERS (продавцы) (saler_id, lname, fname, otchestvo, address, bday), CLIENTS (покупатели) (client_id, lname, fname, otchestvo, address, bday), SALES (продажи) (sale_id, saler_id, client_id, tov_id, kolvo_prodannogo, sale_date).

Ограничения в виде первичных и внешних ключей расставлены, создано представление, проблема осталась в хранимых процедурах и триггере, связанном с таблицей продаж. (С таблицей продаж должен быть связан триггер, запрещающий добавление записи о продаже с прошедшей датой).
FreshBreeze вне форума Ответить с цитированием
Старый 07.09.2009, 14:39   #4
SuperVisor
Павел Сергеевич
Форумчанин
 
Регистрация: 05.11.2006
Сообщений: 665
Счастье

Первое и самое главное: для всех ID используем bigint/int значение (желательно с Identity свойством) или uniqueidentifier. Либо получите жалкое подобие 1С с наипрекраснейшими тормозами.
Далее опишу процедуры с вашими полями, но очень советую обратить внимание на мое замечание.

Цитата:
- Хранимая процедура, реализующая стирание всех записей о продажах с датой, предшествующей указанной;
Код:
Create procedure Delete_Sales
  @SaleDate datetime
as
begin
  delete from sales
  where sale_date<@SaleDate
end

-- Использование: exec DeleteSales @YourDate
Цитата:
- Хранимая процедура, реализующая расчет премии продавца (3% стоимости товара (товар дешевле 1000 у.е.) или 5% стоимости товара (товар дороже 1000 у.е.));
Код:
create function Manager_Reward
  (@ManagerID varchar(4),
  @FromDate datetime,
  @ToDate datetime)
returns money
as
begin
  declare @Ret money

  set @Ret=0
  select @Ret=Sum(sl.kolvo_prodannogo*tv.cena_ed*0.03)
  from sales as sl
  left outer join tovar as tv on tv.tov_id=sl.tov_id
  where tv.cena_ed<1000 and sl.saler_id=@ManagerID and sl.sale_date>=@FromDate and sl.sale_date<=@ToDate

  if @Ret is null set @Ret=0 -- На всякий пожарный, хотя можно использовать coalesce для выбираемых столбцов

  select @Ret=@Ret+Sum(sl.kolvo_prodannogo*tv.cena_ed*0.05)
  from sales as sl
  left outer join tovar as tv on tv.tov_id=sl.tov_id
  where tv.cena_ed>=1000 and sl.saler_id=@ManagerID and sl.sale_date>=@FromDate and sl.sale_date<=@ToDate

  return @Ret
end

-- Использование: select *, dbo.Manager_Reward(saler_id, @FromDate, @ToDate) as Reward from salers
Цитата:
- Х.п., реализующая расчет скидки покупателю (1% за каждую 1000 у.е.).
Код:
create function Get_Client_Discount
  @ClientID varchar(4)
return money
as
begin
  declare @ret money

  select @Ret=SUM(sl.kolvo_prodannogo*tv.cena_ed)
  from sales as sl
  left outer join tovar as tv on tv.tov_id=sl.tov_id
  where sl.client_id=@ClientID

  set @Ret=CEILING(0.01*@Ret/1000) -- или @Ret=CEILING(@Ret/1000) - если необходимо получить 75, а не 0.75
end

-- Использование: select *, dbo.Get_Client_Discount(client_id) as Discount from Clients
Цитата:
С таблицей продаж должен быть связан триггер, запрещающий добавление записи о продаже с прошедшей датой.
Код:
create trigger DoNotPassOlds on dbo.sales
instead of insert
as
begin
  if (select cast(round(cast(sale_date as float),0,1) as datetime) from inserted) < cast(round(cast(GETDATE() as float),0,1) as datetime)
    return
  else
    insert into sales (sale_id, saler_id, client_id, tov_id, kolvo_prodannogo, sale_date)
    select sale_id, saler_id, client_id, tov_id, kolvo_prodannogo, sale_date from inserted
end
Писал все в окошечке,на работоспособность не проверял. Будет вопросы/проблемы - пиши =)
Познавая других, мы познаем себя.
С'est la vie...
SuperVisor вне форума Ответить с цитированием
Старый 07.09.2009, 15:32   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

SuperVisor, хитрозамудрённый движок форума не даёт мне повысить Вам репутацию.
Поэтому мне остаётся только поблагодарить за помощь... иначе мне пришлось бы выискивать время и вымучивать код хранимых процедур...
А FreshBreeze теперь, должно быть, счастлива!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.09.2009, 15:38   #6
SuperVisor
Павел Сергеевич
Форумчанин
 
Регистрация: 05.11.2006
Сообщений: 665
По умолчанию

Serge_Bliznykov, не за что. Приятно знать, что знания и в этой области здесь кому-то сгодились =)
Познавая других, мы познаем себя.
С'est la vie...
SuperVisor вне форума Ответить с цитированием
Старый 08.09.2009, 00:14   #7
FreshBreeze
Пользователь
 
Аватар для FreshBreeze
 
Регистрация: 04.05.2009
Сообщений: 12
По умолчанию

SuperVisor, спасибо огромное!!! Прямо вот такое СПАСИБО!
Это спасение

Update: Да, и за поправку типов данных, конечно же, благодарю!

Serge_Bliznykov, Вы правы, я счастлива

Последний раз редактировалось FreshBreeze; 08.09.2009 в 00:17.
FreshBreeze вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Триггеры и хранимые процедуры SQL FreshBreeze Помощь студентам 6 10.05.2009 14:37
Хранимые процедуры... Только_Учусь БД в Delphi 2 17.07.2008 06:06
Блоб поля и хранимые процедуры yulia БД в Delphi 8 07.06.2008 16:42
Сложные SQL запросы или хранимые процедуры! Killer_djon БД в Delphi 17 25.03.2008 12:10