Заметки консультанта

Шамрай Александр Владимирович

Практическое руководство по отчетности TFS. Практические отчеты

Posted by Шамрай Александр на Май 16, 2014

Отчет «Длительность сборки»

Контекст Если вы ищете пути оптимизации сборки и пытаетесь понять, какая часть сборки занимает большую часть времени, то с использованием Visual Studio это иногда трудно понять. Visual Studio не облегчит эту задачу с помощью прокрутки бесконечного числа записей журнала. Этот отчет содержит более полезную альтернативу, отображая детали каждого шага и продолжительность в неиерархическом виде.
Версия TFS 2010, TFS 2012
Категория Отчет о состоянии

Таблица 3. Отчет «Длительность сборки»

Рисунок 2. Отчет «Длительность сборки»

Предварительные требования

  • Пользователю необходим доступ к базе данных TFS_<Название коллекции>, где <Название коллекции> имя командной коллекции.

Пример

TFS 2010

Следующий код работает для TFS 2010. В этом примере мы устанавливаем @BuildId как последнюю сборку. Если вы хотите получить результат для конкретной сборки, то вам необходимо будет установить значение идентификатора сборки.

  • Tbl_build – таблица содержит запись для каждой сборки.
  • Tbl_InformationType – таблица хранит информацию каждого шага, который выполняется как часть командной сборки.
  • Tbl_buildInformation – таблица с информацией о сборке, которая хранит детальную информацию о результате выполнения каждого шага, указанную в виде информационного типа сборки, для каждой сборки. Схема таблицы отличается у TFS 2010 и TFS2012. В TFS2012 таблица хранит информацию в столбце с именованными полями, в то время как в TFS2010 информация хранятся в отдельной таблице, называемой tbl_BuildInformationFields.
  • Tbl_buildInformationFields – таблица содержит информационные поля для каждой строки tbl_BuildInformation для каждой сборки. Количество полей зависит от BuildInformationType.

 

Код 1.
Отчет «Длительность сборки» для TFS 2010

DECLARE @BuildId int;

— Using this SELECT as just an example to get the latest build to view the details of

SELECT @BuildId = MAX(BuildId) FROM tbl_BuildInformation bi WITH(NOLOCK);

 

SELECT bi.NodeId

,bi.ParentId

,bity.TypeName

,bi.LastModifiedDate

,dpt.FieldValue DisplayText

,CONVERT(DATETIME2, st.FieldValue) StartTime

,CONVERT(DATETIME2, ft.FieldValue) FinishTime

,DATEDIFF(SECOND, st.FieldValue, ft.FieldValue) AS Duration (Seconds)

,CAST((DATEDIFF(SECOND, st.FieldValue, ft.FieldValue))/60.0 AS DECIMAL (12,2)) AS Duration (Minutes)

,sp.FieldValue ServerPath

FROM tbl_BuildInformation bi WITH(NOLOCK)

INNER JOIN tbl_BuildInformationType bity on bi.NodeType = bity.NodeType

LEFT OUTER JOIN (SELECT NodeId,

FieldValue

FROM tbl_BuildInformationField WITH(NOLOCK)

WHERE FieldName = ‘DisplayText‘) dpt ON bi.NodeId = dpt.NodeId

LEFT OUTER JOIN (SELECT NodeId,

FieldValue

FROM tbl_BuildInformationField WITH(NOLOCK)

WHERE FieldName = ‘StartTime‘) st ON bi.NodeId = st.NodeId

LEFT OUTER JOIN (SELECT NodeId,

FieldValue

FROM tbl_BuildInformationField WITH(NOLOCK)

WHERE FieldName = ‘FinishTime‘) ft ON bi.NodeId = ft.NodeId

LEFT OUTER JOIN (SELECT NodeId,

FieldValue

FROM tbl_BuildInformationField WITH(NOLOCK)

WHERE FieldName = ‘ServerPath‘) sp ON bi.NodeId = sp.NodeId

WHERE BuildId = @BuildId

AND bity.TypeName NOT IN (‘BuildMessage‘,

BuildWarning‘,

ExternalLink‘,

ConfigurationSummary‘)

ORDER BY NodeId;

TFS 2012

Схема базы данных TFS 2010 отличается от TFS2012 и tbl_BuildInformation таблицы больше не существует. Поэтому упомянутый выше запрос не будет работать в TFS2012. Альтернативный подход заключается в использовании API в Team Foundation Server, в использовании доступного интерфейса и получении отчета через настроенную службу. В этом случае я создал WCF службу со следующим интерфейсом.

Код 2.
Интерфейс IBuildReports для отчета «Длительность сборки» для TFS 2012

/// <summary>

/// The IBuildReports service interface provide methods for a the various build reports

/// created from Team Foundation Server’s service

/// </summary>

[ServiceContract]

public interface IBuildReports

{

/// <summary>

/// Returns the Build Step Duration report for a given build

/// </summary>

/// <param name=»projectCollectionUri»>The Project collection Uri</param>

/// <param name=»teamProjectName»>The Team Project Name</param>

/// <param name=»buildDefinitionName»>The build definition name for the build for which the report should return the build duration. Only the latest build is extracted.</param>

/// <param name=»reportOption»>An enumeration that determines which steps should be returned</param>

/// <returns>A list of build steps with their respective duration</returns>

[OperationContract]

IEnumerable<BuildStep> GetBuildStepDurationReport(string projectCollectionUri, string teamProjectName, string buildDefinitionName, BuildStepDurationReportOption reportOption);

}

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

Параметр Описание
projectCollectionUri URI подключения коллекции командного проекта.
teamProjectName Имя командного проекта, который содержит сборку.
buildDefinitionName Имя определения сборки.
reportOptions Перечисление возможно со следующими опциями:

  • All – возвращает все шаги сборки
  • SlowestTen – возвращает 10 самых продолжительных сборки
  • FastestTen – возвращает 10 самых быстрых сборки.

Таблица 4.
Параметры отчета «Длительность сборки» для TFS 2012

Тип возвращаемого значения является перечисление объектов типа «BuildStep», которое содержит сведения о каждом шаге сборки и времени его выполнения. Тип Шаг Сборки выглядит следующим образом:

Код 3.
Отчет «Длительность сборки» для TFS 2012 тип BuildStep

[DataContract]

public class BuildStep

{

/// <summary>

/// Gets or sets the name of the Build Step

/// </summary>

[DataMember]

public string Name { get; set; }

/// <summary>

/// Gets or sets the Start Time of the Build Step

/// </summary>

[DataMember]

public DateTime StartTime { get; set; }

/// <summary>

/// Gets or sets the End Time of the Build Step

/// </summary>

[DataMember]

public DateTime? EndTime { get; set; }

/// <summary>

/// Gets or sets the Duration of the build Step

/// </summary>

[DataMember]

public TimeSpan? Duration { get; set; }

}

Реализация IBuildReports показана ниже:

/// <summary>

/// The BuildReports class provides functionality for all Build Reports created from Team Foundation

/// Server’s service

/// </summary>

public class BuildReports : IBuildReports

