Libérer des exemples de requêtes et de rapports de mise en production

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

Les rapports burndown et burnup montrent combien de travail se termine au fil du temps. L’image suivante montre le burndown à la fois par le nombre d’histoires utilisateur et la somme des points d’histoire.

Capture d’écran du rapport de graphique en colonnes en cluster de mise en production de Power BI.

Les graphiques burndown n’ont de sens que si vous planifiez votre travail pendant la période du graphique. Sinon, si vous planifiez un sprint par sprint, vous ne verrez pas de brûlure standard. Dans ces cas, un graphique de burnup est plus judicieux pour voir comment la progression est effectuée au fil du temps.

Important

La suppression des chemins d’accès de zone ou la reconfiguration des chemins d’itération peuvent entraîner une perte de données et ne peuvent pas être rétablies. Par exemple, les graphiques de widgets burndown ou burnup, le sprint burndown et les graphiques de vitesse pour les équipes dont les chemins d’accès à la zone sont modifiés ne reflètent pas les données correctes. Les graphiques de tendance historique référencent le chemin d’accès à la zone et le chemin d’itération tels que définis à un point dans le passé pour chaque élément de travail. Lorsqu’un chemin d’accès à une zone ou un chemin d’itération est supprimé, les données d’historique ne peuvent pas être récupérées.

Pour en savoir plus sur burndown et burnup, consultez Configurer un widget burndown ou burnup et burndown et burnup conseils.

Remarque

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

Prérequis

  • Pour afficher les données Analytics et interroger le service, vous devez être membre d’un projet avec un accès de base ou supérieur. Par défaut, tous les membres du projet sont autorisés à interroger Analytics et à définir des vues Analytics.
  • Pour en savoir plus sur d’autres prérequis concernant l’activation des services et des fonctionnalités et les activités générales de suivi des données, consultez Autorisations et prérequis pour accéder à Analytics.

Exemples de requêtes

Les requêtes de cette section montrent comment générer des graphiques d’éléments de travail en fonction des données historiques. Toutes ces requêtes spécifient l’ensemble d’entités WorkItemSnapshot .

Remarque

Pour déterminer les propriétés disponibles à des fins de filtre ou de rapport, consultez Informations de référence sur les métadonnées pour Azure Boards. Vous pouvez filtrer vos requêtes ou renvoyer des propriétés à l’aide de l’une Property des valeurs sous ou EntityType des NavigationPropertyBinding Path valeurs disponibles avec un EntitySet. Chaque EntitySet correspond à un EntityType. Pour en savoir plus sur le type de données de chaque valeur, passez en revue les métadonnées fournies pour le .EntityType

Burndown of User Stories dans un chemin d’accès de zone à partir de la date de début et de fin

La requête suivante vous montre comment retourner des données historiques des récits utilisateur pour une version basée sur des éléments de travail marqués avec une balise de mise en production.

Remarque

Pour les rapports basés sur le filtrage d’une balise, la balise doit être affectée à l’élément de travail au début de la mise en production ou de la date de début du burndown/burnup. Sinon, l’élément de travail n’est pas inclus dans les données retournées.

Vous pouvez coller la requête Power BI répertoriée ci-dessous> directement dans la fenêtre Obtenir une requête vide. Pour plus d’informations, consultez Vue d’ensemble des exemples de rapports utilisant des requêtes OData.

let
   Source = OData.Feed ("https://analytics.dev.azure.com/{organization}/{project}/_odata/v3.0-preview/WorkItemSnapshot?"
        &"$apply=filter(WorkItemType eq 'User Story' "
            &"and StateCategory ne 'Completed' "
            &"and startswith(Area/AreaPath,'{areapath}') "
            &"and Tags/any(x:x/TagName eq '{tagname}') "
            &"and DateValue ge {startdate} "
            &"and DateValue le {enddate} "
        &") "
        &"/groupby ( "
            &"(DateValue,State,Area/AreaPath), "
            &"aggregate ($count as Count, StoryPoints with sum as TotalStoryPoints) "
        &") "
    ,null, [Implementation="2.0",OmitValues = ODataOmitValues.Nulls,ODataVersion = 4]) 
in
    Source

Chaînes de substitution et répartition des requêtes

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

  • {organization} - Nom de votre organisation
  • {project} - Nom de votre projet d’équipe ou omettre entièrement « /{projet} » pour une requête inter-projets
  • {areapath} - Chemin d’accès de votre zone. Exemple de format : Project\Level1\Level2
  • {tag} - Balise qui représente votre version. Tous les éléments de travail avec étiquetés {tagname} sont inclus dans le rapport
  • {startdate} - Date de début du rapport d’avancement au format : YYYY-MM-DDZ. Par exemple : 2022-04-01Z représente 2022-avril-01. Ne placez pas entre guillemets.
  • {enddate} - Date de fin du rapport d’avancement.

