Ricardo Serradas

Visual Studio ALM in a nutshell

Quest: Customizar Work Items, integração com MS Project e relatórios – Parte 2

fazer um comentário »

Fala galera,

No post anterior, falamos de uma customização de work items usando os recursos do próprio Visual Studio somados aos do Team Foundation Server Power Tools. O que faremos seguindo esse guia é ir além, codificando nosso próprio controle para um formulário de work item.

Vamos relembrar o problema que vamos resolver: precisamos de um campo que vai exibir o andamento geral da atividade, baseado no andamento das 3 etapas, consolidando-as. Para mais detalhes, você pode ler mais sobre o problema proposto na Parte 1.

Para acompanhar, todo o código conte e XML de definição do Work Item “Task” está disponível para download neste link.

Como funciona o deploy de novos controles para Work Items?

Diferentemente do que muitos me supõe, os assemblies de controles customizados para work items não ficam dispostos no servidor do TFS, mas sim em uma pasta específica em cada máquina cliente. Essa pasta é:

[Drive]:\programdata\Microsoft\Team Foundation\Work Item Tracking\Custom Controls\10.0

Por conta disso, precisamos escolher uma forma para distribuir nosso assembly do controle. Isso fica a seu critério. Você pode disponibilizá-la para cópia num compartilhamento na rede, distribuir via pendrive, SkyDrive, etc… Eu escolhi criar um setup que já faz a cópia da DLL para o diretório correto, e aí sim compartilhei este na rede, porém, não vamos entrar nesse mérito.

Vale lembrar que depois do deploy da DLL feito nessa pasta, é necessário reiniciar o Visual Studio para que ele faça sua leitura.

Vamos ao que interessa

Para criarmos nosso controle, criamos um Class Library simples dentro do nosso Visual Studio. Vamos chamá-lo de CustomWorkItemFields. Chamei assim porque, dentro desse mesmo assembly, podemos criar outros novos controles.

Dentro dele, adicionamos um User Control, que vou chamar de “PercentComplete”. Adicionamos então um TextBox simples, o qual vamos chamar de “txtValue”. O último passo dessa parte visual é ajustar o form para que ele fique do mesmo tamanho que nosso TextBox, assim:

Agora, precisamos implementar a inteligência desse controle. Para isso, vamos ao código.

Antes de tudo, precisamos adicionar duas referências ao nosso projeto, que são:

  • Microsoft.TeamFoundation.WorkItemTracking.Client, parte do Team Foundation Server SDK
  • Microsoft.TeamFoundation.WorkItemTracking.Controls, localizado no diretório:

[Drive]:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies

Feito isso:

-          Faça as referências a esses namespaces no codebehind do controle;

-          Implemente a interface IWorkItemControl;

-          (Opcional, como implementei) crie um struct para organizar os nomes dos campos de work items com os quais vamos trabalhar os cálculos;

-          Crie o método SetPercenteCompleteField() para concentrar a inteligência de cálculo.

O segredo todo desta customização está no evento FieldChanged do WorkItem, porque a cada vez que um campo for modificado e este for um dos 3 novos campos que adicionamos ao formulário, temos que realizar o cálculo e exibir o resultado no nosso controle customizado. Veja como ficou o núcleo da nossa customização, o método “SetPercentCompleteField”:

private void SetPercentCompleteField()
{
try
{
// Obtém todos os valores que estão informados nos nossos campos de acompanhamento
var analysis = int.Parse(_workItemDataSource.Fields[WorkItemFields.Analysis].Value.ToString().Replace("%", string.Empty));
var development = int.Parse(_workItemDataSource.Fields[WorkItemFields.Development].Value.ToString().Replace("%", string.Empty));
var tests = int.Parse(_workItemDataSource.Fields[WorkItemFields.Tests].Value.ToString().Replace("%", string.Empty));
// Aplica os pesos a cada um dos valores e depois obtém porcentagem
var result = analysis*40;
result += development*30;
result += tests*30;
result = result/100;
// Atribui o resultado ao nosso campo de work item para armazenamento na base de dados
_workItemDataSource.Fields[WorkItemFields.PercentComplete].Value = result;
// Atribui esse resultado, formatado com o caractér '%', no campo do controle
txtValue.Text = result + "%";
}
catch (Exception)
{
if (_workItemDataSource == null) return;
_workItemDataSource.Fields[WorkItemFields.PercentComplete].Value = 0;
txtValue.Text = "0%";
}
}

Depois do controle codificado, precisamos agora criar um arquivo de definição do controle de work item, que será colocado na mesma pasta de deploy que informei acima. Veja o seu formato:

<?xml version="1.0"?>
<CustomControl xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Assembly>ALMTeam.BlogSampleCMMi.CustomWorkItemFields.dll</Assembly>
<FullClassName>ALMTeam.BlogSampleCMMi.CustomWorkItemFields.PercentComplete</FullClassName>
</CustomControl>

Formato simples, não? Dentro da tag “Assembly”, informamos qual o nome da DLL onde está localizado nosso controle e, em “FullClassName” o nome completo, incluindo namespace, da classe que o define.

Por último, abrimos o Work Item Type “Task” e criamos o campo BlogSampleCMMi.Tracking.PercentComplete (Integer) para armazenar os dados que nosso controle vai exibir.

Feito isso, fazemos o deploy dos dois arquivos na nossa referida pasta e depois reiniciamos o Visual Studio. A partir de então, um novo tipo de controle ficará disponível para inserirmos no layout do work item. É com ele que vamos criar o campo percent complete no formulário, assim como criamos os outros 3 campos, com a seguinte diferença:

Veja que em “Type”, temos nosso tipo de controle customizado disponível. Não podemos nos esquecer, porém, que devemos também referenciar nosso campo de work item (criado na aba “Fields”) na propriedade “Field Name”.

Depois de criado o controle, salve o seu work item type e veja o resultado criando um novo work item do tipo “Task”:

Perceba que cada vez que um desses 3 campos tem seu valor alterado, o cálculo no campo “Andamento Geral” acontece automaticamente.

Importante: a implementação de um controle customizado para formulários de work items na web (Team Foundation Web Access) é diferente. Logo, verá que esse controle não é visível nos formulários web. Este assunto será abordado num outro post. :-)

É isso galera! No próximo episódio dessa “saga”, veremos como integrar tudo isso à um cronograma do Project.

[]’s

Ricardo Serradas

Escrito por Ricardo Serradas

24/08/2010 às 5:36 PM

Publicado em Dicas, Problema e Solução

Etiquetado com , , ,

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Sair / Alterar )

Imagem do Twitter

You are commenting using your Twitter account. Sair / Alterar )

Foto do Facebook

You are commenting using your Facebook account. Sair / Alterar )

Connecting to %s

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.