Exemple de rapport cumulatif de progression des fonctionnalités

Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022

Cet article vous montre comment créer un rapport à barres empilées pour afficher la progression des fonctionnalités en fonction des histoires d'utilisateur enfant achevées. Le rapport affiche le pourcentage d'achèvement par cumul des Story Points pour un ensemble spécifique de fonctionnalités actives. Vous pouvez afficher des histogrammes de progression similaires à partir de votre backlog en ajoutant une colonne cumulative. Pour en savoir plus, consultez Afficher la progression du cumul ou les totaux.

Lorsque vous créez des rapports cumulatifs à l’aide de Power BI, vous pouvez rencontrer des problèmes liés aux données imbriquées dans vos jeux de données. Plus précisément, toute tentative de pivotement d’une table contenant des colonnes avec des données imbriquées peut entraîner un message d’erreur. Pour plus d’informations, consultez la section sur la gestion des données imbriquées.

Prérequis

Catégorie Spécifications
Niveaux d’accès - Membre du projet.
- Au moins un accès de base (Basic).
Autorisations Par défaut, les membres du projet ont l’autorisation d’interroger Analytics et de créer des vues. Pour plus d’informations sur les autres prérequis concernant l’activation du service et des fonctionnalités et les activités de suivi des données générales, consultez Autorisations et conditions préalables pour accéder à Analytics.

Remarque

Cet article suppose que vous lisez Overview des exemples de rapports à l’aide de requêtes OData et que vous avez une compréhension de base de Power BI.

Exemples de requêtes

La progression des fonctionnalités interroge l’entité WorkItems pour obtenir l’état actuel de progression.

Remarque

Pour rechercher les propriétés disponibles pour le filtrage ou la création de rapports, consultez la référence Metadata pour Azure Boards. Vous pouvez filtrer des requêtes ou retourner des propriétés à l’aide de n’importe quelle Property valeur définie sous un EntityType, ou toute NavigationPropertyBinding Path valeur répertoriée pour un EntitySet. Chaque EntitySet mappe vers un EntityType qui documente le type de données pour chaque propriété.

Passer en revue la progression des fonctionnalités en fonction d’un chemin d’accès à une zone

Copiez et collez la requête Power BI suivante directement dans la fenêtre Get Data>Blank Query. Pour plus d’informations, consultez Vue d’ensemble des exemples de rapports à l’aide de requêtes OData.

let
   Source = OData.Feed ("https://analytics.dev.azure.com/{organization}/{project}/_odata/v3.0-preview/WorkItems?"
        &"$filter=WorkItemType eq 'Feature' "
            &"and State ne 'Removed' "
            &"and startswith(Area/AreaPath,'{areapath}') "
            &"and Descendants/any()"
            &"&$select=WorkItemId,Title,Area,Iteration,AssignedTo,WorkItemType,State,AreaSK"
            &"&$expand=Descendants( "
            &"$apply=filter(WorkItemType eq 'User Story') " 
                &"/groupby((StateCategory), "
                &"aggregate(StoryPoints with sum as TotalStoryPoints)) "
            &")  "
    ,null, [Implementation="2.0",OmitValues = ODataOmitValues.Nulls,ODataVersion = 4]) 
in
    Source

Chaînes de substitution et décomposition des requêtes

Remplacez les chaînes suivantes par vos valeurs. N’incluez pas les accolades {} dans votre substitution. Par exemple, si le nom de votre organisation est « Fabrikam », remplacez {organization} par Fabrikam, et non {Fabrikam}.

  • {organization} - Nom de votre organisation
  • {project} - Nom de votre projet d’équipe ou omettre /{project} entièrement, pour une requête inter-projets
  • {areapath} - Chemin d’accès de votre zone. Exemple de format : Project/Level1/Level2.

Répartition des requêtes

Le tableau suivant décrit chaque partie de la requête.

Composant de requête

Description


$filter=WorkItemType eq 'Feature'

Renvoyez des fonctionnalités.

and State ne 'Removed'

Omettez les fonctionnalités marquées comme supprimées.

and startswith(Area/AreaPath,'{areapath}')

Renvoyez les éléments de travail sous un chemin d'accès de zone spécifique. Le remplacement par Area/AreaPath eq '{areapath}' renvoie des éléments à un chemin d'accès de zone spécifique.
Pour filtrer par nom d’équipe, utilisez l’instruction Teams/any(x:x/TeamName eq '{teamname}')de filtre .

and Descendants/any()

Filtrez les éléments de travail qui ont au moins un ou « n’importe quel » descendant. Inclut toutes les fonctionnalités comportant au moins un élément de travail Enfant. Pour obtenir tous les éléments de travail avec leurs descendants, même s'ils n'en ont pas, exécutez une requête sans le filtre Descendants/any(). Pour omettre les fonctionnalités qui n’ont pas d’histoires utilisateur enfants, remplacez par any(d:d/WorkItemType eq 'User Story').

Pour tous les éléments de travail avec et sans descendants :

$filter=endswith(Area/AreaPath,'suffix')
&$select=WorkItemId,Title,WorkItemType,State,Area, Descendants
&$expand=Descendants($select=WorkItemId)

Pour tous les éléments de travail avec au moins un descendant :

