Ir al contenido


Foto

Sistema de Asistencia


  • Por favor identifícate para responder
16 respuestas en este tema

#1 jltf2308

jltf2308

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 12 abril 2013 - 03:27

tengo una tabla access que guarda en un campo la fecha larga, es decir dd/mm/yyyy hh:nn:ss... necesito primero que todo separar ambos datos para luego ir filtrando por horas especificas... en si estoy trabajando en un sistema de asistencia de personal, y dependiendo de las horas quiero tener hora de entrada y salida... quien me orienta por favor
  • 0

#2 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 12 abril 2013 - 03:47

Hola
Aqui tienes un programa de asistencia completo.
Trabaja con base de datoes access tambien.
Saludos

Archivos adjuntos


  • 0

#3 jltf2308

jltf2308

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 12 abril 2013 - 03:50

Revisando
  • 0

#4 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 12 abril 2013 - 03:56

Hola
El programa toma la foto del empleado.
Necesitas un componente para ese fin.
Aqui lo dejo, solo instalalo y ya.
Saludos

Archivos adjuntos


  • 0

#5 jltf2308

jltf2308

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 12 abril 2013 - 04:52

Gracias por el aporte, el detalle está en que necesito manejar los datos directamente de la base de datos que ya tengo establecida ya que esta se llena desde un equipo de registro de asistencia, es decir maneja la toma de asistencia a través de huella dactilar.
Necesito calcular horas extras, dias trabajados e inasistencias... Pero la base de datos almacena hora y fecha como una variable datetime, por lo cual me toma todo el valor en un solo campo
Esta es la captura de la base de datos
Imagen Enviada

con este codigo logro hacer un filtro de fecha y hora, ya que la hora la establezco en dtpicker



delphi
  1. ADOQuery1.Active:= False;
  2.   ADOQuery1.SQL.Text:= 'SELECT distinct * From V_Record';
  3.   ADOQuery1.SQL.Add('where (Checktime between :hora1 and :hora2)');
  4.   ADOQuery1CheckTime.DisplayFormat := 'dd/mm/yyyy';
  5.   ADOQuery1.Parameters.ParamByName('hora1').Value := FormatDateTime('dd,mm,yyyy', horaent1.Time);
  6.   ADOQuery1.Parameters.ParamByName('hora2').Value := FormatDateTime('dd,mm,yyyy', horasal1.Time);
  7.   ADOQuery1.Active:= True;



lo que quiero es mediante filtros separar hora de entrada y salida... a menos que exista otro metodo
  • 0

#6 Jose_Augusto

Jose_Augusto

    Member

  • Miembros
  • PipPip
  • 35 mensajes

Escrito 12 abril 2013 - 05:15

Hola Comunidad,

Bueno, espero que me pueda explicar sobre mi humilde sugerencia y forma de ver las reglas del negocio.

Tienes en una tabla todas las asistencias, tanto entradas como salidas, salidas intermedias y entradas intermedias, porque puede que un empleado tenga un horario mixto de trabajar.
necesitas generar una tarjeta o kardex de asistencia por cada empleado de tal manera que te quede

empleado:
fecha dia.                        E                  S 
dd/mm/aaaa              hh:nn:SS        hh:nn:ss
dd/mm/aaaa              hh:nn:SS        hh:nn:ss
dd/mm/aaaa              hh:nn:SS        hh:nn:ss

o en su defecto
empleado:
fecha dia.                        E                  SI                EI              S
dd/mm/aaaa              hh:nn:ss        hh:nn:ss    hh:nn:ss    hh:nn:ss
dd/mm/aaaa              hh:nn:ss        hh:nn:ss    hh:nn:ss    hh:nn:ss
dd/mm/aaaa              hh:nn:ss        hh:nn:ss    hh:nn:ss    hh:nn:ss

esto es correcto...?

si es asi

la solucion esta en el horario, turno, o configuración que tenga establecida el empleado, por un lado, o tomar las asistencias por pares. pero el problema es si el empleado se le olvido marcar alguna. es por eso que me voy mas por la primer opcion.

creas un filtro para traer la entrada, como es esto.
creas una consulta donde preguntes por la asistencia que se acerque mas a la hora de entrada, esto es manejando una tolerancia.      hora de entrada + ó - tolerancia

creas un filtro para traer la salida, como es esto.
creas una consulta donde preguntes por la asistencia que se acerque mas a la hora de salida, esto es manejando una tolerancia.      hora de salida + ó - tolerancia

