Report gestione spese familiari

Avete creato un report, un applicativo o uno strumento e volete farlo conoscere al gruppo? Postatelo qui!
Rispondi
Avatar utente

Godwyn
Messaggi: 17 | Topic creati
Iscritto il: sab 5 dic 2020, 11:07
Luogo: Varese
Ringraziato: 4 volte

Report gestione spese familiari

Messaggio da Godwyn »

Ciao a tutti,

intanto Buon Anno, sperando che sia migliore di questo appena trascorso, sotto tutti i punti di vista :)

Ci tenevo a condividere con voi un lavoretto fatto da me per la gestione delle spese familiari. Sicuramente ce ne sono di fatti meglio in giro (tra app e dashboard varie delle banche almeno) e di più automatizzati, ma il mio voleva essere anche un esercizio di stile per entrare in contatto con alcuni strumenti del forum, che sto imparando piano piano.

Ci terrei a capire con voi cosa posso migliorare per renderlo ancora più fruibile a tutti voi del forum.

Provo a spiegare l'idea alla base:

- L'utente inserisce le varie voci di spesa nel foglio Dettaglio Spese: il foglio è compilabile solo nelle celle di inserimento dei nomi, le celle con i codici (che nella mia idea dovrebbero fungere da Primary Key) sono bloccati. Strumenti sfruttati: Gestione dei nomi + Doppia convalida dati + Formule Excel per automatizzazione

- Tutte la tabelle vengono inserite nel modello di dati Power Pivot per costruire una prima pivot ed effettuare alcune prima rapide misure: ad esempio i risparmi in € e in %. Strumenti sfruttati: Power Pivot + Misure DAX

Le formule sono molto semplici e sono le seguenti:

Amount Entrate

Codice: Seleziona tutto

CALCULATE(SUM(DettaglioSpese[Amount]);Categorie;Categorie[NomeCategoria]="Entrata")
Amount Uscite

Codice: Seleziona tutto

CALCULATE(SUM(DettaglioSpese[Amount]);Categorie;Categorie[NomeCategoria]="Uscita")
Risparmi € (tutte le uscite vengono caricate con segno negativo)

Codice: Seleziona tutto

[Amount Entrate]+[Amount Uscite]
Risparmi %

Codice: Seleziona tutto

DIVIDE([Amount Entrate]+[Amount Uscite];[Amount Entrate])
- Il terzo step consiste nel caricare in automatico in modello di dati in Power BI, per creare dei report semplici e fruibili per ogni utente della famiglia. Prima di fare questo facciamo transitare le tabelle in Power Query per trasformare alcuni dati della tabella "DettaglioSpese" in modo da rimuovere le colonne in eccesso (quelle con i nomi) e sfruttare le chiavi primarie. In questo modo andiamo a creare un modello di dati "pulito", con una tabella Calendario separata per un analisi più dettagliata a livello di time intelligence. Strumenti sfruttati: Power Query + Power BI

Vi allego:
1) Il file Excel con una primissima bozza di dati compilati, la pwd del foglio DettaglioSpese è mondobi
2) Il file di PBI, dove ho costruito un paio di report semplicissimi, che potremmo personalizzare con dei dati di BGT per categoria o mensili ed altre misure.

Siate cattivi e spietati, tempo per migliorare ce n'è sempre, soprattutto se arrivano idee buone. :)

Un buon Anno a tutti!
Allegati
prova.pbix
(88.21 KiB) Scaricato 74 volte
Report Gestione Spese Familiari V1.xlsx
(620.26 KiB) Scaricato 98 volte


Avatar utente

Andrea90
Messaggi: 2193 | Topic creati
Iscritto il: dom 28 giu 2020, 19:41
Luogo: Bologna
Ringraziato: 666 volte
Contatta:

Report gestione spese familiari

Messaggio da Andrea90 »

Ciao Godwyn,

Intanto grazie per aver pubblicato un tuo lavoro così da condividerlo con tutti noi.

Una prima domanda che mi viene da farti è, perché la tabella SubCategory2 si collega direttamente alla FactTable? Non dovrebbe essere legata alla SubCategory1?

Se fossero effettivamente legate da una relazione (dal punto di vista logico) il modello dati che hai al momento non ti permette di usufruire dei filtri poiché se prendiamo come esempio la tabella SubCategory1 un campo dimensionale di questa tabella sarebbe in grado di filtrare i dati della FactTable, ma non potrebbe fare lo stesso con i dati della tabella SubCategory2 (cosa che invece potrebbe fare se fossero legate fra loro a "cascata").