$filter=endswith(Area/AreaPath, 'suffix')and Descendants/any()
&$select=WorkItemId,Title,WorkItemType,State,Area, Descendants
&$expand=Descendants($select=WorkItemId)

&$select=WorkItemId, Title, WorkItemType, State

Sélectionnez les propriétés à renvoyer.

&$expand=Descendants(

Début de la clause d'expansion Descendants

$apply=filter(WorkItemType eq 'User Story')

Filtrez les descendants. Incluez uniquement les User Stories (omettre les tâches et les bogues).

/groupby((StateCategory),

Regroupez le récapitulatif par catégorie d'état. Pour plus d’informations sur les catégories d’état, consultez Comment les états de flux de travail et les catégories d’état sont utilisés dans les Backlogs et Tableaux.

aggregate(StoryPoints with sum as TotalStoryPoints))

Somme agrégée des Story Points.

)

Fermer la clause Descendants().

Passer en revue la progression des fonctionnalités pour une équipe

La requête suivante est identique à celle que vous avez utilisée précédemment, mais elle filtre par nom d’équipe plutôt que par chemin d’accès à la zone.

Copiez et collez la requête Power BI suivante directement dans la fenêtre Get Data>Blank Query. Pour plus d’informations, consultez Vue d’ensemble des exemples de rapports à l’aide de requêtes OData.

let
   Source = OData.Feed ("https://analytics.dev.azure.com/{organization}/{project}/_odata/v3.0-preview/WorkItems?"
        &"$filter=WorkItemType eq 'Feature' "
            &"and State ne 'Cut' "
            &"and (Teams/any(x:x/TeamName eq '{teamname}') or Teams/any(x:x/TeamName eq '{teamname}') or Teams/any(x:x/TeamName eq '{teamname}')) "
            &"and Descendants/any() "
        &"&$select=WorkItemId,Title,WorkItemType,State,AreaSK "
        &"&$expand=Descendants( "
            &"$apply=filter(WorkItemType eq 'User Story') "
                &"/groupby((StateCategory), "
                &"aggregate(StoryPoints with sum as TotalStoryPoints)) "
            &")  "
    ,null, [Implementation="2.0",OmitValues = ODataOmitValues.Nulls,ODataVersion = 4]) 
in
    Source

Transformer les données dans Éditeur Power Query

La requête retourne plusieurs colonnes que vous devez développer avant de pouvoir les utiliser pour créer un rapport. Toute entité que vous extrayez à l’aide d’une instruction OData $expand retourne un enregistrement avec potentiellement plusieurs champs. Développez l'enregistrement pour aplatir l'entité dans ses champs.

Pour le rapport De progression des fonctionnalités, effectuez les transformations suivantes :

  • Développez la Descendants colonne en deux colonnes : Descendants.StateCategory et Descendants.TotalStoryPoints.
  • Appliquez la transformation de colonne pivot sur la Descendants.StateCategory colonne pour séparer les catégories d’état individuelles.
  • Remplacez les valeurs Null dans toutes les colonnes pivotées.
  • Ajoutez une colonne personnalisée qui représente le pourcentage d’achèvement. La colonne personnalisée affiche des erreurs s’il existe des colonnes nulles dans les colonnes d’état pivotées.

Pour en savoir plus, consultez les données Transform Analytics pour générer des rapports Power BI.

Gestion des données imbriquées

Avant d’effectuer une opération de tableau croisé dynamique, vérifiez que votre jeu de données ne contient aucune colonne avec des données imbriquées. Suivez ces étapes :

  1. Identifier les colonnes imbriquées : recherchez dans votre ensemble de données les colonnes susceptibles de contenir des listes, des enregistrements ou des tables au sein d’une seule cellule.
  2. Aplatir ou supprimer des données imbriquées : supprimez les colonnes imbriquées ou aplatissez-les en les développant en colonnes distinctes à l’aide de la fonctionnalité Développer dans Power Query.
  3. Effectuez l’opération de tableau croisé dynamique : après avoir traité les données imbriquées, vous pouvez poursuivre l’opération de tableau croisé dynamique sans rencontrer d’erreurs.

Remarque

Dans cet exemple, les valeurs d’état de l’article utilisateur incluent Proposé, En cours et Terminé.

Fermez la requête et appliquez vos modifications

Lorsque vous avez terminé toutes vos transformations de données, sélectionnez Fermer & Appliquer dans le menu Accueil . Cette action enregistre la requête et vous renvoie à l’onglet Report dans Power BI.

Capture d'écran de l'option Fermer et Appliquer dans Éditeur Power Query.

Créer le rapport sous forme de graphique à barres empilées

  1. Dans Power BI, sélectionnez Graphique à barres empilées sous Visualizations.

    Capture d'écran des visualisations Power BI et des sélections de champs pour le rapport sur la progression des fonctionnalités sous forme de graphique à barres empilées.

  2. Ajouter Title à l’axe Y.

  3. Ajoutez PercentComplete à l'axe X, faites un clic droit, puis sélectionnez Somme.

L’exemple de rapport s’affiche.

Capture d'écran de l'exemple de rapport sur la progression des fonctionnalités sous forme de graphique à barres empilées.