{

/// <summary>

/// Returns the Build Step Duration report for a given build

/// </summary>

/// <param name=»projectCollectionUri»>The Project collection Uri</param>

/// <param name=»teamProjectName»>The Team Project Name</param>

/// <param name=»buildDefinitionName»>The build definition name for the build for which the report should return the build duration. Only the latest build is extracted.</param>

/// <param name=»reportOption»>An enumeration that determines which steps should be returned</param>

/// <returns>A list of build steps with their respective duration</returns>

public IEnumerable<BuildStep> GetBuildStepDurationReport(string projectCollectionUri, string teamProjectName, string buildDefinitionName, BuildStepDurationReportOption reportOption)

{

ValidateBuildStepDurationParameters(projectCollectionUri, teamProjectName, buildDefinitionName);

var buildCollections = new Collection<BuildStep>();

var teamCollection = GetTeamCollection(projectCollectionUri);

var buildserver = teamCollection.GetService<IBuildServer>();

var buildDefinitionSpec = buildserver.CreateBuildDefinitionSpec(teamProjectName, buildDefinitionName);

var buildDetails = buildserver.QueryBuilds(buildDefinitionSpec);

if (buildDetails != null && buildDetails.Count() > 0)

{

var build = buildDetails.OrderByDescending(s => s.StartTime).FirstOrDefault();

build.Information

.GetSortedNodes(new BuildInformationComparer())

.ForEach(item => AddBuildInformation(buildCollections, item));

}

return buildCollections;

}

private static void ValidateBuildStepDurationParameters(string projectCollectionUri, string teamProjectName, string buildDefinitionName)

{

if (string.IsNullOrWhiteSpace(projectCollectionUri))

{

throw new ArgumentNullExceptionprojectCollectionUri«);

}

if (string.IsNullOrWhiteSpace(teamProjectName))

{

throw new ArgumentNullExceptionteamProjectName«);

}

if (string.IsNullOrWhiteSpace(buildDefinitionName))

{

throw new ArgumentNullExceptionbuildDefinitionName«);

}

if (!Uri.IsWellFormedUriString(projectCollectionUri, UriKind.Absolute))

{

throw new ArgumentExceptionMalformed Uri«, «projectCollectionUri«);

}

}

private static TfsTeamProjectCollection GetTeamCollection(string projectCollectionUri)

{

var teamCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection( new Uri(projectCollectionUri.ToString(), UriKind.Absolute));

teamCollection.EnsureAuthenticated();

return teamCollection;

}     

private static void AddBuildInformation(Collection<BuildStep> collection, IBuildInformationNode buildInformation)

{    

if (buildInformation.Fields.ContainsKey(«StartTime«) && buildInformation.Fields.ContainsKey(«FinishTime«) && buildInformation.Fields.ContainsKey(«DisplayText«))

{

collection.Add(new BuildStep()

{

Name = buildInformation.Fields[«DisplayText«],

StartTime = DateTime.Parse(buildInformation.Fields[«StartTime«]),

EndTime = DateTime.Parse(buildInformation.Fields[«FinishTime«]),

Duration = DateTime.Parse(buildInformation.Fields[«FinishTime«]) — DateTime.Parse(buildInformation.Fields[«StartTime«])

});

}

}

internal class BuildInformationComparer : IComparer<IBuildInformationNode>

{

public int Compare(IBuildInformationNode itemToCompare, IBuildInformationNode itemToCompareWith)

{

if (itemToCompare.Id > itemToCompareWith.Id)

{

return 1;

}

else if (itemToCompare.Id == itemToCompareWith.Id)

{

return 0;

}

return -1;

}

}

}

Установка службы

  • Скопируйте папку «_Published» сервиса на ваш веб-сервер.
  • Создайте новый веб-сайт или виртуальный каталог и назначьте его на папку «_Published».
  • Создайте новый пул приложений и настройте его для запуска с учетной записью, имеющей следующие разрешения в командном проекте.
    • Удаление сборки
    • Обновление информации о сборке
    • Просмотр сборки.
    • Просмотр определения сборки.
  • Убедитесь, что параметр «Включить 32-битные приложения» в пуле приложений установлен в значение истина.
  • Ваш сервис теперь готов для использования.

Отчет «Длительность сборки с течением времени»

