Ramon Barrull

Bones pràctiques per a un informe de Power BI

Unitat de formació · Power BI · Ramon Barrull

Bones pràctiques

Del dada bruta · a l'informe fiable

Un checklist de decisions que marquen la diferència entre un informe fràgil i un informe que aguanta canvis, escala i es pot mantenir un any després.

10 capítols Checklist inclosa Exemples DAX Errors habituals
Tornar a l'índex
IniciBones pràctiques
1
De la dada a l'informe: tres fases

Abans d'obrir un visual, cal tenir clar que un informe de Power BI passa sempre per tres fases connectades: importar i transformar les dades, modelar les taules i relacions, i visualitzar. Un informe no es basa en gràfics bonics: es basa en una base de dades neta, ben estructurada i correctament modelada.

📥 Origen
de dades
⚙️ Power Query
neteja i transforma
🗄️ Modelatge
taules i relacions
📊 Visualització
l'informe final
💡El 80% dels problemes que apareixen "al final" (mesures que no quadren, visuals lents, relacions ambigües) neixen en realitat a la fase 1 o 2. Aquesta guia segueix aquest ordre a propòsit: cada capítol depèn del que fa el capítol anterior bé.

2
Power Query: prepara les dades

Power Query és l'entorn de preparació de dades de Power BI. Aquí es netegen, transformen i estructuren les dades abans de carregar-les al model.

⚠️Power Query no té "Ctrl+Z". Si fas un canvi erroni: esborra el pas manualment al panell "Passos aplicats", o desfés-lo des del menú contextual d'aquell pas.
🔤Power Query distingeix majúscules i minúscules: "Client" i "client" són noms de columna diferents. I aplica per defecte un pas de "Tipus canviat" en importar — és recomanable moure'l al final o eliminar-lo si canviaràs tipus manualment després.
Panell de Passos aplicats de Power Query amb el menú contextual d'un pas obert
Panell "Passos aplicats", amb el menú contextual d'un pas obert (Canviar el nom / Eliminar / Propietats)

Quan fer cada transformació:

AccióQuan fer-ho
Renombrar columnesAl final de tot
Eliminar columnesNomés si tens la certesa que no les necessitaràs
Reordenar columnesMillor evitar-ho: no aporta valor al model i trenca passos posteriors
Canviar tipus de dadesEn un sol pas, al final (evita errors en cascada)
Combinar consultes (merge)Sempre que calgui enriquir dades des d'una altra taula
Afegir columnes personalitzadesNomés si necessites camps derivats nous
  • Usa noms clars i sense espais: DataVenda millor que "data venda"
  • Evita caràcters especials o accents en noms de columna i de taula
  • Renombra els passos si cal claredat (clic dret sobre el pas → "Canviar el nom")
⚙️Query folding (el que el PDF original no menciona i és el més important per al rendiment): quan la font és una base de dades, Power Query intenta traduir els teus passos a una consulta que s'executa al servidor, no al teu PC. Mentre encadenis passos "traduïbles" (filtrar, renombrar, agrupar), el folding es manté i el refresh és ràpid. En el moment que insereixes una columna personalitzada amb M, un canvi de tipus mal situat, o un merge entre fonts diferents, el folding es trenca: tota la resta de passos s'executen dada a dada al motor de Power Query, no al servidor. Per això l'ordre de la taula d'aquí sobre no és estètica, és rendiment.

3
Modelatge: l'esquema en estrella

L'esquema en estrella és l'estructura de model optimitzada per a l'anàlisi. Es compon de taules de fets (dades numèriques: vendes, imports, quantitats) i taules de dimensions (dades descriptives que filtren i agrupen: clients, productes, dates, zones).

📊 Taules de fets

Contenen les mètriques. Creixen molt (milions de files). Mai s'hi relaciona directament una altra taula de fets.

🏷️ Taules de dimensió

Contenen descripcions. Han de tenir clau única per fila per poder crear relacions correctes.

Vista de model de Power BI amb un esquema en estrella
Vista de model (Model view): una taula de fets al centre i les dimensions connectades al voltant

Per què val la pena l'esforç:

  • Millora el rendiment de Power BI
  • Facilita escriure mesures DAX sense ambigüitats
  • Redueix errors en relacions
  • Permet relacions d'un a molts, predictibles i eficients

Regles bàsiques:

  • Les dimensions tenen camps únics (sense repetir) per poder relacionar-se correctament
  • Les relacions van sempre de dimensió → fets (un a molts)
  • Evita les relacions de molts a molts sempre que puguis
  • Mai relacionis dues taules de fets directament; usa una dimensió comuna o una taula intermèdia
