IPB

Welcome Guest ( Log In | Register )

 
Reply to this topicStart new topicStart Poll

Outline · [ Standard ] · Linear+

> Control De Asistencia, como Registrar las inasistencias

telemaquia
post Jun 26 2008, 08:09 PM
Post #1


Nuevo
*

Group: Members
Posts: 4
Joined: 26-June 08
Member No.: 792



Hola a todos, estoy programando un sistema para el control de asistencia de una empresa. Mi gran problema es que no sé como registrar las ausencias ya que el marcado de asistencia se hace mediante la digitación del número del documento de identidad, ahora bien, en un principio lo que hacia era pasar todos los nº de los trabajadores a una tabla temporal de manera tal que cuando la persona marcaba se colocaba un check en el registro y asi diferenciaba a los q asistieron de los que no, luego estos datos los pasaba a una tabla histórica llamada ASISTENCIA, este proceso lo realizaba durante la madrugada; sin embargo, la red de la empresa tiende a desconectarse lo q afecta a mi programa ya que no realiza el traspaso y muchas veces se ha chancado (sobreescrito) la data del dìa anterior, asi que este es mi problema, ojala puedan darme ideas, y si pueden tb código, ah por cierto he tratado de bajar el código de las huellas digitales pero sólo me sale una pestaña del explorador con un monton de caracteres y nada más, acaso lo estoy haciendo mal? Gracias de antemano a todos.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
VMandrake
post Jun 26 2008, 11:11 PM
Post #2


Moderador Global
****

Group: Moderadores Globales
Posts: 100
Joined: 4-November 05
Member No.: 18



Realiza un codigo de actualización de faltas, por fecha o por mes ejecutado por el administrador del equipo verificando si el empleado marco en el periodo laboral de trabajo, ahora en realidad no se como es la estructura de tu sistema, pero deberias controlar faltas por periodos por que supongo que un trabajo se puede definir de horario continuo de un solo periodo de una hora a otra, o entre periodos caso que se da mayormente, es decir si yo trabajo de 8:00 am a 12:00 pm es un periodo de 2:00 pm a 8:00 pm otro periodo, no voy en la mañana pero trabajo en la tarde debe registrarme falta en el periodo de la mañana no por todo el dia, vi tu otro codigo de actualización de salida y me preguntaba si te controla lo que acabo de mencionar, por que manejariamos 2 horas de entrada y 2 de salida por dia. Tambien se daria los casos de controlar la fecha de salida tambien ya que hay personal nocturno que entra a las 10:00 pm , por un ejemplo y se va al dia siguiente tienes que indicar que fecha marco su entra y que fecha marco su salida y muchas otras cosas más, pero en realidad no se si contempla eso tu sistema solo queria saber algunas cosas.
Ah y si no deseas pasar el control de faltas a un administrador con un boton que diga actualizar faltas, haz una llamada a esa función cada vez que se habra la parte de reportes cool.gif , saludos.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
telemaquia
post Jun 27 2008, 05:08 AM
Post #3


Nuevo
*

Group: Members
Posts: 4
Joined: 26-June 08
Member No.: 792



hola VMandrake mira esta es mi tabla temporal:

temporal:
dni
fecha
hringreso (hora de ingreso)
hrsalida (hora de salida)
hr1
.
.
.
hr10
condicion (si llego tarde o no)
falta (indicador de asistencia, es booleano)

