Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Не работает хранимая процедура  [new]
Gring0
Member

Откуда:
Сообщений: 7
Исходные данные:
CREATE TABLE Норма_времени
( 
	Марка                          varchar(40)  NOT NULL ,
	Модель                         varchar(40)  NOT NULL ,
	Норма_времени		 float  NOT NULL ,
	РаботаID                      integer  NOT NULL ,
	Тех_паспорт                 varchar(20)  NOT NULL 
)
go

ALTER TABLE Норма_времени
	ADD CONSTRAINT XPKНорма_времени PRIMARY KEY  CLUSTERED (РаботаID ASC,Тех_паспорт ASC)
go

INSERT INTO [dbo].[Норма_времени]
      VALUES(1,'WAUZZZ89ZJA281780','Опель','Астра',1) 
      GO

CREATE TABLE Нормочас
( 
	Стоимость_нормочаса  decimal  NOT NULL 
)
go
        INSERT INTO [dbo].[Нормочас]
     ([Стоимость_нормочаса])
      VALUES (320000) 


CREATE TABLE Стоимость_работы
( 
	ЗаказID				integer  NOT NULL ,
	РаботаID			integer  NOT NULL ,
	Стоимость_запчастей		decimal  NULL ,
	Стоимость_работы		decimal  NULL ,
	Дата_завершения_работы         datetime  NULL ,
	РаботникиID                            integer  NULL 
)
go

ALTER TABLE Стоимость_работы
	ADD CONSTRAINT XPKСтоимость_работы PRIMARY KEY  CLUSTERED (ЗаказID ASC,РаботаID ASC)
go

     INSERT INTO [dbo].[Стоимость_работы]
      VALUES(2,2,600000,NULL,'2012-01-25',4) 
                                                                     [b]   Скрипт:[/b]

use [СТО]
go
create procedure РасчетСуммыРаботы
 @NЗаказа int,
 @NРаботы int,
 @ТехПаспорт varchar(20)
 AS
 declare @Сумма real, @Норма_врем float , @Стоим_нормочаса real
 declare  @Стоим_запчастей real
 
 select @Стоим_нормочаса = (select Стоимость_нормочаса from Нормочас where @Стоим_нормочаса=Стоимость_нормочаса)
 select @Стоим_запчастей = 0
 select @Норма_врем = (select Норма_времени from Норма_времени where
 Норма_времени.Тех_паспорт=@ТехПаспорт AND Норма_времени.РаботаID= @NРаботы)
 
 if  ((select Стоимость_запчастей from стоимость_работы
where Стоимость_работы.ЗаказID= @NЗаказа AND Стоимость_работы.РаботаID=@NРаботы)
is not null)
	begin
	select @Стоим_запчастей = (select Стоимость_запчастей from Стоимость_работы
	where Стоимость_работы.ЗаказID= @NЗаказа AND Стоимость_работы.РаботаID=
	 @NРаботы)
	end
	
		if  ((select Дата_завершения_работы from Стоимость_работы where Стоимость_работы.ЗаказID= @NЗаказа AND Стоимость_работы.РаботаID=
	 @NРаботы) is not NULL)
		begin
			select @Сумма=@Стоим_нормочаса * @Норма_врем + @Стоим_запчастей
			update Стоимость_работы set Стоимость_работы = @Сумма 
			where Стоимость_работы.ЗаказID= @NЗаказа AND Стоимость_работы.РаботаID=
	 @NРаботы
		end
	else
		begin
		raiserror ('Работа не была завершена.',14,1);
		end


Суть ХП: Подсчитать сумму работы и записать результат в таблицу Стоимость_работы в поле Стоимость_работы (прошу прощения за туфтологию)

Вызов ХП:
use [СТО]
go
declare @номерЗ int
exec @номерЗ=dbo.РасчетСуммыРаботы 1,1,'OPYZZZE89ZJA926366'
print @номерЗ


В @номерЗ при вызове хранится значение 0 (выдает @номерЗ=0)
Хранимая процедура, как и ее вызов отрабатываются без ошибок.
Подскажите пожалуйста, в чем моя ошибка...

Сообщение было отредактировано: 13 май 12, 17:08
13 май 12, 17:03    [12545981]     Ответить | Цитировать Сообщить модератору
 Re: Не работает хранимая процедура  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Ваша процедура ничего не возвращает. Оттуда и 0.

