Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Saludos. Necesito calcular las horas que transcurren desde que un empleado entra a trabajar hasta el momento en que sale, tengo los datos de entrada y salida con fecha y hora en el mismo archivo de Excel, pero no encuentro cómo hacer para que queden en un mismo registro. Estos son los datos de entrada:
Id | Empleado | Fecha | Hora | Tipo |
1 | Manuel C. | 01/08/2014 | 3:00:00 a. m. | Entrada |
2 | Carlos A. | 01/08/2014 | 10:00:00 a. m. | Entrada |
3 | Manuel C. | 01/08/2014 | 1:00:00 p. m. | Salida |
4 | Carlos A. | 01/08/2014 | 8:00:00 p. m. | Salida |
5 | Teresa B. | 01/08/2014 | 11:00:00 p. m. | Entrada |
6 | Teresa B. | 02/08/2014 | 6:00:00 a. m. | Salida |
7 | Manuel C. | 02/08/2014 | 2:00:00 p. m. | Entrada |
8 | Manuel C. | 02/08/2014 | 8:00:00 p. m. | Salida |
9 | Carlos A. | 03/08/2014 | 6:00:00 a. m. | Entrada |
10 | Teresa B. | 03/08/2014 | 4:00:00 p. m. | Entrada |
11 | Teresa B. | 03/08/2014 | 8:00:00 p. m. | Salida |
12 | Manuel C. | 03/08/2014 | 8:00:00 p. m. | Entrada |
13 | Carlos A. | 03/08/2014 | 8:00:00 p. m. | Salida |
14 | Manuel C. | 04/08/2014 | 7:00:00 a. m. | Salida |
Y así es que necesito que quede el reporte:
Empleado | Fecha Entrada | Hora Entrada | Fecha Salida | Hora Salida |
Carlos A. | 01/08/2014 | 10:00:00 a. m. | 01/08/2014 | 8:00:00 p. m. |
Carlos A. | 03/08/2014 | 6:00:00 a. m. | 03/08/2014 | 6:00:00 p. m. |
Teresa B. | 01/08/2014 | 11:00:00 p. m. | 02/08/2014 | 6:00:00 a. m. |
Teresa B. | 03/08/2014 | 4:00:00 p. m. | 03/08/2014 | 8:00:00 p. m. |
Manuel C. | 01/08/2014 | 3:00:00 a. m. | 01/08/2014 | 1:00:00 p. m. |
Manuel C. | 02/08/2014 | 2:00:00 p. m. | 02/08/2014 | 8:00:00 p. m. |
Manuel C. | 03/08/2014 | 8:00:00 p. m. | 04/08/2014 | 7:00:00 a. m. |
Agradezco cualquier ayuda.
Ya encontré la solución, la dejo por si alguien la puede necesitar. Gracias a quienes contestaron.
1. Como para cada dato de entrada debe existir uno de salida se hace una recarga de los datos, ordenados por Empleado y el campo ID. Se asume que ya está cargada la tabla [Marcaciones_x] con todos los campos. Solo se tienen en cuenta los registros 'Salida'.
[Marcaciones_y]:
LOAD
*,
//Si el empleado es el mismo del registro anterior, si el registro actual es de Salida y si el registro actual es mayor que el anterior, se toman la fecha y hora
If(Ced_Empleado = Peek(Ced_Empleado) AND Sentido = 'Salida' AND Id_Registro > Peek(Id_Registro), Peek(Fecha)) AS Fecha_Entrada,
If(Ced_Empleado = Peek(Ced_Empleado) AND Sentido = 'Salida' AND Id_Registro > Peek(Id_Registro), Peek(Hora)) AS Hora_Entrada,
RESIDENT [Marcaciones_x]
ORDER BY Ced_Empleado, Id_Registro;
2. Se hace una recarga de [Marcaciones_y] pero solo de los registros 'Salida', que son los que quedan con los datos.
3. La información de la entrada/salida de cada empleado queda en el mismo registro y se puede hacer el reporte sin problemas.
Saludos.
Una posible solución es hacer una pasada de lectura y crear un fichero con los registros de entrad, a continuación hacer lo mismo con los registro de salida,
Después con ambos ficheros hacer una JOIN
Saludos,
Enrique Colomer
Hola.
Lo tienes bien así. No hace falta hacer join. De hecho está mejor como eventos simples con una fecha y hora de ocurrencia simple para cada evento simple. El hecho de tener 2 tipos de horas en un mismo registro complica el cálculo. Si tienes dos horas en el mismo registro, cada vez que filtres una hora de entrada, estarás filtrando horas de salida. COmpruébalo tu mismo.
El resto es el cálculo.
Yo sustituiría al empleado por un id para no repetir el nombre tantas veces.
Saludos.
Ya encontré la solución, la dejo por si alguien la puede necesitar. Gracias a quienes contestaron.
1. Como para cada dato de entrada debe existir uno de salida se hace una recarga de los datos, ordenados por Empleado y el campo ID. Se asume que ya está cargada la tabla [Marcaciones_x] con todos los campos. Solo se tienen en cuenta los registros 'Salida'.
[Marcaciones_y]:
LOAD
*,
//Si el empleado es el mismo del registro anterior, si el registro actual es de Salida y si el registro actual es mayor que el anterior, se toman la fecha y hora
If(Ced_Empleado = Peek(Ced_Empleado) AND Sentido = 'Salida' AND Id_Registro > Peek(Id_Registro), Peek(Fecha)) AS Fecha_Entrada,
If(Ced_Empleado = Peek(Ced_Empleado) AND Sentido = 'Salida' AND Id_Registro > Peek(Id_Registro), Peek(Hora)) AS Hora_Entrada,
RESIDENT [Marcaciones_x]
ORDER BY Ced_Empleado, Id_Registro;
2. Se hace una recarga de [Marcaciones_y] pero solo de los registros 'Salida', que son los que quedan con los datos.
3. La información de la entrada/salida de cada empleado queda en el mismo registro y se puede hacer el reporte sin problemas.
Saludos.