Контекст Если вы ищете пути оптимизации сборки и пытаетесь понять, какая часть сборки занимает большую часть времени, то с использованием Visual Studio это иногда трудно понять. Visual Studio не облегчит эту задачу с помощью прокрутки бесконечного числа записей журнала.Отчет, описанный здесь, обеспечивает полезную альтернативу, показывая вам все сборки в командной коллекции в одном отчете с их длительностью.
Версия TFS 2012
Категория Отчет о состоянии

Таблица 5. Отчет «Длительность сборки с течением времени»

Рисунок 3. Отчет «Длительность сборки с течением времени»

Предварительные требования

  • Пользователю необходим доступ к базе данных TFS_<Название коллекции>, где <Название коллекции> имя коллекции команды.

Пример

Запрос может быть расширен для использования диапазона дат, чтобы увидеть результаты за период времени.

Ниже приводится краткое описание о каждой из таблиц, используемой в отчете:

  • tbl_Build – Таблица содержит записи для каждой командной сборки.
  • tbl_BuildQueue – В таблице хранятся сведения о том, когда конкретная сборка была поставлена в очередь.
  • tbl_BuildDefinition – Таблица определений сборок хранит информацию о созданном определении сборки.
  • tbl_BuildController – В таблице контроллер сборки хранит сведения о контроллере сборок
  • tbl_BuildInformation – таблица информации о сборке содержит сведения о сборке в отношении различных ее элементов. Например, для каждой сборки есть запись сборочной информации для Сообщения Сборки, Влияния На Тесты и т.д.
  • tbl_BuildInformationType — типы информации, которые хранятся в таблице информации о сборке, содержатся в таблице tbl_BuildInformationType

Код 5. Отчет «Длительность сборки с течением времени»

SELECT REPLACE(REPLACE(REPLACE(bd.DefinitionName, ‘\’, ») , ‘>’, »), ‘»‘,») AS BuildDefinitionName,

REPLACE(REPLACE(REPLACE(bld.BuildNumber, ‘\’, ») , ‘>’, »), ‘»‘,») AS BuildNumber,

CAST(DATEDIFF(SECOND, bld.StartTime, bld.FinishTime)/60 AS Decimal(5,1)) AS BuildDuration,

bld.[StartTime],bld.[FinishTime],[DropLocationRoot],bc.DisplayName AS BuildController

,RA.Field.value(‘(./Value)[1]’, ‘varchar(100)’) AS BuildAgent

FROM [dbo].[tbl_Build] bld

INNER JOIN tbl_BuildDefinition bd ON bld.DefinitionId = bd.DefinitionId

INNER JOIN tbl_BuildInformation bi ON bi.BuildId = bld.BuildId

INNER JOIN tbl_BuildController bc WITH(NOLOCK) ON bc.ControllerId = bld.ControllerId

INNER JOIN tbl_BuildInformationType bty WITH(NOLOCK) ON bi.NodeType = bty.NodeType

cross apply bi.Fields.nodes(‘/Fields/Field’) as RA(Field)

WHERE RA.Field.value(‘(./@Name)[1]’, ‘varchar(100)’) = ‘ReservedAgentName’

ORDER BY StartTime DESC

Отчет «Состояние сборки с течением времени»

Контекст Если вы ищете пути оптимизации сборки и пытаетесь понять, какая часть сборки занимает большую часть времени, то с использованием Visual Studio это иногда трудно понять. Visual Studio не облегчит эту задачу с помощью прокрутки бесконечного числа записей журнала.Отчет, описанный здесь, обеспечивает полезную альтернативу, показывая вам все сборки в командной коллекции в одном отчете с описанием времени начала, окончания и длительности сборок. Запрос может быть расширен диапазоном дат, чтобы увидеть результат за определенный период.
Версия TFS 2012
Категория Отчет о состоянии

Таблица 6. Отчет «Состояние сборки с течением времени»

Рисунок 4. Отчет «Состояние сборки с течением времени»

Предварительные требования

  • Пользователю необходим доступ к базе данных TFS_<Название коллекции>, где <Название коллекции> имя коллекции команды.

Пример

Следующий код работает для TFS 2012. Таблица очереди сборок (tbl_BuildQueue) не содержит исторические данные за последние 24 часа. Если вы хотите хранить больше данных, то вам нужно будет создать отдельную таблицу в другой базе данных.

Не следует создавать каких-либо таблиц, хранимых процедур или представлений в базе данных TFS. Если вы собираетесь поддерживать исторические данные, создайте отдельную базу данных для этого.

  • tbl_Build – Таблица содержит записи для каждой командной сборки.
  • tbl_BuildQueue – В таблице хранятся сведения о том, когда конкретная сборка была поставлена в очередь.
  • tbl_BuildDefinition – Таблица определений сборок хранит информацию о созданном определении сборки.
  • tbl_BuildController – В таблице контроллер сборки хранит сведения о контроллере сборок
  • tbl_BuildInformation – таблица информации о сборке содержит сведения о сборке в отношении различных ее элементов. Например, для каждой сборки, есть запись сборочной информации для Сообщения Сборки, Влияния На Тесты и т.д.
  • tbl_BuildInformationType — типы информации, которые хранятся в таблице информации о сборки, содержатся в таблице tbl_BuildInformationType

Код 6. Отчет «Состояние сборки с течением времени»

SELECT REPLACE(REPLACE(REPLACE(bd.DefinitionName, ‘\’, ») , ‘>’, »), ‘»‘,») AS BuildDef

,bd.[Description]

—,bq.DateCreated

,bq.QueueTime AS ‘Queued Time UTC’

,REPLACE(REPLACE(REPLACE(b.BuildNumber, ‘\’, ») , ‘>’, »), ‘»‘,») AS BuildNumber

,b.StartTime AS ‘Build Start Time UTC’

,b.FinishTime AS ‘Build Finish Time UTC’

,DATEDIFF(SECOND ,bq.QueueTime, b.StartTime) AS ‘Queue Time Seconds’,

bc.DisplayName As BuildController,

RA.Field.value(‘(./Value)[1]’, ‘varchar(100)’) As BuildAgent

FROM tbl_Build b WITH(NOLOCK)

INNER JOIN tbl_BuildQueue bq WITH(NOLOCK) ON b.BuildId = bq.BuildId

INNER JOIN tbl_BuildDefinition bd WITH(NOLOCK) ON b.DefinitionId = bd.DefinitionId

INNER JOIN tbl_BuildController bc WITH(NOLOCK) ON bc.ControllerId = b.ControllerId

INNER JOIN tbl_BuildInformation bi WITH(NOLOCK) ON bi.BuildId = b.BuildId

INNER JOIN tbl_BuildInformationType bity WITH(NOLOCK) on bi.NodeType = bity.NodeType

cross apply bi.Fields.nodes(‘/Fields/Field’) as RA(Field)

WHERE RA.Field.value(‘(./@Name)[1]’, ‘varchar(100)’) = ‘ReservedAgentName’ AND bity.TypeName=‘AgentScopeActivityTracking’

Отчет «Среднее время между сбоями» (MBTF)

Контекст Отчет MTBF или среднее время между сбоями описывает среднее время между тем, когда проблема была найдена в промышленной среде, до момента, когда найдена следующая проблема.С точки зрения TFS возникновение проблемы отслеживается созданием рабочего элемента ошибки с типом «Ошибка». Таким образом, чтобы создать такой отчет, запрос будет искать рабочие элементы типа «Ошибка». Для получения информации мы будем использовать базу данных TfS_Warehouse, которая хранит всю информацию в соответствии со схемой звезда. В базе данных имеется таблица измерений, которая называется DimWorkItem и хранит все рабочие элементы. Однако, т.к. это таблица измерений, все изменения в любом поле в рабочем элементе приводят к новой строке в этой таблице. К счастью база данных Tfs_Warehouse также содержит представление таблицы измерений DimWorkItem, который возвращает текущее состояние каждого рабочего элемента. Представление, которое называется CurrentWorkItemView, — это то, что мы будем использовать в запросе.

Теперь, когда мы знаем, где находятся сведения о рабочем элементе, следующий фактор для рассмотрения – как определить время, прошедшее между созданием двух ошибок. Поле Microsoft_VSTS_Common_ActivatedDate содержит дату и время, когда рабочий элемент был создан, и это то, что мы будем использовать. Если мы сможем сортировать результаты и вычислить разницу между каждой соседней строкой в запросе, то у нас будет нужная информация. Предложения ROW_NUMBER и ORDER в SQL Server содержат необходимые функциональные возможности.

Заключительная часть мозаики – это фильтрация рабочих элементов. Т.к. затраченное время рассматривается в историческом контексте, мы будем фильтровать рабочие элементы, чтобы включать только те, которые закрыты по полю System_State и которые принадлежать данному командному проекту через поле ProjectPath.

Версия TFS 2012
Категория Отчет о рабочих элементам

Таблица 7. Отчет «Среднее время между сбоями»

Рисунок 5. Пример отчета «Среднее время между сбоями»

Предварительные требования

  • Пользователю необходим доступ к базе данных TFS_Warehouse.

Пример

CurrentWorkItemView – представление извлекает текущее состояние каждого рабочего элемента из таблицы измерений DimWorkItem.

Запрос выбирает все рабочие элементы типа «Ошибка» из данного командного проекта с состоянием «Закрыто» и отсортированными по Дате активации. Следующая задача заключается в том, чтобы вычислить разницу между двумя соседними записями. Для этого используется предложение ROWNUMBER и ORDER, чтобы дать уникальный номер для каждой строки результата. Затем результат объединяется по соседним строкам и вычисляет разницу между Дата активации для смежных рабочих элементов и затем с помощью статистической функции AVG определяется среднее количество часов.

Код 7. Отчет «Среднее время между сбоями»

DECLARE @ProjectPath varchar(255);

— Using this SELECT as just an example to get the latest build to view the details of

—SELECT @ProjectPath = ‘DefaultCollection\TeamProjectName’;

SELECT

RIGHT(‘0’ + CAST(DatePart(wk,CurrentBug.Date) as Varchar) + ‘/’ +

Cast(DatePart(yyyy,CurrentBug.Date) as Varchar), 7) as Week,

AVG(DateDiff(hh, FormerBug.Date, CurrentBug.Date)) as [MTBF in hours]

FROM

(SELECT (

ROW_NUMBER()

OVER(ORDER BY Microsoft_VSTS_Common_ActivatedDate asc) + 1) as ID,

Microsoft_VSTS_Common_ActivatedDate as Date

FROM

dbo.CurrentWorkItemView WITH (NOLOCK)

WHERE

System_WorkItemType = ‘Bug’

AND System_State = ‘Closed’

and ProjectPath like @ProjectPath

) as FormerBug

INNER JOIN

(SELECT (

ROW_NUMBER()

OVER(ORDER BY Microsoft_VSTS_Common_ActivatedDate asc)) as ID,

Microsoft_VSTS_Common_ActivatedDate as Date

FROM

dbo.CurrentWorkItemView WITH (NOLOCK)

WHERE

System_WorkItemType = ‘Bug’

AND System_State = ‘Closed’

and ProjectPath like @ProjectPath

) AS CurrentBug

ON FormerBug.ID = CurrentBug.ID

GROUP BY

DatePart(wk, CurrentBug.Date),

DatePart(yyyy, CurrentBug.Date)

Отчет «Среднее время решения проблем» (MTTR)

