Ayuda con lógica sistema de Horarios [RRHH]
#21
Posted 29 September 2010 - 11:27 AM
No me corras el símbolo decimal.
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.
Saludos,
#22
Posted 02 October 2010 - 03:42 PM
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 LEFT JOIN EMPLEADOS E ON E.EMP_ID = A.EMP_ID LEFT JOIN HORARIOS H ON H.HORA_ID = E.EMP_TURNO 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 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 , 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
#23
Posted 02 October 2010 - 04:10 PM
Saludos!
#24
Posted 02 October 2010 - 04:34 PM
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,
#25
Posted 03 October 2010 - 07:49 AM
Yo lo haría así ..
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 JOIN EMPLEADOS E ON E.EMP_ID = A.EMP_ID JOIN HORARIOS H ON H.HORA_ID = E.EMP_TURNO 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).
#26
Posted 04 October 2010 - 07:02 AM
Vaya... creo que te mandé a la horca con mi diseño
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:
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 LEFT JOIN EMPLEADOS E ON E.EMP_ID = A.EMP_ID LEFT JOIN HORARIOS H ON H.HORA_ID = E.EMP_TURNO LEFT JOIN DIAS_HORARIOS DH ON DH.HORA_ID = H.HORA_ID WHERE A.AST_FECHA >= :DESDE AND A.AST_FECHA <= :HASTA AND A.EMP_ID IN (SELECT EMP_ID FROM EMPLEADOS) 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
#27
Posted 04 October 2010 - 07:36 AM
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 .
Saludos.
Attached Files
#28
Posted 04 October 2010 - 07:47 AM
Gracias Fernando por el dato, ya bajé el archivo. En un rato me pongo a verlo y a hacer algunas pruebas.
Saludos,
#29
Posted 04 October 2010 - 06:31 PM
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,
#30
Posted 05 October 2010 - 09:36 AM
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?
¿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 y como para sacarle una consulta.
Saludos,
#31
Posted 05 October 2010 - 09:44 AM
SET TERM ^ ; CREATE OR ALTER PROCEDURE LISTAASISTENCIA ( fdesde DATE, fhasta DATE) RETURNS ( ast_id INTEGER, emp_id INTEGER, ast_fecha DATE, ca_id INTEGER, ast_time1 TIME, ast_time2 TIME, ast_time3 TIME, ast_time4 TIME, nombre_dia VARCHAR(15)) AS DECLARE variable cuantos INTEGER; BEGIN /* Recorre las asistencias entre las fechas */ FOR SELECT ast_id, emp_id, ast_fecha, ca_id, ast_time1, ast_time2, ast_time3, ast_time4 FROM Asistencia WHERE AST_FECHA >= :fdesde AND AST_FECHA <= :fhasta AND ((ast_time1 IS NOT NULL) OR (ast_time2 IS NOT NULL) OR (ast_time3 IS NOT NULL) OR (ast_time4 IS NOT NULL) ) ORDER BY emp_id, ast_fecha INTO :ast_id, :emp_id, :ast_fecha, :ca_id, :ast_time1, :ast_time2, :ast_time3, :ast_time4 do BEGIN 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; IF (:cuantos > 0) THEN BEGIN SELECT DIA_NOMBRE FROM DIAS WHERE DIA_ID = EXTRACT(weekday FROM :ast_fecha) INTO :nombre_dia; suspend; END END END^ SET TERM ; ^ GRANT SELECT ON ASISTENCIA TO PROCEDURE LISTAASISTENCIA; GRANT SELECT ON DIAS_HORARIOS TO PROCEDURE LISTAASISTENCIA; GRANT SELECT ON EMPLEADOS TO PROCEDURE LISTAASISTENCIA; GRANT SELECT ON DIAS TO PROCEDURE LISTAASISTENCIA; GRANT EXECUTE ON PROCEDURE LISTAASISTENCIA TO SYSDBA;
En verdad esta confuso el asunto, jejeje
#32
Posted 05 October 2010 - 10:39 AM
SET TERM ^ ; CREATE OR ALTER PROCEDURE LISTAASISTENCIA ( fdesde DATE, fhasta DATE) RETURNS ( ast_id INTEGER, emp_id INTEGER, ast_fecha DATE, ca_id INTEGER, ast_time1 TIME, ast_time2 TIME, nombre_dia VARCHAR(15)) AS DECLARE variable cuantos INTEGER; BEGIN /* Recorre las asistencias entre las fechas */ FOR SELECT ast_id, emp_id, ast_fecha, ca_id, ast_time1, ast_time2 FROM Asistencia WHERE AST_FECHA >= :fdesde AND AST_FECHA <= :fhasta ORDER BY emp_id, ast_fecha INTO :ast_id, :emp_id, :ast_fecha, :ca_id, :ast_time1, :ast_time2 do BEGIN 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; IF (:cuantos > 0) THEN BEGIN SELECT DIA_NOMBRE FROM DIAS WHERE DIA_ID = EXTRACT(weekday FROM :ast_fecha) INTO :nombre_dia; suspend; END END END^ SET TERM ; ^ GRANT SELECT ON ASISTENCIA TO PROCEDURE LISTAASISTENCIA; GRANT SELECT ON DIAS_HORARIOS TO PROCEDURE LISTAASISTENCIA; GRANT SELECT ON EMPLEADOS TO PROCEDURE LISTAASISTENCIA; GRANT SELECT ON DIAS TO PROCEDURE LISTAASISTENCIA; GRANT EXECUTE ON PROCEDURE LISTAASISTENCIA TO SYSDBA;
Saludos.
#33
Posted 05 October 2010 - 11:43 AM
Saludos,
#34
Posted 05 October 2010 - 03:52 PM
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 jejeje
#35
Posted 05 October 2010 - 04:26 PM
ya eso lo sabiamos amigo :p jejeje
Ouch.
Saludos,