Calculate end date based on own particular work week

HI Everyone, I have an App in which I want select to configure a working week. A Enumlist where I choose the days in which I am going to execute my work:

Sunday

Monday

Tuesday

Wednesday

Thursday

Friday

Saturday

All are chosen by a check box.

Once the days have been chosen, I have to choose the start date of the work. Suppose I start today 3/17/2022 and that I will work Monday, Wednesday and Friday. Also assume a period of 30 business days. Also take into account holidays. What I need is to be able to calculate the end date of the work, taking into account a period of 30 business days, holidays and the previously chosen work week configuration.

This would give me a result with a date 10 weeks later if there is no holiday that falls on some of the days.

One of the formulas I used is WORKDAY() however it is limited as it only excludes Saturdays from the list, Sundays.

Is there a way to create my own WORKDAY formula excluding the days I want?


No matter how fancy the formula is, I'll do it the same

@Steve @TeeSee1 @Joseph_Seddik 

Solved Solved
0 26 817
3 ACCEPTED SOLUTIONS

Here it is, I've changed the display names to English, but was too lazy to change the expressions, but I think you'll be able to relate. In any case, please tell me if you have any difficulties. 

Todavรญa no he leรญdo en detalle tu รบltima respuesta, perdรณn amigo, voy a leerla mรกs tarde con tranquilidad y te contesto.

Target Workday Calculator 2

View solution in original post

@Gustavo_Eduardo Yo calculaba basรกndome en que el dรญa del inicio NO estรก incluido, pero el dรญa final Sรญ. 

Si quieres incluir ambos dรญas, en la expresiรณn tendrรกs que cambiar:

[Date] >  [_ThisRow].[Date de dรฉbut]

por:

[Date] >= [_ThisRow].[Date de dรฉbut]

View solution in original post

@Gustavo_Eduardo 

This is a better, even simpler version, with no VCs, and functions both ways: with global settings for workdays and holidays, and also on a per-calculation basis. Calculation records now can be freely edited. Also, this version is focused on integrability so should serve you better. 

Target Workday Calculator 2

View solution in original post

26 REPLIES 26

I cannot think of any single formula that does this. (I very quickly gave up,,,)

Here is a 'brute force' approach that works but you may not like it.

Some preps

  • create a Holidays table which simply lists holidays that you do not want to include as part of your work/business days.
  • in your main table, create a temporary [count down] with Initial Val to [Required Business Days] <= you can use [Required Business Days] but wanted to preserve it.

Then, Create a actions below

1. Start of the sequence

2. Move End Date by one day

3. Reduce [count down] if it falls on the weekdays you chose AND not in the holidays table

4. Go back to 1. if [count down] > 0

Looping process is something AppSheet cannot do in an elegant way. (No Code ๐Ÿ˜)

If you are interested I can share the demo app..

Perfecto @TeeSee1 apenas despierte la vemos !

TeeSee1_0-1647656494933.png

Just for anyone who might be interested..

https://www.appsheet.com/portfolio/3401559

"work days"

@TeeSee1 wow recien veo esto. Es otra manera de llegar a los valores. En este momento me estoy manejando con la respuesta de Joseph pero con gusto la estudio! Te agradezco que me hayas permitido verla! Saludos

Como estรกs @TeeSee1 Buen dรญa, voy a intentar probando con tu soluciรณn. La forma que me da Joseph es buena pero mi app se pone muy lenta. Una vez que realice ambas adaptaciones pruebo y les comento.

Wow ! Were you tapping the calls some 10 days ago? ๐Ÿ˜„

Iโ€™ve implemented this very same requirement as part of a project presentation to a customer, and will be happy to share with the community. Let me just isolate it and do some UX translation to English and will post the sample app. No actions or complexities involved; just simple expressions. 

Wow!!! Joseph!! espectacular, Yo al menos de mi parte te agradecerรญa mucho poder ver como lo has resuelto. Por ahora te comento como voy haciendolo (a la manera de un cavernรญcola no programador como yo soy). 

Tengo como dato:

  • Fecha de inicio del proyecto
  • Nรบmero de dรญas que dura el trabajo
  • Cantidad de dรญas trabajados por semana (que es una columna que se calcula sola en funciรณn de la selecciรณn del usuario de datos de una enumlist donde estรกn los dรญas de semana); si selecciono 5 dรญas, la cantidad de dรญas trabajados serรก 5
  • Fecha de finalizaciรณn: que es un cรกlculo que hago de la siguiente manera

 

([Fecha de Inicio]-1)+(FLOOR([Plazo en dรญas]/[Dรญas laborales por semana])*7)+