cuando el empleado marca se activa el campo FALTA y se actualizan los demas datos, todo esto es diario, es decir esta tabla solo registra lo del día xq luego paso estos datos a la tabla ASISTENCIA que es idéntica a la TEMPORAL y que contiene las marcaciones de toda la semana y mes, la verdad no habia comtemplado todo aquello que me dices y q tiene bastante lógica. Observando la bbdd de datos de un programa llamado INGRESSIO observo que tiene dos tablas iguales una llamada RegistroIngreso y otra llamada RegistroNoIngreso, que supongo contiene los datos de las personas que no han marcado, por eso mi duda, estará bien lo que estoy haciendo? Ahora, como expuse anteriormente el trapaso que realiza el sistema se ve afectada x la red que se desconecta justo a la hora en que se realiza el proceso (aun cuando ya he cambiado la hora) asi que hay dias en los que llego a mi trabajo y... se chancaron los datos de la tabla temporal poque no se llego hacer el traspaso!!! este es el codigo del reloj que creo ya lo viste:
CODE

f rs.State = 1 Then rs.Close
Set rs = cn.Execute("SELECT * FROM EMPLEADOS WHERE DNI='" & xbusca & "'")
If rs.EOF Then

' MsgBox "El Código que ha ingresado es incorrecto, por favor ingreselo nuevamente", 64
TXTdni = ""
TXTdni.SetFocus
frmCONECTAR.Show vbModal
Set rs = Nothing
Else

'//* CAPTURA LA HORA DE ENTRADA Y SALIDA

If rt.State = 1 Then rt.Close
rt.Open "SELECT HRENTRADA,HRSALIDA FROM EMPLEADOS WHERE DNI='" & xbusca & "'", cn, adOpenKeyset, adLockOptimistic
hora = rt.Fields(0)
HORASAL = rt.Fields(1)

'//* BUSCA LA CONCORDANCIA DE CODIGO (DNI)

If rc.State = 1 Then rc.Close
rc.Open "SELECT * FROM TEMPORAL WHERE DNI='" & xbusca & "'", cn, adOpenKeyset, adLockOptimistic

hring = IIf(IsNull(rc.Fields(8)), "", (rc.Fields(8)))
'//* ACTUALIZA LOS DATOS DE ACUERDO A LA HORA DE INGRESO Y SALIDA

If rc.RecordCount = 1 Then

