none
Procedimiento almacenado para validar registro de asistencia RRS feed

  • 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

    martes, 17 de abril de 2018 20:59

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

    martes, 17 de abril de 2018 21:36
  • quiero que el procedimiento inserte la hora de entrada o la hora de salida dependiendo del horario del personal cuando digite su IDEMPLEADO

    El SELECT está validando si existe el IDEMPLEADO y el dia del Horario.

    martes, 17 de abril de 2018 23:01
  • 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

    miércoles, 18 de abril de 2018 7:00