E nel caso dovessi mettere in relazione la tabella SubCategory2 con la SubCategory1 (o viceversa) poi proverei a pensare se vale la pena di tenerle separate o se meglio condensarle in un'unica tabella tramite PowerQuery, prima del caricamento del modello dati.

A presto,

Andrea
Se hai gradito l'aiuto che hai ricevuto considera di contribuire alle spese per il mantenimento del forum facendo una libera DONAZIONE --> Link

Ricordarsi di segnare come "RISOLTE" le discussioni per le quali si è ricevuto un feedback positivo. Per vedere come fare --> Link
Avatar utente

Autore del topic
Godwyn
Messaggi: 17 | Topic creati
Iscritto il: sab 5 dic 2020, 11:07
Luogo: Varese
Ringraziato: 4 volte

Report gestione spese familiari

Messaggio da Godwyn »

Grazie a te per la risposta Andrea :)

E grazie per i suggerimenti, il modello di dati effettivamente aveva questo grossolano errore, l'idea di denormalizzare le due tabelle è ottima, faccio qualche prova con Power Query e vi restituisco il modello corretto!

Altri consigli o suggerimenti? Io per esempio ho un dubbio sulla gestione dei rimborsi: sono entrate a tutti gli effetti, ma se venissero inseriti in questa categoria porterebbero ad errori sui consuntivi delle varie categorie di uscita, che sarebbero più alti.

Voi come la gestireste? Io per esempio sarei tentato di eliminare la categoria, gestire solo la sub1 e sub2 e lasciare che a dividere le entrate e le uscite siano solo i numeri positivi e negativi.
Avatar utente

Andrea90
Messaggi: 2193 | Topic creati
Iscritto il: dom 28 giu 2020, 19:41
Luogo: Bologna
Ringraziato: 666 volte
Contatta:

Report gestione spese familiari

Messaggio da Andrea90 »

Ciao Godwyn,

Per prima cosa direi che questa misura:

Codice: Seleziona tutto

Amount Uscite = CALCULATE(SUM(DettaglioSpese[Amount]),Categorie,Categorie[NomeCategoria]="Uscita")
Presenta un dettaglio non trascurabile, ovvero quel "Categorie", sarebbe interessante chiederti un parere sulla seguente misura:

Codice: Seleziona tutto

Amount Uscite = CALCULATE(SUM(DettaglioSpese[Amount]),Categorie[NomeCategoria]="Uscita")
E a che risultati possono portare ;)

Poi, io, in generale, preferisco utilizzare misure ad hoc, esempio:

Codice: Seleziona tutto

TotSpese = SUM(DettaglioSpese[Amount])
e poi richiamare la stessa dentro CALCULATE:

Codice: Seleziona tutto

Amount Uscite = CALCULATE([TotSpese],Categorie[NomeCategoria]="Uscita")
Ma questo non influenza, in questo caso, il calcolo, è più una prassi che seguo per mantenere il tutto in ordine ed uniformare la scrittura del codice DAX.

Poi quella tabella Categorie al momento, per come è impostata, non ha un gran ruolo visto che non contiene informazioni aggiuntive, se non il fatto che IN equivale alla parola Entrata, e OUT ad Uscita (cosa che tra l'altro puoi ottenere facilmente già in PQ direttamente dentro la FactTable con un sostituisci valori).

Per quel che riguarda la versatilità del calcolo direi che non hai di che preoccuparti, la forza di DAX risiede proprio in queste cose, pertanto non avrai problemi a crearti misure che lavorino bene a prescindere che tu voglia registrare le informazioni già con il segno corretto, oppure no.

A presto,

Andrea
Se hai gradito l'aiuto che hai ricevuto considera di contribuire alle spese per il mantenimento del forum facendo una libera DONAZIONE --> Link

Ricordarsi di segnare come "RISOLTE" le discussioni per le quali si è ricevuto un feedback positivo. Per vedere come fare --> Link
Avatar utente

Autore del topic
Godwyn
Messaggi: 17 | Topic creati
Iscritto il: sab 5 dic 2020, 11:07
Luogo: Varese
Ringraziato: 4 volte

Report gestione spese familiari

Messaggio da Godwyn »

Andrea90 ha scritto: lun 4 gen 2021, 22:50 Ciao Godwyn,

Per prima cosa direi che questa misura:

Codice: Seleziona tutto

Amount Uscite = CALCULATE(SUM(DettaglioSpese[Amount]),Categorie, Categorie[NomeCategoria]="Uscita")
Presenta un dettaglio non trascurabile, ovvero quel "Categorie", sarebbe interessante chiederti un parere sulla seguente misura:

Codice: Seleziona tutto

Amount Uscite = CALCULATE(SUM(DettaglioSpese[Amount]),Categorie[NomeCategoria]="Uscita")
E a che risultati possono portare ;)
Direi che, per quello che ho imparato, i due risultati sono profondamente diversi. Nel primo caso infatti la tabella Categorie è già nel contesto di filtro e tutti i filtri precedenti vengono sovrascritti . Insomma, in questo caso verrebbe visualizzata la sola categoria "Uscita" nella tabella Categorie. Nel secondo caso invece non viene applicato un contesto di filtro sulla tabella categorie e perciò si visualizzeranno sia le entrate che le uscite, entrambe con lo stesso valore, sbaglio?

