Cursores con variable tipo tabla y contadores

Cursor con variable tipo tabla y contadores

En este artículo se utiliza un cursor para mostrar un reporte de acuerdo a registros que tienen valores enteros, de los cuales se hace un análisis para insertar registros en el reporte como entradas y salidas.

Para más información ver

Cursores en SQL Server
Variables tipo tabla
Creación de tablas

Desarrollando el ejercicio

Se va a usar la base de datos Northwind, si no la tiene puede crear cualquier otra base de datos.

use Northwind
go
set dateformat dmy
go
Drop table if exists Eventos
go
Create table Eventos
(
IDEventos int identity,
FechaRegistro Datetime,
Evento nvarchar(20),
Entrada int,
Salida int,
constraint IdEventosPK Primary key (IDEventos)
)
go

Insertando los registros

insert into Eventos
values
('21/03/2021 14:54:45', 'CONTADOR',1,0),
('21/03/2021 14:54:41', 'CONTADOR',3,1),
('21/03/2021 14:54:38', 'CONTADOR',2,1),
('21/03/2021 14:54:34', 'CONTADOR',0,2),
('21/03/2021 14:54:26', 'CONTADOR',1,4),
('21/03/2021 14:54:14', 'CONTADOR',1,0)
go
Listado de los registros
Select * from Eventos
go
La lista de registros de la tabla se muestra en la siguiente imagen

En la figura anterior podemos notar que el primer registro tiene una entrada y no tienen salidas, el cursor mostrará entonces para ese registro una entrada, para el segundo registro, tiene 3 entradas y una salida, se debe mostrar entonces 04 registros, 03 de entrada y 01 de salida.

Desarrollando el Cursor

Declare cursorEventos cursor for select * from Eventos
Open cursorEventos
Declare @ReporteEventos Table
(
IDEventos int,
FechaRegistro Datetime,
Evento nvarchar(20),
[Entrada/Salida] nvarchar(20)
)
Declare @IDEventos int , @FechaRegistro Datetime, @Evento nvarchar(20),
@Entrada int, @Salida int
Fetch cursorEventos into @IDEventos, @FechaRegistro, @Evento, @Entrada, @Salida
while (@@FETCH_STATUS = 0)
Begin
Declare @ContadorEntradas int = 0
while (@ContadorEntradas < @Entrada)
Begin
insert into @ReporteEventos values
(@IDEventos,@FechaRegistro, @Evento,'ENTRADA')
Set @ContadorEntradas += 1
End
Declare @ContadorSalidas int = 0
while (@ContadorSalidas < @Salida)
Begin
insert into @ReporteEventos values
(@IDEventos,@FechaRegistro, @Evento,'SALIDA')
Set @ContadorSalidas += 1
End
Fetch cursorEventos into @IDEventos, @FechaRegistro, @Evento, @Entrada, @Salida
End
Close cursorEventos
Deallocate cursorEventos
select * from @ReporteEventos
go

El resultado se muestra en la siguiente imagen

La siguiente imagen muestra el resultado comparando la tabla con el resultado del cursor. Note lo que se ha señalado, el registro con ID número 2 tiene 03 entradas, en el cursor se han insertado 03 registros, la selección está con color azul, el mismo registro tiene una salida, en el cursor se ha insertado un registro, la selección está con color rojo.