Funzione giorni lavorativi L’argomento è risolto

Non è propriamente un programma di BI, ma nelle sue versioni più recenti anche Excel può fare grandi cose!

Moderatore: Utilizzo_prof_Excel

Avatar utente

Roberto67
Messaggi: 10 | Topic creati
Iscritto il: ven 20 nov 2020, 8:13
Luogo: Follonica
Contatta:

Funzione giorni lavorativi

Messaggio da Roberto67 »

Buongiorno, ho cercato tra i vari argomenti del forum e su altri siti internet, ma non ho trovato il modo di tradurre nel linguaggio M la formula di excel "GIORNI.LATORATIVI.TOT".
l'obbiettivo sarebbe di creare una funzione per riprodurre lo stesso risultato di Excel da poter utilizzare nelle Power Query.
Ringrazio in anticipo tutti quelli che risponderanno al mio quesito.
Saluti
Roberto
Allegati
GG_lavorativi.xlsx
(8.32 KiB) Scaricato 100 volte


Avatar utente

Enrico Galli
Messaggi: 890 | Topic creati
Iscritto il: dom 28 giu 2020, 19:03
Luogo: San Giovanni in Persiceto (BO)
Ringraziato: 325 volte
Contatta:

Funzione giorni lavorativi

Messaggio da Enrico Galli »

Ciao. Per ottenere lo stesso risultato è necessario avere una lista di tutte le festività comprese nell'intervallo di date previsto, da mettere poi in join con la lista di date completa per ottenere la differenza. In poche parole, non esiste nulla di automatico (le festività "locali" non sono precaricate, come in Excel), e va gestito tutto con codice scritto manualmente
Enrico Galli
Link utili: I nostri tutorial | Come inserire: Immagini - Codice - Risolto
Se il forum ti è stato utile, considera di supportarlo con una libera donazione
Avatar utente

Autore del topic
Roberto67
Messaggi: 10 | Topic creati
Iscritto il: ven 20 nov 2020, 8:13
Luogo: Follonica
Contatta:

Funzione giorni lavorativi

Messaggio da Roberto67 »

Scusa l'insistenza, se io ho un calendario (per comodità consideriamo festivi solo sabato e domenica, implementerò poi con le altre festività) di cui ti riporto lo script nella fiel di testo allegato, come posso trasformarlo in funzione che mi calcoli la differenza di giorni (che nel calendario definisco "lav") tra "data_inizio" e "data_fine" poste in due diverse colonne del file precedentemente allegato?
Grazie per la cortese risposta.
R
Allegati
GG_lavorativi.xlsx
(8.32 KiB) Scaricato 70 volte
Calendario.txt
(2.06 KiB) Scaricato 73 volte
Avatar utente

Enrico Galli
Messaggi: 890 | Topic creati
Iscritto il: dom 28 giu 2020, 19:03
Luogo: San Giovanni in Persiceto (BO)
Ringraziato: 325 volte
Contatta:

Funzione giorni lavorativi

Messaggio da Enrico Galli »

Ci mancherebbe, siamo qui apposta ;)
Date due date come nel tuo excel, per aggiungere una colonna con il conteggio dei giorni dal lunedì al venerdì puoi usare un codice come questo (è un unico passaggio):

Codice: Seleziona tutto

  #"Aggiunta colonna personalizzata" = Table.AddColumn(
      #"Modificato tipo", 
      "Lavorativi", 
      each List.Count(
          List.Select(
              List.Transform(
                  List.Dates(
                      [Data_Inizio], 
                      Number.From([Data_Fine]) - Number.From([Data_Inizio]) + 1, 
                      #duration(1, 0, 0, 0)
                    ), 
                  (x) => Date.DayOfWeek(x)
                ), 
              each _ < 5
            )
        ), 
      Int64.Type
    )
allego il file :wave:
Allegati
GG_lavorativi.xlsx
(17.82 KiB) Scaricato 116 volte
Enrico Galli
Link utili: I nostri tutorial | Come inserire: Immagini - Codice - Risolto
Se il forum ti è stato utile, considera di supportarlo con una libera donazione
Avatar utente

