
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
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

