pues bueno ya que tienes tu tabla (con el autoincrementable) tu procedimiento deberia ser:
Trabajador checa tarjeta
1.- buscar si existe un registro con hora de entrada pero sin hora de salida
a)afirmativo entonces trabajador sale, actualizar ese registro en el campo salida
b)Negativo, el trabajador entra, se inserta un registro nuevo con el campo entrada
y con el campo salida en Null
2.- Decirle al trabajador si checo salida o entrada.
El procedure seria algo asi:
Código SQL:
Ver originalDROP TABLE dbo.Puntualidad
CREATE TABLE dbo.Puntualidad
(
cod_asistencia NUMERIC(9) PRIMARY KEY IDENTITY NOT FOR replication,
ID NUMERIC(9),
hora_entrada Datetime NULL,
hora_salida Datetime NULL
)
GO
ALTER PROCEDURE dbo.ChecadorTrabajador
@id NUMERIC(9)=0 -- identificador del trabajador (leido por codigo de barras)
AS
--variable de control para saber si existe registro
DECLARE @AI NUMERIC(9)
--variable para indicar que operacion de realizo
DECLARE @resultado VARCHAR(20)
--verificar si existe algun registro
--del mismo dia, no puede trabajar mas de 24 horas
--(modificar aqui segun reglas del negocio)
SET @AI = isnull((SELECT top 1 cod_asistencia FROM dbo.Puntualidad
WHERE ID = @id AND hora_salida IS NULL
AND datediff(d,hora_entrada,getdate())<1
),0)
IF @AI=0
--si no existe algun registro
BEGIN
INSERT INTO dbo.Puntualidad (ID,hora_entrada,hora_salida)
VALUES (@id,getdate(),NULL)
SET @resultado = 'Entrada'
END
ELSE
BEGIN
--el trabajador sale
UPDATE dbo.Puntualidad
SET
hora_salida = getdate()
WHERE cod_asistencia=@AI
SET @resultado = 'Salida'
END
IF @@error<>0
BEGIN
SET @resultado = 'Error'
END
SELECT @resultado
GO
EXEC dbo.ChecadorTrabajador 1
SELECT * FROM dbo.Puntualidad
EXEC dbo.ChecadorTrabajador 2
SELECT * FROM dbo.Puntualidad
EXEC dbo.ChecadorTrabajador 3
SELECT * FROM dbo.Puntualidad
EXEC dbo.ChecadorTrabajador 2
SELECT * FROM dbo.Puntualidad