⚠️El que el PDF original no explica prou: quan de veritat necessites una relació N a N (per exemple, un producte pertany a diverses categories a la vegada), la manera correcta no és marcar la relació com "molts a molts" i prou — és construir una taula pont (bridge table) amb una fila per cada combinació vàlida, i relacionar-la en single-direction. Les relacions bidireccionals resolen el símptoma però sovint amaguen ambigüitats de context de filtre que es tradueixen en xifres incorrectes silencioses.

4
La taula de calendari

Power BI necessita una taula de dates pròpia per crear mesures d'intel·ligència temporal (TOTALYTD, SAMEPERIODLASTYEAR, DATEADD) i per filtrar de forma consistent per any, mes o trimestre.

No usis les taules de dates automàtiques que Power BI crea per defecte (una per cada camp de tipus data, ocultes). Multipliquen la mida del model i no es poden relacionar entre elles.

Desactiva-ho primer:

1
Fitxer → Opcions i configuració → Opcions → Càrrega de dades
2
Desmarca "Auto date/time per a nous fitxers"

Crea-la manualment amb DAX:

DAX — Taula Calendari (dates fixes)
Calendari =
ADDCOLUMNS(
    CALENDAR(DATE(2015,1,1), DATE(2030,12,31)),
    "Any", YEAR([Date]),
    "Mes", MONTH([Date]),
    "NomMes", FORMAT([Date], "MMMM"),
    "Trimestre", "Q" & FORMAT([Date], "Q"),
    "AnyMes", FORMAT([Date], "YYYY-MM")
)
  • El camp [Date] ha de ser únic i sense buits en el rang
  • Ordena NomMes per Mes, i AnyMes per [Date]
⚠️Aquesta versió amb dates fixes és clara per aprendre, però té un problema de manteniment real: si el 2031 encara s'usa aquest informe, la taula s'acaba el 31/12/2030 i les mesures temporals deixen de funcionar sense que ningú entengui per què. I si la taula de fets només arriba fins al 2024, estàs generant anys de files buides que inflen el model sense aportar res.

Versió dinàmica (recomanada per a producció): calcula l'inici i el final a partir de les dates reals de la taula de fets, arrodonits a any complet perquè les comparatives YTD i interanuals no es trenquin a mig any.

DAX — Taula Calendari (dates dinàmiques)
Calendari =
VAR DataMin = DATE( YEAR( MIN( F_Vendes[Data] ) ), 1, 1 )
VAR DataMax = DATE( YEAR( MAX( F_Vendes[Data] ) ), 12, 31 )
RETURN
ADDCOLUMNS(
    CALENDAR( DataMin, DataMax ),
    "Any", YEAR([Date]),
    "Mes", MONTH([Date]),
    "NomMes", FORMAT([Date], "MMMM"),
    "Trimestre", "Q" & FORMAT([Date], "Q"),
    "AnyMes", FORMAT([Date], "YYYY-MM")
)
💡Aquí MIN i MAX no treballen amb context de fila: agreguen tota la columna de la taula de fets d'un sol cop, com ho faria una mesura. I com que Calendari és una taula calculada en DAX (no una consulta de Power Query), es torna a calcular sencera cada vegada que refresques el model. Per això la data final sempre reflecteix l'última venda carregada, sense tocar el codi.
⚠️Si [Data] a la taula de fets és Datetime amb hora, no cal truncar-la a part: com que aquí reconstruïm la data amb DATE(YEAR(...),1,1) i DATE(YEAR(...),12,31), la part d'hora queda descartada automàticament. Si tens més d'una taula de fets amb dates (vendes, compres…), amplia el MIN/MAX perquè cobreixi totes: MIN( MIN(F_Vendes[Data]), MIN(F_Compres[Data]) ).
Limitació: les taules calculades en DAX no estan disponibles (o tenen suport molt limitat) en models DirectQuery. En aquest cas cal fer l'equivalent en Power Query M (List.Min / List.Max sobre la columna de dates + List.Dates()).
Opcions de càrrega de dades amb Auto date/time desactivat
Opcions → Càrrega de dades: casella "Auto date/time per a nous fitxers" desmarcada

I marca-la com a taula de dates (per a qualsevol de les dues versions):

1
Selecciona la taula Calendari
2
Selecciona la columna [Date]
3
Eines de taula → "Marcar com a taula de dates"
Diàleg Marcar com a taula de dates
Diàleg "Marcar com a taula de dates" amb la columna Date seleccionada

5
Optimitza el model

Amb les dades importades i el model estructurat, toca deixar-lo net i clar tant per a l'usuari final com per a tu mateix quan hi tornis d'aquí sis mesos.

