cursor

SQL во всех проявлениях - от ANSI-92 до TSQL.

Модераторы: Yurich, Absurd

Ответить
npr2
Сообщения: 2
Зарегистрирован: 08 июн 2009, 09:50

Здравствуйте! Возникла проблема с курсором, не могу понять в чем дело. Необходимо пересчитать в таблице поле для определенных записей. Если в исходном наборе меняется значение какого-либо из двух полей, то надо из второй таблицы с помощью курсора выбрать коэффициенты для расчета. Так этот курсов не находит эти записи (возвращает -1). Отдельно этот запрос работает. Что я делаю не так?
CREATE PROCEDURE Update_Lin_Norma
( @Mes [smallint],
@God [SMALLINT])
AS
DECLARE @Row_Fakt [int], @I [int], @I1 [int], @Row_Norma [int],
@Kod_Tip_GTO_Tek [smallint], @Kod_Uch_It_Tek [smallint],
@Buz [float], @Kar [float], @Sez [float] ,@Reis [float],@Rast [float],
@Prost [float],@Lin [float],@Nadb_REis [float]
DECLARE Cur_Fakt CURSOR LOCAL FORWARD_ONLY FOR -- курсор для факта с начала месяца
select u.Kod_Uch_It,g.Kod_Tip_GTO, f.Kod, f.kol_Reis, f.Gr_Oborot, f.Rasst
from Fakt_proiz f, uch u,GTO g
where
( f.Prizn='2' ) and
f.Kod_Uch=u.Kod_Uch and
f.Kod_bel=g.Kod_GTO and
(MONTH(f.dat_Fakt)=@Mes and
YEAR(f.Dat_Fakt)=@God AND
f.kol_reis<>0)
order by u.Kod_Uch_It,g.Kod_Tip_GTO
OPEN Cur_Fakt
SET @Row_Fakt=@@CURSOR_ROWS
print @Row_Fakt
DECLARE @Kod_Uch_It smallint,@Kod_Tip_GTO smallint,@Kod bigint,
@Kol_Reis int, @Gr_Oborot float ,@Rasst float
SET @I=1
SET @Kod_Tip_GTO_Tek=0
SET @Kod_Uch_It_Tek=0
WHILE @I<=@Row_Fakt -- пересчет строки
BEGIN
FETCH NEXT FROM Cur_Fakt INTO @Kod_Uch_It ,@Kod_Tip_GTO ,@Kod ,
@Kol_Reis , @Gr_Oborot, @Rasst
BEGIN TRANSACTION
IF ((@Kod_Tip_GTO_Tek<>@Kod_Tip_GTO) or (@Kod_Uch_It_Tek<>@Kod_Uch_It))
BEGIN
DECLARE Cur_Norma CURSOR LOCAL FORWARD_ONLY FOR -- курсор базовых норм для данного типа белаза
select Bel_Buz_Norma.Kod_Buz_Norma, Bel_Buz_Norma.Bel_Buz_Norma
from Bel_Buz_Norma
where
Bel_Buz_Norma.Kod_Uch_It=@Kod_Uch_It and
Bel_Buz_Norma.Kod_GTO=@Kod_Tip_GTO and
(Bel_Buz_Norma.Mes=@Mes and
Bel_Buz_Norma.God=@God)
order by Bel_Buz_Norma.KOd_Buz_Norma
OPEN Cur_Norma
SET @Row_NORMA=@@CURSOR_ROWS
DECLARE @Kod_Buz_Norma float, @Bel_Buz_Norma float
print @Row_Norma
SET @I1=1
SET @Buz=0
SET @Kar=0
SET @Sez=0
SET @Reis=0
SET @Rast=0
SET @Prost=0
SET @Lin=0
WHILE @I1<=@Row_Norma -- считываю нормы
BEGIN
FETCH NEXT FROM Cur_Norma INTO @Kod_Buz_Norma, @Bel_Buz_Norma
IF @Kod_Buz_Norma=2 SET @Buz=@Bel_Buz_Norma
IF @Kod_Buz_Norma=3 SET @Kar=@Bel_Buz_Norma
IF @Kod_Buz_Norma=4 SET @Sez=@Bel_Buz_Norma
IF @Kod_Buz_Norma=5 SET @Reis=@Bel_Buz_Norma
IF @Kod_Buz_Norma=6 SET @Rast=@Bel_Buz_Norma
IF @Kod_Buz_Norma=7 SET @Prost=@Bel_Buz_Norma
END
If @Kod_Tip_GTO_Tek<>@Kod_Tip_GTO SET @Kod_Tip_GTO_Tek=@Kod_Tip_GTO
If @Kod_Uch_It_Tek<>@Kod_Uch_It SET @Kod_Uch_It_Tek=@Kod_Uch_It
CLOSE Cur_Norma
DEALLOCATE Cur_Norma
SET @I1=@I1+1
END -- конец IF
COMMIT
-- расчет нормы для записи
IF @Rasst<1
SET @Lin=(@Buz/100*(@Rasst*@Kol_Reis*2))+ --базовая норма
((@Buz/100*(@Rasst*@Kol_Reis*2))*@Kar)+ --карьерная надбавка
((@Buz/100*(@Rasst*@Kol_Reis*2))*@Sez)+ -- сезонная надбавка
(@Reis*@Kol_Reis)+ -- надбавка за рейс
((@Buz/100*(@Rasst*@Kol_Reis*2))*@Rast) --короткий рейс
ELSE
SET @Lin=(@Buz/100*(@Rasst*@Kol_Reis*2))+ --базовая норма
((@Buz/100*(@Rasst*@Kol_Reis*2))*@Kar)+ --карьерная надбавка
((@Buz/100*(@Rasst*@Kol_Reis*2))*@Sez)+ -- сезонная надбавка
(@Reis*@Kol_Reis) -- надбавка за рейс
SET @Nadb_REis= @Reis*@Kol_Reis
-- замена значения
Update FAKT_PROIZ
SET Buz_Lin_Norma=@Lin,
Nadb_Reis=@Nadb_REis
Where kod=@Kod
SET @I=@I+1
END
-- конец добавления факта с начала месяца во временную таблицу
CLOSE Cur_Fakt
DEALLOCATE Cur_Fakt
Ответить