Analyse¶
Le module d'analyse offre une sorte de données analytiques locales, c'est-à-dire des valeurs analytiques basées sur les données stockées dans l'appareil. Actuellement, il n'est pas intégré au module d'analyse du serveur, bien qu'ils partagent des concepts de base, tels que les visualisations, les périodes relatives, les unités relatives, etc.
Analyse agrégée¶
Ce module permet de présenter des valeurs analytiques sous une forme agrégée. Les valeurs peuvent provenir de données agrégées ou de données tracker. Si vous maîtrisez les outils d'analyse web, vous verrez que ce module ressemble beaucoup au Visualiseur de Données (tableaux, graphiques, etc.).
Analyse brute¶
Ce module suit des concepts similaires à ceux du endpoint d'analyse dans l'API web. Deux paramètres de base doivent être fournis au moteur d'analyse pour qu'il effectue une évaluation : les dimensions et les filtres.
Par exemple, une requête de base permettant d'obtenir le nombre de "CPN 1ère visite" (DataElement "fbfJHSPpUQD") au cours des 3 derniers mois (RelativePeriod) et filtrée sur l'unité d'organisation "Ngelehun CHC" (Absolute OrganisationUnit "DiszpKrYNg8") va ressembler à ceci :
d2.analyticsModule().analytics()
.withDimension(new DimensionItem.DataItem.DataElementItem("fbfJHSPpUQD"))
.withDimension(new DimensionItem.PeriodItem.Relative(RelativePeriod.LAST_3_MONTHS))
.withFilter(new DimensionItem.OrganisationUnitItem.Absolute("DiszpKrYNg8"))
.evaluate();
Le moteur renverra un objet Result qui contient soit une DimensionalResponse, soit une AnalyticsException. Regardons la structure de la DimensionalResponse. Nous utilisons la représentation Kotlin pour des raisons de commodité, mais la représentation Java serait très similaire :
DimensionalResponse(
metadata = mapOf(
"fbfJHSPpUQD" to MetadataItem.DataElementItem,
"DiszpKrYNg8" to MetadataItem.OrganisationUnitItem,
"202108" to MetadataItem.PeriodItem,
"202109" to MetadataItem.PeriodItem,
"202110" to MetadataItem.PeriodItem
),
dimensions = listOf(
Dimension.Data,
Dimension.Period
),
dimensionItems = mapOf(
Dimension.Data to listOf(
DimensionItem.DataItem.DataElementItem(uid=fbfJHSPpUQD)
),
Dimension.Period to listOf(
DimensionItem.PeriodItem.Relative(relative=RelativePeriod.LAST_3_MONTHS)
),
Dimension.OrganisationUnit to listOf(
DimensionItem.OrganisationUnitItem.Absolute(uid=DiszpKrYNg8)
)
),
filters = listOf(
"DiszpKrYNg8"
),
values = listOf(
DimensionalValue(
dimensions = listOf("fbfJHSPpUQD", "202108"),
value = "17"
),
DimensionalValue(
dimensions = listOf("fbfJHSPpUQD", "202109"),
value = "112"
),
DimensionalValue(
dimensions = listOf("fbfJHSPpUQD", "202110"),
value = "20"
)
)
)
Propriétés incluses dans l'objet DimensionalResponse :
- Metadata : elle contient une table de correspondance des identifiants pour
MetadataItem. Les identifiants sont des chaînes de caractères qui identifient les éléments de données, les périodes (relatives ou absolues), les unités d'organisation, etc. Voici quelques exemples d'identifiants : "fbfJHSPpUQD", "202108", "LAST_3_MONTHS", "USER_ORGUNIT",etc. L'objectif de cette table de correspondance est d'obtenir rapidement une représentation imprimable de tout identifiant utilisé dans les autres propriétés (éléments de dimension, filtres ou valeurs). L'interfaceMetadataItemcontient deux propriétés de base,idetdisplayNameet elle peut être facilement associée à la classe sous-jacente pour obtenir plus d'informations sur l'élément de données, l'Indicateur, la période, etc. - Dimensions : liste ordonnée des dimensions dans lesquelles les valeurs sont désagrégées. Dans l'exemple ci-dessus, la première dimension est
Data, ce qui signifie que la première dimension de la propriétédimensionsdans les valeurs appartient à la dimensionData. La seconde est "Period". - DimensionItems : elle contient une table de correspondance des éléments regroupés par type de dimension. Elle contient les éléments utilisés à l'origine pour construire la requête : dans l'exemple ci-dessus, la période était relative, donc la dimension "Period" inclut la période relative
LAST_3_MONTHS. - Filters : liste des identifiants qui agissent comme un filtre dans la requête.
- Values : liste de
DimensionalValue. Chaque valeur contient une liste ordonnée d'identifiants qui définissent la valeur. Dans l'exemple ci-dessus, la valeur "17" correspond à "CPN 1ère visite" ("fbfJHSPpUQD") et "Août 2021" ("202108"). Vous pouvez utiliser la table de correspondance des métadonnées pour obtenir plus d'informations à partir de ces identifiants.
Les éléments de dimension peuvent être utilisés comme dimensions ou comme filtres. Plusieurs éléments de la même dimension peuvent être combinés dans la même requête. Par exemple, cette requête permet d'obtenir "CPN 1ère visite" (élément de données "fbfJHSPpUQD") et "CPN 1-3 Taux d'abandon" (Indicateur "ReUHfIn0pTQ") désagrégés par la catégorie "Lieu : Fixe/Proximité" (Catégorie "fMZEcRHuamy") en utilisant les options "Fixe" (Option de catégorie "qkPbeWaFsnU") et "Proximité" (Option de catégorie "wbrDrL2aYEc") au cours des 3 derniers mois (Période relative) dans l'unité d'organisation de l'utilisateur (Unité d'organisation relative), en classant les valeurs par ensemble de légendes d'élément de données et en remplaçant le type d'agrégation :
d2.analyticsModule().analytics()
.withDimension(new DimensionItem.DataItem.DataElementItem("fbfJHSPpUQD"))
.withDimension(new DimensionItem.DataItem.IndicatorItem("ReUHfIn0pTQ"))
.withDimension(new DimensionItem.CategoryItem("fMZEcRHuamy", "qkPbeWaFsnU"))
.withDimension(new DimensionItem.CategoryItem("fMZEcRHuamy", "wbrDrL2aYEc"))
.withFilter(new DimensionItem.PeriodItem.Relative(RelativePeriod.LAST_3_MONTHS))
.withFilter(new DimensionItem.OrganisationUnitItem.Relative(RelativeOrganisationUnit.USER_ORGUNIT))
.withLegendStrategy(AnalyticsLegendStrategy.ByDataItem.INSTANCE)
.withAggregationType(AggregationType.LAST)
.evaluate();
L'évaluateur impose certaines restrictions aux paramètres utilisés en tant que dimensions ou filtres (elles sont similaires à celles imposées par l'api web d'analyse) :
- Au moins un élément de dimension doit être inclus comme propriété de dimension.
- Au moins un élément de dimension data doit être inclus soit en tant que dimension, soit en tant que filtre.
En outre, la requête est évaluée par rapport aux métadonnées et aux données locales, ce qui impose des restrictions supplémentaires :
- Les éléments de dimension (élément de données, indicateurs, unités d'organisation, etc.) doivent être téléchargés dans l'appareil. Par défaut, le SDK télécharge tous les ensembles de données et les programmes accessibles à l'utilisateur, ainsi que les métadonnées correspondantes.
- Les données doivent être téléchargées dans l'appareil. L'évaluation ne prend en compte que les données stockées dans la base de données locale.
Trois options permettent de définir la stratégie legendSet. La classe AnalyticsLegendStrategy est une classe scellée en Kotlin, le mot-clé INSTANCE doit donc être ajouté à la fin des valeurs de l'objet lors du codage en Java. Exemples de code :
d2.analyticsModule().analytics()
.withLegendStrategy(AnalyticsLegendStrategy.ByDataItem.INSTANCE) // Data items use their own LegendSet
.withLegendStrategy(AnalyticsLegendStrategy.None.INSTANCE) // LegendSets are not used
.withLegendStrategy(new AnalyticsLegendStrategy.Fixed("fqs276KXCXi")) // The provided LegendSet will be used for all data items
Analyse de visualisation¶
Le moteur d'analyse de visualisation offre des méthodes pratiques pour évaluer les objets de visualisation. Ce moteur est implémenté au-dessus du moteur d'analyse brute et remplit essentiellement deux objectifs :
- Traduire un objet de visualisation en une requête pour le moteur d'analyse.
- Renvoyer un résultat formaté suivant les lignes, les colonnes et les filtres définis dans la visualisation.
Pour pouvoir utiliser les objets de visualisation, ils doivent être définis dans la section "Analyse" de l'application web Paramètres Android. Actuellement, il n'est pas possible de télécharger des visualisations à la demande à partir du serveur, mais seulement à partir de l'application web Paramètres Android.
Supposons par exemple que nous ayons une visualisation avec les paramètres suivants :
- Visualisation ("SwtkWZFhrFQ").
- Colonnes :
- Données : deux éléments de données (CPN 1ère visite "fbfJHSPpUQD", CPN 2ème visite "cYeuwXTCPkU").
- Catégorie : Lieu Fixe/Proximité ("fMZEcRHuamy").
- Lignes:
- Période : 3_DERNIERS_MOIS.
- Filtre:
- Unité d'organisation : Badja ("YuQRtpLP10I").
La représentation attendue de la visualisation serait à peu près la suivante :

Nous pouvons obtenir le résultat de la visualisation en appelant le référentiel des "visualisations" dans le module d'analyse. En option, nous pouvons écraser les valeurs de 'période' et d''unité d'organisation'. Ceci permet d'exposer des filtres dans l'interface utilisateur afin de faciliter les modifications des résultats.
d2.analyticsModule().visualizations()
.withVisualization("SwtkWZFhrFQ")
[.withPeriods()]
[.withOrganisationUnits()]
.evaluate();
La méthode renverra un Result avec deux valeurs possibles : un GridAnalyticsResponse et un AnalyticsResponse. Regardons la structure de la GridAnalyticsResponse. Nous utilisons la représentation Kotlin pour des raisons de commodité :
GridAnalyticsResponse(
metadata = mapOf(
"fbfJHSPpUQD" to MetadataItem.DataElementItem,
"cYeuwXTCPkU" to MetadataItem.DataElementItem,
"fMZEcRHuamy" to MetadataItem.CategoryItem,
"qkPbeWaFsnU" to MetadataItem.CategoryOptionItem,
"wbrDrL2aYEc" to MetadataItem.CategoryOptionItem,
"YuQRtpLP10I" to MetadataItem.OrganisationUnitItem,
"202108" to MetadataItem.PeriodItem,
"202109" to MetadataItem.PeriodItem,
"202110" to MetadataItem.PeriodItem
),
headers = GridHeader(
columns = listOf(
listOf(
GridHeaderItem(id=fbfJHSPpUQD, weight=2),
GridHeaderItem(id=cYeuwXTCPkU, weight=2)
),
listOf(
GridHeaderItem(id=qkPbeWaFsnU, weight=1),
GridHeaderItem(id=wbrDrL2aYEc, weight=1),
GridHeaderItem(id=qkPbeWaFsnU, weight=1),
GridHeaderItem(id=wbrDrL2aYEc, weight=1)
)
),
rows = listOf(
listOf(
GridHeaderItem(id=202108, weight=1),
GridHeaderItem(id=202109, weight=1),
GridHeaderItem(id=202110, weight=1)
)
)
),
dimensions = GridDimension(
columns = listOf(
Dimension.Data,
Dimension.Category(uid=fMZEcRHuamy)
),
rows = listOf(
Dimension.Period
)
),
dimensionItems = mapOf(
Dimension.Data to listOf(
DimensionItem.DataItem.DataElementItem(uid=fbfJHSPpUQD),
DimensionItem.DataItem.DataElementItem(uid=cYeuwXTCPkU)
),
Dimension.Period to listOf(
DimensionItem.PeriodItem.Relative(relative=LAST_3_MONTHS)
),
Dimension.Category(uid=fMZEcRHuamy) to listOf(
DimensionItem.CategoryItem(uid=fMZEcRHuamy, categoryOption=qkPbeWaFsnU),
DimensionItem.CategoryItem(uid=fMZEcRHuamy, categoryOption=wbrDrL2aYEc)
),
Dimension.OrganisationUnit to listOf(
DimensionItem.OrganisationUnitItem.Absolute(uid=YuQRtpLP10I)
)
),
filters = listOf(
"YuQRtpLP10I"
),
values = listOf(
listOf(
GridResponseValue(
columns=[fbfJHSPpUQD, qkPbeWaFsnU],
rows=[202108],
value=23
),
GridResponseValue(
columns=[fbfJHSPpUQD, wbrDrL2aYEc],
rows=[202108],
value=3
),
GridResponseValue(
columns=[cYeuwXTCPkU, qkPbeWaFsnU],
rows=[202108],
value=46
),
GridResponseValue(
columns=[cYeuwXTCPkU, wbrDrL2aYEc],
rows=[202108],
value=3
)
),
listOf(
GridResponseValue(
columns=[fbfJHSPpUQD, qkPbeWaFsnU],
rows=[202109],
value=21
),
GridResponseValue(
columns=[fbfJHSPpUQD, wbrDrL2aYEc],
rows=[202109],
value=10
),
GridResponseValue(
columns=[cYeuwXTCPkU, qkPbeWaFsnU],
rows=[202109],
value=23
),
GridResponseValue(
columns=[cYeuwXTCPkU, wbrDrL2aYEc],
rows=[202109],
value=8
)
),
listOf(
GridResponseValue(
columns=[fbfJHSPpUQD, qkPbeWaFsnU],
rows=[202110],
value=24
),
GridResponseValue(
columns=[fbfJHSPpUQD, wbrDrL2aYEc],
rows=[202110],
value=1
),
GridResponseValue(
columns=[cYeuwXTCPkU, qkPbeWaFsnU],
rows=[202110],
value=47
),
GridResponseValue(
columns=[cYeuwXTCPkU, wbrDrL2aYEc],
rows=[202110],
value=2
)
)
)
)
Comme nous pouvons le voir, la réponse GridDimensionalResponse est très similaire à la réponse DimensionalResponse avec des informations supplémentaires sur les colonnes et les lignes définies dans la visualisation.
Propriétés incluses dans l'objet GridDimensionalResponse :
- Metadata : elle a le même format et poursuit le même objectif que dans
DimensionalResponse. - Headers : elle définit la structure des en-têtes du tableau. Chaque entrée dans les colonnes et les lignes représente une dimension. Le poids représente le nombre de colonnes et de lignes auxquels elle s'applique. Dans l'exemple, la première dimension des colonnes (dataElements) a un poids de 2, tandis que la deuxième dimension (categoryOptions) a un poids de 1. Le tableau permet de mieux comprendre cet aspect.
- Dimensions : son objectif est le même que celui de
DimensionalResponse, mais les dimensions sont regroupées par colonnes et par lignes. - DimensionItems : elle a le même format et poursuit le même objectif que dans
DimensionalResponse. - Filters : elle a le même format et poursuit le même objectif que dans
DimensionalResponse. - Values : elle contient des informations supplémentaires sur la représentation des valeurs. Chaque entrée du tableau "values" représente une ligne dans le tableau. Cette entrée est une liste de
GridResponseValue, qui représente une cellule du tableau. ChaqueGridResponseValuecontient des informations contextuelles sur les colonnes et les lignes auxquelles la valeur appartient. Ce format permet d'imprimer facilement le résultat sous forme de tableau sans traitement supplémentaire.
Prise en charge des dimensions¶
| Dimension | Élément | Prise en charge |
|---|---|---|
| Données: | Indicateurs | Oui* |
| Éléments de données | Oui | |
| Détails des éléments de données | Oui | |
| Items de données d'événements | Oui | |
| Indicateurs de programme | Oui** | |
| Ensembles de données : Taux de déclaration | Non | |
| Ensembles de données : Taux de déclaration dans les délais | Non | |
| Ensembles de données : Rapports effectifs | Non | |
| Ensembles de données : Rapports effectifs dans les délais | Non | |
| Ensembles de données : Rapports attendus | Non | |
| Période: | Fixe | Oui |
| Relative | Oui | |
| Unité d'organisation : | Fixe | Oui |
| Relative | Oui | |
| Niveau | Oui | |
| Groupes d'unités d'organisation | Oui | |
| Autres : | Catégories (options de catégorie) | Oui*** |
| Ensembles de groupes d'options de catégorie | Non | |
| Ensembles de groupes d'unités d'organisation | Non |
*Consultez le tableau Prise en charge des indicateurs pour plus de détails.
**Consultez le tableau Prise en charge des indicateurs de programme pour plus de détails.
***Pour ce qui est des indicateurs de programme, ils ne sont appliqués qu'aux indicateurs de programmes d'ÉVÈNEMENT.
Prise en charge des indicateurs¶
Ce tableau montre la fonctionnalité prise en charge par l'élément de dimension de l'indicateur par rapport à l'analyse backend.
| Type | Élément | Backend | Android SDK |
|---|---|---|---|
| Mathématique : | Parenthèse | Oui | Oui |
| Plus (+) | Oui | Oui | |
| Moins (-) | Oui | Oui | |
| Puissance (^) | Oui | Non | |
| Multiplier (*) | Oui | Oui | |
| Diviser (/) | Oui | Oui | |
| Pourcentage (%) | Oui | Oui | |
| Logique : | NOT | Oui | Oui |
| ! | Oui | Oui | |
| AND | Oui | Oui | |
| && | Oui | Oui | |
| OR | Oui | Oui | |
| || | Oui | Oui | |
| Comparaison : | Égal (==) | Oui | Oui |
| Pas égal (!=) | Oui | Oui | |
| Supérieur à (>) | Oui | Oui | |
| Inférieur à (<) | Oui | Oui | |
| Supérieur ou égal à (>=) | Oui | Oui | |
| Inférieur ou égal à (<=) | Oui | Oui | |
| Littéral : | nul | Oui | Oui |
| Fonctions : | FirstNonNull | Oui | Oui |
| Greatest | Oui | Oui | |
| If | Oui | Oui | |
| IsNotNull | Oui | Oui | |
| IsNull | Oui | Oui | |
| Least | Oui | Oui | |
| Log | Oui | Non | |
| Log10 | Oui | Non | |
| Sous-expression | Oui | Non | |
| .aggregationType | Oui | Oui | |
| .maxDate | Oui | Oui | |
| .minDate | Oui | Oui | |
| .periodOffset | Oui | Oui | |
| .yearToDate | Oui | Oui | |
| Dimensions : | Constant | Oui | Oui |
| DataElement | Oui | Oui | |
| ProgramAttribute | Oui | Oui | |
| ProgramDataElement | Oui | Oui | |
| ProgramIndicator | Oui | Oui | |
| OrgUnitGroup | Oui | Non | |
| ReportingRate | Oui | Non | |
| Jours | Oui | Oui | |
| PeriodInYear | Oui | Oui | |
| YearlyPeriodCount | Oui | Oui | |
| N_Brace (indicateurs) | Oui | Non |
Prise en charge des indicateurs de programme¶
Ce tableau montre la fonctionnalité prise en charge par l'élément de dimension de l'indicateur de programme par rapport à l'analyse backend.
| Type | Élément | Backend | Android SDK |
|---|---|---|---|
| Mathématique : | Parenthèse | Oui | Oui |
| Plus (+) | Oui | Oui | |
| Moins (-) | Oui | Oui | |
| Puissance (^) | Oui | Non | |
| Multiplier (*) | Oui | Oui | |
| Diviser (/) | Oui | Oui | |
| Pourcentage (%) | Oui | Oui | |
| Logique : | NON | Oui | Oui |
| ! | Oui | Oui | |
| AND | Oui | Oui | |
| && | Oui | Oui | |
| OU | Oui | Oui | |
| || | Oui | Oui | |
| Comparaison : | Égal (==) | Oui | Oui |
| Pas égal (!=) | Oui | Oui | |
| Supérieur à (>) | Oui | Oui | |
| Inférieur à (<) | Oui | Oui | |
| Supérieur ou égal à (>=) | Oui | Oui | |
| Inférieur ou égal à (<=) | Oui | Oui | |
| Littéral : | null | Oui | Oui |
| Fonctions : | FirstNonNull | Oui | Oui |
| Greatest | Oui | Oui | |
| If | Oui | Oui | |
| IsNotNull | Oui | Oui | |
| IsNull | Oui | Oui | |
| Least | Oui | Oui | |
| Log | Oui | Non | |
| Log10 | Oui | Non | |
| PeriodOffset | Oui | Non | |
| Contains | Oui | Oui | |
| ContainsItems | Oui | Oui | |
| Fonctions D2: | D2AddDays | Non | Non |
| D2Ceil | Non | Non | |
| D2Concatenate | Non | Non | |
| D2Condition | Oui | Oui | |
| D2Count | Oui | Oui | |
| D2CountIfCondition | Oui | Oui | |
| D2CountIfValue | Oui | Oui | |
| D2DaysBetween | Oui | Oui | |
| D2Floor | Non | Non | |
| D2HasValue | Oui | Oui | |
| D2Left | Non | Non | |
| D2Length | Non | Non | |
| D2MaxValue | Oui | Oui | |
| D2MinutesBetween | Oui | Oui | |
| D2MinValue | Oui | Oui | |
| D2Modulus | Non | Non | |
| D2MonthsBetween | Oui | Oui | |
| D2Oizp | Oui | Oui | |
| D2RelationshipCount | Oui | Oui | |
| D2Right | Non | Non | |
| D2Round | Non | Non | |
| D2Split | Non | Non | |
| D2Substring | Non | Non | |
| D2ValidatePattern | Non | Non | |
| D2WeeksBetween | Oui | Oui | |
| D2YearsBetween | Oui | Oui | |
| D2Zing | Oui | Oui | |
| D2Zpvc | Oui | Oui | |
| D2LastEventDate | Non | Non | |
| D2AddControlDigits | Non | Non | |
| D2CheckControlDigits | Non | Non | |
| D2ZScoreWFA | Non | Non | |
| D2ZScoreWFH | Non | Non | |
| D2ZScoreHFA | Non | Non | |
| D2InOrgUnitGroup | Non | Non | |
| D2HasUserRole | Non | Non | |
| Fonctions d'agrégation : | avg | Oui | Non |
| count | Oui | Non | |
| max | Oui | Non | |
| min | Oui | Non | |
| percentileCont | Oui | Non | |
| stddev | Oui | Non | |
| stddevPop | Oui | Non | |
| stddevSamp | Oui | Non | |
| sum | Oui | Non | |
| variance | Oui | Non | |
| Variables : | AnalyticsPeriodEnd | Oui | Oui |
| AnalyticsPeriodStart | Oui | Oui | |
| CreationDate | Oui | Oui | |
| CurrentDate | Oui | Oui | |
| CompletedDate | Oui | Oui | |
| DueDate | Oui | Oui | |
| EnrollmentCount | Oui | Oui | |
| EnrollmentDate | Oui | Oui | |
| EnrollmentStatus | Oui | Oui | |
| EventStatus | Oui | Oui | |
| EventCount | Oui | Oui | |
| ExecutionDate | Oui | Oui | |
| EventDate | Oui | Oui | |
| IncidentDate | Oui | Oui | |
| OrgunitCount | Oui | Oui | |
| ProgramStageId | Oui | Oui | |
| ProgramStageName | Oui | Oui | |
| SyncDate | Oui | Oui | |
| TeiCount | Oui | Oui | |
| ValueCount | Oui | Oui | |
| ZeroPosValueCount | Oui | Oui | |
| Autre : | Constant | Oui | Oui |
| ProgramStageElement | Oui | Oui | |
| Attribut de programme | Oui | Oui | |
| PS_EVENTDATE | Oui | Oui |
Prise en charge du type d'agrégation¶
| Type | Android SDK |
|---|---|
| SUM | Oui |
| AVERAGE | Oui |
| AVERAGE_SUM_ORG_UNIT | Oui |
| DERNIÈRE | Oui |
| LAST_AVERAGE_ORG_UNIT | Oui |
| LAST_IN_PERIOD | Oui |
| LAST_IN_PERIOD_AVERAGE_ORG_UNIT | Oui |
| LAST_LAST_ORG_UNIT | Oui |
| PREMIÈRE | Oui |
| FIRST_AVERAGE_ORG_UNIT | Oui |
| FIRST_FIRST_ORG_UNIT | Oui |
| COUNT | Oui |
| STDDEV | Non |
| VARIANCE | Non |
| MIN | Oui |
| MIN_SUM_ORG_UNIT | Oui |
| MAX | Oui |
| MAX_SUM_ORG_UNIT | Oui |
| NONE | Non |
| CUSTOM | Non |
| DEFAULT | Non |
Liste de lignes du Tracker¶
Ce type d'analyse est similaire à celui obtenu avec l'application web Liste de lignes. Cette application permet de générer des listes de lignes au niveau de l'événement ou de l'inscription. Ces listes peuvent inclure des éléments de données, des attributs, des indicateurs de programme, des variables et éventuellement filtrer ces entrées avec les valeurs contenues de leurs colonnes.
Un cas d'utilisation courant consiste à générer une liste d'événements ou d'inscriptions qui répondent à certains critères, tels qu'une valeur appartenant à une fourchette, un statut ou une date spécifiques.
Par exemple, une requête contenant toutes les inscriptions ACTIVES au programme "fbfJHSPpUQD" dont l'attribut "p4mRWMtCxtB" a une valeur comprise entre 40 et 50 ressemblera à ceci. Notez que le statut est inclus en tant que filtre et n'a donc pas de colonne explicite.
d2.analyticsModule().trackerLineList()
.withEnrollmentOutput("fbfJHSPpUQD")
.withFilter(
TrackerLineListItem.ProgramStatusItem(
filters = listOf(
EnumFilter.EqualTo(EnrollmentStatus.ACTIVE.name)
)
)
)
.withColumn(TrackerLineListItem.OrganisationUnitItem())
.withColumn(
TrackerLineListItem.ProgramAttribute(
uid = "p4mRWMtCxtB",
filters = listOf(
DataFilter.GreaterThan("40"),
DataFilter.LowerThan("50"),
),
),
)
.evaluate()
La réponse est un objet 'Result' de 'TrackerLineListResponse', qui a la structure suivante :
TrackerLineListResponse(
metadata = mapOf(
"p4mRWMtCxtB" to MetadataItem.TrackedEntityAttributeItem
),
headers = listOf(
TrackerLineListItem.OrganisationUnitItem,
TrackerLineListItem.ProgramAttribute
),
filters = listOf(
TrackerLineListItem.ProgramStatusItem
),
rows = listOf(
listOf(
TrackerLineListValue(id = "ouItem", value = "Child 1"),
TrackerLineListValue(id = "p4mRWMtCxtB", value = "45")
),
listOf(
TrackerLineListValue(id = "ouItem", value = "Child 2"),
TrackerLineListValue(id = "p4mRWMtCxtB", value = "49")
),
listOf(
TrackerLineListValue(id = "ouItem", value = "Child 2"),
TrackerLineListValue(id = "p4mRWMtCxtB", value = "41")
)
)
)
En option, il est possible d'utiliser un objet TrackerVisualization (appelé EventVisualization dans l'API) pour évaluer une liste de lignes prédéfinie. L'objet TrackerVisualization doit être de type LINE_LIST. Il est également possible de remplacer une valeur.
Par exemple, cette requête utilise la configuration du TrackerVisualization "s85urBIkN0z" et ajoute ou écrase la colonne ProgramStatusItem avec un filtrage sur ACTIVE.
d2.analyticsModule().trackerLineList()
.withTrackerVisualization("s85urBIkN0z")
.withColumn(
TrackerLineListItem.ProgramStatusItem(
filters = listOf(
EnumFilter.EqualTo(EnrollmentStatus.ACTIVE.name)
)
)
)
.evaluate()
Pour pouvoir utiliser les objets TrackerVisualization, ils doivent être définis dans la section "Analyse" de l'application web Paramètres Android. Actuellement, il n'est pas possible de télécharger des visualisations à la demande à partir du serveur, mais seulement à partir de l'application web Paramètres Android.
Liste de lignes d'événements¶
Il s'agit d'analyses basées sur des événements. Si vous maîtrisez les outils d'analyse web, vous remarquerez qu'ils sont très similaires aux rapports d'événements (liste de lignes). C'est un cas simplifié de la Liste de Lignes du Tracker.
Un cas d'utilisation courant consiste à générer une liste d'événements pour une étape répétable et pour le compte d'une TEI donnée afin de montrer l'évolution d'une valeur particulière à travers les événements.
Par exemple, supposons que nous ayons une étape répétable avec deux éléments de données (taille et poids) et un indicateur basé sur ces valeurs (IMC ou Indice de masse corporelle). Nous aimerions montrer l'évolution de ces valeurs à travers les événements
d2.analyticsModule().eventLineList()
.byProgramStage().eq("stage_id")
.byTrackedEntityInstance().eq("tei_id")
.withDataElement("height_id")
.withDataElement("weight_id")
.withProgramIndicator("BMI_id")
.evaluate();
Le résultat sera une liste d'événements avec les valeurs évaluées (éléments de données et indicateurs) ainsi que quelques propriétés displayName pratiques pour afficher le résultat dans un tableau ou un graphique.