Categoritza i formata cada camp:

CampTipus de dadaFormatCategoria de dades
ImportDecimalMoneda (€)Cap
CiutatTextCiutat
Pàgina webTextURL
ImatgeURLTextImatge
Desplegable de categoria de dades a les propietats d'una columna
Panell de propietats d'una columna, amb el desplegable "Categoria de dades" obert
  • Ordena columnes com NomMes per una auxiliar numèrica (Modelatge → "Ordenar per columna")
  • Oculta columnes tècniques, d'ordenació o claus redundants (IDProducte si ja tens NomProducte) — clic dret → "Ocultar a la vista d'informe"
  • Fes servir noms coherents per a taules i columnes; els prefixos DIM_ / F_ són opcionals però ajuden a distingir dimensions de fets d'un cop d'ull
Diàleg Ordenar per columna
Diàleg "Ordenar per columna": NomMes ordenat per la columna Mes

Abans de passar a la visualització, valida:

  • Totes les relacions estan actives
  • No hi ha relacions innecessàries
  • Totes van d'1 (dimensió) a * (fets)
⚠️Un parany que el PDF original no cobreix: quan carregues una taula nova, Power BI intenta autodetectar relacions a partir de noms de columna semblants — i sovint encerta la cardinalitat però no la direcció, o relaciona dues columnes que casualment es diuen igual sense tenir res a veure. Revisa sempre manualment cada relació nova al diagrama del model; no confiïs en l'autodetecció a cegues.
🗂️Extra pràctic per a models grans: agrupa les mesures en display folders (panell de propietats de la mesura → "Display folder", p. ex. "Vendes" / "Marges" / "Auxiliars"). Amb 30-40 mesures, un panell de camps pla és inusable per a qui consumeix l'informe.
Camp Display folder a les propietats d'una mesura
Panell de propietats d'una mesura amb el camp "Display folder" emplenat

6
Dissenya l'informe

Amb dades i model llestos, arriba la fase visual. L'objectiu és mostrar la informació de forma clara i útil per prendre decisions — no fer una demostració de tots els visuals que ofereix Power BI.

Planifica abans de dissenyar:

  • Pregunta't: què necessita veure l'usuari final, concretament?
  • Defineix els KPI clau, els filtres habituals i les agrupacions per període
  • Organitza per pàgines: una de resum (dashboard general) i altres de detall (per producte, client, zona…)

Tipus de filtres i quan usar-los:

Tipus de filtreÚs recomanat
Segmentadors (slicers)Filtres visibles per a data, categoria, client…
Filtres de pàginaS'apliquen a tots els visuals d'una pàgina
Filtres d'informeS'apliquen a totes les pàgines de l'informe
Filtres de visualAfecten només un gràfic concret
DrillthroughPassa a una pàgina de detall filtrada per l'element on has fet clic (no surt al PDF original, i és clau per a informes de detall sense saturar la pàgina de resum)

Disposició clara:

  • Evita sobrecarregar la pàgina amb massa visuals
  • Deixa espais en blanc: milloren la llegibilitat
  • Usa una paleta de colors coherent en tot l'informe
  • Alinea els visuals i posa'ls títols clars
  • Prioritza elements simples: targetes, columnes/línies, taules
💡Una targeta per cada KPI important (vendes actuals, objectiu, variació %) és més llegible que amagar-los dins d'una taula.

Mesures DAX, no columnes calculades:

❌ Columna calculada
Ocupa espai en memòria
per a cada fila.
Es recalcula en carregar
i no respecta el context
de filtre dinàmicament.
✅ Mesura DAX
TotalVendes = SUM(F_Vendes[Import])
VendesYTD =
TOTALYTD([TotalVendes], Calendari[Date])

