Principe

Introduction

MyReport Center est un site Web. Cela signifie que le langage HTML est interprété.

Pour pouvoir injecter du code HTML dans nos dashboards, on va simplement se servir des champs calculés en y écrivant une formule en HTML.

Important

Mais c'est quoi le langage HTML ?

HTML signifie « HyperText Markup Language » qu'on peut traduire par « langage de balises pour l'hypertexte ». Il est utilisé afin de créer et de représenter le contenu d'une page web et sa structure.

Cette fiche pratique ne va pas vous apprendre le HTML. Pour utiliser au mieux cette technique, il est préférable d'avoir des bases sur le HTML. Si le sujet vous intéresse, une documentation nombreuse est disponible sur internet.

Nous allons cependant vous expliquer dans ce document les exemples d'utilisations qui reviennent le plus régulièrement.

Vous trouverez ci-après le projet et les données utilisées dans les exemples présentés.

-

Je veux mettre mon texte en couleur

-

Commençons par un exemple simple, je souhaite afficher les commerciaux de mon listing ci-dessous en bleu.

Dans la formule du champ Commercial, je vais écrire la formule ci-dessous :

"<div style='color:blue'>" & [Commercial] & "</div>"

-

Et si je voulais mettre en bleu uniquement le commercial "MALPY Luca", une idée de la formule que l'on pourrait écrire ?

Allez, je suis sympa, voilà la réponse :

Si([Commercial]="MALPY Luca";
"<div style='color:blue'>" & [Commercial] & "</div>";
[Commercial])

Cette technique peut donc être mixée avec les fonctions MyReport disponibles.

-

Je vais maintenant mettre en orange la colonne "Date facture".

"<div style='color:orange'>" & DateEnTexte([Date facture]) & "</div>"

Triez la colonne "Date facture orange" depuis le Center.

Mais que se passe t'il ? le tri renvoi un ordre étrange...

Et non, le fonctionnement est tout à fait normal. Quand on écrit notre formule, on crée un champs TEXTE. Dans la formule on a d'ailleurs converti en texte le champ date. Le tri qui s'applique est donc un tri alphanumérique. 04/06/2020 est bien inférieur à 05/02/2020 avec ce tri.

CONTRAINTE 1 - Le champ calculé est de type Texte. Le TRI ALPHANUMERIQUE est appliqué sur ce champ.

-

Essayons maintenant de mettre de la couleur rouge sur le champ "CA", avec la formule ci-dessous :

"<div style='color:red'>" & NumeriqueEnTexte([CA]) & "</div>"

Cela ne donne pas un résultant concluant. En effet, comme l'on crée un champ Texte, on ne peut pas utiliser les agrégations SOMME ou MOYENNE.

On choisit donc ici l'agrégation AUCUNE. On a alors un listing Qté PAR CA, Famille, Commercial, Date. Et non plus CA, Qté PAR Famille, Commercial, Date.

CONTRAINTE 2 - Le champ calculé étant de type TEXTE, on ne peut utiliser que les agrégations AUCUNE - MAX - MIN - NB de - NB de sans doublons

Sans le "CA rouge"

Avec le champ "CA rouge"

Une solution possible serait ici :

  • de mettre le champ "CA" dans le report et de le masquer (oeil fermé)
  • de modifier la formule pour utiliser le champ du report "CA", ainsi c'est bien la valeur agrégée qui sera affichée : "<div style='color:red'>" & NumeriqueEnTexte( [[CA]] ) & "</div>"

-

Note

Pour le cas présenté - couleur du texte - il est conseillé d'utiliser les fonctionnalités d'alerte disponibles nativement en lieu et place de cette technique

-

Je veux mettre mon texte en couleur par rapport à un autre champ

-

Dans le report ci-dessous, nous allons mettre en évidence les commerciaux, mais uniquement ceux de l'année 2018.

La formule est la suivante :

Si([Année facture]=2018;
"<div style='color:blue'>" & [Commercial] & "</div>";
[Commercial])

-

Maintenant, on va mettre en évidence les commerciaux qui ont fait plus de 200 000 € de CA. On va écrire la formule ci-dessous :

Si([CA]>200000;
"<div style='color:blue'>" & [Commercial] & "</div>";
[Commercial])

On a alors le résultat ci-dessous. Etrange je n'ai aucun commercial en bleu alors que j'ai bien des CA supérieur à 200 000 €.

