Dwuznaczność w nazwie tabeli polegała na tym, że w klauzuli from do każdej tabeli użyłem aliasu, stąd silnik nie wiedział co tak naprawdę chce aktualizować, poprawiłem w źródle posta.
Kursor u ciebie się zapętlał i był ciągle na pozycji 1, poprawnie to powinno być tak:
DECLARE @KodP2 INT
DECLARE @Data Date
DECLARE @Data2 Date
DECLARE @Kurs INT
DECLARE @Kurs2 INT
declare KRentownosc SCROLL cursor for
select lp, KodP,Data, Kurs from TRentownosc ORDER BY lp asc
OPEN KRentownosc;
FETCH FIRST FROM KRentownosc INTO @lp,@KodP,@Data,@Kurs;
WHILE @@FETCH_STATUS=0
BEGIN
PRINT @LP
PRINT @LP2
IF @lp2 IS NULL
UPDATE TRentownosc SET TRentownosc.Rentownosc=7 WHERE lp=1
ELSE
BEGIN
IF @KodP=@KodP2
UPDATE TRentownosc SET TRentownosc.Rentownosc= ((@Kurs2/@Kurs)-1) WHERE lp=@lp
ELSE
UPDATE TRentownosc SET TRentownosc.Rentownosc=7 WHERE lp=@lp
END
FETCH RELATIVE 0 FROM KRentownosc INTO @lp2,@KodP2,@Data2,@Kurs2;
FETCH NEXT FROM KRentownosc INTO @lp,@KodP,@Data,@Kurs;
END
CLOSE KRentownosc
DEALLOCATE KRentownosc
SELECT *,@lp,@lp2 FROM TRentownosc
Musisz zwrócić uwagę że Fetch przesuwa kursor, tak naprawdę nie musisz sie cofać tylko pobrać to co masz w bieżącym wierszu i przejść do następnego, ogólnie mógłbyś nawet przekopiować zmienne.
Nie zwróciłem na to uwagi (jak pisałem za kursory ucina się ręce, więc słabo je znam ;)), ale zapis:
FETCH PRIOR FROM KRentownosc INTO @lp2,@KodP2,@Data2,@Kurs2;
FETCH NEXT FROM KRentownosc INTO @lp,@KodP,@Data,@Kurs;
Powoduje, że przechodzę do rekordu 0, później do 1 i tak w kółko stąd pętla nigdy nie przerobiła innych rekordów.
To co mi się nasuwa to fakt, że kolejność lp wcale nie determinuje poprawności wykonania zapytania, ponieważ wystarczy, że dopiszesz kolejny rekord dla kodP = 10 z datą 2004-01-05 i nie policzysz rentowności, kolejność powinieneś wymuszać po kodp i data, wtedy będzie prawidłowo. Zresztą tu aż "prosi się" o klucz na polach kodp i data, wtedy nawet prościej zrobić zapytanie:
UPDATE
TRentownosc
SET
Rentownosc = CASE
WHEN p.lp IS NULL OR isnull(TRentownosc.kurs,0)=0 THEN 7
ELSE (p.kurs/TRentownosc.kurs)-1
END
FROM
TRentownosc
Left join TRentownosc P ON P.Data = DateAdd(d,-1,TRentownosc.Data) AND TRentownosc.kodp = p.kodp
Warto też zwrócić uwagę na typy, bo dla typu int dzielenie 2/4 = 0