| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > MS SQL Server > cursor |
| Автор: npr2 22.6.2009, 06:28 |
| Здравствуйте! Возникла проблема с курсором, не могу понять в чем дело. Необходимо пересчитать в таблице поле для определенных записей. Если в исходном наборе меняется значение какого-либо из двух полей, то надо из второй таблицы с помощью курсора выбрать коэффициенты для расчета. Так этот курсов не находит эти записи (возвращает -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 |