![]() |
Модераторы: Akina |
![]() ![]() ![]() |
|
npr2 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 17.1.2008 Репутация: нет Всего: нет |
Здравствуйте! Возникла проблема с курсором, не могу понять в чем дело. Необходимо пересчитать в таблице поле для определенных записей. Если в исходном наборе меняется значение какого-либо из двух полей, то надо из второй таблицы с помощью курсора выбрать коэффициенты для расчета. Так этот курсов не находит эти записи (возвращает -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 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "MS SQL" | |
|
Запрещается! Публиковать ссылки и обсуждать взлом чего бы то ни было.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | MS SQL Server | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |