Свертка значений дочерних рабочих элементов в родительский пример отчета

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

Свертка предоставляет поддержку для отображения количества рабочих элементов или суммы точек истории, оставшихся работ или другого настраиваемого поля дочерних элементов. В этой статье представлено несколько примеров создания табличного сводного отчета для эпических, функций или пользовательских историй, содержащих дочерние рабочие элементы. На следующем рисунке показан пример сведений о точках истории, развернутых для их родительских функций.

Снимок экрана: отчет о матрице свертки компонентов.

Дополнительные сведения о свертки и параметрах для отображения свертки см. в разделе "Отображение хода выполнения накопительного пакета" или итогов в Azure Boards.

Примечание.

В этой статье предполагается, что вы читаете обзор примеров отчетов с помощью запросов OData и имеет базовое представление о Power BI.

Необходимые компоненты

Примеры запросов

Следующие запросы возвращают данные из WorkItems набора сущностей для поддержки создания сверток матрицы отчетов.

Примечание.

Сведения о доступных свойствах для фильтрации или отчета см . в справочнике по метаданным для Azure Boards. Вы можете отфильтровать запросы или возвращать свойства с помощью любого из Property значенийEntityType, доступных в разделе EntitySetили NavigationPropertyBinding Path значениях. Каждое 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 '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

Строки подстановки и разбивка запросов

Замените следующие строки значениями. Не включайте скобки в подстановку {} . Например, если вашей организации присвоено имя Fabrikam, замените {organization} на Fabrikam, а не {Fabrikam}.

  • {organization} — Название организации
  • {project} — Имя проекта группы или полностью опустите "/{project}" для межпроектного запроса
  • {areapath} — Путь к области. Пример формата: Project\Level1\Level2.

Разбивка запросов

В следующей таблице описана каждая часть запроса.

Часть запроса

Description

$filter=WorkItemType eq 'Feature'

Возвращаемые функции.

and State ne 'Cut'

Опустить закрытые ошибки.

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

Возвращайте рабочие элементы в рамках определенного пути области, заменяя Area/AreaPath eq '{areapath}' элементы по определенному пути области. Чтобы отфильтровать по имени команды, используйте инструкцию Teams/any(x:x/TeamName eq '{teamname})'фильтра.

and Descendants/any()

Включите все функции, даже те, которые не содержат пользовательских историй. Замените "any(d:d/WorkItemType eq "Пользовательская история"), чтобы не указывать функции, у которых нет дочерних историй пользователей.

&$select=WorkItemId, Title, WorkItemType, State

Выберите поля для возврата.

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

Выберите поля AssignedToрасширяемого свойства , , AreaIteration.

Descendants(

Descendants Разверните предложение.

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

Отфильтруйте потомков, чтобы включить только пользовательские истории (омитирует задачи и ошибки).

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

Для всех потомков, соответствующих предложению фильтра, подсчитывайте их и суммируете StoryPoints свойство.

)

Закройте среду Descendants().

Сводная история указывает на функции дочерних пользовательских историй на основе Teams

В следующих запросах показано, как создавать отчеты свертки по имени команды, а не по пути к области.

Скопируйте и вставьте следующий запрос 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 '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

Свертка истории указывает на эпические

С помощью следующих запросов можно свернуть историю в Epics.

Скопируйте и вставьте следующий запрос Power BI непосредственно в окно получения пустого запроса данных>. Дополнительные сведения см. в разделе "Обзор примеров отчетов с помощью запросов 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

Свертки задач, оставшихся рабочих и завершенных работ для пользовательских историй

В следующем запросе показано, как свернуть оставшуюся работу и завершенную работу, назначенную дочерним задачам для пользовательских историй в иерархии. Эти запросы предполагают, что задачи назначаются как дочерние элементы пользовательской истории в указанном пути области.

Скопируйте и вставьте следующий запрос 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 'Removed'"
            &" 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, CompletedWork with sum as TotalCompletedWork)"
            &")", 
        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 'Feature'"
            &" and State ne 'Removed'"
            &" 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

(Необязательно) Переименование запроса

Вы можете переименовать метку запроса по умолчанию, query1, в что-то более понятное. Просто введите новое имя в области параметров запроса.

Снимок экрана: параметры меню запроса Power BI, переименование запроса.

Развертывание столбцов в Power BI

Предложение &$expand=AssignedTo($select=UserName), Iteration($select=IterationPath), Area($select=AreaPath) возвращает записи, содержащие несколько полей. Прежде чем создать отчет, необходимо развернуть запись, чтобы она была сплощена в определенные поля. В этом экземпляре необходимо развернуть следующие записи:

  • AssignedTo
  • AreaPath
  • IterationPath

Сведения о том, как можно узнать, как создавать отчеты Power BI, см. в статье "Аналитика преобразования".

(Необязательно) Переименование полей

После развертывания столбцов может потребоваться переименовать одно или несколько полей. Например, можно переименовать столбец AreaPath Area Pathв . Сведения о том, как это сделать, см. в разделе "Переименовать поля столбцов".

Замена значений NULL в полях свертки

Если рабочий элемент не имеет дочерних элементов, значение свертки может иметь значение NULL. Например, Потомки.CountOfUserStories имеет значение NULL, если компонент не имеет дочерних историй пользователей.

Чтобы упростить отчеты, замените все значения NULL нулем, выполнив следующие действия.

  1. Выберите столбец, щелкнув заголовок столбца.
  2. Выберите меню "Преобразование".
  3. Выберите " Заменить значения". Откроется диалоговое окно "Заменить значения ".
  4. Введите значение NULL для поиска.
  5. Введите "0" в замене.
  6. Выберите OK.

Повторите все столбцы свертки.

Закройте запрос и примените изменения

Завершив все преобразования данных, нажмите кнопку "Закрыть" и "Применить " из меню "Главная ", чтобы сохранить запрос и вернуться на вкладку "Отчет " в Power BI.

Снимок экрана: параметр Редактор Power Query Закрыть и применить.

Создание отчета таблицы

  1. В Power BI выберите отчет "Таблица" в разделе "Визуализации".

    Снимок экрана: выбор визуализаций и полей Power BI для отчета о сводной таблице.

  2. Добавьте следующие поля в столбцы в указанном порядке:

    • WorkItemI, выберите "Не сводные данные" для отображения идентификатора при необходимости
    • WorkItemType
    • Title
    • State
    • Count of User Stories
    • Total Story Points.

В примере отчета отображается.

Снимок экрана: сводный отчет о примерах компонентов.