Usuario
Procedimiento almacenado para validar registro de asistencia

Pregunta
-
Buenos dias a todos, acabo de unirme a la comunidad.
Espero me puedan ayudar, de antemano muchas gracias. Quiero hacer un procedimiento almacenado que ingrese un registro a mi tabla asistencia de acuerdo al horario de cada empleado al validar el cod del usuario, hice este procedimiento pero solo funciona para una asistencia por dia. Quisiera que funcione para horarios
CREATE PROCEDURE registrar_asistecia @ID_LEIDA int AS BEGIN DECLARE @FECHA DATETIME SET @FECHA = GETDATE() DECLARE @HORA TIME SET @HORA = @FECHA DECLARE @NOM_DIA VARCHAR(15) SET LANGUAGE Spanish SET @NOM_DIA = DATENAME(DW,@FECHA) DECLARE @ENTRADA TIME, @SALIDA TIME SELECT * FROM horario inner join horario_empleado on horario.id_horario = horario_empleado.id_horario inner join empleado on horario_empleado.id_empleado = empleado.id_empleado WHERE empleado.id_empleado = @ID_LEIDA and horario_empleado.nombre_dia = @NOM_DIA IF @HORA BETWEEN DATEADD(minute,-60,@ENTRADA) AND DATEADD(minute,30,@ENTRADA) BEGIN if @HORA BETWEEN DATEADD(minute,-60,@ENTRADA) AND @ENTRADA begin INSERT INTO asistencia (id_empleado, entrada_asis, nom_dia_asis, estado) VALUES(@ID_LEIDA,@HORA,@NOM_DIA,'Presente') end else INSERT INTO asistencia (id_empleado, entrada_asis, nom_dia_asis, estado) VALUES(@ID_LEIDA,@HORA,@NOM_DIA,'Tarde') END END
Todas las respuestas
-
Y podrias explicar que DESEAS que haga tu procedimiento almacenado
¿porque colocas un SELECT * en el cuerpo de tu procedimiento
SELECT * FROM horario inner join horario_empleado on horario.id_horario = horario_empleado.id_horario inner join empleado on horario_empleado.id_empleado = empleado.id_empleado WHERE empleado.id_empleado = @ID_LEIDA and horario_empleado.nombre_dia = @NOM_DIA
-
-
Hola Dante SQ:
Yo no lo veo exactamente como tu. Te voy a exponer creo que un escenario mas simple para tu caso, y como se puede resolver sin dificultad.
CREATE TABLE ASISTENCIA(ID INT IDENTITY (1,1) PRIMARY KEY, ID_EMPLEADO INT, FECHA DATETIME, ESTADO INT) GO /* creo una tabla de asistencias donde va un indice de la tabla, el empleado, un campo fecha hora que registra las insercciones, y el estado (que esto es tu logica de negocio la cual desconozco) */ CREATE TABLE EMPLEADO (IDEMP INT IDENTITY (1,1) PRIMARY KEY, NOMBRE VARCHAR(10)) GO /* creo mi ejemplo de tabla de empleados, puesto que lo unico que necesito es idemp */ INSERT INTO EMPLEADO (NOMBRE) VALUES ('JUAN'),('ANA'),('BEA'),('LUCAS') GO /* inserto unos registros para las pruebas */ CREATE PROCEDURE REGISTRAR_ASISTENCIA (@ID_EMPLEADO INT, @ESTADO INT) /* el procedimiento almacenado recibe el empleado y "el estado" lo entrecomillo, porque entiendo realmente que el estado debiera de ser una causistica del empleado no de la asistencia, dado que si te refieres a que esta de baja o de alta , o de ... pero por si acaso lo dejo como parametro, aunque salvo que digas algo en contrario yo lo eliminaria */ AS BEGIN BEGIN TRY BEGIN TRAN /*inicio transaccion*/ INSERT INTO ASISTENCIA (ID_EMPLEADO, FECHA, ESTADO) VALUES (@ID_EMPLEADO, GETDATE(), @ESTADO) /*inserto el empleado la fecha y hora actuales y el "estado" */ COMMIT TRAN /*si la transaccion es buena la confirmo */ END TRY BEGIN CATCH ROLLBACK TRAN /* si es mala la deshago */ END CATCH END GO /* fin del procedure */ SELECT * FROM EMPLEADO EXEC REGISTRAR_ASISTENCIA 1,0 /*registro la asistencia del empleado 1, con el "estado 0" */ GO EXEC REGISTRAR_ASISTENCIA 2,0/*registro la asistencia del empleado 2, con el "estado 0" */ GO
Si te fijas en la tabla asistencia, y le haces un select, tienes el empleado la fecha y hora exactas de la ejecución del procedimiento de inserccion. Me acabo de dar cuenta de que a lo mejor ese estado, realmente es para ti, entrada, salida por ejemplo. Al caso, para mi es indiferente.
Y en la tabla tienes tu entrada para el empleado 1 en la cual y ahora es la particularidad cuando tu intentes saber quien ha entrado por ejemplo los miercoles entre las 2 y las 4 horas, solo tienes que utilizar funciones de trabajo con fechas.
https://docs.microsoft.com/es-es/sql/t-sql/functions/datepart-transact-sql
https://docs.microsoft.com/es-es/sql/t-sql/functions/datediff-transact-sql
Esto se parece a lo que tu quieres obtener?
Saludos