Autore del topic
Roberto67
Messaggi: 10 | Topic creati
Iscritto il: ven 20 nov 2020, 8:13
Luogo: Follonica
Contatta:

Funzione giorni lavorativi

Messaggio da Roberto67 »

Grazie, ancora.
Nel frattempo, avrei aggiunto nel calendario allegato anche le festività con un campo che distingue così in modo puntuale i giorni lavorativi da festivi (fest/lav).
Possibile secondo te richiamare con una funzione tale calendario in modo da avere esatto valore di durata in gg lavorativi tra le date inizio e fine di un'altra tabella.
Riallego calendario
Allegati
Calendario.xlsx
(176.33 KiB) Scaricato 74 volte
Avatar utente

Autore del topic
Roberto67
Messaggi: 10 | Topic creati
Iscritto il: ven 20 nov 2020, 8:13
Luogo: Follonica
Contatta:

Funzione giorni lavorativi

Messaggio da Roberto67 »

Scusate se ritorno sul tema, ripropongo il quesito:
Avendo una calendar table di appoggio, che riallego, in cui ho aggiunto un campo che distingue i giorni lavorativi da quelli festivi comprese le festività.
Da questa è possibile creare una funzione in power query che attingendo a tale tabella calcoli i gg lavorativi tra date presenti in altre tabelle o query?
Allego anche lo script della tabella calendario, se può essere di aiuto.
Ringrazio chiunque mi dia una risposta sull'argomento.
Ciao
Roberto
Allegati
Calendario.txt
(2.06 KiB) Scaricato 38 volte
Calendario.xlsx
(176.33 KiB) Scaricato 58 volte
Avatar utente

Enrico Galli
Messaggi: 890 | Topic creati
Iscritto il: dom 28 giu 2020, 19:03
Luogo: San Giovanni in Persiceto (BO)
Ringraziato: 325 volte
Contatta:

Funzione giorni lavorativi

Messaggio da Enrico Galli »

Ciao, hai fatto benissimo a ricordarmi/ci di essere in credito di una risposta, perché io mi ero scordato che la discussione fosse ancora in sospeso :?

Ho rifatto la query, spezzando tutti i passaggi così puoi renderti conto di come avviene il filtraggio delle date. Dopo aver cancellato sabati e domeniche, ho fatto un join con la tabella calendario, e ho ulteriormente filtrato i "fest".

Il tutto funziona anche se inserisci più intervalli di tempo uno sotto all'altro nella tabella iniziale; l'unico problema sarebbe se tu avessi dei periodi interamente festivi. In questo caso non restituirebbe 0, ma il periodo sparirebbe completamente dalla lista. SI può ovviare anche a questo, se serve.

Codeice M:

Codice: Seleziona tutto

// periodi
let
    Origine = Excel.CurrentWorkbook(){[Name="periodi"]}[Content],
    #"Modificato tipo" = Table.TransformColumnTypes(Origine,{{"Data_Inizio", type date}, {"Data_Fine", type date}}),
    #"Aggiunta colonna personalizzata" = Table.AddColumn(#"Modificato tipo", "date", each List.Dates([Data_Inizio], Number.From([Data_Fine])-Number.From([Data_Inizio])+1, #duration(1,0,0,0))),
    #"Tabella date espansa" = Table.ExpandListColumn(#"Aggiunta colonna personalizzata", "date"),
    #"Modificato tipo1" = Table.TransformColumnTypes(#"Tabella date espansa",{{"date", type date}}),
    #"Nome del giorno inserito" = Table.AddColumn(#"Modificato tipo1", "Nome del giorno", each Date.DayOfWeekName([date]), type text),
    #"Filtrate righe" = Table.SelectRows(#"Nome del giorno inserito", each ([Nome del giorno] <> "domenica" and [Nome del giorno] <> "sabato")),
    #"Merge di query eseguito" = Table.NestedJoin(#"Filtrate righe", {"date"}, Calendario, {"Giorno"}, "Calendario", JoinKind.LeftOuter),
    #"Tabella Calendario espansa" = Table.ExpandTableColumn(#"Merge di query eseguito", "Calendario", {"Lav_fest"}, {"Lav_fest"}),
    #"Filtrate righe1" = Table.SelectRows(#"Tabella Calendario espansa", each ([Lav_fest] = "lav")),
    #"Raggruppate righe" = Table.Group(#"Filtrate righe1", {"Data_Inizio", "Data_Fine"}, {{"Giorni_Lav", each Table.RowCount(_), Int64.Type}})
