5 | Types de données
En bref
- Objectifs : distinguer les types du langage M et les types de colonnes proposés par l'interface ; typer des colonnes et des paramètres de fonction ; tester et convertir le type d'une valeur.
- Prérequis : chapitre « 4 | Valeurs et expressions ».
- Niveau : avancé.
Pourquoi ?
Le type d'une colonne détermine ce que vous pourrez en faire dans le modèle sémantique : additionner, filtrer par période, trier. En M, un type bien posé signale aussi une erreur au plus tôt : un paramètre de fonction déclaré as date refuse un texte dès l'appel, au lieu de produire un résultat faux trois étapes plus loin.
Notions clés
Types du langage et types de l'interface
Le langage M connaît un petit nombre de types de base : any, none, null, logical, number, time, date, datetime, datetimezone, duration, text, binary, type, list, record, table et function. Source
Les types de colonnes proposés par l'interface sont des précisions de ces types de base. Plusieurs d'entre eux sont tous des type number pour le langage, mais sont chargés différemment dans le modèle sémantique :
| Type dans l'interface | Écriture en M | Type de base |
| Nombre décimal | type number ou Number.Type | number |
| Nombre décimal fixe | Currency.Type | number |
| Nombre entier | Int64.Type | number |
| Pourcentage | Percentage.Type | number |
| Date | type date | date |
| Date/Heure | type datetime | datetime |
| Date/Heure/Fuseau horaire | type datetimezone | datetimezone |
| Heure | type time | time |
| Durée | type duration | duration |
| Texte | type text | text |
| Vrai/Faux | type logical | logical |
| Binaire | type binary | binary |
| Any | type any | any |
D'autres types précisés existent dans la bibliothèque (Int8.Type à Int32.Type, Single.Type, Double.Type, Decimal.Type, Guid.Type, Uri.Type...). Ils sont rarement utiles dans Power BI, où les quatre types numériques ci-dessus suffisent.
Types nullables
Une valeur null n'est pas un number. Un paramètre déclaré as number refuse donc null ; déclarez-le as nullable number si la colonne peut contenir des vides. Le même principe s'applique aux colonnes d'un type de table : type table [Montant = nullable number].
Typer les colonnes
L'étape Type modifié utilise Table.TransformColumnTypes, qui convertit les valeurs et produit des erreurs de cellule quand la conversion échoue :
= Table.TransformColumnTypes(Source, {{"Date", type date}, {"Quantité", Int64.Type}, {"Montant", Currency.Type}})Un troisième argument facultatif précise les paramètres régionaux de la conversion, ce que fait l'option Utiliser les paramètres régionaux de l'interface :
= Table.TransformColumnTypes(Source, {{"Date", type date}}, "en-US")Le quatrième argument de Table.AddColumn type une colonne calculée : Table.AddColumn(Source, "TTC", each [HT] * 1.2, type number). Source
Tester et convertir
| Fonction | Rôle | Exemple |
Value.Type(valeur) | Renvoie le type d'une valeur | Value.Type(42) renvoie type number |
Value.Is(valeur, type) | Teste le type d'une valeur | Value.Is("abc", type text) renvoie true |
Number.From, Text.From, Date.From | Convertissent une valeur | Number.From("12") renvoie 12 |
x as type | Vérifie le type, erreur sinon | "12" as number provoque une erreur |
Table.Schema(table) | Décrit les colonnes d'une table et leur type | Contrôler le typage d'une requête |
Deux tests utiles dans une colonne personnalisée :
// La valeur peut-elle être lue comme une date ?
try Value.Is(Date.From([Colonne]), type date) otherwise false// Garder les valeurs numériques, remplacer les autres par null
try Number.From([Colonne]) otherwise nullExemple
Requête testable : une petite table typée dès sa création, puis la description de ses colonnes.
let
Ventes = #table(
type table [Date = date, Produit = text, Quantité = Int64.Type, Remise = nullable number],
{
{#date(2026, 1, 5), "Chaise", 4, 0.1},
{#date(2026, 1, 6), "Table", 1, null}
}
),
Schema = Table.Schema(Ventes),
Resultat = Table.SelectColumns(Schema, {"Name", "TypeName", "IsNullable"})
in
ResultatLe résultat liste les quatre colonnes avec leur type (par exemple Int64.Type pour Quantité) et indique que seule Remise accepte null.
[Capture : résultat de Table.Schema, colonnes Name, TypeName et IsNullable]
Pièges et bonnes pratiques
- Une colonne de type Any (icône ABC123) n'a pas de type défini : typez toutes les colonnes avant le chargement.
Number.Type(nombre décimal, à virgule flottante) peut produire de petits écarts d'arrondi sur les montants ; préférezCurrency.Type(décimal fixe à 4 décimales) pour les valeurs monétaires.- Déclarer
as numberdans une fonction ne convertit pas la valeur, il vérifie seulement son type : convertissez avecNumber.Fromsi la source est du texte. - Le type d'une colonne personnalisée sans quatrième argument est Any, même si toutes les valeurs sont des nombres.
À retenir
- Le langage a des types de base ; l'interface en propose des précisions (
Int64.Type,Currency.Type,Percentage.Type). nullableautorise les valeurs vides dans un paramètre ou une colonne.Table.TransformColumnTypesconvertit, avec des paramètres régionaux si besoin.Value.Is,Value.Typeettry ... otherwiseservent à tester les valeurs.