Répartition des requêtes

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

Composant de requête

Description

$apply=filter(WorkItemType eq 'User Story'

Incluez les récits utilisateur dans le menu d’avancement.

and StateCategory ne 'Completed'

Filtre les éléments terminés. Pour plus d’informations sur les catégories d’état, consultez Utilisation des états de flux de travail et des catégories d’état dans backlogs et tableaux.

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

Incluez uniquement les récits utilisateur sous un chemin d’accès de zone spécifique en '{areapath}'remplaçant .
Pour filtrer par nom d’équipe, utilisez l’instruction Teams/any(x:x/TeamName eq '{teamname})'filter .

and Tags/any(x:x/TagName eq '{tagname}').

Spécifie l’étiquette de balise qui représente la mise en production à brûler et pour inclure tous les éléments de travail marqués avec {tagname} dans le rapport.

and DateValue ge {startdate}

Démarrez le burndown le ou après la date spécifiée. Exemple : 2019-04-01Z représente 2019-avril-01.

and DateValue le {enddate}

Démarrez le burndown le ou avant la date spécifiée. Même format que {startdate}.

)

Clause Close filter() .

/groupby (

Clause Start groupby() .

(DateValue, State, Area/AreaPath),

Regroupez par DateValue (utilisé pour la tendance) et tous les champs sur lesquelles vous souhaitez créer un rapport.

aggregate ($count as Count, StoryPoints with sum as TotalStoryPoints)

Agréger en fonction du nombre d’histoires utilisateur et de la somme des points d’histoire.

)

Clause Close groupby() .

Burndown of User Stories for a team

La requête suivante retourne les données de burndown filtrées par nom d’équipe plutôt que par chemin d’accès à la zone.

Vous pouvez coller la requête Power BI répertoriée ci-dessous> directement dans la fenêtre Obtenir une requête vide. Pour plus d’informations, consultez Vue d’ensemble des exemples de rapports utilisant des requêtes OData.

let
   Source = OData.Feed ("https://analytics.dev.azure.com/{organization}/{project}/_odata/v3.0-preview/WorkItemSnapshot?"
        &"$apply=filter(WorkItemType eq 'User Story' "
            &"and StateCategory ne 'Completed' "
            &"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 Tags/any(x:x/TagName eq '{tagname}') "
            &"and DateValue ge {startdate} "
            &"and DateValue le {enddate} "
        &") "
        &"/groupby ( "
            &"(DateValue,State,Area/AreaPath), "
            &"aggregate ($count as Count, StoryPoints with sum as TotalStoryPoints) "
        &") "
    ,null, [Implementation="2.0",OmitValues = ODataOmitValues.Nulls,ODataVersion = 4]) 
in
    Source

Burndown User Stories avec un instantané tous les vendredis

L’utilisation d’un instantané hebdomadaire réduit la quantité de données extraites dans Power BI et augmente les performances des requêtes.

Vous pouvez coller la requête Power BI répertoriée ci-dessous> directement dans la fenêtre Obtenir une requête vide. Pour plus d’informations, consultez Vue d’ensemble des exemples de rapports utilisant des requêtes OData.

let
   Source = OData.Feed ("https://analytics.dev.azure.com/{organization}/{project}/_odata/v3.0-preview/WorkItemSnapshot?"
        &"$apply=filter(WorkItemType eq 'User Story' "
            &"and StateCategory ne 'Completed' "
            &"and startswith(Area/AreaPath,'{areapath}') "
            &"and Tags/any(x:x/TagName eq '{tagname}') "
            &"and DateValue ge {startdate} "
            &"and DateValue le {enddate} "
            &"and Date/DayName eq 'Friday' "
        &") "
        &"/groupby ( "
            &"(DateValue,State,Area/AreaPath,AreaSK), "
            &"aggregate ($count as Count, StoryPoints with sum as TotalStoryPoints) "
        &") "
    ,null, [Implementation="2.0",OmitValues = ODataOmitValues.Nulls,ODataVersion = 4]) 
in
    Source

Burndown User Stories en fonction d’une zone et d’un chemin d’itération

Certaines organisations utilisent des chemins d’itération pour marquer des récits pour une version. Par exemple, ils peuvent avoir un chemin d’itération de MyProject\Release1. La requête suivante montre comment sélectionner des récits utilisateur par chemin d’itération.

Vous pouvez coller la requête Power BI répertoriée ci-dessous> directement dans la fenêtre Obtenir une requête vide. Pour plus d’informations, consultez Vue d’ensemble des exemples de rapports utilisant des requêtes OData.

let
   Source = OData.Feed ("https://analytics.dev.azure.com/{organization}/{project}/_odata/v3.0-preview/WorkItemSnapshot?"
        &"$apply=filter(WorkItemType eq 'User Story' "
            &"and StateCategory ne 'Completed' "
            &"and startswith(Area/AreaPath,'{areapath}') "
            &"and startswith(Iteration/IterationPath,'{iterationpath}') "
            &"and DateValue ge {startdate} "
            &"and DateValue le {enddate} "
            &") "
        &"/groupby ( "
            &"(DateValue,StateCategory,State,Area/AreaPath,AreaSK), "
            &"aggregate ($count as Count, StoryPoints with sum as TotalStoryPoints) "
        &") "
    ,null, [Implementation="2.0",OmitValues = ODataOmitValues.Nulls,ODataVersion = 4]) 
in
    Source

Burndown User Stories avec une valeur de champ personnalisée

Certaines organisations utilisent un champ personnalisé pour marquer les récits utilisateur pour une version. Par exemple, ils peuvent avoir un champ appelé Jalon. Cette requête vous montre comment sélectionner des récits utilisateur par un champ personnalisé.

Vous devez remplacer les deux {customfieldname} et {releasevalue} dans la requête. Pour déterminer le nom de votre champ personnalisé, consultez la référence des métadonnées pour Azure Boards, propriétés personnalisées. Vous allez remplacer {customfieldname} par le nom de propriété personnalisé, par exemple Custom_Milestone.

Vous pouvez coller la requête Power BI répertoriée ci-dessous> directement dans la fenêtre Obtenir une requête vide. Pour plus d’informations, consultez Vue d’ensemble des exemples de rapports utilisant des requêtes OData.

let
   Source = OData.Feed ("https://analytics.dev.azure.com/{organization}/{project}/_odata/v3.0-preview/WorkItemSnapshot?"
        &"$apply=filter(WorkItemType eq 'User Story' "
            &"and StateCategory ne 'Completed' "
            &"and startswith(Area/AreaPath,'{areapath}') "
            &"and {customfieldname} eq '{releasevalue}' "
            &"and DateValue ge {startdate} "
            &"and DateValue le {enddate} "
            &") "
        &"/groupby ( "
            &"(DateValue,StateCategory,State,Area/AreaPath,AreaSK), "
            &"aggregate ($count as Count, StoryPoints with sum as TotalStoryPoints) "
        &") "
    ,null, [Implementation="2.0",OmitValues = ODataOmitValues.Nulls,ODataVersion = 4]) 
in
    Source

(Facultatif) Renommer la requête

Vous pouvez renommer l’étiquette de requête par défaut , Query1, en quelque chose de plus significatif. Entrez simplement un nouveau nom dans le volet Paramètres de requête .

Capture d’écran des options de menu de requête Power BI, renommer la requête.

Développer des colonnes dans Éditeur Power Query

Avant de créer le rapport, vous devez développer des colonnes qui retournent des enregistrements contenant plusieurs champs. Dans ce cas, vous devez développer les enregistrements suivants :

  • Links
  • Links.TargetWorkItem
  • Area
  • Iteration
  • AssignedTo

Pour savoir comment développer des éléments de travail, consultez Transformer des données Analytics pour générer des rapports Power BI.

Fermez la requête et appliquez vos modifications

Une fois que vous avez terminé toutes vos transformations de données, choisissez Fermer & Appliquer dans le menu Accueil pour enregistrer la requête et revenir à l’onglet Rapport dans Power BI.

Capture d’écran de Éditeur Power Query’option Fermer et appliquer.

Créer le histogramme en cluster

  1. Dans Power BI, choisissez Histogramme en cluster sous Visualisations.

    Capture d’écran des sélections de visualisations et de champs Power BI pour le rapport de graphique en colonnes en cluster de mise en production.

  2. Ajouter DateValue à l’axe X, cliquez avec le bouton droit et sélectionnez DateValue, plutôt que Date Hierarchy

  3. Ajouter Count à l’axe Y.

  4. Ajouter TotalStoryPoints à l’axe Y.

L’exemple de rapport affiche le burndown sur le nombre d’histoires et de somme ou de points d’histoire.

Capture d’écran du rapport de graphique en colonnes en cluster de l’exemple Power BI.