Ir al contenido


Foto

Ayuda con lógica sistema de Horarios [RRHH]


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

#21 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 29 septiembre 2010 - 11:27

Ha... no, no..

No me corras el símbolo decimal.  :D :D

Para que no te confundas con tu moneda, te lo pongo en dólares (a tasa de hoy, según el cambio argentino de 4,02): 252,28. Te lo dejo directamente a 250 dlrs.  :D

Saludos,
  • 0

#22 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 02 octubre 2010 - 03:42

Bueno sigo con este asunto, aplicando la lógica de Delphius, ahora necesito hacer el reporte en base a esos datos, tengo la siguiente consulta que me lanza todos los días registrados:



sql
  1. SELECT A.EMP_ID, A.AST_FECHA, A.AST_TIME1,A.AST_TIME2, A.CA_ID, EXTRACT(WEEKDAY FROM A.AST_FECHA) AS DIA, E.EMP_NAME, E.EMP_LAST, E.EMP_AREA, E.EMP_TURNO, H.HORA_ENT, H.HORA_SAL FROM ASISTENCIA A
  2. LEFT JOIN EMPLEADOS E ON E.EMP_ID = A.EMP_ID
  3. LEFT JOIN HORARIOS H ON H.HORA_ID = E.EMP_TURNO
  4. WHERE A.AST_FECHA >= :DESDE AND A.AST_FECHA <= :HASTA AND A.EMP_ID IN (SELECT EMP_ID FROM EMPLEADOS)



Todo perfecto, pero me muestra todos los días, ahora, lo que necesito hacer es sacar sólo los días correspondientes al horario asignado a un empleado, o sea, tenemos las tablas HORARIOS (h) y DIAS_HORARIOS donde éste último son los días asignados a los horarios (Lunes,Martes, miercoles...) y tabla DIAS donde están registrados los días de semana, en la tabla EMPLEADOS (E) está el campo EMP_TURNO que es el ID de HORARIOS (h), los registros de ponches o asistencias están en la tabla ASISTENCIA (A), ¿cómo reporteo sólo los días correspondientes al horario por cada empleado?, NOTA: la consulta que mostré anteriormente funciona perfectamente, sólo que me muestra todos los días, por ejemplo:

El empleado fulano de tal tiene asignado el HORARIO HO01 la cual sólo trabajará los Lunes y viernes y fulanito de tal tiene asignado el HORARIO HO02 la cual trabajara los días Martes, Miercoles y JUeves, el resultado debería ser el siguiente:

Fulano de Tal
05/10/2010  Lunes  08:00 AM  03:00 PM
09/10/2010  Viernes 08:03 AM  02:49 PM

Fulanito de Tal
06/10/2010  Martes  08:15 AM  01:50 PM
07/10/2010  Miercol  07:53 AM  01:48 PM
08/10/2010  Jueves  08:00 AM  02:02 PM

Más sin embargo obtengo esto

Fulano de Tal
05/10/2010  Lunes  08:00 AM  03:00 PM
06/10/2010  Martes  00:00 AM  00:00 PM
07/10/2010  Miercol  00:00 AM  00:00 PM
08/10/2010  Jueves  00:00 AM  00:00 PM
09/10/2010  Viernes 08:03 AM  02:49 PM
10/10/2010  Sabado  00:00 AM  00:00 PM
11/10/2010  Doming  00:00 AM  00:00 PM

Fulanito de Tal
05/10/2010  Lunes  00:00 AM  00:00 PM
06/10/2010  Martes  08:15 AM  01:50 PM
07/10/2010  Miercol  07:53 AM  01:48 PM
08/10/2010  Jueves  08:00 AM  02:02 PM
09/10/2010  Viernes  00:00 AM  00:00 PM
10/10/2010  Sabado  00:00 AM  00:00 PM
11/10/2010  Doming  00:00 AM  00:00 PM

Una mano por favor :D
  • 0

#23 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 02 octubre 2010 - 04:10

¿Eso lo obtienes con ese query verdad?


Saludos!
  • 0

#24 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 02 octubre 2010 - 04:34

Vaya... creo que te mandé a la horca con mi diseño  :p  :