Interaccions i format:

  • Decideix com interactuen els visuals entre ells (filtren / ressalten / no s'afecten) des de Format → "Editar interaccions"
  • Personalitza colors, etiquetes, línies de referència, mides de text i marges per a cada visual
Icones d'editar interaccions sobre els visuals
Mode "Editar interaccions": icones de filtre / ressaltar / cap sobre cada visual

Tooltips personalitzats:

1
Crea una pàgina nova
2
Format de pàgina → marca-la com "Tooltip"
3
Dissenya el contingut (p. ex. desglossament per producte)
4
Aplica'l al visual corresponent
Format de pàgina amb el toggle Tooltip activat
Format de pàgina amb el tipus "Tooltip" activat i la mida reduïda

7
Revisió final i checklist

Abans d'entregar l'informe, revisa'l com si fossis l'usuari final: filtra per diferents valors, comprova que els visuals responen bé, i assegura't que les dades s'entenen sense haver-te de preguntar res a tu.

Bones pràctiques
  • Noms clars, consistents i sense espais
  • Canvis de tipus, nom i ordre fets al final del procés a Power Query
  • Auto date/time desactivat i taula de calendari pròpia
  • Columnes innecessàries ocultes a l'informe
  • Model en estrella (fets + dimensions)
  • Camps formatats i categoritzats correctament
  • Mesures DAX en lloc de columnes calculades quan és possible
  • Informe enfocat, sense excés de gràfics
  • Visuals alineats i ben etiquetats
  • Navegació i filtres provats com a usuari final
Errors comuns
  • Relacions de molts a molts innecessàries
  • Relacionar dues taules de fets directament
  • Deixar actives les taules de dates automàtiques
  • Carregar columnes que mai s'usen
  • No ordenar "Mes" o "NomMes" per la columna numèrica corresponent
  • No marcar la taula de dates com a tal
  • Escriure mesures sense entendre el context de filtratge
  • Fer massa transformacions al principi de Power Query (trenca el query folding)
  • No netejar les dades abans de visualitzar-les
  • Confiar cegament en relacions autodetectades

8
Configuració de Power BI Desktop

Uns quants ajustos que val la pena revisar en començar qualsevol projecte, per evitar problemes que després costen molt de desfer.

📅 Auto date/time

Fitxer → Opcions → Càrrega de dades → desactiva "Auto date/time per a nous fitxers". Evita que Power BI generi una taula de dates interna per cada camp de tipus data.

🌍 Regionalització

Fitxer → Opcions → Configuració regional. Assegura't que l'arxiu usa la configuració correcta (p. ex. "Català" o l'idioma predeterminat de Windows): afecta format de dates, separadors decimals i moneda.

⚡ Rendiment

Opcions → Càrrega de dades → vista prèvia de dades: desactiva el càlcul automàtic de previsualitzacions si treballes amb volums grans. Millora el rendiment editant a Power Query.

🧹 Versió neta

Abans de compartir: elimina consultes no utilitzades, neteja taules/columnes/mesures de prova, i comprova que el model final estigui optimitzat.

Configuració regional a les opcions de Power BI Desktop
Opcions → Configuració regional

9
Documenta el model

És la part que sempre s'obvia i la que més es troba a faltar sis mesos després. Documentar bé el model ajuda a entendre el flux de treball, facilita el manteniment, permet col·laborar amb altres equips i fa que sigui més fàcil detectar errors o colls d'ampolla en la lògica de negoci.

  • Usa noms descriptius i coherents per a taules, columnes i mesures
  • Afegeix comentaris als passos de Power Query (clic dret sobre el pas → "Propietats" → escriu un comentari)
  • Fes servir una taula auxiliar o un document extern on expliquis l'estructura del model, les relacions entre taules, les regles de negoci (com es calculen els KPI) i les suposicions preses (p. ex. "els valors nuls es tracten com a 0")
  • Anomena les mesures DAX seguint un patró clar (p. ex. Total Vendes, Mitjana Vendes Últims 3 Mesos)
  • Afegeix descripcions als camps (clic al camp → panell de propietats → "Descripció")
🛠️Eina que el PDF original no menciona: per a models grans val la pena auditar-los amb el Best Practice Analyzer de Tabular Editor, que revisa automàticament el model contra un conjunt de regles de bones pràctiques (mesures sense format, columnes calculades que haurien de ser mesures, relacions inactives, camps sense amagar…). No substitueix el criteri, però detecta en segons el que costaria hores de revisar manualment.

10
Cas pràctic complet

Apliquem els nou capítols anteriors seguits, sobre un cas real petit: una botiga d'articles esportius amb vendes, clients i productes. L'objectiu no és el resultat final, és veure com cada decisió d'un capítol condiciona el següent.

10.1 · Les dades en brut

Així arriba l'extracció del sistema de vendes, sense tocar:

fecha ventaclientePRODUCTOqtyimport €
03/01/2024Marta Solé Bicicleta Trek FX21649,00
2024-01-04joan puigcasc mtb pro289,90
5/1/2024MARTA SOLÉBicicleta Trek FX21649,00
Tres problemes reals en tres files: dates en formats diferents (algunes ambigües entre dia i mes), el mateix client escrit de tres maneres ("Marta Solé", "MARTA SOLÉ", amb espai final), i un import que barreja coma decimal amb possibles duplicats de venda. Cap d'aquests problemes es veu "bé" en una taula dinàmica fins que algú suma malament un client o un mes.

10.2 · Neteja a Power Query

1
Canvia el tipus de fecha venta forçant el format d'origen (Regió: Espanya/dia-mes) abans que Power Query l'endevini malament amb el pas automàtic de "Tipus canviat"
2
Normalitza cliente: Text.Trim + Text.Proper (treu espais i uniformitza majúscules/minúscules) perquè "Marta Solé" i "MARTA SOLÉ " es tractin com el mateix client
3
Detecta i elimina la fila duplicada (mateix client, producte i data que una altra) amb "Eliminar duplicats" sobre les columnes clau
4
Al final: renombra a DataVenda/Client/Producte/Quantitat/Import i fixa els tipus definitius en un sol pas
💡Fixa't en l'ordre: primer es resol l'ambigüitat de format (pas 1, mentre encara és fàcil de detectar), després la neteja de text, després els duplicats, i només al final el renombrament — exactament la taula del capítol 2.

10.3 · Model en estrella

📊 F_Vendes (taula de fets)
🏷️ DIM_Clients
📦 DIM_Productes
📅 Calendari

F_Vendes conté DataVenda, IdClient, IdProducte, Quantitat i Import — res de nom de client ni de producte, això viu a les dimensions. Les tres relacions surten de F_Vendes cap a cada dimensió, totes 1 (dimensió) a * (fets), com marca el capítol 3.

10.4 · Calendari dinàmic aplicat al cas

DAX
Calendari =
VAR DataMin = DATE( YEAR( MIN( F_Vendes[DataVenda] ) ), 1, 1 )
VAR DataMax = DATE( YEAR( MAX( F_Vendes[DataVenda] ) ), 12, 31 )
RETURN
ADDCOLUMNS( CALENDAR( DataMin, DataMax ), "Any", YEAR([Date]), "Mes", MONTH([Date]), "NomMes", FORMAT([Date],"MMMM") )

Cada cop que es carreguen vendes noves, DataMax avança sol. Ningú ha de recordar "ampliar el calendari" el gener següent.

10.5 · Mesures clau

DAX
TotalVendes = SUM(F_Vendes[Import])

CostVendes =
SUMX(F_Vendes, F_Vendes[Quantitat] * RELATED(DIM_Productes[CostUnitari]))

MargeBrut = [TotalVendes] - [CostVendes]

MargePercent = DIVIDE([MargeBrut], [TotalVendes])

VendesYTD = TOTALYTD([TotalVendes], Calendari[Date])

VendesAnyAnterior =
CALCULATE([TotalVendes], SAMEPERIODLASTYEAR(Calendari[Date]))
  • SUMX és necessari a CostVendes perquè el cost és per unitat: cal multiplicar fila a fila abans de sumar, no es pot fer amb un SUM directe
  • RELATED llegeix el cost des de la dimensió DIM_Productes aprofitant el context de fila que dona SUMX sobre F_Vendes
  • DIVIDE en lloc de /: retorna en blanc (o el tercer paràmetre, si l'indiques) quan TotalVendes és 0, sense trencar el visual amb un error de divisió

10.6 · Disseny de l'informe

📄 Pàgina 1 · Resum

Targetes amb TotalVendes, MargePercent i VendesYTD. Gràfic de columnes de vendes per mes. Segmentador d'any. Cap taula detallada: és la pàgina que obre un directiu.

📄 Pàgina 2 · Detall per client

Taula amb clients i les seves mètriques. S'hi arriba per drillthrough des d'una barra de la pàgina 1 (capítol 6.3). Segmentador de categoria de producte.

Aquest disseny de dues pàgines segueix la recomanació del capítol 6: una pàgina de resum per decidir d'un cop d'ull, i una pàgina de detall per a qui necessita investigar-hi més.

El cicle real d'un informe ben construït

L'ordre dels capítols és l'ordre en què s'han de prendre les decisions. Saltar-se'l és el que produeix informes que "funcionen" fins que algú els vol ampliar. El capítol 10 mostra el mateix ordre aplicat a un cas real.

⚙️Power Query net i amb query folding intacte és la base del rendiment.
El model en estrella evita ambigüitats de context de filtre.
📅La taula de calendari pròpia és imprescindible per a DAX temporal.
🗂️Un model optimitzat i validat és fàcil d'usar per qui no l'ha creat.
🎨El disseny ha de respondre a què necessita decidir l'usuari, no a què es pot fer.
La checklist final és el que separa un informe acabat d'un informe abandonat.
🔧La configuració inicial evita hores de feina de desfer decisions per defecte.
📝La documentació és el que fa que el model sobrevisqui a qui l'ha creat.

Un informe correcte avui i un informe mantenible d'aquí un any no són el mateix objectiu. Aquesta guia apunta al segon.