Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Hola,
Querías saber si es posible generar todas las fechas posibles de un año, con los datos fecha inicio y frecuencia, me explico.
Tenemos las fecha 15/02/2017 que esta asociada a un campo que se genera trimestralmente, lo que quiero es generar las fechas previstas del 2017 de ese campo a partir de la primera fecha (15/05/2017, 15/08/2017, 15/11/2017). La frecuencia puede ser tanto trimestralmente como mensual,semestral, anual, bianual,..
Agradecería mucho una respuesta.
Gracias y saludos.
Hola Antón,
El siguiente código:
T1:
LOAD * INLINE [
ID, Fecha Inicio, Periodicidad
0001, 15/02/2017, 3
0002, 15/05/2017, 6
0003, 15/01/2017, 1
0004, 15/07/2017, 6
];
LET vsNumeroIteraciones = NoOfRows('T1') - 1;
FOR vsContador = 0 TO $(vsNumeroIteraciones)
LET vsIDIteracion = Peek('ID', $(vsContador), 'T1');
LET vsFechaInicioIteracion = LookUp('Fecha Inicio', 'ID', '$(vsIDIteracion)', 'T1');
LET vsPeriodicidadIteracion = LookUp('Periodicidad', 'ID', '$(vsIDIteracion)', 'T1');
LET vsAnyoIteracion = Year('$(vsFechaInicioIteracion)');
LET vsNumRegistros = 12 / $(vsPeriodicidadIteracion);
T2:
LOAD '$(vsIDIteracion)' AS ID2,
AddMonths('$(vsFechaInicioIteracion)',
$(vsPeriodicidadIteracion) * (Recno() - 1)) AS [Fecha Prevista]
AUTOGENERATE $(vsNumRegistros)
WHERE Year(AddMonths('$(vsFechaInicioIteracion)',
$(vsPeriodicidadIteracion) * (Recno() - 1))) = $(vsAnyoIteracion);
NEXT
, te genera la tabla siguiente:
ID2 | Fecha Prevista |
0001 | 15/02/2017 |
0001 | 15/05/2017 |
0001 | 15/08/2017 |
0001 | 15/11/2017 |
0002 | 15/05/2017 |
0002 | 15/11/2017 |
0003 | 15/01/2017 |
0003 | 15/02/2017 |
0003 | 15/03/2017 |
0003 | 15/04/2017 |
0003 | 15/05/2017 |
0003 | 15/06/2017 |
0003 | 15/07/2017 |
0003 | 15/08/2017 |
0003 | 15/09/2017 |
0003 | 15/10/2017 |
0003 | 15/11/2017 |
0003 | 15/12/2017 |
0004 | 15/07/2017 |
¿Es lo que necesitas? Si quieres que no te genere para cada ID el registro para la fecha igual a 'Fecha Inicio' y solo las fechas futuras bastaría con sustituir (Recno() - 1) por Recno() en el campo [Fecha Prevista].
Mira a ver el tiempo de recarga porque, como ves, tendrías que iterar por cada uno de los registros de la tabla T1 y quizá no fuese viable.
Adjunto ejemplo.
Saludos,
H
Hola..
utiliza un calendario maestro...
Calendario Maestro para obtener todos los días transcurridos
Saludos.
Hola Anton, te adjunto un calendario maestro.
En el script debes definir tu año-mes-día de inicio y el campo Fecha el cual se va a unir con tu tabla de hechos.
Saludos.
JM
Hola Juan,
Gracias por tu respuesta pero no estoy seguro si me entendisteis o yo no entiendo la manera de hacerlo. Te explico, lo que quiere es calcular según una fecha y una frecuencia las fechas previstas según la frecuencia. Tengo una tabla que contiene los campos id_orden, fecha_inicio y frecuencia.
id_ orden, fecha_inicio, frecuencia
0001, 15/02/2017, 3
0002, 15/05/2017, 6
0003, 15/01/2017, 1
Lo que quiere es calcular las fechas previstas de un año entero de la orden, no todas las fechas del año, los datos que debería obtener son estos
id_orden, fechaPrevista
0001, 15/05/2017
0001, 15/08/2017
0001, 15/11/2017
0002, 15/11/2017
0003, 15/01/2017
0003, 15/02/2017
0003, 15/03/2017
0003, 15/04/2017
0003, 15/05/2017
0003, 15/06/2017
0003, 15/07/2017
0003, 15/08/2017
0003, 15/09/2017
0003, 15/10/2017
0003, 15/11/2017
0003, 15/12/2017
Saludos y gracias.
Hola Antón,
El siguiente código:
T1:
LOAD * INLINE [
ID, Fecha Inicio, Periodicidad
0001, 15/02/2017, 3
0002, 15/05/2017, 6
0003, 15/01/2017, 1
0004, 15/07/2017, 6
];
LET vsNumeroIteraciones = NoOfRows('T1') - 1;
FOR vsContador = 0 TO $(vsNumeroIteraciones)
LET vsIDIteracion = Peek('ID', $(vsContador), 'T1');
LET vsFechaInicioIteracion = LookUp('Fecha Inicio', 'ID', '$(vsIDIteracion)', 'T1');
LET vsPeriodicidadIteracion = LookUp('Periodicidad', 'ID', '$(vsIDIteracion)', 'T1');
LET vsAnyoIteracion = Year('$(vsFechaInicioIteracion)');
LET vsNumRegistros = 12 / $(vsPeriodicidadIteracion);
T2:
LOAD '$(vsIDIteracion)' AS ID2,
AddMonths('$(vsFechaInicioIteracion)',
$(vsPeriodicidadIteracion) * (Recno() - 1)) AS [Fecha Prevista]
AUTOGENERATE $(vsNumRegistros)
WHERE Year(AddMonths('$(vsFechaInicioIteracion)',
$(vsPeriodicidadIteracion) * (Recno() - 1))) = $(vsAnyoIteracion);
NEXT
, te genera la tabla siguiente:
ID2 | Fecha Prevista |
0001 | 15/02/2017 |
0001 | 15/05/2017 |
0001 | 15/08/2017 |
0001 | 15/11/2017 |
0002 | 15/05/2017 |
0002 | 15/11/2017 |
0003 | 15/01/2017 |
0003 | 15/02/2017 |
0003 | 15/03/2017 |
0003 | 15/04/2017 |
0003 | 15/05/2017 |
0003 | 15/06/2017 |
0003 | 15/07/2017 |
0003 | 15/08/2017 |
0003 | 15/09/2017 |
0003 | 15/10/2017 |
0003 | 15/11/2017 |
0003 | 15/12/2017 |
0004 | 15/07/2017 |
¿Es lo que necesitas? Si quieres que no te genere para cada ID el registro para la fecha igual a 'Fecha Inicio' y solo las fechas futuras bastaría con sustituir (Recno() - 1) por Recno() en el campo [Fecha Prevista].
Mira a ver el tiempo de recarga porque, como ves, tendrías que iterar por cada uno de los registros de la tabla T1 y quizá no fuese viable.
Adjunto ejemplo.
Saludos,
H
Hola Héctor,
Justo acabo de solucionar el problema que tenía y llegamos casi a la misma conclusión para generar los datos que quiero.
Muchas gracias por tu respuesta y a la comunidad Qlik.
Saludos