Grazie per le dritte sulla pulizia delle formule! :)
Avatar utente

Andrea90
Messaggi: 2193 | Topic creati
Iscritto il: dom 28 giu 2020, 19:41
Luogo: Bologna
Ringraziato: 666 volte
Contatta:

Report gestione spese familiari

Messaggio da Andrea90 »

Ciao Godwyn,

Sul fatto che i due risultati sono diversi sono più che d'accordo :thumbup:

Sul motivo per il quale sono diversi mi verrebbe da dire:

1) "Nel primo caso infatti la tabella Categorie è già nel contesto di filtro e tutti i filtri precedenti vengono sovrascritti" --> Ni, nel senso che DAX è un linguaggio che nasconde insidie, qui il "tutti" i filtri precedenti vengono sovrascritti può portare ad errori, poiché non è propriamente corretto. Ad esempio un filtro esterno derivante ad esempio dalla tabella Calendario, non verrebbe sovrascritto.

2) Un argomento filtro lo si può intendere come una tabella di valori, difatti quel Categorie[NomeCategoria]="Uscita" lo si può intendere come
FILTER( ALL(Categorie[NomeCategoria]), Categorie[NomeCategoria] = "Uscita"), pertanto indipendentemente da che valore tu utilizzi dentro al tuo report per il campo NomeCategoria, DAX lo sostituisce con "Uscita", ecco perché nella seconda versione, il fatto che tu abbia sulle righe Entrata o Uscita, non influenza il risultato della misura.

3) Inserire come argomento filtro un'intera tabella, come hai scritto nella prima versione, non è proprio una best practice. Al momento non te ne accorgi poiché Categorie è una tabella con 2 righe e 2 colonne, ma immagina di scrivere una formula simile inserendo come riferimento una tabella con migliaia di righe e diverse colonne, a livello di performance avresti seri problemi (oltre che potenziali errori di calcolo - Expanded Table).

4) Se tu utilizzi una sugar syntax come si fa di solito, tipo: Categorie[NomeCategoria] = "Uscita", DAX te la traduce in automatico in un
FILTER ( ALL ( ) )....
ma se tu indichi come filtro il solo nome della Tabella, quest'ultima sarà affetta dal contesto esterno. Pertanto in una matrice dove sulle righe hai le 2 diverse Categorie, la formula nella prima versione ti riporterà un valore vuoto nella riga delle Entrate perché :
a) Il primo argomento filtro, ovvero la tabella Categoria riporterà solo le righe che rispecchiano il valore che trovi sulla riga (ovvero la riga delle entrate)
b) Il secondo argomento ti riporterà la sola riga delle Uscite perché essendoci quel ALL implicito, pur avendo le Entrare sulle righe il FILTER non lo considererà.
c) L'intersezione di queste due "tabelle" riporterà un valore vuoto poiché non esiste nessun record che rappresenta sia le entrate (a) che le uscite (b).

Il fatto che tu voglia il risultato descritto al punto 4) è in funzione di ciò che vuoi misurare, poiché magari possono esistere metodi diversi (es° KEEPFILTERS) per far si che comunque ti compaia un valore vuoto, senza per questo dover utilizzare un'intera tabella come argomento filtro (che ripeto trovo essere molto pericolosa come prassi, a meno di casi particolari).

A presto,

Andrea
Se hai gradito l'aiuto che hai ricevuto considera di contribuire alle spese per il mantenimento del forum facendo una libera DONAZIONE --> Link

Ricordarsi di segnare come "RISOLTE" le discussioni per le quali si è ricevuto un feedback positivo. Per vedere come fare --> Link
Rispondi