C'est normal, car notre formule s'applique sur chaque enregistrement et donc ici à la ligne de facture. En réalité, on met ici en bleu les commerciaux qui ont des lignes de factures supérieures à 200 000 €, autant dire qu'il n'y en a aucune.

Par rapport à notre souhait, on est ici sur un abus de langage. Ce que l'on souhaite en réalité, c'est mettre en bleu les commerciaux pour lesquels la somme des lignes de factures est supérieure à 200 000 €

Donc notre condition devrait être : Si Sum(CA) > 200 000

Comment pouvons nous faire pour répondre à ce besoin ?

  • Modifier l'agrégation sur le champs transformé ?

    • Pas possible, je crée un champ Texte, donc je n'ai pas accès à l'agrégation SOMME.
  • Utiliser le champ du report pour le CA, puisqu'il est déjà sommé, au lieu du champ du modèle ? Essayons avec la formule ci-dessous :

    • Si([[CA]]>200000;
      "<div style='color:blue'>" & [Commercial] & "</div>";
      [Commercial])
    • Léger problème, je ne peux pas valider la formule. On a le message d'erreur "Une formule ne peut pas contenir à la fois des champs agrégés et des champs non agrégés"
    • En effet, dans une formule, on ne peut pas mélanger des champs du modèle et des champs du report.
  • Utiliser le champ du report pour le CA et le Commercial, et on masquera le commercial (œil fermé) ? Essayons avec la formule ci-dessous :

    • Si([[CA]]>200000;
      "<div style='color:blue'>" & [[Commercial]] & "</div>";
      [[Commercial]])
    • On a le même problème que précédemment : "Une formule ne peut pas contenir à la fois des champs agrégés et des champs non agrégés"
    • En effet le champ du report CA à l'agrégation Somme et Commercial l'agrégation Aucune. Commercial doit donc être agrégé aussi.
  • On va donc mettre une seconde fois le champ "Commercial" dans le report, avec le nom "Commercial2" et l'agrégation "Maximum".

    • Si([[CA]]>200000;
      "<div style='color:blue'>" & [[Commercial2]] & "</div>";
      [[Commercial2]])
    • Pour que cela fonctionne, les champs "Commercial - AUCUNE" et "Commercial2 - MAXIMUM" doivent être cochés dans le report. Vous pouvez cependant les masquer avec l'oeil fermé.
    • Le champ "Commercial - AUCUNE" doit être présent / coché dans le report afin de conserver le Group By par Commercial. Sinon, au lieu de Sum(CA) / Max(Commercial) par Année / Commercial, on aurait le report Sum(CA) / Max(Commercial) par Année.
    • et VICTOIRE, on a le résultat souhaité.

-

Pour ceux qui veulent aller plus loin dans l'optimisation, il existe une seconde méthode qui évite de devoir ajouter un second champ Commercial 2. Cependant la formule nécessitera un peu plus de gymnastique intellectuelle.

La formule que l'on veut écrire est celle-ci : Si Sum(CA) > 200000 Alors "<div style='color:blue'>" & Max(Commercial) & "</div>" Sinon Max(Commercial)

C'est à dire une formule qui mélange des agrégations différentes. La seule possibilité est d'utiliser la fonction SQLtypeAGREGE() et de ce fait d'écrire la formule dans le langage de la base de données requêtée.

La solution est un peu plus bas.

-

-

-

Solution :

Créer un champ avec la formule ci-dessous. Une agrégation doit être mise sur le champ, peu importe laquelle.

SQL Server :

Firebird

SQLTexteAgrege(
CASE WHEN SUM ([CA]) >= 200000
THEN '<div style=color:blue>' + MAX([Commercial]) + '</div>'
ELSE MAX([Commercial]) END)
SQLTexteAgrege(
CASE WHEN SUM ([CA]) >= 200000
THEN "<div style='color:blue'>" || MAX([Commercial]) || "</div>"
ELSE [[Commercial]] END)

-

Maintenant que vous maîtrisez les principes, à votre tour d'explorer les différentes possibilités que va vous offrir cette technique pour ajouter du dynamisme à vos dashboards. De nombreuses balises HTML sont disponibles, n'hésitez pas à expérimenter. Nous allons quand même voir ensemble dans la partie suivante les balises le plus souvent utilisées.

ghostghostghostghostghost