A ver si voy comprendiendo... seguiste mi propuesta y tienes la tabla HORARIOS y la tabla DIAS, y la tabla DIAS_HORARIOS como la intermedia entre ambas.
Perfecto, allí voy entendiendo.
Luego tienes las tablas EMPLEADOS y la tabla ASISTENCIA... y allí me pierdo  :( No logro entender como es la relación entre las tablas EMPLEADO  y ASISTENCIA con las anteriores...
Si me puedes describir a la tabla EMPLEADO y ASISTENCIA quizá logre verlo mejor.

¿La consulta que expones te da los datos agrupados por usuario? O tu por claridad los tabulaste de ese modo? Porque no veo la cláusula GRUOP BY.

Saludos,
  • 0

#25 Gallosuarez

Gallosuarez

    Newbie

  • Miembros
  • Pip
  • 3 mensajes

Escrito 03 octubre 2010 - 07:49

Enecumene:

Yo lo haría así ..


sql
  1. SELECT A.EMP_ID, A.AST_FECHA, A.AST_TIME1,A.AST_TIME2, A.CA_ID, EXTRACT(WEEKDAY FROM A.AST_FECHA) AS DIA, E.EMP_NAME, E.EMP_LAST, E.EMP_AREA, E.EMP_TURNO, H.HORA_ENT, H.HORA_SAL FROM ASISTENCIA A
  2.     JOIN EMPLEADOS E ON E.EMP_ID = A.EMP_ID
  3.     JOIN HORARIOS H ON H.HORA_ID = E.EMP_TURNO
  4. WHERE A.AST_FECHA >= :DESDE AND A.AST_FECHA <= :HASTA AND A.EMP_ID IN (SELECT EMP_ID FROM EMPLEADOS)



Es decir, le quito las sentencia LEFT...

Saludos,
Gerardo Suárez Trejo

P.D. Tengo un sistema totalmente funcional en varias escuelas para registrar asistencias, el concepto es casi el mismo, aunque la forma que tengo de hacer mis consultas varía (me he preocupado sobre todo por la eficiencia en lo que respecta a la velocidad). 

  • 0

#26 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 04 octubre 2010 - 07:02

Vaya... creo que te mandé a la horca con mi diseño  :p  :

A ver si voy comprendiendo... seguiste mi propuesta y tienes la tabla HORARIOS y la tabla DIAS, y la tabla DIAS_HORARIOS como la intermedia entre ambas.
Perfecto, allí voy entendiendo.
Luego tienes las tablas EMPLEADOS y la tabla ASISTENCIA... y allí me pierdo  :( No logro entender como es la relación entre las tablas EMPLEADO  y ASISTENCIA con las anteriores...
Si me puedes describir a la tabla EMPLEADO y ASISTENCIA quizá logre verlo mejor.

¿La consulta que expones te da los datos agrupados por usuario? O tu por claridad los tabulaste de ese modo? Porque no veo la cláusula GRUOP BY.

Saludos,


Ah vaya, no me había fijado que la consulta está incompleta, la consulta correcta es ésta:



sql
  1. SELECT A.EMP_ID, A.AST_FECHA, A.AST_TIME1, A.AST_TIME2, A.CA_ID, EXTRACT(WEEKDAY FROM A.AST_FECHA) AS DIA, E.EMP_NAME, E.EMP_LAST,
  2.         E.EMP_AREA, E.EMP_TURNO, H.HORA_ENT, H.HORA_SAL  FROM ASISTENCIA A
  3.         LEFT JOIN EMPLEADOS E ON E.EMP_ID = A.EMP_ID
  4.         LEFT JOIN HORARIOS H ON H.HORA_ID = E.EMP_TURNO
  5.         LEFT JOIN DIAS_HORARIOS DH ON DH.HORA_ID = H.HORA_ID
  6.         WHERE A.AST_FECHA >= :DESDE AND A.AST_FECHA <= :HASTA AND A.EMP_ID IN (SELECT EMP_ID FROM EMPLEADOS) 
  7.         GROUP BY A.EMP_ID, A.AST_FECHA, A.AST_TIME1, A.AST_TIME2, A.CA_ID, E.EMP_NAME, E.EMP_LAST, E.EMP_AREA, E.EMP_TURNO, H.HORA_ENT, H.HORA_SAL ORDER BY E.EMP_LAST, E.EMP_NAME, E.EMP_AREA, A.AST_FECHA



@GalloSuarez, muchas gracias por la recomendación, deja hacer la prueba, aunque tal como tengo la consulta me funciona perfectamente.

Saludos
  • 0

#27 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 04 octubre 2010 - 07:36

Amigo Delphiuste adjunto las estructura de las tablas ASISTENCIA y EMPLEADOS.

Los registros de asistencias se sacan de la tabla de ASISTENCIA, se generan todos los días de la semana por empleados, ahora, lo que necesito hacer es integrar la tabla DIAS_HORARIOS, para mostrar sólo los días correspondientes del horario asignado a cada empleado, no sé si me hice entender pues :p.

Saludos.

Archivos adjuntos


  • 0

#28 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 04 octubre 2010 - 07:47

Hola,
Gracias Fernando por el dato, ya bajé el archivo. En un rato me pongo a verlo y a hacer algunas pruebas.

Saludos,
  • 0

#29 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 04 octubre 2010 - 06:31

Hola,

Disculpa Fernando, no he podido sentarme tranquilo frente a la PC en todo el santo día. Me han estado ******* los ***** todo el santo día.  :@
A ver si mañana saco tiempo y lo analizo mejor.

Saludos,
  • 0

#30 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 05 octubre 2010 - 09:36

Hola amigo,
No se que me pasa... cada vez que veo tu tema es como si se me bloqueara la cabeza...  : hay algo que no me cuadra demasiado. ¿Qué relación debe cumplir la tabla ASISTENCIA con EMPLEADOS o alguna otra tabla?  ^o|

¿Es posible que haya alguna otra entidad en el medio? ¿La asistencia se da por empleado, y por turno?

En principio una consulta similar a la que expones debería funcionar... quisiera hacer una representación lo más aproximada de tu diseño para ver donde está el meollo del asunto y poder determinar cual es el problema en mi cabeza que no me cierra.

Nunca me he bloqueado tanto pensando en un DER  :o  :| y como para sacarle una consulta.  :(

Saludos,
  • 0

#31 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 05 octubre 2010 - 09:44

Eso que quieres la forma mas facil es un SP



sql
  1. SET TERM ^ ;
  2.  
  3. CREATE OR ALTER PROCEDURE LISTAASISTENCIA (
  4. fdesde DATE,
  5. fhasta DATE)
  6. RETURNS (
  7. ast_id INTEGER,
  8. emp_id INTEGER,
  9. ast_fecha DATE,
  10. ca_id INTEGER,
  11. ast_time1 TIME,
  12. ast_time2 TIME,
  13. ast_time3 TIME,
  14. ast_time4 TIME,
  15. nombre_dia VARCHAR(15))
  16. AS
  17. DECLARE variable cuantos INTEGER;
  18. BEGIN
  19. /* Recorre las asistencias entre las fechas */
  20. FOR
  21. SELECT ast_id, emp_id, ast_fecha, ca_id, ast_time1,
  22. ast_time2, ast_time3, ast_time4
  23. FROM
  24. Asistencia
  25. WHERE
  26. AST_FECHA >= :fdesde AND
  27. AST_FECHA <= :fhasta AND
  28. ((ast_time1 IS NOT NULL) OR
  29. (ast_time2 IS NOT NULL) OR
  30. (ast_time3 IS NOT NULL) OR
  31. (ast_time4 IS NOT NULL) )
  32. ORDER BY emp_id, ast_fecha
  33. INTO :ast_id, :emp_id, :ast_fecha, :ca_id, :ast_time1, :ast_time2, :ast_time3, :ast_time4 do
  34. BEGIN
  35. SELECT COUNT(*) FROM dias_horarios dh WHERE dh.hora_id = (SELECT EMP_turno FROM empleados E WHERE E.emp_id = :emp_id) AND dh.dia_id = EXTRACT(weekday FROM :ast_fecha) INTO :cuantos;
  36. IF (:cuantos > 0) THEN
  37. BEGIN
  38. SELECT DIA_NOMBRE FROM DIAS WHERE DIA_ID = EXTRACT(weekday FROM :ast_fecha) INTO :nombre_dia;
  39. suspend;
  40. END
  41. END
  42.  
  43. END^
  44.  
  45. SET TERM ; ^
  46.  
  47. GRANT SELECT ON ASISTENCIA TO PROCEDURE LISTAASISTENCIA;
  48.  
  49. GRANT SELECT ON DIAS_HORARIOS TO PROCEDURE LISTAASISTENCIA;
  50.  
  51. GRANT SELECT ON EMPLEADOS TO PROCEDURE LISTAASISTENCIA;
  52.  
  53. GRANT SELECT ON DIAS TO PROCEDURE LISTAASISTENCIA;
  54.  
  55. GRANT EXECUTE ON PROCEDURE LISTAASISTENCIA TO SYSDBA;



En verdad esta confuso el asunto, jejeje
  • 0

#32 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 05 octubre 2010 - 10:39

Gracias eduarcol, eso es lo que necesitaba con unos cuantos ajustes el procedimiento funciona perfecto hasta el momento, la cosa queda así:



sql
  1. SET TERM ^ ;
  2.  
  3. CREATE OR ALTER PROCEDURE LISTAASISTENCIA (
  4.     fdesde DATE,
  5.     fhasta DATE)
  6. RETURNS (
  7.     ast_id INTEGER,
  8.     emp_id INTEGER,
  9.     ast_fecha DATE,
  10.     ca_id INTEGER,
  11.     ast_time1 TIME,
  12.     ast_time2 TIME,
  13.     nombre_dia VARCHAR(15))
  14. AS
  15. DECLARE variable cuantos INTEGER;
  16. BEGIN
  17.     /* Recorre las asistencias entre las fechas */
  18.     FOR
  19.         SELECT ast_id, emp_id, ast_fecha, ca_id, ast_time1,
  20.         ast_time2 FROM Asistencia WHERE
  21.         AST_FECHA >= :fdesde AND
  22.         AST_FECHA <= :fhasta ORDER BY emp_id, ast_fecha
  23.         INTO :ast_id, :emp_id, :ast_fecha, :ca_id, :ast_time1, :ast_time2 do
  24.     BEGIN
  25.         SELECT COUNT(*) FROM dias_horarios dh WHERE dh.hora_id = (SELECT EMP_turno FROM empleados E WHERE E.emp_id = :emp_id) AND dh.dia_id = EXTRACT(weekday FROM :ast_fecha) INTO :cuantos;
  26.             IF (:cuantos > 0) THEN
  27.                 BEGIN
  28.                     SELECT DIA_NOMBRE FROM DIAS WHERE DIA_ID = EXTRACT(weekday FROM :ast_fecha) INTO :nombre_dia;
  29.                     suspend;
  30.                 END
  31.     END
  32.  
  33. END^
  34.  
  35. SET TERM ; ^
  36.  
  37. GRANT SELECT ON ASISTENCIA TO PROCEDURE LISTAASISTENCIA;
  38.  
  39. GRANT SELECT ON DIAS_HORARIOS TO PROCEDURE LISTAASISTENCIA;
  40.  
  41. GRANT SELECT ON EMPLEADOS TO PROCEDURE LISTAASISTENCIA;
  42.  
  43. GRANT SELECT ON DIAS TO PROCEDURE LISTAASISTENCIA;
  44.  
  45. GRANT EXECUTE ON PROCEDURE LISTAASISTENCIA TO SYSDBA;



Saludos.
  • 0

#33 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 05 octubre 2010 - 11:43

Pues no se me pasó por la cabeza la idea de un SP. Bua... no me funciona la cabeza  :

Saludos,
  • 0

#34 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 05 octubre 2010 - 03:52

Pues no se me pasó por la cabeza la idea de un SP. Bua... no me funciona la cabeza  :

Saludos,


ya eso lo sabiamos amigo :p:p jejeje
  • 0

#35 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 05 octubre 2010 - 04:26

ya eso lo sabiamos amigo :p:p jejeje


:o  :|  :(  :

Ouch.  :D

Saludos,
  • 0




IP.Board spam blocked by CleanTalk.