Monthly Archives: agosto 2011

[TFS2010] HowTo: Crear un WorkItem con campos personalizados en C#

image47dd1de4

Buenas,

si bien el modelo de objetos para Visual Studio 2010 para trabajar con Team Foundation Server 2010 no es muy complejo, hay algunas particularidades a tener en cuenta. Por ejemplo, cuando queremos crear un WorkItem al que le hemos modificado su estructura de campos.

Por ejemplo, para la definición de una tarea hemos agregado 2 campos de texto más a la misma, llamados “Version” y “Scope”, y luego los hemos agregado visualmente al formulario de edición (si quieres ver como es posible realizar este cambio, este post es para ti). En al siguiente imagen es posible ver como el campo “versión” es requerido para la creación de una tarea.

image

Si tomamos el ejemplo disponible desde MSDN para la creaciòn de un WorkItem utilizando el Client Object Model, veremos que en el mismo no se tiene en cuenta la utilización de campos personalizados. Modificamos el mismo para que guarde los datos de una tarea, como muestra el siguiente código:

   1: using System;

   2: using Microsoft.TeamFoundation.Client;

   3: using Microsoft.TeamFoundation.WorkItemTracking.Client;

   4:  

   5: namespace ElBruno.CreateWiFromCode

   6: {

   7:     class Program

   8:     {

   9:         static void Main(string[] args)

  10:         {

  11:             var collectionUri = new Uri("http://localhost:8080/tfs/tpb");

  12:             var tpc = new TfsTeamProjectCollection(collectionUri);

  13:             var workItemStore = tpc.GetService<WorkItemStore>();

  14:             var teamProject = workItemStore.Projects["AgileLabs"];

  15:             var workItemType = teamProject.WorkItemTypes["Task"];

  16:  

  17:             var task = new WorkItem(workItemType)

  18:             {

  19:                 Title = "Sample Title",

  20:                 Description = "Sample desc"

  21:             };

  22:             task.Save();

  23:  

  24:             Console.WriteLine(@"WorkItem id: " + task.Id);

  25:             Console.ReadLine();

  26:         }

  27:     }

  28: }

 

 

Cuando se quiere guardar el WI (línea 22), nos encontramos con la siguiente excepción:

image

   1: Microsoft.TeamFoundation.WorkItemTracking.Client.ValidationException was unhandled

   2:   Message=TF237124: Work Item is not ready to save

   3:   Source=Microsoft.TeamFoundation.WorkItemTracking.Client

   4:   IsRemoteException=false

   5:   ErrorId=0

   6:   LogException=false

   7:   StackTrace:

   8:        at Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItem.Save(SaveFlags saveFlags)

   9:        at Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItem.Save()

  10:        at ElBruno.CreateWiFromCode.Program.Main(String[] args) in 

  11:        at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)

  12:        at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)

  13:        at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()

  14:        at System.Threading.ThreadHelper.ThreadStart_Context(Object state)

  15:        at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)

  16:        at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)

  17:        at System.Threading.ThreadHelper.ThreadStart()

  18:   InnerException: 

La solución consiste en definir el valor del campo “version” para poder de esta forma cumplir con los campos requeridos para la tarea. Una de las formas posibles de ver el estado de un WI, es analizando el campo IsDirty del mismo. Para este caso podemos realizar la siguiente validación

   1: var task = new WorkItem(workItemType)

   2: {

   3:     Title = "Sample Title",

   4:     Description = "Sample desc"

   5: };

   6: if(task.IsDirty)

   7:     Console.WriteLine("Can't save WorkItem");

   8: else

   9:     task.Save();

 

El objetivo del post era explicar como agregar valores a los campos personalizados, en este caso la magia la realiza una vez más, la línea 22.

   1: using System;

   2: using Microsoft.TeamFoundation.Client;

   3: using Microsoft.TeamFoundation.WorkItemTracking.Client;

   4:  

   5: namespace ElBruno.CreateWiFromCode

   6: {

   7:     class Program

   8:     {

   9:         static void Main(string[] args)

  10:         {

  11:             var collectionUri = new Uri("http://localhost:8080/tfs/tpb");

  12:             var tpc = new TfsTeamProjectCollection(collectionUri);

  13:             var workItemStore = tpc.GetService<WorkItemStore>();

  14:             var teamProject = workItemStore.Projects["AgileLabs"];

  15:             var workItemType = teamProject.WorkItemTypes["Task"];

  16:  

  17:             var task = new WorkItem(workItemType)

  18:             {

  19:                 Title = "Sample Title",

  20:                 Description = "Sample desc"

  21:             };

  22:             task.Fields["ElBruno.Version"].Value = "version 01";

  23:             task.Save();

  24:  

  25:             Console.WriteLine(@"WorkItem id: " + task.Id);

  26:             Console.ReadLine();

  27:         }

  28:     }

  29: }

 

 

Saludos @ Here

El Bruno

   

Fuente: http://msdn.microsoft.com/en-us/library/bb130322.aspx#Y697

Crossposting from El Bruno

[OFFICE] NoReplyAll Outlook AddIn

Buenas,

hoy me he encontrado con una interesante extensión para Microsoft Outlook: NoReplyAll AddIn. Este addin, no hace lo primero que estás pensando: deshabilitar el Reply To All, sino que se aprovecha de algunas funcionalidades propias de Exchange para que podamos indicar en un correo, si no queremos que el mismo pueda ser respondido con un “Reply To All”.

Para esto tenemos una serie de botones en la Ribbon de un correo, donde podemos configurar que no se pueda responder el correo o que no se pueda enviar el mismo.

image

Esto es mucho más simple que la utilización del DRM (que es lo recomendado) y puede ser de bastante utilidad en determinados escenarios.

Yo hoy ya lo he utilizado 2 veces Open-mouthed smile

Saludos @ Home

El Bruno

   

HomePage: http://research.microsoft.com/en-us/projects/researchdesktop/noreplyall.aspx

Download: http://research.microsoft.com/en-us/downloads/60860f41-88ab-4bb4-8104-765feca9cfed/

Crossposting from El Bruno

[KINECT] Beta 1 Refresh para el driver del SDK

image

Buenas,

pues lo has leído en el título del post y lo lees nuevamente aquí: hoy se ha liberado una actualización para la Beta del SDK para desarrollar con Kinect con algunas mejoras incluidas en el mismo. Hasta donde he visto se trata de actualización en la documentación (que siempre se agradece) y algunas cosillas que se me escapan en el driver. Pues a descargarlo y a seguir jugando !!!

Descarga: http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/download.aspx

 

Saludos @ Here

El Bruno

   

Fuente: http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/download.aspx

Crossposting from El Bruno