in
    #"Raggruppate righe"
Allegati
GG_lavorativi.xlsx
(19.65 KiB) Scaricato 53 volte
Enrico Galli
Link utili: I nostri tutorial | Come inserire: Immagini - Codice - Risolto
Se il forum ti è stato utile, considera di supportarlo con una libera donazione
Avatar utente

Autore del topic
Roberto67
Messaggi: 10 | Topic creati
Iscritto il: ven 20 nov 2020, 8:13
Luogo: Follonica
Contatta:

Funzione giorni lavorativi

Messaggio da Roberto67 »

Grazie della risposta tempestiva e puntuale, effettivamente ho verificato che in caso di periodi festivi l'intervallo di tempo sparisce invece di restituire 0.
Se fosse possibile correggere il bug, te ne sarei grato.
In ultimo, la query che hai creato come può essere trasformata in funzione>?
Nel file allegato ho aggiunto l'esempio della funzione Percentile creata per altra analisi.
Attendo vs.
ciao
Allegati
GG_lavorativi.xlsx
(261.73 KiB) Scaricato 41 volte
Avatar utente

Enrico Galli
Messaggi: 890 | Topic creati
Iscritto il: dom 28 giu 2020, 19:03
Luogo: San Giovanni in Persiceto (BO)
Ringraziato: 325 volte
Contatta:

Funzione giorni lavorativi

Messaggio da Enrico Galli »

Ho fatto le seguenti modifiche:
1) il calendario è stato filtrato per i soli giorni festivi
2) il calcolo dei lavorativi è diventato la seguente funzione:

Codice: Seleziona tutto

// fxGGlav
(datainizio as date, datafine as date) as number =>
let
    gglav = List.Count(
          List.Select(
                List.Dates(
                    datainizio, 
                    Number.From(datafine) - Number.From(datainizio) + 1, 
                    #duration(1, 0, 0, 0)
                ), 
            (x) => not List.Contains(Calendario_festivi[Giorno], x)
            )
        )   
in
    gglav
Fammi sapere, ciao :wave:
Allegati
GG_lavorativi v2.xlsx
(253.25 KiB) Scaricato 108 volte
Enrico Galli
Link utili: I nostri tutorial | Come inserire: Immagini - Codice - Risolto
Se il forum ti è stato utile, considera di supportarlo con una libera donazione
Avatar utente

Autore del topic
Roberto67
Messaggi: 10 | Topic creati
Iscritto il: ven 20 nov 2020, 8:13
Luogo: Follonica
Contatta:

Funzione giorni lavorativi

Messaggio da Roberto67 »

Buongiorno, ritorno su un vecchio tema per una nuova richiesta.
Avendo un calendario che distingue tra giorni lavorativi e festivi comprese le festività, come faccio con le power query ad aggiungere ad una data 3 giorni lavorativi in modo che mi restituisca ovviamente una data di giorno lavorativo?
Allego file di esempio fatto con funzione excel e codice calendario per giorni festivi/lavorativi (casella di testo affianco).
Ringrazio per il supporto.
Saluti
Roberto
Allegati
Aggiunta giorni lavorativi.xlsx
File di esempio con codice calendario giorni lavorativi/festivi
(12.73 KiB) Scaricato 34 volte
Rispondi