Acumulación de valores de elementos de trabajo secundarios en el informe de ejemplo primario

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019

En este artículo se muestra cómo generar el recuento acumulativo de casos de usuario y el número total de puntos de historia para un conjunto determinado de características. Un ejemplo se muestra en la imagen siguiente.

Ejemplo - Boards - Acumulación - Informe

Nota:

En este artículo se da por supuesto que ha leído Información general de informes de ejemplo mediante consultas de OData y que tiene conocimientos básicos de Power BI.

Prerrequisitos

  • Debe ser miembro de un proyecto con acceso Básico o superior. Si no se ha agregado como miembro del proyecto, ahora se agrega. Cualquier persona con acceso al proyecto, excepto las partes interesadas, puede ver las vistas de Analytics.
  • Para que los datos de Analytics estén disponibles, se debe habilitar el servicio correspondiente. Por ejemplo, para consultar los datos de seguimiento del trabajo, Boards debe estar habilitado. Si está deshabilitada, no se mostrarán las vistas de Analytics. Para volver a habilitar un servicio, consulte Activación o desactivación de Azure DevOps servicio de mantenimiento.
  • Para usar vistas de Analytics,habilite la característica vista previa vistas de Analytics para usuarios individuales o para la organización.
  • Además, debe tener el permiso *View Analytics establecido en Permitir. Para más información, consulte Concesión de permisos para acceder al servicio Analytics.
  • Para usar Power BI para Azure DevOps o para ejecutar una consulta de OData para Analytics, debe tener el permiso de View Analytics establecido en Permitir. De forma predeterminada, se concede acceso a todos los colaboradores con acceso Básico. Para editar vistas compartidas de Analytics,debe tener el permiso * Editar vistascompartidas de Analytics establecido en Permitir. Para más información, consulte Concesión de permisos para acceder al servicio Analytics.
  • Debe ser miembro de un proyecto con acceso Básico o superior. Si no se ha agregado como miembro del proyecto, ahora se agrega. Cualquier persona con acceso al proyecto, excepto las partes interesadas, puede ver las vistas de Analytics.
  • Compruebe que Analytics está instalado y, si no es así, habilite esta opción. Debe ser propietario de la cuenta o miembro del grupo administrador de Project para agregar extensiones o habilitar el servicio.
  • Para que los datos de Analytics estén disponibles, se debe habilitar el servicio correspondiente. Por ejemplo, para consultar los datos de seguimiento del trabajo, Boards debe estar habilitado. Si está deshabilitada, no se mostrarán las vistas de Analytics. Para volver a habilitar un servicio, consulte Activación o desactivación de Azure DevOps servicio de mantenimiento.
  • Para usar vistas de Analytics,habilite la característica vista previa vistas de Analytics para usuarios individuales o para la organización.
  • Además, debe tener el permiso *View Analytics establecido en Permitir. Para más información, consulte Concesión de permisos para acceder al servicio Analytics.
  • Para usar Power BI para Azure DevOps o para ejecutar una consulta de OData para Analytics, debe tener el permiso de View Analytics establecido en Permitir. De forma predeterminada, se concede acceso a todos los colaboradores con acceso Básico. Para editar vistas compartidas de Analytics,debe tener el permiso Editar vistas compartidas de Analytics establecido en Permitir. Para más información, consulte Concesión de permisos para acceder al servicio Analytics.

Consultas de ejemplo

Puede pegar la consulta Power BI que se muestra a continuación directamente en la ventana Obtener datos: consulta en blanco. Para obtener más información, consulte Información general de informes de ejemplo mediante consultas de 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 startswith(Area/AreaPath,'{areapath}')"
            &" and Descendants/any()"    
        &"& $select=WorkItemId,Title,WorkItemType,State,AreaSK"
        &"& $expand=AssignedTo($select=UserName),Iteration($select=IterationPath),Area($select=AreaPath),"        
            &"Descendants("
                &"$apply=filter(WorkItemType eq 'User Story')"
                &"/aggregate($count as CountOfUserStories, StoryPoints with sum as TotalStoryPoints)"
            &")", 
        null, [Implementation="2.0",OmitValues = ODataOmitValues.Nulls,ODataVersion = 4])  
in
    Source

Cadenas de sustitución

Cada consulta contiene las cadenas siguientes que debe sustituir por sus valores. No incluya corchetes con {} la sustitución. Por ejemplo, si el nombre de la organización es "Fabrikam", reemplace {organization} por Fabrikam,no {Fabrikam}.

  • {organization} - Nombre de la organización
  • {project} - El nombre del proyecto de equipo u omite "/{project}" por completo para una consulta entre proyectos
  • {areapath} : la ruta de acceso del área. Formato de ejemplo: Project\Level1\Level2 .

Desglose de consultas

En la tabla siguiente se describe cada parte de la consulta.

Elemento de consulta

Descripción

$filter=WorkItemType eq 'Feature'

Devolver características.

and State ne 'Cut'

Omitir errores cerrados.

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

Elementos de trabajo en una ruta de acceso de área específica. Reemplazar por devuelve Area/AreaPath eq '{areapath}' elementos en una ruta de acceso de área específica.