espero haberme explicado y que mi comentario sea lo que esperas y si es así o si salieron mas dudas, con gusto puedo ayudarte.
  • 0

#7 jltf2308

jltf2308

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 12 abril 2013 - 05:24

Emparejar las horas es lo que quiero... ya con el filtro puedo tener los chequeos que esten entre fecha1 y fecha2... actualmente puedo ver esos chequeos tomando en cuenta la hora. esta consulta la muestro en un dbgrid, alli mismo quiero mostrar fecha, entrada salida_inter, entrada_inter y salida, pero ni idea de como poder manejar esos datos dentro del grid
  • 0

#8 Jose_Augusto

Jose_Augusto

    Member

  • Miembros
  • PipPip
  • 35 mensajes

Escrito 12 abril 2013 - 05:34

no te sirve utilizar un ClientDataSet?, primero haciendo una consulta donde por cada empleado buscas las fechas distintas y despues barres la consulta, fecha por fecha filtrando entradas y salidas una vez que tengas una fecha completa con sus entradas y salidas la agregas al ClientdataSet y claro el dbgrid lo ligas al ClientDataSet
  • 0

#9 jltf2308

jltf2308

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 13 abril 2013 - 07:10

he visto esa sugerencia en otros foros, pero no se como ejecutarla, en realidad ya estoy en el punto donde el fin justifica los medios ya que hago esto por dos cosas, para aprender y poder desarrollar algo mas elaborado, pero me hacen falta las herramientas de conocimiento para eso me uni a la comunidad y decidi abrir el tema para que me ayuden a buscar solucion
  • 0

#10 Jose_Augusto

Jose_Augusto

    Member

  • Miembros
  • PipPip
  • 35 mensajes

Escrito 15 abril 2013 - 08:05

Hola Nuevamente,

Si no mal recuerdo cuando agregas el componente ClientDataSet desde el grupo "Data Access", en su propiedad FieldDefs defines los campos que vas a utilizar, una vez definidos, clic segundario sobre el componente (derecho) y clic sobre Create DataSet y listo ya esta funcionando  tu ClientDataSet, ya lo puedes ligar a un TDataSource y a tus Datacontrols. lo manipulas como un TTable.

Imagen Enviada

revisa este blog, es una maravilla, te dará mas pistas de como usar este componente, espero  te sirva la ayuda.

http://delphiallimit...emoria-con.html
  • 0

#11 jltf2308

jltf2308

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 18 abril 2013 - 03:54



delphi
  1. begin
  2. //Filtro por contenido del combobox
  3. //filtro Todos
  4.   if ComboBox1.text = 'Todos' then
  5.   begin
  6.       ADOQuery1.Active:= False;
  7.       ADOQuery1.SQL.Text:= 'SELECT * From V_Record';
  8.       ADOQuery1.SQL.Add('where (Checktime between :hora1 and :hora2)');
  9.       ADOQuery1CheckTime.DisplayFormat := 'hh:nn:ss';
  10.       //ADOQuery1.Parameters.ParamByName('nombre').Value := ComboBox1.Text;
  11.       ADOQuery1.Parameters.ParamByName('hora1').Value := horaent1.datetime;
  12.       ADOQuery1.Parameters.ParamByName('hora2').Value := horasal1.datetime;
  13.       ADOQuery1.Active:= True;
  14.         ADOQuery1.First;
  15.   while not ADOQuery1.Eof do
  16.     begin
  17.         ClientDataSet1.Append;
  18.         ClientDataSet1Legajo.Value := adoquery1userid.Value;
  19.         ClientDataSet1Cedula.Value := adoquery1NativePlace.Value;
  20.         ClientDataSet1Nombre.Value := adoquery1Name.Value;
  21.         ClientDataSet1Fecha.Value := adoquery1Checktime.Value;
  22.         ClientDataSet1HoraE.Value := adoquery1Checktime.Value;
  23.         ADOQuery1.Next;
  24.     end;
  25.   end
  26. //Filtro por nombre
  27.   else
  28.   begin
  29.   ADOQuery1.Active:= False;
  30.   ADOQuery1.SQL.Text:= 'SELECT * From V_Record';
  31.   ADOQuery1.SQL.Add('where (Checktime between :hora1 and :hora2)and Name = :nombre');
  32.   ADOQuery1CheckTime.DisplayFormat := 'hh:nn:ss';
  33.   ADOQuery1.Parameters.ParamByName('nombre').Value := ComboBox1.Text;
  34.   ADOQuery1.Parameters.ParamByName('hora1').Value := horaent1.datetime;
  35.   ADOQuery1.Parameters.ParamByName('hora2').Value := horasal1.datetime;
  36.   ADOQuery1.Active:= True;
  37.     ADOQuery1.First;
  38.   while not ADOQuery1.Eof do
  39.     begin
  40.         ClientDataSet1.Append;
  41.         ClientDataSet1Legajo.Value := adoquery1userid.Value;
  42.         ClientDataSet1Cedula.Value := adoquery1NativePlace.Value;
  43.         ClientDataSet1Nombre.Value := adoquery1Name.Value;
  44.         ClientDataSet1Fecha.Value := adoquery1Checktime.Value;
  45.         ClientDataSet1HoraE.Value := adoquery1Checktime.Value;
  46.         ADOQuery1.Next;
  47.     end;
  48.   end;


  • 0

