Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
igutierrezp
Contributor II
Contributor II

Como calcular FechaCompra + Dias hábiles

Estimados, necesito de su ayuda plis

Estoy haciendo un informe en el cual tengo FechaCompra , FechaEntrega.

para este calculo requiero agregarle 10 días hábiles a la FechaCompra, pero yo lo estaba haciendo mal. es decir tenia FechaCompra+10 y listo. pero dentro de esos 10 días puede haber un feriado o fin de semana.

Un ejemplo;

FechaCompra: 07-01-2019

Días para entrega: 10 días Hábiles, el día 16-01-2019 es feriado (no es así pero sirve para dar el contexto)

FechaEntrega: 17-01-2019 (Esta fecha de entrega esta mal, porque solo suma los 10 días y es la que uso de momento)

FechaEntrega: 29-01-2018 (Fecha correcta según mi calendario Chile, el cual tiene 2 fines de semana incluido + el día feriado)

Se que existe Networkdays, holidays. Estuve mirando algunas ideas y tengo creado un excel con FechaInicio FechaFinal y con Holidays. pero no se como aplicarlo en el gráfico para que la fechaentrega ya esté calculada con los días hábiles.

Muchas gracias de antemano.

Saludos.

1 Solution

Accepted Solutions
jmmayoral3
Creator
Creator

Hola. 

Dada la complejidad de la fórmula que deberías aplicar sólo se me ocurre que crees una tabla de conversión de fechas en el script. Esta tabla tendría 2 campos: Fecha_Compra y Fecha_Entrega

El proceso para crearla sería el siguiente:

1.- Crea un excel con los días festivos. ej: Festivos.xlsx

2.- Carga ese excel en una tabla llamada FESTIVOS con sólo un campo llamado "Dia_Festivo"

3.- Crea una tabla con un calendario con todos los días naturales. Llámala CONVERSION_FECHAS y numera los registros de 1 a n, de modo que tendrá dos campos: Num_Dia y Fecha_Compra. Quedará ordenada por Num_Dia

4.- Crea una tabla auxiliar a partir de esta :
     DIAS_LABORABLES:
     LOAD Rowno() As Num_rec,   //Numera automáticamente los registros de esta tabla
                 Fecha_Compra as Fecha_Entrega
    RESIDENT CONVERSION_FECHAS 
   WHERE  Num_Dia>=10   // a la primera fecha_compra la corresponderá al menos la fecha_venta nº 10
           AND NOT EXISTS(Dia_Festivo, Fecha_Compra) //Rechazo las fechas de compra
           AND WEEKDAY(Fecha_compra)<5 //Rechazo sábados y domingos
    ;

5.- Unes ambas tablas
      LEFT JOIN (CONVERSION_FECHAS )
      LOAD Num_rec AS Num_Dia,  //campo de unión entre ambas
                  Fecha_Entrega
      RESIDENT DIAS_LABORABLES;

6.- Borras la tabla DIAS_LABORABLES.

7.- El campo Num_Dias tampoco te sirve para nada. puedes borrarlo.

A partir de aquí tendrás que evaluar si dejas esta tabla como parte del modelo o con un LEFT JOIN añades la Fecha_entrega a tu tabla de hechos (desconozco tu modelo, pero esta opción creo que es la mejor) y borras la tabla CONVERSION_FECHAS .
Yo crearía un calendario con tantos años como me fuera posible, comenzando en diciembre de 2018, que aunque ya ha terminado, servirá para calcular las fechas de entrega en el cambio de año y siguientes años.
Este proceso debería ser muy rápido y es mejor que calcularlo en fórmulas dentro de gráficos. si aún así fuera lento, puedes guardar el resultado de CONVERSION_FECHAS en un .qvd para usarlo cada vez que recargues y no tenerlo que calcular en cada recarga.

Saludos.

 

View solution in original post

4 Replies
jmmayoral3
Creator
Creator

Hola. 

Dada la complejidad de la fórmula que deberías aplicar sólo se me ocurre que crees una tabla de conversión de fechas en el script. Esta tabla tendría 2 campos: Fecha_Compra y Fecha_Entrega

El proceso para crearla sería el siguiente:

1.- Crea un excel con los días festivos. ej: Festivos.xlsx

2.- Carga ese excel en una tabla llamada FESTIVOS con sólo un campo llamado "Dia_Festivo"

3.- Crea una tabla con un calendario con todos los días naturales. Llámala CONVERSION_FECHAS y numera los registros de 1 a n, de modo que tendrá dos campos: Num_Dia y Fecha_Compra. Quedará ordenada por Num_Dia

4.- Crea una tabla auxiliar a partir de esta :
     DIAS_LABORABLES:
     LOAD Rowno() As Num_rec,   //Numera automáticamente los registros de esta tabla
                 Fecha_Compra as Fecha_Entrega
    RESIDENT CONVERSION_FECHAS 
   WHERE  Num_Dia>=10   // a la primera fecha_compra la corresponderá al menos la fecha_venta nº 10
           AND NOT EXISTS(Dia_Festivo, Fecha_Compra) //Rechazo las fechas de compra
           AND WEEKDAY(Fecha_compra)<5 //Rechazo sábados y domingos
    ;

5.- Unes ambas tablas
      LEFT JOIN (CONVERSION_FECHAS )
      LOAD Num_rec AS Num_Dia,  //campo de unión entre ambas
                  Fecha_Entrega
      RESIDENT DIAS_LABORABLES;

6.- Borras la tabla DIAS_LABORABLES.

7.- El campo Num_Dias tampoco te sirve para nada. puedes borrarlo.

A partir de aquí tendrás que evaluar si dejas esta tabla como parte del modelo o con un LEFT JOIN añades la Fecha_entrega a tu tabla de hechos (desconozco tu modelo, pero esta opción creo que es la mejor) y borras la tabla CONVERSION_FECHAS .
Yo crearía un calendario con tantos años como me fuera posible, comenzando en diciembre de 2018, que aunque ya ha terminado, servirá para calcular las fechas de entrega en el cambio de año y siguientes años.
Este proceso debería ser muy rápido y es mejor que calcularlo en fórmulas dentro de gráficos. si aún así fuera lento, puedes guardar el resultado de CONVERSION_FECHAS en un .qvd para usarlo cada vez que recargues y no tenerlo que calcular en cada recarga.

Saludos.

 

igutierrezp
Contributor II
Contributor II
Author

Estimado, muchas gracias por la ayuda, quisiera si es posible que me expliques el punto 3 

"Crea una tabla con un calendario con todos los días naturales. Llámala CONVERSION_FECHAS y numera los registros de 1 a n, de modo que tendrá dos campos: Num_Dia y Fecha_Compra. Quedará ordenada por Num_Dia"

Esta tabla la hago en un excel? tal como los días festivos y la cargo en el script?

muchas gracias!

jmmayoral3
Creator
Creator

Hola.

Si tu empresa tiene ventas todos los días, entonces sólo tendrás que crear una tabla con las fechas de ventas.
Algo así como:
LOAD distinct rowno() as num_dia,
            <tu_campo_fecha> AS Fecha_Venta
RESIDENT <tu tabla de hechos>
ORDER BY <tu campo fecha>;     // la ordenación es sólo para asegurarte que las fechas están en orden, aunque probablemente ya lo estén.

 

Si no vende todos los días, entonces tienes que crearte un calendario maestro. 
Básicamente consiste en tomar una fecha mínima, una máxima  y crear todas las fechas entre ambas para evitar que haya "huecos".

En este post tienes un ejemplo: Calendario maestro

En cualquier caso, como tu siempre necesitas una fecha de entrega 10 días mayor que la mayor fecha de venta , lo que te recomiendo es que en vez de calcular las variables vMin y vMax a partir de las fechas máximas y mínimas de tu tabla de hechos, las asignes un valor a mano.
                  Por ejemplo: vMin=Date('01/12/2018' , 'DD/MM/YYYY'); 
                                              vMax=Date('31/12/2022' , 'DD/MM/YYYY');  // Así decides meter la tabla final en un QVD, te despreocupas de tenerla que calcular hasta dentro de unos años.

igutierrezp
Contributor II
Contributor II
Author

Muchas gracias por tu ayuda estimado,

te comento que me sirvio mucho lo que me explicas, como reseña dejo el codigo que aplique en el script y que me funciono:

Politica:
Load
*,
LlavePedido.Politica as Llave.Pedido,
if(IsNull(FechaGuia.Politica),'No Tratado',if(networkdays (FechaPedido.Politica, FechaGuia.Politica, '01-01-2018','30-03-2018','01-05-2018',
'21-05-2018','07-06-2018','02-07-2018','16-07-2018','15-08-2018','17-09-2018','18-09-2018','19-09-2018','15-10-2018','01-11-2018',
'02-11-2018','25-12-2018','01-01-2019','19-04-2019','01-05-2019','21-05-2019','16-07-2019','15-08-2019','18-09-2019','19-09-2019',
'20-09-2019','31-10-2019','01-11-2019','25-12-2019')>Politica.Politica,'No Cumplido','Cumplido')) as ContadorPolitica2
//
Resident AuxPolitica;
drop table AuxPolitica;

 

 

 

Muchas gracias, saludos.