(

   ([Plazo en dรญas]/[Dรญas laborales por semana])-

   FLOOR([Plazo en dรญas]/[Dรญas laborales por semana])

  )*([Dรญas laborales por semana])

 

Esto me permite conocer cuanto se desplaza la fecha pero no es muy exacto y tampoco profesional. Estoy seguro que tu tienes algo muy profesional para mostrar. Te agradezco si puedes corregirme.

Ahora estoy por hacer un "recalculo" teniendo en cuenta los dรญas festivos que hay en el lapso desde el inicio hasta la fecha final y luego recalcular la fecha final. Tengo que aclarar para que no te rias, soy un principiante, pero no me quedรณ mรกs remedio que ingeniarmela para obtener el resultado. Si pudiera contar con algo como lo tuyo serรญa ideal.

COUNT(
              SELECT(
                               Feriados[Fecha Feriado],
                                                                                [Fecha Feriado]>=[Fecha de Inicio],
                                                                                [Fecha Feriado]<=[Fecha Final 1]
                      )
)

 

luego recalculo y obtengo

([Fecha de Inicio]-1)+(FLOOR(([Plazo en dรญas]+[Feriados])/[Dรญas laborales por semana])*7)+((([Plazo en dรญas]+[Feriados])/[Dรญas laborales por semana])-FLOOR(([Plazo en dรญas]+[Feriados])/[Dรญas laborales por semana]))*([Dรญas laborales por semana])

Lo que tengo que hacer ahora es desplazar la fecha un dรญa mรกs si coinide con un dรญa no laboral, haciendo que termine en un dรญa laborable. Esta soluciรณn es muy rรบstica.

Hola Gus,

Una expresiรณn similar fue la primera que he considerado mentalmente, pero el problema es que cuando desplaces la fecha target por el nรบmero de fechas no laborales y festivos encontrados, es muy probable que encuentres mรกs dรญas de este tipo y tendrรกs que desplazar de nuevo y serรก posible encontrar mรกs dรญas no laborales de nuevo, por eso descartรฉ esta vรญa por la imposibilidad de ser controlado sobre todo porque el nรบmero de dรญas del proyecto es indefinido. 

Aparte de eso, bien hecho ๐Ÿ™‚ la creatividad es el mejor amigo al desarrollador. 

Here it is, I've changed the display names to English, but was too lazy to change the expressions, but I think you'll be able to relate. In any case, please tell me if you have any difficulties. 

Todavรญa no he leรญdo en detalle tu รบltima respuesta, perdรณn amigo, voy a leerla mรกs tarde con tranquilidad y te contesto.

Target Workday Calculator 2

Tengo una duda respecto a cรณmo adaptarlo Joseph, Tu tienes en la App una vista de "Semana" donde puedes configurar la semana laborable sin embargo yo debo hacerlo para cada trabajo y dentro del formulario de trabajo. Para ello he adoptado una EnumList donde simplemente selecciono los dรญas laborables de la semana y se crea una lista con los dรญas que necesito. La diferencia radica en que en la fรณrmula de tu app haces referencia a una condiciรณn adoptada en la vista semana (Laborable o No laborable)

 

TOP(
        SELECT(

                         Dates[Date],

AND(
          [Date] > [_ThisRow].[Date de dรฉbut],
         [Ouvrable]
         )

                             ),[Nombre de jours]
)

 

Sin embargo lo que yo necesito es adaptar esta fรณrmula para que, cuando yo seleccione directamente un elemento de la enumlist, los elementos seleccionados se consideren laborables.

Es eso posible?

El cรกlculo en realidad no se hace aquรญ, pero en la tabla Dates, columna "Ouvrable". 

AND(
  NOT( IN( WEEKDAY([Date]), SELECT(Semaine[Index], FALSE = [Ouvrable]) )),
  NOT( IN([Date], Jours Fรฉriรฉs[Date]) )
)

Esta es la formula que asigna el estado laboral o no laboral a una fecha. 

Ahora sobre la necesidad de hacer el cรกlculo por un trabajo. Esto es lo normal, lo esperado. Pero la cuestiรณn es ยฟcรณmo abordarlo? Primero, sรญ es posible adaptar la app para incorporar esta funciรณn y asignar fechas por trabajo, pero ยฟserรญa el camino correcto?

Muchos desarrolladores suelen olvidarse de que la arquitectura del software es mas importante de su codificaciรณn. Sรญ, con algunos trucos de magia de codificaciรณn, se podrรญa crear expresiones complejos con las cuales se incorporarรกn el calculo de fechas por proyecto y por usuario, etc. pero para mรญ esto serรญa una falta grave. Era exactamente el tema principal de mi presentaciรณn ๐Ÿ™‚ KISS - Keep It Smart & Simple