Сообщение было отредактировано: 13 май 12, 17:10
13 май 12, 17:09    [12545992]     Ответить | Цитировать Сообщить модератору
 Re: Не работает хранимая процедура  [new]
rector
Member

Откуда: Киев
Сообщений: 57
Gring0,

а что, собственно, хотите увидеть ?
процедура ничего не возвращает, да и к тому же вы используете её как функцию.
Если надо получить значение из "внутренностей" процедуры, используйте OUTPUT переменные.
А так, вообще не понятно что вы хотите увидеть.
13 май 12, 17:12    [12545998]     Ответить | Цитировать Сообщить модератору
 Re: Не работает хранимая процедура  [new]
Gring0
Member

Откуда:
Сообщений: 7
Gring0
select @Сумма=@Стоим_нормочаса * @Норма_врем + @Стоим_запчастей
update Стоимость_работы set Стоимость_работы = @Сумма
where Стоимость_работы.ЗаказID= @NЗаказа AND Стоимость_работы.РаботаID=


Я хочу, чтобы в поле Стоимость_работы таблицы [Стоимость_работы] посчиталась сумма работы. Что я не так делаю?
13 май 12, 17:56    [12546062]     Ответить | Цитировать Сообщить модератору
 Re: Не работает хранимая процедура  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
Gring0
Что я не так делаю?
Если коротко, то все.

Вся ваша куча кода спокойно заменяется одной инструкцией update.
Вот это фрагмент вообще шедеврален:
select @Стоим_нормочаса = (select Стоимость_нормочаса from Нормочас where @Стоим_нормочаса=Стоимость_нормочаса)

А еще подумайте, что произойдет, если в таблице "Нормочас" будет более одной строки.
13 май 12, 18:14    [12546096]     Ответить | Цитировать Сообщить модератору
 Re: Не работает хранимая процедура  [new]
Gring0
Member

Откуда:
Сообщений: 7
invm
Gring0
Что я не так делаю?
Если коротко, то все.

Вся ваша куча кода спокойно заменяется одной инструкцией update.
Вот это фрагмент вообще шедеврален:
select @Стоим_нормочаса = (select Стоимость_нормочаса from Нормочас where @Стоим_нормочаса=Стоимость_нормочаса)

А еще подумайте, что произойдет, если в таблице "Нормочас" будет более одной строки.


Все так и задумано, что таблица "Нормочас" - справочная и в ней хранится только одна запись о текущей стоимости нормочаса. Данную задачу хочу решить с помощью ХП.
13 май 12, 18:51    [12546150]     Ответить | Цитировать Сообщить модератору
 Re: Не работает хранимая процедура  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
Gring0
Все так и задумано, что таблица "Нормочас" - справочная и в ней хранится только одна запись о текущей стоимости нормочаса.
Т.е., в общем случае, вы не сможете озвучить заказчику стоимость работ.
Gring0
Данную задачу хочу решить с помощью ХП.
А ХП обязательно подразумевает наличие кучи переменных и ненужного кода? Практически все содержимое вашей процедуры заменяется на:
update a
 set
  Стоимость_работы set = c.Стоим_нормочаса * b.Норма_времени + a.Стоим_запчастей
from
 Стоимость_работы a join
 Норма_времени b on b.Тех_паспорт = @ТехПаспорт and b.РаботаID = @NРаботы cross join
 Нормочас c
where
 a.ЗаказID = @NЗаказа and
 a.РаботаID = @NРаботы and
 a.Дата_завершения_работы is not null and
 a.Стоимость_запчастей is not null;
13 май 12, 20:40    [12546536]     Ответить | Цитировать Сообщить модератору
 Re: Не работает хранимая процедура  [new]
Gring0
Member

Откуда:
Сообщений: 7
invm
Gring0
Все так и задумано, что таблица "Нормочас" - справочная и в ней хранится только одна запись о текущей стоимости нормочаса.
Т.е., в общем случае, вы не сможете озвучить заказчику стоимость работ.


Получается так. Я не предусмотрел эту возможность. Т.е. стоимость работы будет озвучена заказчику только после ее выполнения :)
Если бы в таблице "Норма_времени" были расписаны все возможные нормы времени по всем осуществляемым работам для всех моделей и марок авто, то можно было бы написать еще одну ХП. А так получается, что стоимость работы не всегда известна даже Менеджеру СТО...
14 май 12, 01:14    [12547561]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить