Tutoriels sur le DHIS2¶
Créer des tableaux de bord à l'aide de l'application Tableau croisé dynamique¶
Définition de tableaux de bord : Dans les services de santé publique tels que les ministères de la santé, les tableaux de bord proposent une méthode utile et normalisée pour combiner des indicateurs connexes dans un seul tableau. Un tableau de bord donne une vision globale des performances d'un programme de santé tel qu'un programme de vaccination, en mettant en évidence les succès, les faiblesses et les points à améliorer. Voici donc à quoi ressemble un tableau de bord :

Ce tutoriel explique comment créer un tableau de bord dans l'application Tableau croisé dynamique de DHIS2. L'utilisation du tableau croisé dynamique pour la création d'un tableau de bord, par exemple, présente de nombreux avantages tels que :
-
Vous pouvez enregistrer la carte de pointage sur le tableau de bord et l'utiliser hors ligne.
-
Vous pouvez partager la carte de pointage avec d'autres utilisateurs de DHIS2.
Commençons donc !
Créez une légende pour votre carte de pointage¶
Tout d'abord, nous allons créer une légende de "feux" en 3 couleurs pour la carte de pointage. Avec ses trois couleurs de base, la carte de pointage devient facile à scanner et à comprendre.
-
Ouvrez l'application Maintenance. Cliquez sur le menu dans le coin supérieur droit et sélectionnez Maintenance dans la liste des applications. Vous pouvez également saisir les premières lettres du mot maintenance dans le champ de recherche pour trouver l'application.

-
Dans l'application Maintenance, faites défiler défiler au bas de la page jusqu'à la section Autres.
-
Allez sur Legende et cliquez sur le +.

-
Dans la page Gestion des légendes, descendez au bas de la page et créez une nouvelle légende en cliquant sur le bouton de couleur bleue +.

-
Saisissez un nom pour la légende, par exemple "Feu tricolore", ainsi qu'une valeur de départ et une valeur d'arrivée dans les champs. Les valeurs que vous saisissez ici dépendent des notes de performance que vous souhaitez définir dans le tableau de performances.
-
Remplacez Nombre d'éléments de légende par 3 pour afficher trois couleurs dans le tableau de performances. Pour modifier les couleurs des éléments de la légende, cliquez sur le bouton de couleur bleue +, puis modifiez les couleurs.

Créer une carte de pointage dans l'application Tableau croisé dynamique¶
-
Ouvrez l'application Tableau croisé dynamique dans le coin supérieur droit du tableau de bord. Vous pouvez également saisir les premières lettres de Tableau croisé dynamique dans le champ de recherche.
-
Allez à Données dans le volet de gauche et sélectionnez Indicateurs dans la liste.
-
Sélectionnez un groupe d'indicateurs tel que "ANC" dans la deuxième liste.
-
À l'aide des flèches, sélectionnez le type d'indicateurs que vous souhaitez voir figurer dans votre tableau de performance.

-
Cliquez sur Mise à jour. Vous trouverez ce bouton dans le menu en haut de l'espace de travail
-
Allez dans Périodes et sélectionnez une période pour laquelle vous souhaitez afficher des données. Dans cet exemple de "feux tricolores", nous utiliserons la section des périodes relatives. Dans Trimestres, sélectionnez Ce trimestre et Dernier trimestre. Décochez toutes les autres cases et cliquez sur Mettre à jour.

-
Dans le même panneau de gauche allez sur Unités d'organisation, et cliquez sur la flèche à côté du bouton d'engrenage.
-
Sélectionnez Sélectionner les niveaux.