La app se trata de una calculadora que se puede incorporar en contextos mรกs grandes. El caso del cliente era mรกs complejo, pero tambiรฉn en tu caso no necesitas hacer algo mรกs para hacer el cรกlculo por trabajo:

  • Quรฉdate con la tabla "Calculatrice" en tu app.
  • Tu tabla de Trabajos, debe tener las columnas: "Fecha Inicio", "Dรญas laborales de la semana", "Nombre de Dรญas" y "Fecha Final". 
  • Puedes copiar la expresiรณn de "Date Cible" en "Fecha Final", o aรฑadir una columna "TrabajoID" en "Calculatrice" y utilizar las Dereference Expressions para copiar el valor (en lugar de la expresiรณn) de "Date Cible" en "Fecha Final".
  • Cuando aรฑades un trabajo nuevo en la tabla Trabajos, en ese momento puedes elegir los dรญas correspondientes, o hacerlo antes. 

Los datos de un trabajo en la tabla de Trabajos serรกn guardados en columnas normales en el spreadsheet, y asรญ no serรกn cambiados si por ejemplo los dรญas laborales han sido cambiados segรบn un nuevo proyecto.

Ademรกs, puedes impedir que esos datos se cambien al editar la fila, poniendo la siguiente condiciรณn en el campo Editable? de cada columna:

ISBLANK([_This])

Asรญ, una vez creado un trabajo, la informaciรณn dinรกmica relacionada con los cรกlculos de fechas no se cambiarรกn nunca. 

Joseph, no serรญa lo mismo, e incluso algo mรกs simple si a la expresiรณn de cรกlculo la planteas asรญ:

AND(
  IN( WEEKDAY([Date]), SELECT(Semaine[Index], TRUE= [Ouvrable]) ),
  NOT( IN([Date], Jours Fรฉriรฉs[Date]) )
)

 

Sรญ, es lo mismo, solo es una cuestiรณn de estilo para mejorar la legibilidad (en mi pdv). 

Yo digo: selecciona las fechas que NI son laborales en la semana, NI son festivos.

Tรบ dices: selecciona las fechas que Sร son no laborales, pero NO son festivos. 

 

Una pregunta Joseph! supongamos que tenemos trabajos de mรกs de un aรฑo de demora y que la lista de fechas es pequeรฑa.

No hay una manera de generar una lista virtual entre dos fechas de forma que podamos poner una fecha lรญmite y una fecha de inicio de la lista y no todas las fechas del 2022, 23, .... 2070

Es obvio que quizรกs para esa รฉpoca ya no exista Appsheet pero pienso que una lista carga mucho a la app. Por ahรญ una lista virtual sea menos pesada no crees?

Generar una lista dinรกmica implica utilizar Actions. Es posible, pero si lo prefieras, serรญa mรกs sencillo utilizar la soluciรณn propuesta por @TeeSee1

Sin embargo, no creo que la lista de fechas cargarรญa la app o tendrรญa un impacto sobre su rendimiento; porque la SELECT siempre se lanza en una tabla con solo siete filas. 

De todas formas la expresiรณn en Dates se puede mejorar impidiendo  el cรกlculo para las fechas antiguas, por ejemplo asรญ:

IF( [Date] < TODAY(), 
  FALSE, 
  AND( โ€ฆ )
)

Bien Joseph, la propuesta de ti si me dio la sensaciรณn que es buena y simple, pero no sรฉ cรณmo implementarlas correctamente porque creo que en su soluciรณn รฉl utiliza botones para calcular y yo necesito que sea automรกtico como tu soluciรณn en realidad. Voy a intentar generar un comportamiento para ver si puedo lograrlo como รฉl plantea pero la soluciรณn mรกs fรกcil para mi es la tuya. Lo que si no puedo lograr es configurar la semana laboral desde la tabla trabajos todavรญa. Voy a sacar una captura de pantalla de mis tablas para ver si puedes ayudarme a adaptar seguro logramos hacerlo smart & simple 

De acuerdo. Por cierto, ยฟme puedes mirar por favor el performance analyzer y decirme quรฉ tablas o cรกlculos contribuyen mรกs al tiempo de sync? Me interesa estudiar este tema en tu app, porque en mi lado no veo ningรบn impacto. Muchas gracias. 

UPDATE:

He aรฑadido las fechas hasta finales de 2070, ยกson 19.700 filas! He podido calcular hasta 3.800 dรญas, el รบnico lรญmite es los 50.000 caracteres en la celda porque estoy captando todas las fechas laborales en "Dates Ouvrรฉs" sino no habrรก lรญmite. 

Cuando utilizas la Form, verรกs que el cรกlculo es casi inmediato, y el tiempo de sync es inferior a dos segundos. Copia la app de nuevo y pruรฉbalo tรบ por favor. Gracias de nuevo.