Контекст MTTR среднее время, прошедшее с момента, когда проблема обнаружена в промышленной среде, до момента, когда проблема устранена. Для того чтобы отслеживать MTTR, вы определяете данные, которые вам нужно, и как извлечь их из TFS. В шаблоне процесса MSF для гибкой разработки проблемы в промышленной среде представлены рабочим элементом ошибка, т.е. нужно отфильтровать по этому типу рабочего элемента и командному проекту.Не все ошибки, хранящиеся в командном проекте TFS, полезны для отслеживания MTTR. Нужны только те, которые были исправлены в промышленной среде. Также нужно фильтровать по командному проекту и нужно два поля для расчета MTTR. Первое поле — это момент, когда ошибка обнаружена в промышленной среде. Второе поле, когда ошибка исправлена и ее состояние становится закрытым. В шаблоне MSF для гибкой разработки это значение автоматически сохраняется в поле Дата закрытия.

Вы должны также принять решение о том, как представить данные в заключительном отчете. Расчет MTTR является временем, прошедшим между значениями Дата закрытия и Дата активации. Тем не менее, этот отчет будет более удобочитаемым, если будет скорректирован по значениям единиц времени и сгруппированы по результатам».

Версия TFS 2012
Категория Отчет о рабочих элементам

Таблица 8. Отчет «Среднее время решения проблем»

Рисунок 6. Пример отчета «Среднее время решения проблем»

Предварительные требования

  • Пользователю необходим доступ к базе данных TFS_Warehouse.

Пример

Код 8. Отчет «Среднее время решения проблем»

DECLARE @ProjectPath varchar(255);

— Using this SELECT as just an example to get the latest build to view the details of

—SELECT @ProjectPath = ‘DefaultCollection\TeamProjectName’;

SELECT

— We are adding a trailing ‘0’ for 1-digit week numbers,

— so we use the RIGHT function to remove it if was not

— needed because the week number had 2 digits.

RIGHT

(

‘0’

— Number of the week inside the year

+ CAST(DATEPART(wk, [Microsoft_VSTS_Common_ClosedDate])

AS VARCHAR)

— Separator

+ ‘/’

— Year

+ CAST(DATEPART(yyyy, [Microsoft_VSTS_Common_ClosedDate])

AS VARCHAR)

— Maximum length of the returned value (format: WW/YYYY)

, 7

) AS [Week]

— Mean Time To Recover, in hours, per each week

,AVG(

DATEDIFF(hh, [Microsoft_VSTS_Common_ActivatedDate],

[Microsoft_VSTS_Common_ClosedDate])

) AS [MTTR in hours]

FROM

[dbo].[CurrentWorkItemView] WITH(NOLOCK)

WHERE

[ProjectPath] like @ProjectPath = ‘\DefaultCollection\Lab04-Metrics’

AND [System_WorkItemType] = ‘Bug’

AND [System_State] = ‘Closed’

GROUP BY

— Grouping by week and year to calculate the average

DATEPART(wk, [Microsoft_VSTS_Common_ClosedDate]),

DATEPART(yyyy, [Microsoft_VSTS_Common_ClosedDate])

ORDER BY

— Ordering by year and week number

DATEPART(yyyy, [Microsoft_VSTS_Common_ClosedDate]) DESC,

DATEPART(wk, [Microsoft_VSTS_Common_ClosedDate]) DESC

Отчет «Отслеживание времени»

Контекст Отчет по отслеживанию времени отображает каждую версию рабочего элемента и его влияние на оставшуюся работу для данного рабочего элемента. Идея заключается в том, что люди обновляют рабочие элементы по выполнению части работы, они будут постоянно обновлять поле Оставшиеся трудозатраты. Отчет будет использовать этот запрос для отслеживания, сколько работы осталось.
Версия TFS 2010, TFS 2012
Категория Отчет о рабочих элементам

Таблица 9. Отчет «Отслеживание времени»

Рисунок 7. Пример отчета отслеживания времени в Scrum 2.2

Рисунок 7. Пример отчета отслеживания времени в MSF Agile

