optimizacion de un proceso en cursores

24/11/2004 - 00:27 por jdonis2002 | Informe spam
hola,
el problema es que tengo que un proceso en SP el cual tengo que optimizar
debido a que se esta tomando casi 4 horas en ejecutar.

basicamente el proceso debe prorratear los servicios realizados por un
trabajador dentro de los dias indicados.
para prorratear debo sumarizar por fecha lo debengado y distribuirlo dentro
de los servicios realizados.

tengo 2 cursores. el primero me identifica los dias ordinarios sobre los
que tengo que distribuir los servicios. el segundo obtiene el monto a
distribuir por fecha.




o domingos
declare cur_participar cursor fast_forward for
select codemp, sum(isnull(cantidad,0)) as diasOrd
from servicio_realizado with ( nolock )
join detser_serv with ( nolock ) on codcia = codcia and fecha = fecha and
codsre = codigo
where codcia = @codcia
and codtpl = @codtpl
and codpla = @codpla
and codcsr = 15
and codgsr = 1
and codsrv = 1
group by fecha, codemp
for read only

open cur_participar
fetch next from cur_participar into @codemp, @diasOrd
while @@fetch_status = 0
begin

if @diasord > 0 begin
declare cur_procesa cursor fast_forward for

select fecha, sum(isnull(cantidad,0))
from servicio_realizado with ( nolock )
join detser_serv with ( nolock ) on codcia = codcia and fecha = fecha and
codsre = codigo
where codcia = @codcia
and codtpl = @codtpl
and codpla = @codpla
and codcsr = 1
and codgsr = 2
group by fecha
for read only

set @contador = 0

open cur_procesa
fetch next from cur_procesa into @fecha, @cantidad
while @@fetch_status = 0
begin

realizados por dia.
update detser_serv set segmen01 = convert(decimal(10,2), ( 1 / @cantidad
) * cantidad )
from servicio_realizado with ( nolock )
join detser_serv with ( nolock ) on codcia = codcia and fecha = fecha and
codsre = codigo
where codcia = @codcia
and codtpl = @codtpl
and codpla = @codpla
and fecha = @fecha
and codemp = isnull(@codemp, dse_codemp)
and codcsr = 1
and codgsr = 2

set @contador = @contador + 1

existentes trabajados.
ingresados.
if @contador >= @diasOrd break

fetch next from cur_procesa into @fecha, @cantidad
end
close cur_procesa
deallocate cur_procesa
end

fetch next from cur_participar into @codemp, @diasOrd, @diasFer
end
close cur_participar
deallocate cur_participar
 

Leer las respuestas

#1 Liliana Sorrentino
24/11/2004 - 13:39 | Informe spam
Hola,
Podrías mandar la esctructura de las tablas SIMPLIFICADA, con ejemplos de
datos de entrada y el resultado esperado?
Liliana.

"jdonis2002" escribió en el mensaje
news:
hola,
el problema es que tengo que un proceso en SP el cual tengo que optimizar
debido a que se esta tomando casi 4 horas en ejecutar.

basicamente el proceso debe prorratear los servicios realizados por un
trabajador dentro de los dias indicados.
para prorratear debo sumarizar por fecha lo debengado y distribuirlo


dentro
de los servicios realizados.

tengo 2 cursores. el primero me identifica los dias ordinarios sobre los
que tengo que distribuir los servicios. el segundo obtiene el monto a
distribuir por fecha.






feriados
o domingos
declare cur_participar cursor fast_forward for
select codemp, sum(isnull(cantidad,0)) as diasOrd
from servicio_realizado with ( nolock )
join detser_serv with ( nolock ) on codcia = codcia and fecha = fecha and
codsre = codigo
where codcia = @codcia
and codtpl = @codtpl
and codpla = @codpla
and codcsr = 15
and codgsr = 1
and codsrv = 1
group by fecha, codemp
for read only

open cur_participar
fetch next from cur_participar into @codemp, @diasOrd
while @@fetch_status = 0
begin

if @diasord > 0 begin
declare cur_procesa cursor fast_forward for

select fecha, sum(isnull(cantidad,0))
from servicio_realizado with ( nolock )
join detser_serv with ( nolock ) on codcia = codcia and fecha = fecha and
codsre = codigo
where codcia = @codcia
and codtpl = @codtpl
and codpla = @codpla
and codcsr = 1
and codgsr = 2
group by fecha
for read only

set @contador = 0

open cur_procesa
fetch next from cur_procesa into @fecha, @cantidad
while @@fetch_status = 0
begin

realizados por dia.
update detser_serv set segmen01 = convert(decimal(10,2), ( 1 / @cantidad
) * cantidad )
from servicio_realizado with ( nolock )
join detser_serv with ( nolock ) on codcia = codcia and fecha = fecha and
codsre = codigo
where codcia = @codcia
and codtpl = @codtpl
and codpla = @codpla
and fecha = @fecha
and codemp = isnull(@codemp, dse_codemp)
and codcsr = 1
and codgsr = 2

set @contador = @contador + 1

existentes trabajados.
ingresados.
if @contador >= @diasOrd break

fetch next from cur_procesa into @fecha, @cantidad
end
close cur_procesa
deallocate cur_procesa
end

fetch next from cur_participar into @codemp, @diasOrd, @diasFer
end
close cur_participar
deallocate cur_participar



Preguntas similares