@Gustavo_Eduardo 

Ok Joseph! voy a intentar inmediatamente lo que dices.

Mas tarde te envรญo una respuesta. Perdรณn la demora 

Respecto del "Target Day" a menos que sea considerado como fecha no incluida desde el inicio del conteo, estarรญas sumando un dรญa mรกs al plazo. 

Lo normal serรญa que si se arranca a trabajar un 1/3/2022 (todo el dรญa) y tienes 20 dรญas de plazo, el dรญa 20/3/2022 termine el trabajo al final de la jornada, ya que se incluye el primer dรญa como dรญa completo trabajado dentro de los 20 de plazo. Si no se incluye este dรญa, entonces estรก bien. Al menos en mi app es asรญ, incluyo el dรญa inicial dentro de los dรญas hasta la fecha final. 

 

@Gustavo_Eduardo Yo calculaba basรกndome en que el dรญa del inicio NO estรก incluido, pero el dรญa final Sรญ. 

Si quieres incluir ambos dรญas, en la expresiรณn tendrรกs que cambiar:

[Date] >  [_ThisRow].[Date de dรฉbut]

por:

[Date] >= [_ThisRow].[Date de dรฉbut]

Perfecto Joseph, asรญ lo hice como me lo planteas y estรก bien funciona.

Joseph te agradezco mucho tu buena forma de ser

@Gustavo_Eduardo 

This is a better, even simpler version, with no VCs, and functions both ways: with global settings for workdays and holidays, and also on a per-calculation basis. Calculation records now can be freely edited. Also, this version is focused on integrability so should serve you better. 

Target Workday Calculator 2

 

Joseph, la revisรณ, a mi app se aplica mucho mejor, el resultado es inmediato. Solo optรฉ por la forma particular de elegir los dรญas laborables y eliminรฉ a general ya que no la utilizo. La simultanea, ahora, es rapida. Yo en mi app tampoco muestro los dรญas laborables ni los feriados ya que se ven en otra tabla y vuelve engorroso el formulario, sin embargo entiendo que lo ha dejado de forma que se ve para mayor entendimiento. 

Realmente ahora anda perfecto, siendo que ha resuelto esto de la manera mรกs prรกctica y que no existe fรณrmula para calcularlo asรญ.

Respecto del Performance Analyzer, 00:00:01 es el tiempo que tarda en sincronizar, a la fecha. 

Lo que sรญ, me recomienda habilitar el almacenamiento en cachรฉ del servidor para mejorar el rendimiento. Lo estoy haciendo ahora mismo. 

Gracias Joseph infinitas, nuevamente. 

A toda la comunidad, quiero dejarle en claro que  @Joseph_Seddik es un usuario altruista y benรฉfico. Realmente sus soluciones me han sido de valor y me ha acompaรฑado cada vez que รฉl preguntรณ algo. Muchos de ustedes son similares a รฉl y debo reconocerles su aporte tambiรฉn, como @TeeSee1 , @Steve@SkrOYC, @graham_howe y muchos otros que me ayudan a diario. Por si alguien lee, ojalรก hubiera mรกs miembros valiosos como ellos.

@Gustavo_Eduardo El beneficio es mutuo amigo ๐Ÿ™‚ Yo habรญa diseรฑado esta funcionalidad respondiendo a un requisito especรญfico. Tener en cuenta tus necesidades, me ha permitido evolucionar el diseรฑo y sacar una versiรณn aรบn mejor, por lo tanto muchas gracias a ti ๐Ÿ™‚ 

Tambiรฉn es importante decir que agradezco mucho tu amabilidad y que seas uno de pocos que ayudan a los demรกs para que ellos puedan prestar mejor apoyo y consejos. Se ve que siempre haces un esfuerzo importante en pensar y preparar tus preguntas en la manera mรกs clara posible, siempre estรกs activo en la discusiรณn sobre tus preguntas aportando informaciones que facilitan bastantemente el entendimiento y el trabajo de los demรกs, siempre estรกs dispuesto a leer la documentaciรณn, probar e investigar, todo eso junto con tu personalidad tan amable desde el primer dรญa hace que participar en tus posts sea un verdadero placer. El miembro modelo de este comunidad ยกeres tรบ! 

ยกTe lo agradezco sinceramente, mi amigo, Gus!

Te agradezco mucho nuevamente amigo, desde mi humilde lugar seguirรฉ aportando lo que pueda, esta comunidad se ha hecho para mi un lugar de encuentro diario! Pero las estadรญsticas te muestran como el "mejor compaรฑero de la clase"

Saludos desde argentina Joseph

Top Labels in this Space