Предварительные требования

  • Пользователю необходим доступ к базе данных TFS_Warehouse.

Пример

Основные параметры

Это список основных параметров, которые необходимы для отчета, они не должны удаляться.

Параметр Применение
ProjectName Используется для фильтрации рабочих элементом. В отчете отображаются рабочие элементы только для командного проекта с заданным именем.

Таблица 10. Параметры отчета «Отслеживание времени»

Этот параметр устанавливается следующим образом:

Рисунок 7. Параметр отчета

Источники данных

В отчете содержится только один источник данных Tfs_Warehouse и должен быть сопоставлен к базе данных Tfs_Warehouse.

Пошаговое руководство

Шаг Инструкции
1. Создайте проект отчета
[ ] – Сделано
  • Запустите BIDS (SQL Server Business Intelligence Development Studio)
  • Создайте новый проект Report Server Project MyCustomReport
2. Добавьте источник данных
[ ] – Сделано
  • В обозревателе решений нажмите правой кнопкой на DataSource, Add New Datasource и назовите его Tfs_Warehouse
  • Сделайте строку соединения и задайте учетные данные для чтения из базы данных Tfs_Warehouse.
3. Добавьте набор данных
[ ] – Сделано
  • В обозревателе решений, щелкните правой кнопкой мыши на DataSets, Add New DataSet
  • Задайте имя набора данных TimeTrackingDataset
  • Выберите источник данных Tfs_Warehouse
  • В Text Area for Query скопируйте и вставьте следующий SQL:

SELECT

[System_Id] As [Id],[System_Rev] As [Rev],

[System_ChangedBy] As [Changed By],

[Microsoft_VSTS_Scheduling_OriginalEstimate] AS [Original Estimate],

[Microsoft_VSTS_Scheduling_RemainingWork] AS [Remaining Work],

[Microsoft_VSTS_Scheduling_CompletedWork] AS [Completed Work],

[System_Title] As [Title],[System_AssignedTo] As [Assigned To],

[System_ChangedDate] As [Changed Date],

[ProjectNodeName] AS [Team Project],

[AreaName],[AreaPath],

[IterationName],

[IterationPath] ,

[Microsoft_VSTS_Scheduling_RemainingWork] — (Select Top 1 IsNull([Microsoft_VSTS_Scheduling_CompletedWork],0)

FROM [Tfs_Warehouse].[dbo].[WorkItemHistoryView] WITH(NOLOCK)

WHERE [System_Id] = WIHV.[System_Id]

AND [System_Rev] = WIHV.[System_Rev] — 1) as [Completed Diff]

FROM

[Tfs_Warehouse].[dbo].[WorkItemHistoryView] WIHV WITH(NOLOCK)

WHERE

/** Filter team project **/

[ProjectNodeName] LIKE @ProjectName

/** Filter correction entries **/

AND [RevisionCount] IS NOT NULL /** Filter empty entries **/

AND ([Microsoft_VSTS_Scheduling_OriginalEstimate] IS NOT NULL

OR [Microsoft_VSTS_Scheduling_RemainingWork] IS NOT NULL

OR [Microsoft_VSTS_Scheduling_CompletedWork] IS NOT NULL)

ORDER BY ID, Rev

  • Нажмите на пункт Parameters и установите флажок Default Value.
  • Установить значение по умолчанию как «%».
  • Нажмите кнопку ОК.
4. Добавьте отчет
[ ] – Сделано
  • В обозревателе решений нажмите правой кнопкой мыши Report, Add existing report и перейдите к отчету TimeTrackingReport.rdl
5. Установите запускаемый отчет для проекта
[ ] – Сделано
  • Щелкните правой кнопкой мыши на узел проекта и выберите Properties
  • Под Debug/Startitem выберите отчет
6. Протестируйте отчет
[ ] – Сделано
  • Нажмите F5 для сборки и тестирования отчета

 

 

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

 
%d такие блоггеры, как: