Tabella calcolata in DAX, errore su endofmonth

Il software per la BI di Microsoft, leader nel mercato
Rispondi
Avatar utente

alex77
Messaggi: 160 | Topic creati
Iscritto il: sab 24 ott 2020, 23:04
Luogo: Treviso
Ringraziato: 11 volte

Tabella calcolata in DAX, errore su endofmonth

Messaggio da alex77 »

Buongiorno a tutti,
partendo dai movimenti di magazzino del gestionale, genero una tabella calcolata che calcola le giacenze giorno per giorno e, collegando un listino, mi dà anche il prezzo unitario. Problema: il listino è datato, calcolato nel gestionale ogni fine mese. Per collegarlo con la giacenza faccio questo: se la data giacenza è fine mese, collego il corrispondente listino, altrimenti collego il listino del mese prima. Tradotto se data giacenza è il 31/01/2021 prendo listino 31/01/2021, se la data è il 15/01/2021 prendo il listino 31/12/2020. La formula che uso per trasformare la data giacenza nella data da collegare al listino è questa :

Codice: Seleziona tutto

if(ElencoCodici[Data]=ENDOFMONTH(ElencoCodici[Data]),ElencoCodici[Data],ENDOFMONTH(DATEADD(ElencoCodici[Data],-1,MONTH)
Se questa formula la uso per una colonna calcolata direttamente nella tabella "ElencoCodici" mi produce risultati assolutamente bizzarri, del tipo:
30/09/21 -> 30/09/21 ok
15/09/21 -> 31/08/21 ok
02/07/19 -> 21/06/19 ??
01/01/19 -> (vuoto) ??


Poi l'ho integrata nella tabella calcolata con le giacenze per avere direttamente il prezzo unitario e sembra funzionare, tranne per il fatto che in tale tabella, per la data di oggi, 12/11/21, il campo prezzo risulta vuoto. Di seguito il calcolo della tabella calcolata:

Codice: Seleziona tutto

Giacenza = ADDCOLUMNS(
                    ElencoCodici,
                    "Giacenza",
                    VAR vArticolo = ElencoCodici[Articolo Codice]
                    VAR vDeposito = ElencoCodici[Deposito Codice]
                    VAR vData = [Data]
                    var vAnno = Year([Data])
                    VAR vGiac = sumx(filter
                                        (Movimenti,Movimenti[Articolo Codice]=vArticolo &&
                                                   Movimenti[Deposito Codice]= vDeposito &&
                                                   Year(Movimenti[Data Movimento])=vAnno &&
                                                   Movimenti[Data Movimento]<=vdata),
                                    Movimenti[Qta])
                    RETURN
                    vGiac + 0,
                    "prezzo listino",
                    VAR vDtListino = if(ElencoCodici[Data]=ENDOFMONTH(ElencoCodici[Data]),ElencoCodici[Data],ENDOFMONTH(DATEADD(ElencoCodici[Data],-1,MONTH)))
                    VAR vArticolo = ElencoCodici[Articolo Codice]
                    VAR vPrezzo = selectcolumns(FILTER(Listino,Listino[cdart]=vArticolo &&
                                                Listino[dtlis]=vDtListino
                    ),"Prezzo",Listino[prezn])
                    return
                    vPrezzo
                                                    )
Sapete dirmi dove sbaglio?
Altra cosa: siccome è la prima tabella calcolata che creo, appena fatta ha lavorato 5 minuti per generare la tabella (e ci sta... 49 milioni di righe). Ora, che sto facendo modifiche in power query e poi ricaricando, non noto che la tabella calcolata impieghi tempo per generarsi... è veramente così rapida o mi sfugge qualcosa? Grazie dell'eventuale aiuto


Avatar utente

Autore del topic
alex77
Messaggi: 160 | Topic creati
Iscritto il: sab 24 ott 2020, 23:04
Luogo: Treviso
Ringraziato: 11 volte

Tabella calcolata in DAX, errore su endofmonth

Messaggio da alex77 »

Buongiorno,
aggiungo, se qualcuno ha qualche idea su come aiutarmi, che ho provato a fare un po' di debug della generazione della tabella calcolata: al posto del prezzo ho fatto uscire la data togliendo anche "endofmonth" e lasciando dateadd che porta indietro di un mese. Sembra che non venga applicato, chissà per quale motivo all'ultimo giorno presente, in questo caso (da immagine allegata) il 14 novembre, che rimane tale, invece di essere trasformato in 14 ottobre. Non so se possa dipendere dal fatto che la tabella "ElencoCodici" sia essa stessa una calcolata e la cosa combini qualche pasticcio.

Grazie per un eventuale aiuto
Immagine
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:

Tabella calcolata in DAX, errore su endofmonth

Messaggio da Enrico Galli »

Ciao, premesso che (ma lo sai già da solo) è impossibile aiutarti sulla scorta di screenshot che riportano del codice DAX e null'altro, mi viene da pensare che tu consideri DATEADD come una funzione che prende semplicemente una data e gli aggiunge/sottrae un certo numero di giorni da te stabilito. E' un frainteso tipico di chi viene dal mondo Excel, ma in DAX non è così semplice... DATEADD prende il blocco di date visibili nel filter context, e le sposta di X giorni (mesi, anni). Le date del nuovo contesto devono esistere nella tabella calendario (che tu qui NON stai usando), altrimenti avrai dei blank, o dei periodi parziali. Questo è sicuramente un errore concettuale che vedo nel tuo codice: per il resto... hic sunt leones! :lol:
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
alex77
Messaggi: 160 | Topic creati
Iscritto il: sab 24 ott 2020, 23:04
Luogo: Treviso
Ringraziato: 11 volte

Tabella calcolata in DAX, errore su endofmonth

Messaggio da alex77 »

Ciao Enrico Galli
Solo “hic sunt leones” vale il prezzo del biglietto :clap:
Confermo che so che serve magari un Excel con dei dati di esempio, ma volevo effettivamente innanzitutto capire il livello concettuale della formula e confermo la mia mal interpretazione di dateadd da figlio di Excel. Avevo subodorato già la questione ma la tua conferma mi è molto utile per proseguire le prove di “aggiustaggio”. Se arrivo alla disperazione mi rifaccio vivo con i dati di esempio.

Grazie mille per l’aiuto
Avatar utente

Autore del topic
alex77
Messaggi: 160 | Topic creati
Iscritto il: sab 24 ott 2020, 23:04
Luogo: Treviso
Ringraziato: 11 volte

Tabella calcolata in DAX, errore su endofmonth

Messaggio da alex77 »

Ciao,
per chi si diletterà a leggere questo post, dopo attenta analisi dei risultati (che, come detto, mi venivano sbagliati) e grazie alle indicazioni di Enrico Galli, effettivamente il problema era nel fatto che la tabella dimensione calendario finiva con la data odierna, quindi la funzione "endofmonth" dava la fine del mese che "poteva vedere" e cioè proprio la data odierna. Modificando il calendario, facendolo finire a fine mese, tutto lavora correttamente.
Grazie ad Enrico per l'aiuto!

A.
Rispondi