列出链接的工作项示例查询和报表

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

本文介绍如何创建列出链接到其他工作项的工作项的报表。 例如,以下报表显示一个功能列表,这些功能链接到具有父子链接类型的用户情景。

功能和用户情景表报表的父子链接的屏幕截图。

有关链接类型和链接工作项的详细信息,请参阅 链接用户情景、问题、bug 和其他工作项

其他示例查询包括列出具有指向另一个 bug 的重复链接的 bug,并列出不包含指向另一个 bug 的重复链接的 bug。

注意

本文假设你阅读 了使用 OData 查询 的示例报表概述,并基本了解 Power BI。

先决条件

  • Access:至少是具有基本访问权限的项目的成员。
  • 权限: 默认情况下,项目成员有权查询 Analytics 和创建视图。
  • 有关服务和功能启用和常规数据跟踪活动的其他先决条件的详细信息,请参阅 访问 Analytics 的权限和先决条件。

示例查询

提供了多个查询,其中显示了如何筛选链接的工作项。 所有这些查询在返回当前数据时指定 WorkItems 实体集。

注意

若要确定用于筛选或报表的可用属性,请参阅Azure Boards元数据参考。 可以使用 提供的 EntitySetNavigationPropertyBinding Path 值下EntityType的任何Property值筛选查询或返回属性。 每个对应 EntitySet 一个 EntityType。 有关每个值的数据类型的详细信息,请查看为相应 EntityType值提供的元数据。

返回功能及其子用户情景

将以下 Power BI 查询直接复制并粘贴到 “获取数据>空白查询” 窗口中。 有关详细信息,请参阅 使用 OData 查询的示例报告概述。


let
   Source = OData.Feed ("https://analytics.dev.azure.com/{organization}/{project}/_odata/v3.0-preview/WorkItems?"
        &"$filter=WorkItemType eq 'Feature' "
            &"and State ne 'Closed' and State ne 'Removed' "
            &"and startswith(Area/AreaPath,'{areapath}') " 
        &"&$select=WorkItemId,Title,WorkItemType,State,AreaSK "
        &"&$expand=AssignedTo($select=UserName),Iteration($select=IterationPath),Area($select=AreaPath), "
                &"Links( "
                    &"$filter=LinkTypeName eq 'Child' "
                        &"and TargetWorkItem/WorkItemType eq 'User Story'; "
                    &"$select=LinkTypeName; "
                    &"$expand=TargetWorkItem($select=WorkItemType,WorkItemId,Title,State) "
                &") "
    ,null, [Implementation="2.0",OmitValues = ODataOmitValues.Nulls,ODataVersion = 4]) 
in
    Source

替换字符串和查询明细

将以下字符串替换为值。 不要在替换中包含括号 {} 。 例如,如果组织名称为“Fabrikam”,请将 替换为 {organization}Fabrikam,而不是 {Fabrikam}

  • {organization} - 组织名称
  • {project} - 对于跨项目查询,团队项目名称或完全省略“/{project}”
  • {areapath} - 区域路径。 示例格式: Project\Level1\Level2

查询明细

下表描述了查询的每个部分。

查询部件

描述

$filter=WorkItemType eq 'Feature'

返回用户情景。

and State ne 'Closed' and State ne 'Removed'

省略其状态设置为“已关闭”或已删除”的功能。

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