-
Sélectionnez District dans la liste (à côté du bouton d'engrenage). Cliquez sur Mettre à jour.

Comme vous pouvez le voir, le tableau de performance commence à prendre forme dans l'espace de travail. Il reste maintenant à peaufiner l'aspect et la convivialité.
Organiser la mise en page et l'affichage de votre carte de pointage¶
-
Dans l'espace de travail, cliquez sur Disposition.

-
Dans Disposition du tableau, faites glisser Unités d'organisation jusqu'à la section ** Dimensions des lignes**.
-
Faites glisser Données dans la section Dimensions de la colonne.
-
Dans le volet Dimensions de la colonne, faites glisser Périodes sous Données, et cliquez sur Mise à jour.
-
Dans l'espace de travail, cliquez sur Options.

-
Allez dans Données et décochez toutes les cases.
-
Accédez à Style > Ensemble de légende et dans la liste, sélectionnez la légende que vous avez créée dans l'application Maintenance. Dans cet exemple, nous l'avons appelée Feu tricolore.
-
Allez sur Style > Style d'affichage des légendes et sélectionnez Couleur de fond.
-
Cliquez sur Mettre à jour.
La carte de pointage est donc prête !

Enregistrer et partager votre carte de pointage¶
-
Dans l'espace de travail, allez au menu Favoris.
-
Cliquez sur Enregistrer sous. Entrez un nom pour votre carte de pointage.
-
Pour partager votre carte de pointage, sélectionnez Favoris.
-
Saisissez le nom d'un groupe d'utilisateurs et cliquez sur Sauvegarder. Votre tableau de performances peut être consulté par les personnes avec lesquelles vous partagez un tableau de bord.
Travailler avec TextPattern¶
Le TextPattern a été introduit dans la version 2.29 de DHIS2, comme moyen de définir un modèle comprenant des variables, des valeurs générées et du texte brut, qui peut ensuite être généré en une valeur de texte. Le cas d'utilisation actuel de TextPattern est la génération automatique d'attributs pour les entités suivies où vous souhaitez générer par exemple des identifiants uniques basés sur un modèle spécifique.
Ce guide couvre à la fois les thèmes élémentaires et complexes permettant de travailler avec TextPattern, mais se focalise principalement sur la façon dont vous pouvez définir les TextPatterns et sur les limitations ainsi que mises en garde existantes.
Syntaxe TextPattern¶
Un TextPattern est une séquence de segments, reliés entre eux par le caractère "+". Un segment a une notation spécifique et dans la plupart des cas un paramètre format, permettant de manipuler la valeur.
Tableau : Segments TextPattern
| Notation de segment | Description | Paramètre (format) | Exemple (segment → valeur d'entrée → résultat) |
|---|---|---|---|
| "Texte brut" | Le segment de texte brut restera inchangé dans toutes les valeurs générées. Ce segment spécial est défini en plaçant le texte entre deux guillemets doubles. Si votre modèle doit inclure des symboles de séparation tels qu'un tiret, vous devez utiliser ceci "-". Le segment de texte brut permet également d'insérer du texte de remplacement. Cela signifie que vous pouvez spécifier que certaines parties du segment de texte brut doivent être constituées d'un ensemble de caractères. Il existe actuellement 4 caractères spéciaux que vous pouvez utiliser: * \d (0-9) * \x (a-z) * \X (A-Z) * \w (a-zA-Z0-9) | Aucun | " Bonjour le monde " → Aucun → Bonjour le monde " Bonjour \x\x\x " → " Bonjour toi " → Bonjour toi " \d\d\d " → " 123 " → 123 |
| DATE_ACTUELLE(format) | Le segment de la date actuelle sera généré par le serveur au moment de la génération. Ceci est utile si vous voulez que vos motifs aient une contrainte temporelle déconnectée du contexte. Vous ne devez pas l'utiliser si vous avez besoin de contrôler la date injectée dans le modèle. | Format de la date | DATE_ACTUELLE(yyyy) → 01-01-2018 → 2018 |
| UNITE_D'ORG_CODE(format) | Ce segment représente le code de l'unité d'organisation associée à la génération. | Format du texte | UNITE_D'ORG_CODE(...) → OSLO → OSL |
| ALEATOIRE(format) | Les segments aléatoires seront remplacés par une valeur générée aléatoirement par le serveur en fonction du format. Les segments générés, comme les segments aléatoires, fondent leur unicité sur le reste du modèle. Cela signifie qu'une valeur aléatoire peut apparaître deux fois, à condition que le reste du motif soit différent, ce qui signifie que le texte généré dans son ensemble sera unique. | Format de génération | ALEATOIRE(X####) →Aucun → A1234 |
| SEQUENTIEL(format) | Les segments séquentiels seront remplacés par un nombre, basé sur une valeur de comptage sur le serveur. Les segments séquentiels commencent à la valeur 1 et, pour chaque valeur générée, ils comptent jusqu'à ce qu'il n'y ait plus de valeurs disponibles, en fonction du format. Comme pour les segments aléatoires, l'unicité est basée sur le reste du modèle, de sorte que chaque version possible du modèle ait son propre compteur séquentiel commençant à 1. | Format de génération | "A"+SEQUENTIEL(###) →Aucun→ A001 "A"-SEQUENTIEL(###) → Aucun→ A002 "B"-SEQUENTIEL(###) → Aucun → B001 "B"-SEQUENTIEL(###) →Aucun → B002 |
La plupart des segments ont un paramètre *format *, sauf le segment de texte brut. Le tableau suivant énumère les formats disponibles, leur mode d'utilisation et des exemples de notations qui les utilisent.
Tableau: Formats des paramètres
| Format | Description | Exemple |
|---|---|---|
| Format de la date | Ce format est basé directement sur le format Java SimpleDateFormat, ce qui signifie que tout modèle valide pour SimpleDateFormat sera valide comme format de date dans TextPattern. | DATE_ACTUELLE(dd-MM-yyyy) → 31-12-2018 DATE_ACTUELLE(MM-yyyy) → 12-2018 |
| Format du texte | Le format texte permet une manipulation de base du texte. En laissant le format vide, la valeur sera renvoyée sans modification, mais en utilisant "^", "." et "$", vous pouvez modifier la valeur avant qu'elle ne soit renvoyée. Chaque "." représente un caractère, tandis que "^" représente le début du texte et "$" la fin. Lors de l'utilisation de formats, la valeur d'entrée doit être au moins de la même longueur que le format. | UNITE_D'ORG_CODE(....) → OSLO UNITE_D'ORG_CODE(..) → OS UNITE_D'ORG_CODE(..$) → LO UNITE_D'ORG_CODE(^...$) → OSLO ^....$ exigera que la valeur d'entrée comporte exactement 4 caractères. |
| Format de génération | Le format de génération accepte une combinaison d'un ou plusieurs des caractères suivants : "#", "X", "x" et "*". Ils représentent respectivement un nombre (0-9), une lettre majuscule (A-Z), une lettre minuscule (a-z) ou l'un des caractères ci-dessus (0-9, a-z, A-Z). Le segment SEQUENTIEL n'accepte que "#", car il ne génère que des nombres. Le nombre de caractères dans le format détermine la taille de la valeur générée. En d'autres termes, l'utilisation d'un seul "#" ne permettra de générer que 10 valeurs (0-9), tandis que "###" permettra de générer 1000 valeurs (000-999). Les valeurs SEQUENTIELLES générées ont des zéros en tête, de sorte que la longueur de la valeur générée corresponde toujours à la longueur du format. | ALEATOIRE(X###) → A123 ALEATOIRE(****) → 1AbC SEQUENTIEL(###) → 001 SEQUENTIEL(######) → 000001 |
Quelques points importants à noter concernant les formats :
-
Le format de la date est très polyvalent, mais il faut être conscient des éléments de date ou d'heure que l'on utilise. L'utilisation de composants inférieurs à un jour (par exemple les heures ou les secondes) n'est pas recommandée, même s'ils sont disponibles.
-
Le format texte permet de marquer à la fois le début et la fin de la valeur saisie, mais "^..." et "..." donneront en réalité exactement les mêmes résultats. Le seul cas où il convient d'utiliser "^" est celui où l'on veut imposer la longueur de la valeur saisie. Par exemple, "^....$" acceptera OSLO, puisqu'il y a 4 caractères entre le début et la fin, mais PARIS sera rejeté, puisqu'il a 5 caractères.
-
Lorsque le format texte est utilisé pour des valeurs uniques, comme le code de l'unité d'organisation, assurez-vous que le format ne rompt pas l'unicité. (Exemple : CODE DE_L'UNITÉ_D'ORGANISATION(..) pour "PARIS" et "PANAMA CITY" renverrait tous deux PA, ce qui signifie que ces deux unités d'organisation partageraient en réalité les valeurs générées)
-
Le format de génération est le principal moyen de comprendre la capacité de votre modèle. Assurez-vous que le format est suffisamment long pour couvrir plus de valeurs que vous n'en avez besoin.
Pour terminer la section syntaxique du tutoriel, voici quelques exemples de modèle de texte :
CODE_D'UNITE_D'ORG(...) + "-" + DATE_ACTUELLE(yyyyww) + "-" + SÉQUENTIEL(#####)
Ce modèle aura 99999 valeurs possibles (dans un contexte SÉQUENTIEL. 00000 n'est jamais utilisé puisque nous commençons à 1). En outre, le modèle restant changera pour chaque unité d'organisation différente générant des valeurs (CODE_D'UNITE_D'ORG) et pour chaque semaine (DATE_ACTUELLE(aaaaaww) représente l'année et la semaine). Cela signifie donc que chaque nouvelle semaine, chaque unité d'organisation aura 99999 nouvelles valeurs qu'elle pourra utiliser.
"ABC_" + ALÉATOIRE(****)
Le segment de texte clair de ce modèle, ne fera aucune différence dans la capacité totale du modèle, mais le segment généré (ALÉATOIRE) permettra 14776336 valeurs possibles. La raison en est que * peut être n'importe quel caractère parmi les 62 caractères disponibles (0-9, a-z, A-Z). Vous pouvez en savoir plus sur la compréhension de la capacité des modèles plus loin dans le tutoriel.
Conception d'un modèle de texte pour la génération d'identifiants¶
Un des cas d'utilisation du TextPattern est la génération d'identifiants uniques. Nous présenterons dans cette partie les lignes directrices ainsi que les problèmes courants liés à la conception de TextPatterns utilisés pour la génération des identifiants.
Un identifiant ne doit jamais contenir d'informations sensibles, ou des informations qui, combinées, permettent d'identifier un individu. Actuellement, TextPattern ne prend pas en charge les segments utilisant ce type de valeurs, mais pourrait toutefois le faire à l'avenir.
La liste ci-après met en évidence certaines des restrictions spécifiques aux TextPattern dont vous devez tenir compte lors de la conception d'un TextPattern pour les identifiants :
-
Assurez-vous que la capacité (nombre de valeurs possibles) du TextPattern couvre votre cas d'utilisation. Il est préférable d'avoir plus de valeurs possibles que d'en avoir moins. Les attributs d'entité suivis à l'aide de TextPattern nécessitent qu'un seul segment généré soit présent dans le TextPattern.
-
Un TextPattern est unique dans tout le système, mais seulement pour l'objet qui l'utilise. En d'autres termes, si vous avez un seul attribut d'entité suivie avec TextPattern, utilisé par plusieurs entités suivies (à ne pas confondre avec les instances d'entités suivies), toutes les valeurs générées seront partagées entre toutes les entités suivies utilisant l'attribut. Cela signifie également que si vous avez deux attributs d'entités suivies avec la même syntaxe TextPattern, chaque attribut pourra générer la même valeur que l'autre, puisque l'unicité est basée sur l'attribut.
-
Les segments SEQUENTIELS sont, dans la mise en œuvre, des nombres commençant par 1, croissant de 1 pour chaque valeur, de manière séquentielle jusqu'à ce qu'il n'y ait plus de valeurs disponibles. Toutefois, dans la réalité, il est très probable que vous vous retrouviez avec des lacunes lorsque les utilisateurs génèrent et réservent des valeurs qui ne sont jamais utilisées, ou si un utilisateur envoie une valeur pour laquelle le segment SEQUENTIEL a une valeur plus élevée que celle enregistrée sur le serveur.
-
L'implémentation actuelle repose sur l'envoi par l'utilisateur-client des valeurs contenues dans le TextPattern lors de l'enregistrement d'une nouvelle valeur. Cela signifie que la génération d'un identifiant correct dépend de l'utilisateur et de l'utilisateur-client, qui doivent fournir les données correctes.
Comprendre la capacité du TextPattern¶
La chose la plus importante à garder à l'esprit lors de la conception d'un TextPattern, est la capacité - c'est-à-dire le nombre total de valeurs potentielles qu'un TextPattern peut produire.
Avec la mise en œuvre actuelle de TextPattern, trois principaux facteurs déterminent la capacité :
-
Capacité du segment généré dans le TextPattern
-
La présence d'un segment DATE_ACTUELLE
-
La présence d'un segment CODE_D'UNITE_D'ORG
La présence d'un segment de date (comme DATE_ACTUELLE) réinitialisera effectivement la capacité chaque fois que le segment change. Selon le format de la date, elle peut passer d'annuelle à quotidienne. N.B. : si votre format de date ne contient pas d'année, le modèle se résoudra à la même valeur chaque année. Cela qui signifie que les valeurs seront déjà utilisées. Par exemple, si votre TextPattern ressemble à ceci :
DATE_ACTUELLE(ww) + "-" + ALEATOIRE(#)
Ce modèle vous donnera jusqu'à 10 valeurs uniques pour chaque semaine, mais après 1 an, DATE_ACTUELLE(ww) sera la même que l'année dernière, et vous n'aurez pas de nouvelles valeurs disponibles. Si vous utilisez plutôt "yyyy-ww", il sera unique pour chaque année, chaque semaine.
Les codes des unités d'organisation rendront vos valeurs uniques pour chaque unité d'organisation différente, c'est-à-dire si vous avez un modèle de texte comme celui-ci :
CODE_D'UNITE_D'ORG() + "-" + ALEATOIRE(#)
Ce modèle vous donnera 10 valeurs uniques pour chaque unité d'organisation différente.
Calcul de la capacité des segments générés¶
Lors de la conception de TextPatterns, il est essentiel de comprendre comment calculer la capacité d'un TexPattern. Les segments générés seront la composante principale de tout TextPattern en termes de capacité, puis augmentés en fonction de la présence des segments CODE_D'UNITE_D'ORG ou DATE_ACTUELLE.
Commençons par des segments SÉQUENTIELS. Chaque "#" du format représente un nombre entre 0 et 9. Pour calculer la capacité totale, vous multipliez le nombre de valeurs possibles pour chaque "#". Comme il s'agit toujours de 10 (0-9), le calcul est assez simple :
SÉQUENTIEL(#) = 10 = 10
SÉQUENTIEL(###) = 10 * 10 * 10 = 1000
SÉQUENTIEL(#####) = 10 * 10 * 10 * 10 * 10 = 100000
Étant donné que les compteurs SEQUENTIELS du serveur commencent à 1 et non à 0, la capacité réelle est de 999, mais celle-ci est insignifiante dans la plupart des cas.
Dès que nous faisons intervenir l'ALÉATOIRE, le calcul devient un peu plus compliqué. Comme pour le SEQUENTIEL, un "#" a 10 valeurs possibles. En outre, nous avons "X" et "x" avec 26 valeurs possibles chacun, ainsi que "*" qui peut être l'une des précédentes, c'est-à-dire 62 (10+26+26) valeurs possibles.
Pour calculer la capacité, vous devez prendre chaque caractère dans votre format et le remplacer par le nombre de valeurs possibles, puis les multiplier tous ensemble comme nous l'avons fait au niveau de SEQUENTIEL :
ALÉATOIRE(#) = 10 = 10
ALÉATOIRE(X) = 26 = 26
ALÉATOIRE(*) = 62 = 62
ALÉATOIRE(X##) = 26 * 10 * 10 = 2600
ALÉATOIRE(XXxx) = 26 * 26 * 26 * 26 = 456976
ALÉATOIRE(***) = 62 * 62 * 62 = 238328
Comme vous pouvez le voir, les calculs deviennent un peu plus compliqués, mais en suivant cette formule, vous pouvez trouver le nombre de valeurs potentielles.
Les segments aléatoires et pourquoi vous devriez les éviter¶
L'utilisation du segment aléatoire dans TextPattern a un coût caché à long terme, mais cela ne signifie pas que vous ne devez jamais l'utiliser. Cette section mettra en évidence les problèmes liés à l'utilisation du segment aléatoire et suggérera des moments où il pourrait être plus approprié de l'utiliser.
Cette section est justifée par un problème lié à la stratégie génération précédente, où vous n'aviez qu'une génération aléatoire. Après un certain temps, les instances utilisant cette fonctionnalité étaient en fait incapables de générer et de réserver de nouvelles valeurs, puisqu'il fallait trop de temps pour trouver les valeurs disponibles. Cette section examine certains des problèmes liés à la génération aléatoire ayant conduit à cette situation.
Générer des valeurs aléatoires¶
Avant d'utiliser le segment RANDOM dans votre TextPattern, vous devez considérer les problèmes suivants liés à l'utilisation de RANDOM :
- La génération de valeurs à partir d'un TextPattern avec un segment RANDOM sera plus complexe qu'avec d'autres TextPatterns
Saisie de données pour les métadonnées basées sur le TextPattern¶
Comme mentionné précédemment, les seules métadonnées qui supportent actuellement le TextPattern sont les attributs des entités suivies. Dans cette partie, nous allons décrire les différentes façons dont la saisie de données pour TextPattern fonctionne, en particulier pour les attributs des entités suivies.
Validation des valeurs à l'aide d'un modèle de texte¶
Par défaut, toutes les valeurs envoyées au serveur pour les métadonnées à l'aide de TextPattern, seront validées. La validation peut être ignorée si nécessaire, mais vous devez toujours valider les données saisies dans des circonstances normales. La validation sera basée sur le TextPattern que vous avez défini et sera aussi stricte que possible :
-
Les segments de date doivent correspondre au même format que celui spécifié dans le
-
Les segments de texte clair doivent correspondre exactement
-
Les valeurs des segments de texte doivent être au moins aussi longues que la chaîne du format. Si "^" et "$" sont présents, la valeur doit correspondre à la longueur exacte.
-
Les valeurs de segments générées doivent correspondre exactement au format, caractère par caractère.
Lorsque vous utilisez le serveur pour générer et réserver des valeurs pour la première fois, le serveur modifie les valeurs utilisées dans le TextPattern avant de les injecter, ce qui signifie que vous obtiendrez toujours une valeur valide lorsque vous la générerez sur le serveur.
Une dernière exception à la validation du TextPattern est faite pour un cas particulier : Si vous modifiez un TextPattern après avoir réservé des valeurs pour le modèle original, les valeurs envoyées au serveur et qui ne sont pas valides selon le nouveau TextPattern, seront toujours acceptées si celles-ci étaient déjà réservées.
Différents flux de saisie de données pour le TextPattern¶
Il existe actuellement 2 façons pour un client de stocker les valeurs des métadonnées TextPattern :
-
Générer et réserver des valeurs (les applications devraient le faire pour vous)
-
Stockage d'une valeur personnalisée
Le moyen préféré est de générer et de réserver les valeurs nécessaires (le nombre de valeurs générées et réservées est géré par l'application). Cela signifie que chaque fois que vous voyez et stockez une valeur, elle a été générée et réservée par le serveur, et sera donc valide.
L'autre façon peut s'avérer utile dans des cas spécifiques. L'utilisateur fournira la valeur lui-même et tant que la valeur fournie est valable pour le TextPattern, il peut y mettre ce qu'il veut. L'inconvénient de cette méthode est que vous pouvez utiliser des valeurs réservées par quelqu'un d'autre et si vous avez un segment SEQUENTIEL, le compteur ne sera donc pas mis à jour.