Para filtrar por nombre de equipo, use la instrucción de filtro Teams/any(x:x/TeamName eq '{teamname})' .

and Descendants/any()

Incluya todas las características, incluso las que no tienen casos de usuario. Reemplace por "any(d:d/WorkItemType eq 'User Story')" para omitir las características que no tienen casos de usuario secundarios.

&$select=WorkItemId, Title, WorkItemType, State

Seleccione los campos que desea devolver.

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

Expanda Asignado a, Iteración, Entidades de área y seleccione campos de entidad.

Descendants(

Expanda Descendientes.

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

Filtra los descendientes. Incluir solo casos de usuario (omite Tareas y errores).

/aggregate($count as CountOfUserStories, StoryPoints with sum as TotalStoryPoints)

Para todos los descendientes que coincidan con la cláusula de filtro anterior, consítelos y sumar el campo StoryPoints.

)

Close Descendants().

Filtros de consulta

Para determinar los filtros de consulta disponibles, consulte los metadatos como se describe en Exploración de los metadatos de OData de Analytics. Puede filtrar las consultas mediante cualquiera de los valores de NavigationPropertyBinding Path enumerados en entitySet. Para obtener más información sobre el tipo de datos de cada valor, revise los metadatos proporcionados para el entityType correspondiente. Cada EntitySet corresponde a un entityType.

Por ejemplo, EntitySet Name="WorkItemSnapshot" corresponde a EntityType Name="WorkItemSnapshot". Los metadatos de OData para EntitySet Name="WorkItemSnapshot" se muestran a continuación para v4.0-preview. Puede agregar filtros basados en cualquiera de los valores de NavigationPropertyBinding Path enumerados.

<EntitySet Name="WorkItemSnapshot" EntityType="Microsoft.VisualStudio.Services.Analytics.Model.WorkItemSnapshot">
  <NavigationPropertyBinding Path="Date" Target="Dates"/>
  <NavigationPropertyBinding Path="RevisedOn" Target="Dates"/>
  <NavigationPropertyBinding Path="Teams" Target="Teams"/>
  <NavigationPropertyBinding Path="Processes" Target="Processes"/>
  <NavigationPropertyBinding Path="Project" Target="Projects"/>
  <NavigationPropertyBinding Path="Area" Target="Areas"/>
  <NavigationPropertyBinding Path="Iteration" Target="Iterations"/>
  <NavigationPropertyBinding Path="AssignedTo" Target="Users"/>
  <NavigationPropertyBinding Path="ChangedBy" Target="Users"/>
  <NavigationPropertyBinding Path="CreatedBy" Target="Users"/>
  <NavigationPropertyBinding Path="ActivatedBy" Target="Users"/>
  <NavigationPropertyBinding Path="ClosedBy" Target="Users"/>
  <NavigationPropertyBinding Path="ResolvedBy" Target="Users"/>
  <NavigationPropertyBinding Path="Tags" Target="Tags"/>
  <NavigationPropertyBinding Path="ChangedOn" Target="Dates"/>
  <NavigationPropertyBinding Path="ClosedOn" Target="Dates"/>
  <NavigationPropertyBinding Path="CreatedOn" Target="Dates"/>
  <NavigationPropertyBinding Path="ResolvedOn" Target="Dates"/>
  <NavigationPropertyBinding Path="StateChangeOn" Target="Dates"/>
  <NavigationPropertyBinding Path="InProgressOn" Target="Dates"/>
  <NavigationPropertyBinding Path="CompletedOn" Target="Dates"/>
</EntitySet>

Power BI transformaciones

Expandir columnas Area, Iteration, AssignedTo

La consulta devuelve varias columnas que debe expandir para poder usarlas en Power BI. Cualquier entidad que se extraía mediante una instrucción OData $expand devuelve un registro con potencialmente varios campos. Debe expandir el registro para aplanar la entidad en sus campos. Algunos ejemplos de estas entidades son: AssignedTo, Iteration y Area.

Después de cerrar Editor avanzado y mientras permanece en el Editor de Power Query, seleccione el botón expandir de las entidades que necesita aplanar.

  1. Elija el botón Expandir.

    Expandir una columna de entidad, Power BI + OData

  2. Seleccione los campos que desea aplanar.

    Seleccione los campos que desea aplanar.

  3. La tabla ahora contiene campos de entidad.

    La tabla ahora contiene campos de entidad.

  4. Repita los pasos del 1 al 3 para todos los campos que representan entidades: Área, Iteración, AsignadoTo.

Expandir columna Descendientes

  1. Elija el botón Expandir y seleccione las columnas sobre las que se debe informar:

    Power BI + OData: expandir una columna de entidad

  2. Compruebe todas las columnas y elija Aceptar.

    Power BI + OData: expandir descendientes

  3. La entidad Descendants se aplana en las columnas seleccionadas:

    Power BI + OData: descendientes expandido

Reemplazo de valores NULL en campos consolidados

Si un elemento de trabajo no tiene elementos secundarios, el valor consolidado puede ser NULL. Por ejemplo, Descendants.CountOfUserS doesnes es "null" si una característica no tiene ningún caso de usuario secundario.

Para facilitar la creación de informes, reemplace todos los valores NULL por cero siguiendo estos pasos.

  1. Seleccione la columna haciendo clic en el encabezado de columna.
  2. Seleccione el menú Transformar.
  3. Seleccione Reemplazar valores. Aparece el cuadro de diálogo Reemplazar valores.
  4. Escriba "null" en Valor para buscar.
  5. Escriba "0" en Reemplazar por.
  6. Elija Aceptar.

Repita el proceso para todas las columnas de acumulación.

Cambie el nombre de los campos y la consulta y, a continuación, cierre & Aplicar.

Cuando termine, puede cambiar el nombre de las columnas.

  1. Haga clic con el botón derecho en un encabezado de columna y seleccione Cambiar nombre...

    Power BI Cambiar el nombre de las columnas

  2. También puede cambiar el nombre de la consulta de la consulta predeterminada Query1a algo más significativo.

    Power BI Cambiar el nombre de la consulta

  3. Una vez hecho esto, elija Cerrar aplicar para guardar la consulta y volver a Power BI.

    Power BI Cerrar  aplicar

Creación del informe

Power BI muestra los campos sobre los que puede informar.

Nota:

En el ejemplo siguiente se supone que se cambia el nombre de las columnas como se indica en las imágenes correspondientes.

Campos acumulativos de características.

Para obtener un informe sencillo, realice los pasos siguientes:

  1. Elija la Power BI de visualización.
  2. Agregue los campos siguientes a Valores.
    • WorkItemId, elija No resumir para mostrar el identificador.
    • WorkItemType
    • Título
    • State
    • Recuento de casos de usuario
    • Total de puntos de historia

El informe de ejemplo muestra:

Informe de ejemplo del paquete acumulativo de características.

Extracción de datos de varios equipos

A menudo, quiere agregar y comparar datos de varios equipos. Si va a extraer elementos de varios equipos, considere la posibilidad de agregar una segmentación de equipos al informe. Una segmentación de equipos permite filtrar el informe existente por nombre de equipo.

Consultas adicionales

Puede usar las siguientes consultas adicionales para crear informes diferentes pero similares mediante los mismos pasos definidos anteriormente en este artículo.

Filtrar por Teams, en lugar de ruta de acceso de área

Puede generar informes acumulativos filtrando por nombre de equipo en lugar de ruta de acceso de área.

Puede pegar la consulta Power BI que se muestra a continuación directamente en la ventana Obtener datos: consulta en blanco. Para obtener más información, consulte Información general de informes de ejemplo mediante consultas de 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=AssignedTo($select=UserName),Iteration($select=IterationPath),Area($select=AreaPath),"        
            &"Descendants("
                &"$apply=filter(WorkItemType eq 'User Story')"
                &"/aggregate($count as CountOfUserStories, StoryPoints with sum as TotalStoryPoints)"
            &")", 
        null, [Implementation="2.0",OmitValues = ODataOmitValues.Nulls,ODataVersion = 4])  
