Skip to main content
Announcements
Global Transformation Awards! Applications are now open. Submit Entry
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Generar fechas previstas

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.

1 Solution

Accepted Solutions
hector_munoz
Specialist
Specialist

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:

 

ID2Fecha Prevista
000115/02/2017
000115/05/2017
000115/08/2017
000115/11/2017
000215/05/2017
000215/11/2017
000315/01/2017
000315/02/2017
000315/03/2017
000315/04/2017
000315/05/2017
000315/06/2017
000315/07/2017
000315/08/2017
000315/09/2017
000315/10/2017
000315/11/2017
000315/12/2017
000415/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

View solution in original post

5 Replies
sacosta5
Contributor III
Contributor III

Hola..

utiliza un calendario maestro...

Calendario Maestro para obtener todos los días transcurridos

Saludos.

juanma21
Contributor III
Contributor III

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

Not applicable
Author

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.

hector_munoz
Specialist
Specialist

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:

 

ID2Fecha Prevista
000115/02/2017
000115/05/2017
000115/08/2017
000115/11/2017
000215/05/2017
000215/11/2017
000315/01/2017
000315/02/2017
000315/03/2017
000315/04/2017
000315/05/2017
000315/06/2017
000315/07/2017
000315/08/2017
000315/09/2017
000315/10/2017
000315/11/2017
000315/12/2017
000415/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

Not applicable
Author

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