Décode l'informatique

Traitement des nombres dans Power Apps

Power Apps Résultat du calcul

Le traitement des nombres et des valeurs numériques dans Power Apps peut révéler quelques surprises, qui ne sont pas forcément toutes bonnes.

Notamment, vous verrez pour quelles raisons, il a été nécessaire d’appeler 3 fonctions Power Apps pour convertir un nombre en… nombre !

Le scénario suivant est réel. Il a été rencontré en cours de développement d’une application Power Apps pour un client.

Somme dans Power Apps

Prenez un cas simple.

Faites la somme de 2 nombres dans des entrées de textes différentes (TextInput1, TextInput2), comme par exemple :

Power Apps Somme 2 nombres
Power Apps Somme 2 nombres

Le signe “+” est une étiquette (Label1) et le résultat du calcul s’affiche dans une autre étiquette (Label2). Le bouton “=” ne sert à strictement à rien dans le calcul. Il sert uniquement à faire joli. La somme de l’étiquette est obtenue par la formule :

Label2.Text = TextInput1.Text+TextInput2.Text

C’est épatant car cela marche tout de suite ! Pourtant, par défaut, les entrées de texte sont définies au format Texte.

Power Apps Format Texte
Power Apps Format Texte

Si vous le souhaitez, vous pouvez les mettre au format Nombre. La somme de 25,44 et 44,88 fera toujours 70,32. Tout va bien.

Power Apps Format Nombre
Power Apps Format Nombre

Pourtant la formule de calcul ne renvoie pas 70,32. Elle renvoie précisément :

70.32000000000001

Passons sur l’erreur d’arrondi, car ce n’est pas ce qui nous intéresse. La valeur décimale renvoyée contient un point (“.” ), et non une virgule (“.”).

Power Apps Résultat du calcul
Power Apps Résultat du calcul

Tout le problème est là. Le point. C’est l’ennemi.

Dans un cas simple comme celui-ci, le contrôle étiquette joue admirablement bien son rôle et affiche correctement la virgule pour les lecteurs francophones.

Quand les données proviennent d’une base de données, comme par exemple une liste Sharepoint, vous pouvez éventuellement rencontrer des problèmes plus complexes.

Format numérique dans SharePoint

Dans SharePoint, il y a 5 types de champs différents qui permettent de stocker un nombre. Il y a les champs de type Nombre, Devise, Date, Oui/Non et Valeur calculée.

Un champ de type Date et heure n’est pas directement concerné par les manipulations de nombre car il subit un traitement spécifique de la part de SharePoint pour apparaître sous forme d’une date.

De même, un champ Oui/Non subit aussi un traitement spécifique de SharePoint pour apparaître sous forme d’un booléen. De plus, l’étendue des possibilités de stockage de ce type de champ est assez limitée 🙂

Un champ Valeur calculée renvoie un des 4 autres types de données. Donc, ce qui est valable pour ces types de données est aussi valable pour lui.

Stockage des nombres dans SharePoint

Les données numériques décimales sont stockées sous forme d’un nombre décimal, donc avec un point. C’est évidemment aussi le cas si elles sont le résultat d’un calcul décimal, comme pour un champ Valeur calculée.

Dans ce cas, un appel à la fonction Power Apps Lookup() d’un champ numérique sur lequel un calcul décimal est fait renverra un nombre stocké avec un point.

Power Apps Lookup
Power Apps Lookup

Si la colonne Ordre contient le nombre 42, Power Apps stockera en mémoire le nombre 33.6 (42 * 80%). C’est le contrôle qui renverra obligeamment 33,6. Bien aimable. (C’est aussi un peu son rôle).

Convertir un nombre en nombre

Le problème apparaît lors de calcul, ou de conversion de nombres décimaux, dans les variables ou les collections. Typiquement, l’appel d’une simple fonction Round() sur cette variable génère un message d’erreur.

Round(glbOrder;0)

Visiblement, la variable glbOrder n’était pas assez numérique pour Round().

Power Apps Message Erreur Round
Power Apps Message Erreur Round

Si une chaîne de caractères contient uniquement des caractères numériques, La fonction Value() de Power Apps permet de la convertir en valeur numérique. Il est donc possible d’effectuer des calculs sur le résultat de la fonction.

Dans certains cas, la formule suivante résout le problème.

Value(glbOrder)

Cependant, cela ne fonctionne pas dans toutes les situations à cause du point (“.”). Aussi, si vous rencontrez ce genre de problème, il faut faire appel à la fonction Substitute() de Power Apps, pour remplacer le point par la virgule.

Substitute(glbOrder;".";","))

Toutefois, la fonction Substitute() ne s’applique que sur une chaîne de caractères. Or, la fonction Substitute() trouve que la variable glbOrder est trop numérique !

A partir d’ici, ça devient compliqué

Dans ce scénario, votre variable, issu d’un champ numérique de SharePoint, n’est pas assez numérique pour la fonction Round(). Par ailleurs, la même variable est trop numérique pour la fonction Substitute().

Dans ce cas, vous vous devez utiliser la fonction Text() de Power Apps. En effet, celle-ci permet de transformer un résultat numérique en chaîne de caractères. Sur cette chaîne de caractères, la fonction Substitute() pourra remplacer le point par une virgule.

Substitute(Text(glbOrder);".";","))

Ensuite, il ne reste plus qu’à transformer la chaîne de caractères numériques en nombre, grâce à la fonction Value(), puis d’appliquer la fonction Round().

Au final, votre formule complète sera :

Round(Value(Substitute(Text(glbOrder);".";",")));0)

Encore une fois, il est possible que vous ne rencontriez jamais ce cas complexe. Tant mieux.

En revanche, si cela vous arrive, cet article peut vous aider à mieux comprendre ce qui se passe et surtout vous aider à résoudre votre problème.

Microsoft365 Addict

Ajouter un commentaire