Search This Blog
Sunday, December 06, 2009
Deleting work item in TFS 2010
Example: witadmin destroywi 10
Thursday, December 06, 2007
TF20015: The field 'xxx' contains a value that is not in the list of supported values.
- The user in one of the fields (which is implementing the valid user value list as the allowed values for the field) was renamed or deleted.
- The work item schema was changed in a way that made some of the existing work items have illegal values. For example, if you made one of the fields mandatory trough all of the work flow and you have some work items with a null value in the field.
So, how can you fix it?
There are 2 ways to do it:
- Changing the work item schema temporarily so the field won't be disabled and then you can change the value.
- Write some code the change the field value:
Here's a code sample on how to update work item field values:
public void UpdateWorkItem(string serverUri, int id, string fieldName, string fieldValue)
{
TeamFoundationServer tfs = new TeamFoundationServer(serverUri);
tfs.EnsureAuthenticated();
WorkItemStore wis = tfs.GetService(typeof(WorkItemStore)) as WorkItemStore;
WorkItem workItem = wis.GetWorkItem(id);
workItem.Open();
workItem.Fields[fieldName].Value = fieldValue;
workItem.Save();
}
Monday, December 03, 2007
Set Work Item Type field allowed values when another field value changes
I was asked once by a friend if there's a way to filter the allowed values of a field when another field value changes. Well, the solution is not exactly as we think about filtering but more like a switch/case mechanism.
Let's take for example 2 fields that implement OS Platform & Version selection:
Windows --> XP, 2003 Server, Vista
Linux --> Ubuntu, Red Hat, Suse
Mac --> OS X 10.0, OS X 10.5
To implement this in the work item type definition file we need to define 2 fields. The xml should look like this:
<FIELD
type="String"
name="OS Platform"
refname="MyFields.OSPlatform">
<ALLOWEDVALUES>
<LISTITEM
value="Windows" />
<LISTITEM
value="Linux" />
<LISTITEM
value="Mac" />
</ALLOWEDVALUES>
</FIELD>
<FIELD
type="String"
name="OS Version"
refname="MyFields.OSVersion">
<WHEN
field="MyFields.OSPlatform"
value="Windows">
<ALLOWEDVALUES>
<LISTITEM
value="XP" />
<LISTITEM
value="2003 Server" />
<LISTITEM
value="Vista" />
</ALLOWEDVALUES>
</WHEN>
<WHEN
field="MyFields.OSPlatform"
value="Linux">
<ALLOWEDVALUES>
<LISTITEM
value="Ubuntu" />
<LISTITEM
value="Red Hat" />
<LISTITEM
value="Suse" />
</ALLOWEDVALUES>
</WHEN>
<WHEN
field="MyFields.OSPlatform"
value="Mac">
<ALLOWEDVALUES>
<LISTITEM
value="OS X 10.0" />
<LISTITEM
value="OS X 10.5" />
</ALLOWEDVALUES>
</WHEN>
</FIELD>
The version field contains WHEN rule for each platform. The result is a field that changes in real time when the parent field value changes.
You don't have to write the xml in order to achieve this. You can use the "Process Template Editor" which is part of the Team Foundation Server power tools to easily add fields and rules to you work item.
Thursday, November 29, 2007
TFSQueryExplorer
Tuesday, July 17, 2007
How to Expose the Work Item Editor Control
Here's an example for creating a new work item with the control.
First we need to connect to a Team Foundation Server and obtain the WorkItemStore service:
TeamFoundationServer tfs = new TeamFoundationServer(serverName);
tfs.EnsureAuthenticated();
WorkItemStore wis = tfs.GetService(typeof(WorkItemStore)) as WorkItemStore;
After doing so we can now create the WorkItemFormControl:
WorkItemFormControl wifc = new WorkItemFormControl();
The WorkItemFormControl has a string property named FormDefinition. We need to set this property with an XML defining the work item type that we want to use. To do so we use the WorkItemStore service:
WorkItemType wit = wis.Projects[teamProjectName].WorkItemTypes["Bug"];
This will return the the Bug work item type.
After doing so we can use the WorkItemType to set the FormDefinition property:
XmlDocument xmlDocument = wit.Export(false);
wifc.FormDefinition = xmlDocument.InnerXml;
Now we can use the WorkItemFormControl with a newly created work item or an existing one:
WorkItem wi = new WorkItem("Bug"); or WorkItem wi = wis.GetWorkItem(bugId);
wifc.Item = wi;
To show the control embed it to a form or a panel on a form.
Wednesday, June 06, 2007
CropperTFSPlugin
Wednesday, May 30, 2007
Cropper TFS Work Item Plugin
The plugin enables you to capture images directly to a new TFS work item attachments field. You can also add an attachment to an existing work item. You can download it from here. Read the read me file for installation guide and how to use it.
The plugin uses the WorkItemFormControl to edit the work item. I will explain in future posts on how to use it.
I'm planning to add the sources to Cropper Plugins project in CodePlex.
The plugin is in it's early stages. I would be happy to hear your comments.
Thursday, April 12, 2007
Extracting Images from Work Items Attachments
In this example I will show how to use the WorkItemStore interface. This example will execute a stored query on the work items database and will extract the attachments from the work items returned from the query. This is a good training for working with the WorkItemStore interface.
private void ExtractWorkItemsAttachments(string teamFoundationServer, string teamProject, string storedQuery,
string saveTo)
{
//Logon to the server and create the needed objects
TeamFoundationServer tfs = TeamFoundationServerFactory.GetServer(teamFoundationServer);
tfs.EnsureAuthenticated();
WorkItemStore store = (WorkItemStore)tfs.GetService(typeof(WorkItemStore));
Project tfsProject = store.Projects[teamProject];
StoredQueryCollection sqc = tfsProject.StoredQueries;
string querystring;
//Search for the query
foreach (StoredQuery query in sqc)
{
if (query.Name == storedQuery)
{
//Execute the query
querystring = query.QueryText;
querystring = querystring.Replace("@project", "'" + tfsProject.Name + "'");
WorkItemCollection workItems = store.Query(querystring);
//Extract the attachments
foreach (WorkItem workItem in workItems)
{
if (workItem.Attachments.Count > 0)
{
foreach (Attachment attachment in workItem.Attachments)
{
//Using WebClient to download the attachment
WebClient webClient = new WebClient();
webClient.Credentials = CredentialCache.DefaultCredentials;
string fileName = Path.Combine(saveTo, attachment.Name);
webClient.DownloadFile(attachment.Uri.AbsoluteUri, fileName);
}
}
}
}
}
}