none
control de ingreso RRS feed

  • Pregunta

  • Buenas tardes
    amigos foreros tengo una consulta estoy haciendo una aplicación de ingreso de usuarios 
    tengo la tabla imagenes con los siguientes campos

    idimagen ,      tarjeta ,      FechaEntrada,                  usuario,

    1                      123          2015-08-26 16:50:25       pablo


    el mismo usuario vuelve a pasar la tarjeta

    idimagen , tarjeta ,              FechaEntrada,                     nombre,

    2                 123                  2015-08-26 16:51:50            pablo 

    el campo FechaEntrada es el tipo datetime

     diferencia seria la hora un minuto mas tarde la ingreso de nuevo


    mi problema que pasa si la tarjeta pasa dos veces en el mismo momento necesito evitar eso 

    que no haya duplicados de ingreso de usurio en un lazo de tiempo corto

    pero depues de los 10 minutos que si puede ingresar nuevamente la tarjeta para guardar los datos

    esta es mi funcion para insertar datos

    Public Function insertar(ByVal datos As vempleado) As Integer
    
            'Declaramos una variable Mysqlcomand'
            Dim cmd As New MySqlCommand
            Try
                'Usuamos nuestra conexion' 
                cmd.Connection = conn
                'indicamos que utilizaremos un procedimiento'
                cmd.CommandType = CommandType.StoredProcedure
                'indicamos el nombre del procedimiento de nuestra base de datos MYSQL'
                cmd.CommandText = "SP_INSERT_Entradas"
                'Declaramos e igualamos los parametros nuestro procedimiento SP_INSERT_Entrada
                cmd.Parameters.Add("?Tarjeta", MySqlDbType.VarChar, 15).Value = datos._targeta
                cmd.Parameters.Add("?Rut", MySqlDbType.Int32).Value = datos._Rut_Empleado
                cmd.Parameters.Add("?Nombre", MySqlDbType.VarChar, 60).Value = datos._Nombre
                cmd.Parameters.Add("?HoraEntrada", MySqlDbType.DateTime).Value = datos._horafecha
    
                'CDate(datos._horafecha)
                
                'Declaramos un integer(entero)'
                Dim i As Integer
                'Abrimos nuestra conexion'
                conn.Open()
                'Se almacenara en nuestro entero el valor de la ejecucion de nuestro procedimiento'
                'por ejemplo si 0 no se pudo ejecutar, en cambio si es 1 se ejecuto correctamente'
                i = cmd.ExecuteNonQuery()
                'Cerramos nuestra conexion'
                conn.Close()
                'Nos retornara un resultado'
                Return i
            Catch ex As MySqlException
                Return MsgBox(ex.Message)
                'MsgBox("Error al operar con la base de datos!", MsgBoxStyle.Critical, "Error!")
            End Try
    
        End Function





    martes, 1 de septiembre de 2015 16:26