If FormatDateTime(Time, 4) <= FormatDateTime(hora, 4) Then
sentencia = "UPDATE TEMPORAL SET FECHAING='" & LBLingreso & "',"
sentencia = sentencia + "HRINGRESO='" & Time & "',"
sentencia = sentencia + "CONDICION='" & "TEMPRANO" & "', FALTA=" & CHKasist & ""
sentencia = sentencia + " WHERE DNI='" & xbusca & "'"
cn.Execute (sentencia)
TXTdni = ""
ElseIf FormatDateTime(Time, 4) > FormatDateTime(hora, 4) And FormatDateTime(Time, 4) < FormatDateTime(HORASAL, 4) Then
If hring = "" Then
sentencia = "UPDATE TEMPORAL SET FECHAING='" & LBLingreso & "',"
sentencia = sentencia + "HRINGRESO='" & Time & "',"
sentencia = sentencia + "CONDICION='" & "TARDE" & "', FALTA=" & CHKasist & ""
sentencia = sentencia + " WHERE DNI='" & xbusca & "'"
cn.Execute (sentencia)
TXTdni = ""
ElseIf h1 = "" Then
sentencia = "UPDATE TEMPORAL SET FECHAING='" & LBLingreso & "',"
sentencia = sentencia + "HR1='" & Time & "',"
sentencia = sentencia + "FALTA=" & CHKasist & ""
sentencia = sentencia + " WHERE DNI='" & xbusca & "'"
cn.Execute (sentencia)
TXTdni = ""
ElseIf h2 = "" Then
sentencia = "UPDATE TEMPORAL SET FECHAING='" & LBLingreso & "',"
sentencia = sentencia + "HR2='" & Time & "',"
sentencia = sentencia + "FALTA=" & CHKasist & ""
sentencia = sentencia + " WHERE DNI='" & xbusca & "'"
cn.Execute (sentencia)
TXTdni = ""
ElseIf h3 = "" Then
sentencia = "UPDATE TEMPORAL SET FECHAING='" & LBLingreso & "',"
sentencia = sentencia + "HR3='" & Time & "',"
sentencia = sentencia + "FALTA=" & CHKasist & ""
sentencia = sentencia + " WHERE DNI='" & xbusca & "'"
cn.Execute (sentencia)
TXTdni = ""
ElseIf h4 = "" Then
sentencia = "UPDATE TEMPORAL SET FECHAING='" & LBLingreso & "',"
sentencia = sentencia + "HR4='" & Time & "',"
sentencia = sentencia + "FALTA=" & CHKasist & ""
sentencia = sentencia + " WHERE DNI='" & xbusca & "'"
cn.Execute (sentencia)
TXTdni = ""
ElseIf h5 = "" Then
sentencia = "UPDATE TEMPORAL SET FECHAING='" & LBLingreso & "',"
sentencia = sentencia + "ALMS='" & Time & "',"
sentencia = sentencia + "FALTA=" & CHKasist & ""
sentencia = sentencia + " WHERE DNI='" & xbusca & "'"
cn.Execute (sentencia)
TXTdni = ""
ElseIf h6 = "" Then
sentencia = "UPDATE TEMPORAL SET FECHAING='" & LBLingreso & "',"
sentencia = sentencia + "ALME='" & Time & "',"
sentencia = sentencia + "FALTA=" & CHKasist & ""
sentencia = sentencia + " WHERE DNI='" & xbusca & "'"
cn.Execute (sentencia)
TXTdni = ""
ElseIf h7 = "" Then
sentencia = "UPDATE TEMPORAL SET FECHAING='" & LBLingreso & "',"
sentencia = sentencia + "HR5='" & Time & "',"
sentencia = sentencia + "FALTA=" & CHKasist & ""
sentencia = sentencia + " WHERE DNI='" & xbusca & "'"
cn.Execute (sentencia)
TXTdni = ""
ElseIf h8 = "" Then
sentencia = "UPDATE TEMPORAL SET FECHAING='" & LBLingreso & "',"
sentencia = sentencia + "HR6='" & Time & "',"
sentencia = sentencia + "FALTA=" & CHKasist & ""
sentencia = sentencia + " WHERE DNI='" & xbusca & "'"
cn.Execute (sentencia)
TXTdni = ""
ElseIf h9 = "" Then
sentencia = "UPDATE TEMPORAL SET FECHAING='" & LBLingreso & "',"
sentencia = sentencia + "HR7='" & Time & "',"
sentencia = sentencia + "FALTA=" & CHKasist & ""
sentencia = sentencia + " WHERE DNI='" & xbusca & "'"
cn.Execute (sentencia)
TXTdni = ""
ElseIf h10 = "" Then
sentencia = "UPDATE TEMPORAL SET FECHAING='" & LBLingreso & "',"
sentencia = sentencia + "HR8='" & Time & "',"
sentencia = sentencia + "FALTA=" & CHKasist & ""
sentencia = sentencia + " WHERE DNI='" & xbusca & "'"
cn.Execute (sentencia)
TXTdni = ""
Else
Beep
MsgBox "Ud ha excedido el numero de salidas, por favor contáctese con la persona encargada", 64
TXTdni = ""
End If
ElseIf FormatDateTime(Time, 4) >= FormatDateTime(HORASAL, 4) Then
If Not IsNull(rc.Fields(8)) Then
sentencia2 = "UPDATE TEMPORAL SET HRSALIDA='" & Time & "'"
sentencia2 = sentencia2 + " WHERE DNI='" & xbusca & "'"
cn.Execute (sentencia2)
TXTdni = ""
Else
Beep
MsgBox "Ud no ha registrado su ingreso, por favor contáctese con la persona encargada", 64
TXTdni = ""
End If
End If


End If

End If


como verás es bastante limitado puesto que solo contempla 5 salidas con sus respectivos ingresos durante el día, este tipo ddee tabla me parece más eficiente puesto que permite un número ilimitado de salidas:

ASISTENCIA
dni
fecha
hora
entradasalida (esta es una marca que indica que es lo que se está ingresando)

aqui sólo bastaría un INSERT y no tendria que hacer el dichoso traspaso, pero y las faltas??? esta es la funcion que hace el traspaso de datos y que llena la tabla temporal para que los empleados puedan marcar:
CODE

''//* PASO LOS DATOS DE LA TABLA TEMPORAL A LA TABLA ASISTENCIA
   SENTENCIA3 = "INSERT INTO ASISTENCIA SELECT * FROM TEMPORAL"
   cn.Execute (SENTENCIA3)
   
   '//* LIMPIA LA TABLA TEMPORAL
   Set rs = cn.Execute("DELETE FROM TEMPORAL")
   
   '//* PASA LOS DATOS DE LA TABLA EMPLEADOS A LA TABLA TEMPORAL
   If rs.State = 1 Then rs.Close
   Set rs = cn.Execute("INSERT INTO TEMPORAL (DNI) SELECT DNI FROM EMPLEADOS")
   sentencia2 = "UPDATE TEMPORAL SET FECHAING='" & Format(LBLingreso, "DD/MM/YYYY") & "'"      ' LBLingreso tiene la fecha
   cn.Execute (sentencia2)

Gracias por tu tiempo, si necesitas puedo enviarte mi codigo fuente, comenzaré a trabajar en lo que dices, porque si bien en mi trabajo hay un sólo horario existe una persona que trabaja de madrugada y que lo había excluido sin intención, te agradecería me guies para mejorar el sitema, gracias por todo.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
VMandrake
post Jul 6 2008, 01:13 AM
Post #4


Moderador Global
****

Group: Moderadores Globales
Posts: 100
Joined: 4-November 05
Member No.: 18



Hola disculpa por el retraso, no tuve tiempo de entrar a la red por cuestiones de trabajo Bueno estuve analizando lo que escribiste y yo pienso, que está bien que te bases en lo que otros programas tienen que ofrecer al cliente, para realizar en este caso el control de asistencia, PERO solo para mejorar lo que ves y superar a la competencia, no para que te mates analizando o comprendiendo que hace que, usa tú logica haz lo tuyo, tienes cualidades.
Bueno lo de usar la tabla Temporal, no me convence mucho ya que se presenta ese problema que tu mencionas, en mi caso la omitiria en mi primer proyecto se presento la misma opción, claro que tb no solo me servia eso sino tambien para filtrar marcaciones repetidas, pero despues de analizar note que era algo inconsistente, ademas que si te das cuenta cuando trabajas con una gran cantidad de datos, depende del manejador de BD que usas, tb que tipo de equipo tienes, para solucionar problemas y realizar un buen trabajo es empezar a optimizar tu codigo lo mas que puedas ya que si saturas tu sistema quedara colgado laugh.gif .

Ya que estas trabajando con un BD pequeña por lo que veo, te recomiendo que solo uses una tabla principal, digamos marcaciones aparte de los campos correspondientes colocas iduser, hora entrada, hora salida, fecha entrada,desde ahi todo depende de tu programación, por ejemplo la primera marcacion que realize el usuario llenara los campos hora entrada y fecha entrada, cuando realize mi segunda marcación el sistema buscara mi registro por la fecha y por supuesto por mi Id, como lo encuentra modificara el campo hora salida insertando la hora salida, despues podrias manejar una tabla faltas, que se actualizaria dinamicamente o se actualizaria por el usuario al solo hacer un clic, tendria que ejecutarse un modulo donde tengas codigo que consulte a la BD en la tabla marcaciones, este codigo puedes hacer que se ejecute un dia despues de las anteriores marcaciones o al terminar el día, consultas a la tabla marcaciones por la Fecha, los que no tengan tuplas en la fecha determinada pues son los que tienen falta, y esos datos se insertan en la tabla faltas, donde tienes iduser fecha de falta, claro que puedes extenderte más pero esa es la base. así que adelante cool.gif
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
telemaquia
post Jul 25 2008, 09:09 PM
Post #5