#12 jltf2308

jltf2308

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 18 abril 2013 - 04:03

a partir de lo anterior, quiero hacer un filtro de hora y asi obtener una tabla que me muestre la fecha el nombre la hora de entrada y salida
  • 0

#13 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 19 abril 2013 - 03:31

No uso access, pero en FireBird existen varias soluciones:

1) "Separar" fecha y hora desde la propia SQL y obtener dos campos distintos (más al respecto aquí http://www.firebirds...20-extract.html):

Select Extract(hour from MyField) as hora

En access parece que tienes algo similar llamado DatePart() "para campos calculados": http://msdn.microsof...(v=SQL.80).aspx

2) Usar el campo como float, y como la fecha va en la parte entera y la hora en la decimal, redondeando y esas cosas separas una cosa de otra, o si tienes funciones de redondeo y esas cosas, puedes filtrar por hora usando (date-round(date))
  • 0

#14 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 19 abril 2013 - 08:23

Sería de mucha ayuda si nos mostrarás los campos de la tabla. De esa manera podríamos armar una consulta que se ajuste a lo que necesitas amigo mio
  • 0

#15 jltf2308

jltf2308

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 19 abril 2013 - 10:11

Gracias por el aporte, el detalle está en que necesito manejar los datos directamente de la base de datos que ya tengo establecida ya que esta se llena desde un equipo de registro de asistencia, es decir maneja la toma de asistencia a través de huella dactilar.
Necesito calcular horas extras, dias trabajados e inasistencias... Pero la base de datos almacena hora y fecha como una variable datetime, por lo cual me toma todo el valor en un solo campo
Esta es la captura de la base de datos
Imagen Enviada

con este codigo logro hacer un filtro de fecha y hora, ya que la hora la establezco en dtpicker



delphi
  1. ADOQuery1.Active:= False;
  2.   ADOQuery1.SQL.Text:= 'SELECT distinct * From V_Record';
  3.   ADOQuery1.SQL.Add('where (Checktime between :hora1 and :hora2)');
  4.   ADOQuery1CheckTime.DisplayFormat := 'dd/mm/yyyy';
  5.   ADOQuery1.Parameters.ParamByName('hora1').Value := FormatDateTime('dd,mm,yyyy', horaent1.Time);
  6.   ADOQuery1.Parameters.ParamByName('hora2').Value := FormatDateTime('dd,mm,yyyy', horasal1.Time);
  7.   ADOQuery1.Active:= True;



lo que quiero es mediante filtros separar hora de entrada y salida... a menos que exista otro metodo


este es el formato de la tabla de donde extraigo los datos
la tabla resultante quedaría
en vez de checktime, seria fecha, horaentrada horasalida
en realidad ya la parte de separar fecha y hora lo solucione dando formato al query...
Es decir, ya tengo la fecha en un campo, la hora de entrada en otro campo,  me hace falta una consulta para sacar la hora de salida... no se si me explico
  • 0

#16 Jose_Augusto

Jose_Augusto

    Member

  • Miembros
  • PipPip
  • 35 mensajes

Escrito 19 abril 2013 - 12:22

Hola,

Bueno, revisando el codigo que nos muestras, encuentro lo siguiente:

