Pagina 1 di 1

Tabella calcolata in DAX, errore su endofmonth

Inviato: ven 12 nov 2021, 16:58
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

Tabella calcolata in DAX, errore su endofmonth

Inviato: lun 15 nov 2021, 8:37
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

Tabella calcolata in DAX, errore su endofmonth

Inviato: lun 15 nov 2021, 11:28
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:

Tabella calcolata in DAX, errore su endofmonth

Inviato: lun 15 nov 2021, 14:30
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

Tabella calcolata in DAX, errore su endofmonth

Inviato: mar 23 nov 2021, 14:12
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.