Ir al contenido


Foto

Calcular hora de máxima asistencia

Delphi MySQL Graficas

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

#1 jmonfor

jmonfor

    Member

  • Miembros
  • PipPip
  • 20 mensajes

Escrito 11 abril 2016 - 04:35

Muy buenas a todos. Mi nombre es Javier y es mi primer tema en este foro, foro que sigo desde hace años porque sois todos unos cracks y realizáis una labor increíble. 

 

Mi problema es el siguiente:

 

estoy desarrollando una aplicación para el control y gestión de una piscina de una comunidad de vecinos. Una de las necesidades que se plantea es el conocer la hora de máxima asistencia de usuarios a la piscina de una fecha elegida en un datetimepicker. 

 

He implementado una consulta que me muestra datos de usuarios que estaban presentes en la piscina en el día seleccionado:


delphi
  1. //mostramos los usuarios presentes en la fecha establecida
  2. datamodule1.ZQuery_Busqueda.SQL.Clear;
  3. datamodule1.ZQuery_Busqueda.SQL.Add('SELECT USUARIO,HORA_ENTRADA,HORA_SALIDA,ID_USUARIO,NOMBRE,APELLIDOS,CODIGO_SOCIO,TIPO_USUARIO, INVITADOS');
  4. datamodule1.ZQuery_Busqueda.SQL.Add('case CARNET when 1 then :F4 when 0 then :F5 end AS CARNET,');
  5. datamodule1.ZQuery_Busqueda.SQL.Add('FROM REGISTRO_ACTIVIDAD INNER JOIN USUARIO ON REGISTRO_ACTIVIDAD.USUARIO = USUARIO.ID_USUARIO');
  6. datamodule1.ZQuery_Busqueda.SQL.Add('AND HORA_ENTRADA = :F1');
  7. datamodule1.ZQuery_Busqueda.ParamByName('F1').AsDate := datetimepicker1.Date;
  8. datamodule1.ZQuery_Busqueda.ParamByName('F4').AsString := 'SI';
  9. datamodule1.ZQuery_Busqueda.ParamByName('F5').AsString := 'NO';
  10. datamodule1.ZQuery_Busqueda.Active := True;
  11.  
  12. dbgrid1.Columns[0].FieldName := 'HORA_ENTRADA';
  13. dbgrid1.Columns[1].FieldName := 'HORA_SALIDA';
  14. dbgrid1.Columns[2].FieldName := 'NOMBRE';
  15. dbgrid1.Columns[3].FieldName := 'APELLIDOS';
  16. dbgrid1.Columns[4].FieldName := 'CODIGO_SOCIO';
  17. dbgrid1.Columns[5].FieldName := 'TIPO_USUARIO';
  18. dbgrid1.Columns[6].FieldName := 'INVITADOS';
  19. dbgrid1.Columns[7].FieldName := 'CARNET';

El siguiente paso, como os he comentado, es agrupar los usuarios presentes en ese día según la hora de entrada de los mismos y poder saber los usuarios activos por hora, calcular el pico máximo de asistencia y representarlo gráficamente.

 

Sinceramente ando un poco atascado, así que os agradezco de antemano vuestra ayuda.

 

Un saludo .

 


  • 0

#2 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 11 abril 2016 - 10:01

Es un tema relacionado a base de datos..

Con que motor estas trabajando?

 

Si es mysql puedes usar group by. Esa clausula te permite agrupar por ejemplo por hora de entrada los registros que resulten de la consulta...

 

Y un consejo es ejecutar el query en la bd antes de volcarlo a los procesos en delphi...


  • 1

#3 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 11 abril 2016 - 11:06

El siguiente paso, como os he comentado, es agrupar los usuarios presentes en ese día según la hora de entrada de los mismos y poder saber los usuarios activos por hora, calcular el pico máximo de asistencia y representarlo gráficamente.

 

Sinceramente ando un poco atascado, así que os agradezco de antemano vuestra ayuda.

 

Un saludo .

 

Yo lo que haría es crear una tabla de horarios del tipo

 

Hora inicio, Hora fin. Visitantes

05:00          06:00

           ..

           ..

22:00  ..     23:00

 

Luego con un cursor recorrer a los visitantes e incrementar  el campo correspondiente en los horarios de entrada y salida. Con ello obtendrás un sumario de visitantes por cada hora y además podrás obtener datos como la hora de mayor afluencia, promedio por hora, etc.

 

Saludos.    


  • 1

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 11 abril 2016 - 02:52

En MySQL sería de esta manera:

sql
  1. SELECT COUNT(DISTINCT usuario), HOUR(Hora) FROM visitas WHERE Fecha = '2016-04-11' GROUP BY HOUR(Hora)

Esto te devolverá la cantidad de visitas por hora.

Saludos.
  • 1

#5 jmonfor

jmonfor

    Member

  • Miembros
  • PipPip
  • 20 mensajes

Escrito 12 abril 2016 - 04:26

Solucionado! Muchísimas gracias.
Un saludo
  • 0

#6 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 12 abril 2016 - 05:05

Cual fue la solución?.

Enviado desde mi SPH-L720 mediante Tapatalk
  • 1

#7 jmonfor

jmonfor

    Member

  • Miembros
  • PipPip
  • 20 mensajes

Escrito 12 abril 2016 - 10:10

Cual fue la solución?.

Enviado desde mi SPH-L720 mediante Tapatalk

 

Ups! mil perdones

Pues esta es la solución, tal y como me indicaste:


delphi
  1. datamodule1.ZQuery_Horas.SQL.Clear;
  2.   datamodule1.ZQuery_Horas.SQL.Add('SELECT HOUR(HORA_ENTRADA) AS HORA, COUNT(DISTINCT USUARIO) AS USUARIOS, SUM(INVITADOS) AS INVITADOS');
  3.   datamodule1.ZQuery_Horas.SQL.Add('FROM REGISTRO_ACTIVIDAD');
  4.   datamodule1.ZQuery_Horas.SQL.Add('WHERE DATE(HORA_ENTRADA) = :F1');
  5.   datamodule1.ZQuery_Horas.SQL.Add('GROUP BY HOUR(HORA_ENTRADA)');
  6.   datamodule1.ZQuery_Horas.ParamByName('F1').AsDate := datetimepicker1.Date;
  7.  
  8.   datamodule1.ZQuery_Horas.Active := True;

y el resultado muestra el número de usuarios presentes ( no repetidos) agrupados por horas.

 

Muchas gracias!!!


  • 0





Etiquetado también con una o más de estas palabras: Delphi, MySQL, Graficas