-El contenido de la Tquery lo pasas completo al ClientDataSet.
-Estoy entendiendo que en la consulta pides todas las "asistencias" de una misma fecha que estan entre la entrada y la salida. en lo ideal cada empleado tendrá un par de asistencias. ¿estamos de acuerdo?
-En vez de pasar "Todo" al TclientDataSet, analiza cada fecha-hora que encuentras de acuerdo a la configuracion que tengas del horario laboral, al "barrer" los registros de la consulta decidas, cual es entrada y cual es salida, de acuerdo a dicha configuración laboral.
-ahora que si lo quieres todo en la consulta puedes intentar hacer subconsultas para que te filtre la entrada y la salida. pero tienes que manejar un rango para la entrada y un rango para la salida


creas un filtro para traer la entrada, como es esto.
creas una consulta donde preguntes por la asistencia que se acerque mas a la hora de entrada, esto es manejando una tolerancia.      hora de entrada + ó - tolerancia

creas un filtro para traer la salida, como es esto.
creas una consulta donde preguntes por la asistencia que se acerque mas a la hora de salida, esto es manejando una tolerancia.      hora de salida + ó - tolerancia


por ejemplo Un Empleado que su jornada laboral empieza a las 8 AM y termina 5 PM no quiere decir que todos los dias va a llegar en punto, sobre todo que los registros se guardan hasta en milisegundos, no puedes preguntar si entro exactamente a esa hora, ni tampoco puedes "separar" la hora de entrada porque daría lo mismo entrar 8:01 que 8:59.
mejor toma un rango. manejas un rango de tolerancia para entrar antes de la hora asignada como entrada, y un rango despues, para tomarla como un retado. es decir, 15 minutos antes y 15 minutos despues por ejemplo.

entonces ya en tu consulta agregas una subconsulta para la entrada y Otra para la salida

SELECT V_Record.* , (SELECT MIN(Checktime) FROM V_Record WHERE Checktime between :hora1 and :hora2) as ENTRADA, (SELECT MAX(Checktime) FROM V_Record WHERE Checktime between :hora3 and :hora4) as SALIDA
From V_Record
WHERE
Checktime = :FECHA


El min en la entrada es para que tome la primera del dia y el Max es para que tome la ultima del dia en la salida. ya teniendo esto puedes pasarlo directamente al DBgrid o al clientdataset por si quieres hacer otro proceso.
esta es una forma burda de solucionarlo. ya que el control de asistencias es complejo ya que hay otras "circunstancias" que necesitas contemplar y controlar, retardos, inasistencias, permisos, si al usuario se le olvidó marcar alguna, tolerancias, en fin.

espero que haya sido clara mi idea, y te pueda servir
  • 0

#17 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 19 abril 2013 - 05:41

Sin entrar en detalles de tu problema porque no dispongo de mucho tiempo, solo puedo decirte que MsAccess cuenta con funciones predefinas para obtener la parte que necesites de un campo del tipo  DateTime:

Por ejemplo si quieres recuperar solo la hora del campo CHECKTIME harías algo así:

SELECT HOUR(CHECKTIME) FROM TU_TABLA
WHERE
/*TUS CONDICIONES*/



Si quieres recuperar solo los minutos del campo CHECKTIME harías algo así:

SELECT MINUTE(CHECKTIME) FROM TU_TABLA
WHERE
/*TUS CONDICIONES*/


Si quieres recuperar solo los segundos del campo CHECKTIME harías algo así:

SELECT SECOND(CHECKTIME) FROM TU_TABLA
WHERE
/*TUS CONDICIONES*/


Si quieres recuperar solo el mes del campo CHECKTIME harías algo así:

SELECT MONTH(CHECKTIME) FROM TU_TABLA
WHERE
/*TUS CONDICIONES*/


Si quieres recuperar solo el día del campo CHECKTIME harías algo así:

SELECT DAY(CHECKTIME) FROM TU_TABLA
WHERE
/*TUS CONDICIONES*/


Si quieres recuperar solo el año del campo CHECKTIME harías algo así:

SELECT YEAR(CHECKTIME) FROM TU_TABLA
WHERE
/*TUS CONDICIONES*/


Como es lógico también puedes usar estas funciones dentro de las condiciones de tus consultas, por ejemplo, a la siguiente consulta le pasas los parámetros de  fecha y horas que quieras obtener:


SELECT * FROM V_RECORD WHERE
(CHECKTIME = :FECHA) AND
(HOUR(CHECKTIME) BETWEEN :HORA1 AND :HORA2)


Saludos.
  • 0




IP.Board spam blocked by CleanTalk.