Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Hola,
Tengo un problema que no he podido resolver. Tengo una tabla de datos que nececito llenar con los datos faltantes
Esta es una parte de la tabla
Empleado Fecha
15001 01/06/2005
18887 26/04/2006
18887 02/02/2014
27305 10/08/2008
27305 13/03/2013
27305 01/04/2014
Lo que necesito crear, es el intervalo de fechas con el dato que les corresponde, a partir de la fecha inicial:
Ejemplo resultado:
Empleado Fecha
15001 01/06/2005
15001 02/06/2005
15001 03/06/2005
15001 ...hasta el día de hoy..
18887 26/04/2006
18887 27/04/2006
18887 28/04/2006
18887 29/04/2006
18887 ......hasta el día de la siguiente fecha...
18887 02/02/2014
18887 03/02/2014
18887 04/02/2014
18887 ...hasta el día de hoy..
27305 10/08/2008
27305 11/08/2008
27305 12/08/2008
27305 ......hasta el día de la siguiente fecha...
27305 13/03/2013
27305 14/03/2013
27305 15/03/2013
27305 ......hasta el día de la siguiente fecha...
27305 01/04/2015
27305 02/04/2015
27305 ...hasta el día de hoy..
Llevo varíos dias intentando resolverlo,pero ya se me agotaron las opciones .
Ojala alguien me pueda orientar .
Saludos.
Hola,
Estaba haciendo pruebas con el script que escribiste, no me queda claro como funciona esta línea,
Load Date(MinFecha + IterNo() -1 ) AS Fecha While (MinFecha + IterNo() - 1) <= Num(MaxFecha);
Sin embargo el resultado es perfecto, es justo lo que buscaba.
Te agradezco las atenciones, era un problema que me tenia de cabeza hace unos días.
Saludos y gracias nuevamente.
Hola Ricardo,
Mirate este ejemplo si es lo que necesitas, Revísalo y mira si lo puedes pulir
Saludos,
Segun puedo ver, lo que tendrias que hacer es tomar la primera fecha y generar el QVD hasta la fecha de hoy? si es asi entonces aqui tiene algo que te sirve.
T1:
LOAD * INLINE [
Empleado, Fecha
15001, 01/06/2005
18887, 26/04/2006
18887, 02/02/2014
27305, 10/08/2008
27305, 13/03/2013
27305, 01/04/2014
];
T2:
NoConcatenate
Load Empleado, Min(Fecha) as Fecha
Resident T1 Group By Empleado;
T3:
Load Empleado, Date(Fecha+IterNo()-1) as Fechas
Resident T2
While IterNo()<= Today()-Fecha+1;
DROP Table T1,T2;
Hola, tienes razón se tiene que repetir hasta hoy. La dificultad con la que me encontré es que el mismo empleado puede tener un cambio de fecha. Lo que acabo de notar en que en mi ejemplo hace falta una fecha de Ingreso
Por ejemplo: La fecha de ingreso es el 13/03/2013, y se debe repetir el intervalo hasta su siguiente fecha 01/04/2015, y esta última es la que se debe repetir al día de hoy.
Cuando
Empleado Fecha Fecha Ingreso
27305 13/03/2013 13/03/2013
27305 14/03/2013 13/03/2013
27305 15/03/2013 13/03/2013
27305 ......hasta el día de la siguiente fecha... 13/03/2013
27305 01/04/2015 01/04/2015
27305 02/04/2015 01/04/2015
27305 ...hasta el día de hoy.. 01/04/2015
Lo intente con la alternativa que me diste, sin embrago mi calendario terminó con algo así:
Empleado Fecha Fecha Ingreso
27305 28/06/2016 13/03/2013
27305 28/06/2016 01/04/2015
27305 29/06/2016 13/03/2013
27305 29/06/2016 01/04/2015
Saludos y gracias por el tiempo dedicado.
Hola Jordi,
Ya vi el script y parece funcionar muy bien. Solo que no coloque el ejemplo completo
Lo que acabo de notar en que en mi ejemplo hace falta una fecha de Ingreso
Por ejemplo: La fecha de ingreso es el 13/03/2013, y se debe repetir el intervalo hasta su siguiente fecha 01/04/2015, y esta última es la que se debe repetir al día de hoy.
Este es el ejemplo con el empleado 27305.
Empleado Fecha Fecha Ingreso
27305 13/03/2013 13/03/2013
27305 14/03/2013 13/03/2013
27305 15/03/2013 13/03/2013
27305 ......hasta el día de la siguiente fecha... 13/03/2013
27305 01/04/2015 01/04/2015
27305 02/04/2015 01/04/2015
27305 ...hasta el día de hoy.. 01/04/2015
Ojala puedas ayudarme
Hola Ricardo, supongo que se podrá optimizar porque he ido directo a por la solución, mira si este script te valdría:
Orig:
LOAD Empleado, Date#(Fecha, 'DD/MM/YYYY') as Fecha Inline [
Empleado ,Fecha
15001 ,01/06/2005
18887 ,26/04/2006
18887 ,02/02/2014
27305 ,10/08/2008
27305 ,13/03/2013
27305 ,01/04/2014
];
Data:
LOAD Empleado,
Fecha as [Fecha Inicio],
If(Peek('Empleado')=Empleado, Date(Peek([Fecha Inicio])-1), Date(Today())) as [Fecha Fin]
Resident Orig Order By Empleado asc, Fecha desc;
Calendario:
LOAD Date(Fecha) AS Fecha;
LOAD Date(MinFecha + IterNo() -1 ) AS Fecha While (MinFecha + IterNo() - 1) <= Num(MaxFecha);
LOAD Min(Fecha) as MinFecha, Today() as MaxFecha Resident Orig;
Left Join (Calendario)LOAD * Resident Data;
EndData:
NoConcatenate LOAD * Resident Calendario Where [Fecha Inicio]<=Fecha and [Fecha Fin]>=Fecha;
DROP Tables Data, Calendario, Orig;
Hola,
Intenta crear una tabla tipo mapping con las fechas de ingreso, luego cargas ese mapping en la tabla final en un campo llamado fecha ingreso te quedaran registros en con el campo fecha ingreso en blanco... para que tengan valor haz un peek del valor anterior...
Creo que te tendría que funcionar.
Saludos,
Hola,
Estaba haciendo pruebas con el script que escribiste, no me queda claro como funciona esta línea,
Load Date(MinFecha + IterNo() -1 ) AS Fecha While (MinFecha + IterNo() - 1) <= Num(MaxFecha);
Sin embargo el resultado es perfecto, es justo lo que buscaba.
Te agradezco las atenciones, era un problema que me tenia de cabeza hace unos días.
Saludos y gracias nuevamente.
Hola Jordi,
Lo que mencionas funcionó bien, no conocía la funcionalidad de Peek, en el script que escribió Ruben Marin pude ver la funcionalidad, y se basa en tener orden en los datos.
Gracias por las atenciones.
Hola Ricardo, esa sentencia genera todas las fechas entre MinFecha y MaxFecha, tiene como origen la línea inferior: carga la fecha más baja como MinFecha y la fecha de hoy como MaxFecha.
Con esos datos hace un bucle que va desde MinFecha hasta MaxFecha (Esta es la parte del while)
El IterNo() recupera el número de iteración del bucle, empezando por 1 (por eso se resta 1), por lo que:
- La primera iteración genera la fecha MinFecha+0
- La 2ª iteración crea MinFecha+1
- Y así hasta llegar a MaxFecha,
Por aclararlo, las fechas son números enteros (la hora son los decimales), por ejemplo hoy (01/07/2016) es la fecha 42552, ayer era la 42551, por eso sumando 1 se van generando todas las fechas.
El LOAD de arriba realmente no sería necesario si solo se carga la fecha, se me quedó por costumbre , en esa parte se suelen generar los campos relacionados con la fecha: Mes, Semana, AñoMes, flags...
Saludos.