Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Buenas tardes.
Estimados, espero estén muy bien, soy de Venezuela y estoy reciente en el uso de qlikview y me parece una excelente herramienta.
En estos momento estoy desarrollando una aplicación para llevar el control de acceso a las oficinas.
La información que obtengo es la siguiente:
Cédula | Fecha | H_Entrada | H_Salida | Total de Horas |
15664062 | 2016-04-25 | 07:03:49 | 18:50:01 | 11:46:12 |
15664062 | 2016-04-26 | 13:29:05 | 17:56:43 | 04:27:38 |
15664062 | 2016-04-27 | 07:14:01 | 17:46:24 | 10:32:23 |
16429625 | 2016-04-26 | 07:10:51 | 17:35:31 | 10:24:40 |
16429625 | 2016-04-27 | 07:16:08 | 17:04:14 | 09:48:06 |
18096033 | 2016-04-25 | 06:04:20 | 16:50:55 | 10:46:35 |
18096033 | 2016-04-26 | 06:04:04 | 16:49:35 | 10:45:31 |
18096033 | 2016-04-27 | 05:53:17 | 15:35:21 | 09:42:04 |
La expresión "Total de Horas" la la extraigo de la siguiente forma: Interval(H_Salida-H_Entrada, ' hh:mm').
Actualmente estoy detenido, ya que necesito obtener en una expresión que me indique si cada empleado cumplió con el total de horas por día, dándose ciertas condiciones las cuales detallo a continuación.
He dedicado más de 3 semanas buscando en foros y tutoriales y de verdad que no logro manejar las expresiones con horas.
Agradezco mucho su colaboración.
Hola,
El script por ejemplo te quedaría así (adaptalo a tu código):
Horas:
LOAD * INLINE [
Emp, HoraIn, HoraOut
1, 07:05:10, 20:45:00
2, 08:00:00, 19:00:00
3, 12:00:00, 18:00:00
4, 06:55:10, 17:45:00
];
Final:
Load Emp,
HoraIn,
HoraOut,
Interval(RangeMin(HoraOut,MakeTime(17)) - RangeMax(HoraIn, MakeTime(7)),'hh:mm:ss') as HorasTrabajas_7_a_17,
Interval(RangeMin(HoraOut,MakeTime(17)) - HoraIn,'hh:mm:ss') as HorasTrabajadas,
If(HoraIn<=MakeTime(7) and HoraOut>=MakeTime(17),'En Tiempo','Fuera de Tiempo') as Estado_Tiempo
resident Horas;
Drop Table Horas;
Con Respecto a lo de la fracción de Hora no lo acabo de entender. Lo que hace el MaKeTime es crearte la hora --> MakeTime(7) = 07:00:00... Entonces te aseguras que las horas del trabajador siempre te las sume dentro del horario establecido. Es decir, si ellos trabajan de 7 a 17:00 si entran a las 6:55 esos 5 minutos no le van a contar en el caso Horas_Trabajadas_7_a_17 pero si en el caso HorasTrabajadas.
El MakeTime si quieres hacer las 7:15 pues tienes que poner MakeTime(7,15)
Saludos,
Hola Luis,
Para el intervalo de las horas prueba mejor con esto (ya que te calculará siempre de 7 a 17:00)
Horas:
LOAD * INLINE [
Emp, HoraIn, HoraOut
1, 07:05:10, 20:45:00
2, 08:00:00, 19:00:00
3, 12:00:00, 18:00:00
4, 06:55:10, 17:45:00
];
Final:
Load Emp,
HoraIn,
HoraOut,
Interval(RangeMin(HoraOut,MakeTime(17)) - RangeMax(HoraIn, MakeTime(7)),'hh:mm:ss') as HorasTrabajadas
resident Horas;
Drop Table Horas;
O si no quieres poner hora de entrada:
Interval(RangeMin(HoraOut,MakeTime(17)) - HoraIn,'hh:mm:ss') as HorasTrabajadas
Si lo que quieres es que solo te sume si cumple ponle un If delante pero tienes que pensar que vas a hacer con las horas que te faltan o que no cuentan... (es decir si entro a las 8:15 no me suman las horas?)
Saludos,
Hola Jordi, gracias por tu pronta respuesta, me falto colocar en mi enunciado que deseo obtener es un texto que me diga "En tiempo" o "Fuera de Tiempo". Si se cumple las condiciones anteriores diga "En Tiempo" si no se cumple diga "Fuera de Tiempo"
Me surge la duda cuando me dices que solo me calculará de 7 a 17. Como se haría si quiero calcular una fracción de hora?
Hola,
El script por ejemplo te quedaría así (adaptalo a tu código):
Horas:
LOAD * INLINE [
Emp, HoraIn, HoraOut
1, 07:05:10, 20:45:00
2, 08:00:00, 19:00:00
3, 12:00:00, 18:00:00
4, 06:55:10, 17:45:00
];
Final:
Load Emp,
HoraIn,
HoraOut,
Interval(RangeMin(HoraOut,MakeTime(17)) - RangeMax(HoraIn, MakeTime(7)),'hh:mm:ss') as HorasTrabajas_7_a_17,
Interval(RangeMin(HoraOut,MakeTime(17)) - HoraIn,'hh:mm:ss') as HorasTrabajadas,
If(HoraIn<=MakeTime(7) and HoraOut>=MakeTime(17),'En Tiempo','Fuera de Tiempo') as Estado_Tiempo
resident Horas;
Drop Table Horas;
Con Respecto a lo de la fracción de Hora no lo acabo de entender. Lo que hace el MaKeTime es crearte la hora --> MakeTime(7) = 07:00:00... Entonces te aseguras que las horas del trabajador siempre te las sume dentro del horario establecido. Es decir, si ellos trabajan de 7 a 17:00 si entran a las 6:55 esos 5 minutos no le van a contar en el caso Horas_Trabajadas_7_a_17 pero si en el caso HorasTrabajadas.
El MakeTime si quieres hacer las 7:15 pues tienes que poner MakeTime(7,15)
Saludos,
Hola Luis:
Mi procedimiento para gestionar tiempo es convertirlo a minutos (o segundos cuando aplica).
En tu ejemplo:
LOAD Hour(HoraEntrada) * Minute(HoraEntrada) as MinutoEntrada
Hour(HoraSalida) * Minute(HoraSalida) as MinutoSalida
Hour(HoraSalida) * Minute(HoraSalida) Hour(HoraEntrada) * Minute(HoraEntrada) as MinutosTrabajado
9h 45' = 585 '
Minuto Inicial Rango = 420
Minuto Final Rango = 1080
Antes de las 08:01 <= 481
Después de las 16:59 => 1019
A partir de este punto creo que las comparaciones entre minutos trabajados y el resto de valores son más sencillas
Si te gusta esta posibilidad le daremos más vueltas.
Saludos
Joaquín
Buenos días.
Gracias Jordi por tu respuesta, utilice tu sugerencia en una expresión.
If(H_Entrada<=MakeTime(7,15) and H_Salida>=MakeTime(17),'Cumple','No Cumple')
Me funciono perfectamente.
De verdad muchas gracias a todos y me disculpan el no haber respondido antes.
Hola Luis,
Genial, me alegra que lo hayas podido solucionar.
Cierra el hilo para que la gente pueda consultar en próximas ocasiones.
Saludos,
Disculpa mi ignorancia, como cierro el hilo de esta discusión?
Hola Luis,
De ignorancia nada, era que marcases la respuesta como correcta para que la gente si algun dia busca vea que se ha solucionado el caso.
Saludos,