spTop20Morosos actualización
Se trabajó en la creación del stored procedure encargado de devolver los 20 abonados con la morosidad más alta, de forma descendente (aprox 2hrs)
Luego de su debido proceso de debbugeo se logró el resultado deseado mediante el siguiente código:
declare @TablaMorosos table (sec int identity(1,1), id_abonado int, total_morosidad int)
declare @cont int
set @cont = 1
while @cont <= 40
begin
--se declaran las tablas
--recibo consulta que va a contener los datos de los recibos aún no pagados por el abonado
--resultado en el que se le va a ingresar el calculo del monto de los recibos a pagar
DECLARE @reciboConsulta table (sec int identity(1,1), idRecibo int, numeroFinca int, idmuni int, idAbonado int, valor int, nombre varchar(30), fechaEmision dateTime, fechaLimite dateTime, fechaPagado dateTime, valorMAgua float, tasaInteres int)
DECLARE @resultado table (sec int identity(1,1), idRecibo int, montoAgua float, montoAlumbrado float, montoBasura float, montoParques float, montoPatente float, intMoratorio float, morosidad float, impuestoPropiedad float, subTotal float)
--obtiene los recibos que aún no han sido pagados = null por el abonado
Insert into @reciboConsulta Select Recibo.ID, Recibo.NumeroFinca, IdMunicipalidad, IdAbonado, Valor, Abonado.Nombre, FechaEmision, FechaLimite, FechaPagado, ValorMAgua, TasaInteres from Propiedad join Abonado on Propiedad.IdAbonado = Abonado.ID
join Recibo on Propiedad.NumeroFinca = Recibo.NumeroFinca
join Municipalidad on Propiedad.IdMunicipalidad = Municipalidad.ID where Propiedad.IdAbonado = @cont and FechaPagado is null ORDER BY FechaEmision desc
--se declaran variables para obtener los datos
DECLARE @low int = 1
DECLARE @high int = 0
DECLARE @montoAgua float = 0
DECLARE @montoAlumbrado float = 0
DECLARE @montoBasura float = 0
DECLARE @montoParques float = 0
DECLARE @montoPatente float = 0
DECLARE @intMoratorio float = 0
DECLARE @subTotal float = 0
DECLARE @morosidad float = 0
DECLARE @numFinca int = 0
DECLARE @idRecibo int = 0
DECLARE @fechalimite dateTime
DECLARE @interesMoratorio float = 0
DECLARE @impuestoPropiedad float = 0
Print 'comienza loop------------------------------'
Select @high = max(T.sec) from @reciboConsulta T
--procede a iterar por los recibos para obtener el valor a pagar del agua,alumbrado,parques,patente,interesMoratiorio en caso de que el servicio no sea solicitado settea un 0 en la tabla
while @low <= @high
Begin
--obtiene numero de finca e id recibo a pagar
Set @numFinca = (Select numeroFinca from @reciboConsulta where sec = @low)
Set @idRecibo = (Select idRecibo from @reciboConsulta where sec = @low)
--obtiene el valor del pago correspondiente al recibo del agua por medio del id del recibo
Execute dbo.spGetCalculoAguaPorRecibo @idRecibo,@montoAgua out
--obtiene los servicios que paga la finca al mes, en caso de no haber solicitado algún servicio se settea un 0 al valor para no afectar el subtotal
Execute spGetPagos @numFinca,@montoAlumbrado out,@montoBasura out,@montoParques out,@montoPatente out
--suma subtotal
Set @subtotal = @montoAlumbrado + @montoBasura + @montoParques + @montoPatente + @montoAgua
--obtiene el id de la municipalidad por medio del numero de finca para sacar el interes moratorio
Set @interesMoratorio = (Select Municipalidad.TasaInteres from Municipalidad where Municipalidad.ID = (Select Municipalidad.ID from Propiedad join Municipalidad on Propiedad.IdMunicipalidad = Municipalidad.ID where Propiedad.NumeroFinca = @numFinca))
Set @fechalimite = (Select FechaLimite from Recibo where Recibo.ID = @idRecibo)
Set @impuestoPropiedad = (Select Valor from Propiedad where Propiedad.NumeroFinca = @numFinca)
Set @impuestoPropiedad = @impuestoPropiedad * 0.5
--datediff = dias de atraso
if(DATEDIFF(DAY,@fechalimite,GETDATE()) > 0)
Set @morosidad = @subtotal * (@interesMoratorio/360) * DATEDIFF(DAY,@fechalimite,GETDATE())
Insert into @resultado values (@idRecibo,@montoAgua,@montoAlumbrado,@montoBasura,@montoParques,@montoPatente,@interesMoratorio,@morosidad,@impuestoPropiedad,@subTotal)
Set @low = @low + 1
end
insert into @TablaMorosos (id_abonado, total_morosidad) values (@cont, (select sum(morosidad) from @resultado))
set @cont = @cont + 1
delete from @reciboConsulta
delete from @resultado
end
Select top 20 * from @TablaMorosos order by total_morosidad desc
end
El procedimiento se encarga de calcular la morosidad de cada recibo de cada abonado, estos valores se suman y se guardan en una tabla temporal con el id del abonado y la suma de sus morosidades. Luego se despliegan los primeros 20 registros ordenados de mayor a meor.
El resultado de esto, con los datos suministrados es:
Luego de su debido proceso de debbugeo se logró el resultado deseado mediante el siguiente código:
declare @TablaMorosos table (sec int identity(1,1), id_abonado int, total_morosidad int)
declare @cont int
set @cont = 1
while @cont <= 40
begin
--se declaran las tablas
--recibo consulta que va a contener los datos de los recibos aún no pagados por el abonado
--resultado en el que se le va a ingresar el calculo del monto de los recibos a pagar
DECLARE @reciboConsulta table (sec int identity(1,1), idRecibo int, numeroFinca int, idmuni int, idAbonado int, valor int, nombre varchar(30), fechaEmision dateTime, fechaLimite dateTime, fechaPagado dateTime, valorMAgua float, tasaInteres int)
DECLARE @resultado table (sec int identity(1,1), idRecibo int, montoAgua float, montoAlumbrado float, montoBasura float, montoParques float, montoPatente float, intMoratorio float, morosidad float, impuestoPropiedad float, subTotal float)
--obtiene los recibos que aún no han sido pagados = null por el abonado
Insert into @reciboConsulta Select Recibo.ID, Recibo.NumeroFinca, IdMunicipalidad, IdAbonado, Valor, Abonado.Nombre, FechaEmision, FechaLimite, FechaPagado, ValorMAgua, TasaInteres from Propiedad join Abonado on Propiedad.IdAbonado = Abonado.ID
join Recibo on Propiedad.NumeroFinca = Recibo.NumeroFinca
join Municipalidad on Propiedad.IdMunicipalidad = Municipalidad.ID where Propiedad.IdAbonado = @cont and FechaPagado is null ORDER BY FechaEmision desc
--se declaran variables para obtener los datos
DECLARE @low int = 1
DECLARE @high int = 0
DECLARE @montoAgua float = 0
DECLARE @montoAlumbrado float = 0
DECLARE @montoBasura float = 0
DECLARE @montoParques float = 0
DECLARE @montoPatente float = 0
DECLARE @intMoratorio float = 0
DECLARE @subTotal float = 0
DECLARE @morosidad float = 0
DECLARE @numFinca int = 0
DECLARE @idRecibo int = 0
DECLARE @fechalimite dateTime
DECLARE @interesMoratorio float = 0
DECLARE @impuestoPropiedad float = 0
Print 'comienza loop------------------------------'
Select @high = max(T.sec) from @reciboConsulta T
--procede a iterar por los recibos para obtener el valor a pagar del agua,alumbrado,parques,patente,interesMoratiorio en caso de que el servicio no sea solicitado settea un 0 en la tabla
while @low <= @high
Begin
--obtiene numero de finca e id recibo a pagar
Set @numFinca = (Select numeroFinca from @reciboConsulta where sec = @low)
Set @idRecibo = (Select idRecibo from @reciboConsulta where sec = @low)
--obtiene el valor del pago correspondiente al recibo del agua por medio del id del recibo
Execute dbo.spGetCalculoAguaPorRecibo @idRecibo,@montoAgua out
--obtiene los servicios que paga la finca al mes, en caso de no haber solicitado algún servicio se settea un 0 al valor para no afectar el subtotal
Execute spGetPagos @numFinca,@montoAlumbrado out,@montoBasura out,@montoParques out,@montoPatente out
--suma subtotal
Set @subtotal = @montoAlumbrado + @montoBasura + @montoParques + @montoPatente + @montoAgua
--obtiene el id de la municipalidad por medio del numero de finca para sacar el interes moratorio
Set @interesMoratorio = (Select Municipalidad.TasaInteres from Municipalidad where Municipalidad.ID = (Select Municipalidad.ID from Propiedad join Municipalidad on Propiedad.IdMunicipalidad = Municipalidad.ID where Propiedad.NumeroFinca = @numFinca))
Set @fechalimite = (Select FechaLimite from Recibo where Recibo.ID = @idRecibo)
Set @impuestoPropiedad = (Select Valor from Propiedad where Propiedad.NumeroFinca = @numFinca)
Set @impuestoPropiedad = @impuestoPropiedad * 0.5
--datediff = dias de atraso
if(DATEDIFF(DAY,@fechalimite,GETDATE()) > 0)
Set @morosidad = @subtotal * (@interesMoratorio/360) * DATEDIFF(DAY,@fechalimite,GETDATE())
Insert into @resultado values (@idRecibo,@montoAgua,@montoAlumbrado,@montoBasura,@montoParques,@montoPatente,@interesMoratorio,@morosidad,@impuestoPropiedad,@subTotal)
Set @low = @low + 1
end
insert into @TablaMorosos (id_abonado, total_morosidad) values (@cont, (select sum(morosidad) from @resultado))
set @cont = @cont + 1
delete from @reciboConsulta
delete from @resultado
end
Select top 20 * from @TablaMorosos order by total_morosidad desc
end
El procedimiento se encarga de calcular la morosidad de cada recibo de cada abonado, estos valores se suman y se guardan en una tabla temporal con el id del abonado y la suma de sus morosidades. Luego se despliegan los primeros 20 registros ordenados de mayor a meor.
El resultado de esto, con los datos suministrados es:
Comentarios
Publicar un comentario