Respuestas

  • a donde apunto es que el problema no lo resulves poniendo una limitacion

    deberias dejar que la persona se registre las veces que quiera y despues lo resuelves cuando armas el listado

    baiscamente deberias resolver cual es el horario minimo y maximo en que se registro ese dia y el resto lo descartas, eso con un simple sql puede resolverlo

     

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 1 de septiembre de 2015 17:37
  • Hola djnilo,

    ¿Es posible que alguien que ingreso a las 8:00 pueda salir a las 8:09? ¿Es posible que alguien que salio a las 2:00 regrese a las 2:05? Si eso es posible entonces los 10 minutos de margen no es correcto porque no podrás cubrir esas incidencias, no al momento de la inserciones como tampoco al momento de hacer un reporte ya que no sabrás si es un registro válido o una doble marcacion.

    Lo que te sugiero (sea cual sea la opción que tomes) que el tiempo no sea amplio, 10 minutos me parece excesivo, pienso que 1 o 2 minutos es tiempo prudente para definir si es una doble marcación.

    Sobre tu pregunta, la variable UltimoRegistro deberá tener la fecha/hora del último registro para el empleado, para ello queda claro que antes de hacer la inserción deberás hacer una consulta a la base de datos y obtener ese dato, ese dato lo asignarás a la variable UltimoRegistro.


    OFF TOPIC:

    Máximas en el diseño de software:

    Principio 1: DRY (Don't repeat yourself) No repitas código, encapsula y reutiliza.

    Principio 2: KISS (Keep It Simple, Stupid) Hazlo simple, legible, evita la complejidad innecesaria.

    Principio 3: YAGNI (You Aint't Gonna Need It) No agregues funcionalidad si no es necesario. Básate en requerimientos, no en suposiciones.
    martes, 1 de septiembre de 2015 17:48
  • Hola djnilo,

    No, no es lo que te propuse.

    A ver, lo que tienes que hacer es obtener la fecha del último registro realizado.

    conn.Open()
    Dim sql = "Select FechaEntrada from imagenes where Tajeta = ?"
    
    Dim cmd = New MySqlCommand(sql, conn)
    cmd.Parameters.AddWithValue("@param1", TxtTarjeta.Text)
    Dim UltimoRegistro As DateTime = Convert.ToDateTime(cmd.ExecuteScalar())

    La variable UltimoRegistro ya cuenta con la última fecha (fecha y tiempo) en que ingreso el empleado, lo que queda es saber cuanto tiempo existe entre este momento y la última fecha de ingreso, ello lo consigues restando el tiempo actual contra el último ingreso. Si la diferencia de tiempo es mayor al tiempo que definido entonces haces la inserción.

    Dim Minutos As TimeSpan = DateTime.Now.Subtract(UltimoRegistro)
    
            If Minutos.Minutes > 10 Then
    
                datos._targeta = TxtTarjeta.Text
                datos._Rut_Empleado = TxtRut.Text
                datos._Nombre = TxtNombre.Text
                datos._horafecha = TextBox1.Text
    
                If insetar.insertar(datos) Then
                    MessageBox.Show("Usuario Correctamente Logiado", "Sic ", MessageBoxButtons.OK, MessageBoxIcon.Information)
                    limpiar()
    
    
                Else
                    MessageBox.Show("Usuario no Actorizado", "Sic ", MessageBoxButtons.OK, MessageBoxIcon.Information)
                End If
    
            End If

    Algo mas, mencionas que tienes problemas pero no eres puntual en lo que sucede.

    Coméntanos como te fue.


    OFF TOPIC:

    Máximas en el diseño de software:

    Principio 1: DRY (Don't repeat yourself) No repitas código, encapsula y reutiliza.

    Principio 2: KISS (Keep It Simple, Stupid) Hazlo simple, legible, evita la complejidad innecesaria.

    Principio 3: YAGNI (You Aint't Gonna Need It) No agregues funcionalidad si no es necesario. Básate en requerimientos, no en suposiciones.
    • Editado Willams Morales jueves, 3 de septiembre de 2015 17:04
    • Marcado como respuesta djnilo jueves, 3 de septiembre de 2015 19:11
    jueves, 3 de septiembre de 2015 17:02

Todas las respuestas

  • Hola djnilo,

    Lo que tendrías que hacer es restar la fecha actual contra el último registro, sobre la diferencia determinarás la cantidad de tiempo permitida para hacer la inserción, en tu caso el margen que estableces es 10 minutos. Podrías hace algo como o siguiente:

    Dim UltimoRegistro As New DateTime(2015, 9, 1, 11, 30, 0)
    Dim Minutos As TimeSpan = DateTime.Now.Subtract(UltimoRegistro)		
    
    If Minutos.Minutes > 10 Then
        'Insertar
    End If


    OFF TOPIC:

    Máximas en el diseño de software:

    Principio 1: DRY (Don't repeat yourself) No repitas código, encapsula y reutiliza.

    Principio 2: KISS (Keep It Simple, Stupid) Hazlo simple, legible, evita la complejidad innecesaria.

    Principio 3: YAGNI (You Aint't Gonna Need It) No agregues funcionalidad si no es necesario. Básate en requerimientos, no en suposiciones.
    martes, 1 de septiembre de 2015 16:35
  • hola

    >>mi problema que pasa si la tarjeta pasa dos veces en el mismo momento necesito evitar eso   que no haya duplicados de ingreso de usurio en un lazo de tiempo corto

    pero es el log del ingreso de la persona, porque deberias evitar esto que planteas

    que pasa si por un error mecanico del dispositivo de acceso, o si porque lo retuvieron en el ingreso la persona tiene que pasar nuevamente la tarjeta? lo estarias haciendo esperar 10 min, no le veo sentido

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    martes, 1 de septiembre de 2015 17:14
  • muchas gracias por responder williams Morales pero no se como poner tu codigo para validar el tiempo

    Dim datos As New vempleado
            Dim insetar As New fempleado
    
            Dim UltimoRegistro As New DateTime()
            Dim Minutos As TimeSpan = DateTime.Now.Subtract(UltimoRegistro)
    
    
    
    
    
            If Minutos.Minutes > 10 Then
    
                datos._targeta = TxtTarjeta.Text
                datos._Rut_Empleado = TxtRut.Text
                datos._Nombre = TxtNombre.Text
                datos._horafecha = TextBox1.Text
    
                If insetar.insertar(datos) Then
                    MessageBox.Show("Usuario Correctamente Logiado", "Sic ", MessageBoxButtons.OK, MessageBoxIcon.Information)
                    limpiar()
    
    
                Else
                    MessageBox.Show("Usuario no Actorizado", "Sic ", MessageBoxButtons.OK, MessageBoxIcon.Information)
                End If
    
            End If

    martes, 1 de septiembre de 2015 17:35
  • muchas gracias por responder leandro

    pero lo quiero hacer de esa forma el usuario ingrese solo una vez la tarjeta en el lazo de tiempo corto si pasa 10 minutos que se guarde la informacion nuevamente

    martes, 1 de septiembre de 2015 17:37
  • a donde apunto es que el problema no lo resulves poniendo una limitacion

    deberias dejar que la persona se registre las veces que quiera y despues lo resuelves cuando armas el listado

    baiscamente deberias resolver cual es el horario minimo y maximo en que se registro ese dia y el resto lo descartas, eso con un simple sql puede resolverlo

     

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 1 de septiembre de 2015 17:37
  • Hola djnilo,

    ¿Es posible que alguien que ingreso a las 8:00 pueda salir a las 8:09? ¿Es posible que alguien que salio a las 2:00 regrese a las 2:05? Si eso es posible entonces los 10 minutos de margen no es correcto porque no podrás cubrir esas incidencias, no al momento de la inserciones como tampoco al momento de hacer un reporte ya que no sabrás si es un registro válido o una doble marcacion.

    Lo que te sugiero (sea cual sea la opción que tomes) que el tiempo no sea amplio, 10 minutos me parece excesivo, pienso que 1 o 2 minutos es tiempo prudente para definir si es una doble marcación.

    Sobre tu pregunta, la variable UltimoRegistro deberá tener la fecha/hora del último registro para el empleado, para ello queda claro que antes de hacer la inserción deberás hacer una consulta a la base de datos y obtener ese dato, ese dato lo asignarás a la variable UltimoRegistro.


    OFF TOPIC:

    Máximas en el diseño de software:

    Principio 1: DRY (Don't repeat yourself) No repitas código, encapsula y reutiliza.

    Principio 2: KISS (Keep It Simple, Stupid) Hazlo simple, legible, evita la complejidad innecesaria.

    Principio 3: YAGNI (You Aint't Gonna Need It) No agregues funcionalidad si no es necesario. Básate en requerimientos, no en suposiciones.
    martes, 1 de septiembre de 2015 17:48
  • lo que pasa es que al pasar la tarjeta se presiona un rele  que abre una puerta entoces no queria que el usuario abriera a cada rato la puerta pero esta bueno tu rasocinio leandro
    martes, 1 de septiembre de 2015 17:50
  • gracias por responder Willams Morales voy trata de hacerlo 
    martes, 1 de septiembre de 2015 18:07
  • >>pero lo quiero hacer de esa forma el usuario ingrese solo una vez la tarjeta en el lazo de tiempo corto si pasa 10 minutos que se guarde la informacion nuevamente

    y que logras con eso ? porque la persona puede registrarte varias veces en periodos de 10min y eso generara varios registros al dia

    por eso mencionaba que lo dejes registrar total es lo mismo, pero lo que debes atacar es como trabjas los datos, tomando solo la min y max horas que se registran ese dia

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 1 de septiembre de 2015 18:42
  • williams Morales trate de ocupar tu codigo para solucionar mi problema del ingreso pero tengo problemas con el codigo del formato datetime 

    Dim UltimoRegistro As New DateTime()
            Dim Minutos As TimeSpan = DateTime.Now.Subtract(UltimoRegistro)
    
            conn.Open()
            Dim sql = "Select tarjeta,HoraEntrada from imagenes where Tajeta = ?tarjeta and FechaEntrada = ?UltimoRegistro"
    
            Dim cmd = New MySqlCommand(sql, conn)
            cmd.Parameters.Add("?tarjeta", MySqlDbType.DateTime).Value = TxtTarjeta.Text
            cmd.Parameters.Add("?UltimoRegistro", MySqlDbType.DateTime).Value = TxtEntrada.Text
                Dim result = cmd.ExecuteScalar()
                If result Is Nothing Then
                MessageBox.Show("No hay Entrada")
                Else
                MessageBox.Show("hay entrada " & result.ToString())
                End If
            conn.Close()
    
    con este codigo trato de consulta a la base datos para saber si ya se  ingreso esta tarjeta y la hora 

    jueves, 3 de septiembre de 2015 16:30
  • Hola djnilo,

    No, no es lo que te propuse.

    A ver, lo que tienes que hacer es obtener la fecha del último registro realizado.

    conn.Open()
    Dim sql = "Select FechaEntrada from imagenes where Tajeta = ?"
    
    Dim cmd = New MySqlCommand(sql, conn)
    cmd.Parameters.AddWithValue("@param1", TxtTarjeta.Text)
    Dim UltimoRegistro As DateTime = Convert.ToDateTime(cmd.ExecuteScalar())

    La variable UltimoRegistro ya cuenta con la última fecha (fecha y tiempo) en que ingreso el empleado, lo que queda es saber cuanto tiempo existe entre este momento y la última fecha de ingreso, ello lo consigues restando el tiempo actual contra el último ingreso. Si la diferencia de tiempo es mayor al tiempo que definido entonces haces la inserción.

    Dim Minutos As TimeSpan = DateTime.Now.Subtract(UltimoRegistro)
    
            If Minutos.Minutes > 10 Then
    
                datos._targeta = TxtTarjeta.Text
                datos._Rut_Empleado = TxtRut.Text
                datos._Nombre = TxtNombre.Text
                datos._horafecha = TextBox1.Text
    
                If insetar.insertar(datos) Then
                    MessageBox.Show("Usuario Correctamente Logiado", "Sic ", MessageBoxButtons.OK, MessageBoxIcon.Information)
                    limpiar()
    
    
                Else
                    MessageBox.Show("Usuario no Actorizado", "Sic ", MessageBoxButtons.OK, MessageBoxIcon.Information)
                End If
    
            End If

    Algo mas, mencionas que tienes problemas pero no eres puntual en lo que sucede.

    Coméntanos como te fue.


    OFF TOPIC:

    Máximas en el diseño de software:

    Principio 1: DRY (Don't repeat yourself) No repitas código, encapsula y reutiliza.

    Principio 2: KISS (Keep It Simple, Stupid) Hazlo simple, legible, evita la complejidad innecesaria.

    Principio 3: YAGNI (You Aint't Gonna Need It) No agregues funcionalidad si no es necesario. Básate en requerimientos, no en suposiciones.
    • Editado Willams Morales jueves, 3 de septiembre de 2015 17:04
    • Marcado como respuesta djnilo jueves, 3 de septiembre de 2015 19:11
    jueves, 3 de septiembre de 2015 17:02
  • muchas gracias por tu paciencia williams Morales funciona 

     Dim datos As New vempleado
            Dim insetar As New fmantencionempleados
    
            conn.Open()
            Dim sql = "Select FechaEntrada from imagenes where Tarjeta = ?tarjeta"
    
            Dim cmd = New MySqlCommand(sql, conn)
            cmd.Parameters.AddWithValue("?tarjeta", TxtTarjeta.Text)
            Dim UltimoRegistro As DateTime = Convert.ToDateTime(cmd.ExecuteScalar())
            'La variable UltimoRegistro ya cuenta con la última fecha (fecha y tiempo) en que ingreso el empleado, lo que queda es saber cuanto tiempo existe entre este momento y la última fecha de ingreso, ello lo consigues restando el tiempo actual contra el último ingreso. Si la diferencia de tiempo es mayor al tiempo que definido entonces haces la inserción.
    
            Dim Minutos As TimeSpan = DateTime.Now.Subtract(UltimoRegistro)
    
            If Minutos.Minutes > 10 Then
    
                datos._targeta = TxtTarjeta.Text
                datos._Rut_Empleado = TxtRut.Text
                datos._Nombre = TxtNombre.Text
                datos._horafecha = TxtEntrada.Text
    
                insetar.insertar(datos)
                MessageBox.Show("Usuario Correctamente Logiado", "Sic ", MessageBoxButtons.OK, MessageBoxIcon.Information)
                limpiar()
    
    
            Else
                MessageBox.Show("Usuario no Actorizado", "Sic ", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If
    
    
        End Sub

    jueves, 3 de septiembre de 2015 19:10