Am finisat varianta cu cursor. Am incercat sa scap de selectul ala inutil care cred ca imi diminua performanta si a iesit asta:
drop table A_tmplstFisaCont
select *, cast(0 as decimal(28,6)) as Sold into A_tmplstFisaCont from A_lstFisaCont order by cont, datainr, nds
alter table A_tmplstFisaCont add [iId] [int] IDENTITY (1, 1) NOT NULL
go
CREATE CLUSTERED
INDEX [iIdIdx] ON [dbo].[A_tmplstFisaCont] ([iId])
ON [PRIMARY]
GO
update A_tmplstFisaCont set sold = 0
DECLARE @id int, @cont varchar(16), @datainr datetime, @nds int, @coduser int, @debit decimal(28,6), @credit decimal(28,6), @sold decimal(28,6)
declare @bFirstRow int, @dPrevSold decimal(28,6), @sPrevCont varchar(16)
set @bFirstRow = 1
set @dPrevSold = 0
set @sPrevCont = ''
DECLARE abc CURSOR FAST_FORWARD READ_ONLY
FOR
SELECT iid, cont, datainr, nds, coduser, debit, credit, sold
FROM A_tmplstFisaCont
ORDER BY iid
OPEN abc
FETCH NEXT FROM abc
INTO @id, @cont, @datainr, @nds, @coduser, @debit, @credit, @sold
WHILE @@FETCH_STATUS = 0
BEGIN
if @cont = @sPrevCont
begin
set @dPrevSold = 0
set @sPrevCont <> @cont
end
if @bFirstRow = 1
begin
set @Sold = @debit - @credit
set @bFirstRow = 0
end
else
begin
set @Sold = @dPrevSold + @debit - @credit
end
UPDATE A_tmplstFisaCont SET Sold = @sold
where iid=@id
set @dPrevSold = @sold
FETCH NEXT FROM abc
INTO @id, @cont, @datainr, @nds, @coduser, @debit, @credit, @sold
END
CLOSE abc
DEALLOCATE abc
GO
De aceasta data codul este de 5 ori mai rapid decat varianta cu select (varianta initiala).