Nuevo
*

Group: Members
Posts: 4
Joined: 26-June 08
Member No.: 792



Hola a Todos, he estado algo ocupado y no pude responder, de antemano gracias a VMandrakem por los consejos, bueno al final mi tabla de marcaciones quedo de esta manera:
REGISTROINGRESO:
-DNI (codigo)
-FECHAING (Fecha de Ingreso)
-HRINGRESO (Hora de marcación)
-MANUAL (sirve para identificar si la marcación se realizó mendiante el reloj o manualmente en el administrador)
-MARCA (sirve para numerar las marcaciones de manera que el nº1 es el ingreso y el último nº la salida, esto me permite tener un numero indetreminado de ingresos y salidas, el sistema ya no es tan rigido como el anterior pero...)

Este es mi código en vb para el reloj:

Private Sub ingreso()
dim xbusca as string
dim bingreso as byte
xbusca = TXTdni

Call conectar
'//* verifica la conección (cn) de no haber, guarda el dni en un archivo de texto
If cn.State = 0 Then
GuardarArchivo "C:\Asistencia.txt", xbusca & Date & " " & Time & " " & 0
TXTdni = ""
Else
'//* ADVIERTE QUE EL CODIGO (DNI) ES INCORRECTO DE ACUERDO A LOS EXISTENTES EN LA BBDD

If rs.State = 1 Then rs.Close
Set rs = cn.Execute("SELECT * FROM EMPLEADOS WHERE DNI='" & xbusca & "'")
If rs.EOF Then
TXTdni = ""
TXTdni.SetFocus
frmERROR.Show vbModal
GuardarArchivo "C:\Asistencia.txt", xbusca & Date & " " & Time & " " & 1
Set rs = Nothing
Else
'//* Inserta los registros
If rc.State = 1 Then rc.Close
rc.Open "SELECT TOP 1 MARCA FROM REGISTROINGRESO WHERE DNI='" & xbusca & "' AND FechaIng=#" & Format(Date, "YYYY/MM/DD") & "# ORDER BY Marca DESC", cn, adOpenKeyset, adLockOptimistic
If rc.RecordCount = 0 Then
bingreso = 1
SQL = "INSERT INTO REGISTROINGRESO (DNI,FECHAING,HRINGRESO,"
SQL = SQL + "MANUAL,MARCA) VALUES ('" & xbusca & "','" & LBLingreso & "',"
SQL = SQL + "'" & Time & "','" & lblMANUAL & "','" & bingreso & "')"
GuardarArchivo "C:\Asistencia.txt", xbusca & Date & " " & Time
cn.Execute (SQL)
TXTdni = ""
Else
bingreso = rc.Fields("Marca") + 1
SQL = "INSERT INTO REGISTROINGRESO (DNI,FECHAING,HRINGRESO,"
SQL = SQL + "MANUAL,MARCA) VALUES ('" & xbusca & "','" & LBLingreso & "',"
SQL = SQL + "'" & Time & "','" & lblMANUAL & "','" & bingreso & "')"
GuardarArchivo "C:\Asistencia.txt", xbusca & Date & " " & Time
cn.Execute (SQL)
TXTdni = ""
End If

End If
Set rs = Nothing
Set rt = Nothing
Set rc = Nothing
End If
End Sub

ahora mi problema es como hacer una consulta para que el registro de salida se muestre al lado del registro de ingreso he intentado varias cosas con subconsultas y eso pero nada, les agradecería una manito.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Reply to this topicTopic OptionsStart new topic
1 User(s) are reading this topic (1 Guests and 0 Anonymous Users)
0 Members:
 

Lo-Fi Version Time is now: 22nd November 2008 - 01:46 AM