仅包含特定 区域路径 替换 '{areapath}'下的功能。
若要按团队名称进行筛选,请使用 filter 语句 Teams/any(x:x/TeamName eq '{teamname})'

&$select=WorkItemId,Title,WorkItemType,State,AreaSK

选择要返回的字段。

&$expand=AssignedTo($select=UserName), Iteration($select=IterationPath), Area($select=AreaPath),

指定要用于展开和IterationArea实体的AssignedTo字段。

Links(

Links展开实体。

$filter=LinkTypeName eq 'Child'

仅筛选具有 链接类型的工作项。 其他示例包括 Parent、ChildDuplicateDuplicate OfAffectsAffected

and TargetWorkItem/WorkItemType eq 'User Story';

仅包括链接的用户情景。

$select=LinkTypeName;

选择要 LinkTypeName 返回的属性。

$expand=TargetWorkItem($select=WorkItemType, WorkItemId, Title, State)

选择要返回的链接工作项的属性。

)

关闭子 Links() 句。

将以下 Power BI 查询直接复制并粘贴到 “获取数据>空白查询” 窗口中。 有关详细信息,请参阅 使用 OData 查询的示例报告概述。

let
   Source = OData.Feed ("https://analytics.dev.azure.com/{organization}/{project}/_odata/v3.0-preview/WorkItems?"
        &"$filter=WorkItemType eq 'User Story' "
            &"and State ne 'Closed' "
            &"and startswith(Area/AreaPath,'{areapath}') "
        &"&$select=WorkItemId,Title,WorkItemType,State,AreaSK "
        &"&$expand=AssignedTo($select=UserName),Iteration($select=IterationPath),Area($select=AreaPath), "
                &"Links( "
                    &"$filter=LinkTypeName eq 'Related' "
                        &"and TargetWorkItem/WorkItemType eq 'User Story'; "
                    &"$select=LinkTypeName; "
                    &"$expand=TargetWorkItem($select=WorkItemType,WorkItemId,Title,State) "
                &") "
    ,null, [Implementation="2.0",OmitValues = ODataOmitValues.Nulls,ODataVersion = 4]) 
in
    Source

返回由 Teams 筛选的链接用户情景

以下查询与本文前面使用的查询相同,只不过它按团队名称而不是区域路径筛选。

将以下 Power BI 查询直接复制并粘贴到 “获取数据>空白查询” 窗口中。 有关详细信息,请参阅 使用 OData 查询的示例报告概述。

let
   Source = OData.Feed ("https://analytics.dev.azure.com/{organization}/{project}/_odata/v3.0-preview/WorkItems?"
        &"$filter=WorkItemType eq 'User Story' "
            &"and State ne 'Closed' "
            &"and (Teams/any(x:x/TeamName eq '{teamname}) or Teams/any(x:x/TeamName eq '{teamname}) or Teams/any(x:x/TeamName eq '{teamname}) "
        &"&$select=WorkItemId,Title,WorkItemType,State,Priority,Severity,TagNames,AreaSK "
        &"&$expand=AssignedTo($select=UserName),Iteration($select=IterationPath),Area($select=AreaPath), "
                &"Links( "
                    &"$filter=LinkTypeName eq 'Related' "
                        &"and TargetWorkItem/WorkItemType eq 'User Story'; "
                    &"$select=LinkTypeName; "
                    &"$expand=TargetWorkItem($select=WorkItemType,WorkItemId,Title,State) "
                &") "
    ,null, [Implementation="2.0",OmitValues = ODataOmitValues.Nulls,ODataVersion = 4]) 
in
    Source

将以下 Power BI 查询直接复制并粘贴到 “获取数据>空白查询” 窗口中。 有关详细信息,请参阅 使用 OData 查询的示例报告概述。

let
    Source = OData.Feed ("https://analytics.dev.azure.com/{organization}/{project}/_odata/v3.0-preview/WorkItems?"
        &"$filter=WorkItemType eq 'Bug' "
            &"and State ne 'Closed' "
            &"and startswith(Area/AreaPath,'{areapath}') "
            &"and Links/any(x:x/LinkTypeName eq 'Duplicate' and x/TargetWorkItem/WorkItemType eq 'Bug') "
        &"&$select=WorkItemId,Title,WorkItemType,State,Priority,Severity,TagNames "
        &"&$expand=AssignedTo($select=UserName),Iteration($select=IterationPath),Area($select=AreaPath), "
            &"Links( "
                &"$filter=LinkTypeName eq 'Duplicate' "
                &"and TargetWorkItem/WorkItemType eq 'Bug'; "
                    &"$select=LinkTypeName; "
                &"$expand=TargetWorkItem($select=WorkItemType,WorkItemId,Title,State) "
            &") "
    ,null, [Implementation="2.0",OmitValues = ODataOmitValues.Nulls,ODataVersion = 4]) 
in
    Source

将以下 Power BI 查询直接复制并粘贴到 “获取数据>空白查询” 窗口中。 有关详细信息,请参阅 使用 OData 查询的示例报告概述。

let
   Source = OData.Feed ("https://analytics.dev.azure.com/{organization}/{project}/_odata/v3.0-preview/WorkItems?"
        &"$filter=WorkItemType eq 'Bug' "
                &"and State ne 'Closed' "
                &"and startswith(Area/AreaPath,'{areapath}') "
                &"and not (Links/any(x:x/LinkTypeName eq 'Duplicate' and x/TargetWorkItem/WorkItemType eq 'Bug')) "
        &"&$select=WorkItemId,Title,WorkItemType,State,Priority,Severity,TagNames "
        &"&$expand=AssignedTo($select=UserName),Iteration($select=IterationPath),Area($select=AreaPath) "
    ,null, [Implementation="2.0",OmitValues = ODataOmitValues.Nulls,ODataVersion = 4]) 
in
    Source

(可选) 重命名查询

可以将默认查询标签 Query1 重命名为更有意义的标签。 只需在 “查询设置” 窗格中输入新名称。

Power BI 查询菜单选项的屏幕截图,重命名查询。

转换Power Query 编辑器中的数据

在创建报表之前,需要展开返回包含多个字段的记录的列。 在此实例中,需要展开以下记录:

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

若要了解如何展开工作项,请参阅 转换分析数据以生成 Power BI 报表

(可选)重命名字段

展开列后,可能需要重命名一个或多个字段。 例如,可以将列 AreaPath 重命名为 Area Path。 可以在数据表视图中重命名它们,也可以在创建报表时稍后进行重命名。 若要了解如何操作,请参阅 “重命名列字段”。

在此示例中,已重命名以下字段:

原始字段名称 重命名
Links.TargetWorkItem.ID 目标 ID
LinksLinkTypeName 链接类型
Links.TargetWorkItem.State 目标状态
Links.TargetWorkItem.Title 目标标题

关闭查询并应用更改

完成所有数据转换后,从“开始”菜单中选择“关闭和应用”以保存查询并返回到 Power BI 中的“报表”选项卡。

Power Query 编辑器“关闭并应用”选项的屏幕截图。

创建表报表以列出链接的工作项

  1. 在 Power BI 中,选择可视化效果下的“表”报表。

    父子链接列表表报表的 Power BI 可视化效果和字段选择的屏幕截图。

  2. 按“列指示的顺序添加以下字段:

    • ID,右键单击并选择“不汇总”
    • State
    • 标题
    • 目标 ID,右键单击并选择“ 不汇总”
    • 链接类型
    • 目标状态
    • 目标标题

显示示例报表。

功能和用户情景表报表的示例父子链接的屏幕截图。