Son tres cursores, de repente falta optimizarlos, haber si me dan una mano. El problema es que demora mucho al mostrar (mas de media hora).
El primer cursor bota mas de 62 mil codigos que se tienen que analizar y los demas cursores se filtran por cada codigo del primer cursor (10 registros por cada codigo del primero) y del segundo cursor (de 4 a 11 registros aproximadamente) y lo guardo a un temporal para luego mostrarlos, pero el problema es que demora al guardar al temporal. Lo probe con una tabla normal y es lo mismo, el asunto es que quiero mostrar los registros filtrados.
El tercer cursor compara los montos que tiene un predio por cada propietario, si el primero es mayor que el segundo coge el primero y el segundo y los guarda en dos variables. Si el segundo es menor que el tercero no lo coge y asi sucesivamente sigue comparando.
Como veran son tres bucles y por eso quiero ver si hay otra manera de hacerlo.
alter procedure juan
--@anio1 varchar(4),
--@anio2 varchar(4)
as
declare @aniomodif varchar(4) --Año Modificado
declare @fechmodif datetime --Fecha Modificada
declare @usua varchar(20) --Usuario
declare @anioinic varchar(4) --Año Inicial
declare @nompropiet varchar(200) -- Nombre del Propietario
declare @codper int --Codigo de la Persona
declare @codpred int --Codigo del Predio
declare @montos decimal(10,2) --Monto
declare @a decimal(10,2) --Comparador
/* Cursor de los Propietarios */
declare PropietariosJ Cursor FOR
select distinct p.pers_p_incodper from m_hoja_resu a, m_pers p, m_pred_unic prd where a.pers_p_incodper = p.pers_p_incodper
and prd.hore_p_incodhoj = a.hore_p_incodhoj
and p.pers_p_incodper <> 1
and prd.pred_p_incodpre <> 1
and a.estado = 1
and p.estado = 1
and prd.estado = 1
order by p.pers_p_incodper
open PropietariosJ
fetch next from PropietariosJ INTO @codper
While @@FETCH_STATUS = 0
begin
---------------------------------------------------------------------------------------------
/* Cursor que coge el Predio */
declare PrediosJ Cursor FOR
select distinct prd.pred_p_incodpre from m_hoja_resu a, m_pers p, m_pred_unic prd where a.pers_p_incodper = p.pers_p_incodper and prd.hore_p_incodhoj = a.hore_p_incodhoj and a.estado = 1 and p.estado = 1 and prd.estado = 1 and a.pers_p_incodper = @codper and prd.pred_p_incodpre = @codpred
order by prd.pred_p_incodpre
open PrediosJ
fetch next from PrediosJ INTO @codpred
While @@FETCH_STATUS = 0
Begin
----------------------------------------------------------------------------------
/* Cursor que guarda años y montos iniciales y modificados */
set @a = 0
declare AutoAvaluosJ Cursor FOR
select a.hore_debasnet from m_hoja_resu a, m_pers p, m_pred_unic prd where a.pers_p_incodper = p.pers_p_incodper and prd.hore_p_incodhoj = a.hore_p_incodhoj
and a.estado = 1 and p.estado = 1 and prd.estado = 1 and a.pers_p_incodper = @codper and a.hore_debasnet <> 0
and prd.pred_p_incodpre = @codpred and a.anio_p_chcodano between @anio1 and @anio2
order by p.pers_p_incodper, prd.pred_p_incodpre, anio_p_chcodano
open AutoAvaluosJ
fetch next from AutoAvaluosJ into @montos
While @@FETCH_STATUS = 0
Begin
if @a<>0
begin
if @a>@montos
begin
----Tabla Temporal
declare @Mostrar TABLE (Codigo int, Nombre varchar(200), Anio1 varchar(4), Mon1 decimal(10,2), Anio2 varchar(4), Mon2 decimal(10,2), Usua varchar(20), FechModif varchar(20))
--Nombre del Propietario
select distinct @nompropiet = p.pers_chnomcom from m_pers p, m_pred_unic prd where prd.pers_p_incodper = p.pers_p_incodper and prd.estado = 1 and p.estado = 1 and prd.pers_p_incodper = @codper and prd.pred_p_incodpre = @codpred ----'2825'
----Año Inicial
select @anioinic = a.anio_p_chcodano from m_pers p, m_pred_unic prd, m_hoja_resu a where a.pers_p_incodper = p.pers_p_incodper and prd.hore_p_incodhoj = a.hore_p_incodhoj and a.estado = 1 and prd.estado = 1 and p.estado = 1 and prd.pers_p_incodper = @codper and prd.pred_p_incodpre = @codpred----'2825'
and a.hore_debasnet = @a
--Año Modificado
select @aniomodif = a.anio_p_chcodano from m_pers p, m_pred_unic prd, m_hoja_resu a where a.pers_p_incodper = p.pers_p_incodper and prd.hore_p_incodhoj = a.hore_p_incodhoj and a.estado = 1 and prd.estado = 1 and p.estado = 1 and prd.pers_p_incodper = @codper and prd.pred_p_incodpre = @codpred and a.hore_debasnet = @montos
--Usuario Modificación
select @usua = a.segu_chusulog from m_pers p, m_pred_unic prd, m_hoja_resu a where a.pers_p_incodper = p.pers_p_incodper and prd.hore_p_incodhoj = a.hore_p_incodhoj and a.estado = 1 and prd.estado = 1 and p.estado = 1 and prd.pers_p_incodper = @codper and prd.pred_p_incodpre = @codpred and a.hore_debasnet = @montos
--Fecha Modificación
select @fechmodif = a.segu_chusufec from m_pers p, m_pred_unic prd, m_hoja_resu a where a.pers_p_incodper = p.pers_p_incodper and prd.hore_p_incodhoj = a.hore_p_incodhoj and a.estado = 1 and prd.estado = 1 and p.estado = 1 and prd.pers_p_incodper = @codper and prd.pred_p_incodpre = @codpred and a.hore_debasnet = @montos
/* Aqui lo guardo en la Tabla Temporal */
insert into @Mostrar values (@codpred,@nompropiet, @anioinic,@a,@aniomodif,@montos,@usua,@fechmodif)
end
end
set @a = @montos
fetch next from AutoAvaluosJ into @montos
end
/* Cierro el cursor de los años y montos modificados */
Close AutoAvaluosJ deallocate AutoAvaluosJ
-------------------------------------------------------------------------------
fetch next from PrediosJ into @codpred
end
/* Cierro el cursor de los predios */
Close PrediosJ
deallocate PrediosJ
----------------------------------------------------------------------------------------------------------
fetch next from PropietariosJ INTO @codper
end
/* Cierro el cursor del codigo del propietario */
Close PropietariosJ
deallocate PropietariosJ
--Despues de esto tengo que filtrarlos
select * from @Mostrar
--------------------------------------------------------------------------------------------------------------------------------