in
    Source

Acumulación de puntos de historia a epopeyas

Puede acumular puntos de historia a Epopeyas mediante la consulta siguiente.

Puede pegar la consulta Power BI que se muestra a continuación directamente en la ventana Obtener datos: consulta en blanco. Para obtener más información, consulte Información general de informes de ejemplo mediante consultas de OData.

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

Acumulación de tareas pendientes de trabajo en características

Puede pegar la consulta Power BI que se muestra a continuación directamente en la ventana Obtener datos: consulta en blanco. Para obtener más información, consulte Información general de informes de ejemplo mediante consultas de 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 startswith(Area/AreaPath,'{areapath}')"
            &" and Descendants/any()"    
        &"& $select=WorkItemId,Title,WorkItemType,State,AreaSK"
        &"& $expand=AssignedTo($select=UserName),Iteration($select=IterationPath),Area($select=AreaPath),"        
            &"Descendants("
                &"$apply=filter(WorkItemType eq 'Task')"
                &"/aggregate(RemainingWork with sum as TotalRemainingWork)"
            &")", 
        null, [Implementation="2.0",OmitValues = ODataOmitValues.Nulls,ODataVersion = 4])  
in
    Source

Recuento de errores consolidados a características

Puede pegar la consulta Power BI que se muestra a continuación directamente en la ventana Obtener datos: consulta en blanco. Para obtener más información, consulte Información general de informes de ejemplo mediante consultas de 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 startswith(Area/AreaPath,'{areapath}')"
            &" and Descendants/any()"    
        &"& $select=WorkItemId,Title,WorkItemType,State,AreaSK"
        &"& $expand=AssignedTo($select=UserName),Iteration($select=IterationPath),Area($select=AreaPath),"        
            &"Descendants("
                &"$apply=filter(WorkItemType eq 'Bug')"
                &"/aggregate($count as CountOfBugs)"
            &")", 
        null, [Implementation="2.0",OmitValues = ODataOmitValues.Nulls,ODataVersion = 4])  
in
    Source

Lista completa de informes de ejemplo