<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3289826069092511990</id><updated>2011-11-28T00:04:55.975Z</updated><category term='powerpivot'/><category term='sharepoint'/><category term='enterprise search'/><category term='infopath'/><category term='WCF'/><category term='workflow'/><category term='OpenXML'/><category term='Office'/><category term='security'/><category term='sharepoint 2010'/><category term='deployment'/><category term='suguk'/><category term='forms'/><category term='timer jobs'/><category term='virtualisation'/><category term='vhd'/><title type='text'>SharePoint Place</title><subtitle type='html'>The blog of a Senior SharePoint Consultant focusing on  infrastructure, administration and development.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://sharepointplace.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://sharepointplace.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Shaun O'Callaghan</name><uri>http://www.blogger.com/profile/01457074098308559187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3289826069092511990.post-4222824625314053511</id><published>2011-06-18T20:14:00.000+01:00</published><updated>2011-06-18T20:31:25.495+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sharepoint'/><category scheme='http://www.blogger.com/atom/ns#' term='workflow'/><title type='text'>SharePoint 2010 Workflow: Dealing with events in custom activities</title><content type='html'>&lt;p style="CLEAR: both"&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/p&gt;&lt;p style="CLEAR: both"&gt;In the past few months I've been responsible for designing a workflow solution to support the automation of an asset management acquisitions process for a customer in the US. The last time I worked on a large workflow project, which touched thousands of users and had a truly global reach, was back in December 2009. I was a little bit rusty and have spent one or two days in the last month getting back up to speed. In this blog post, I'd like to talk about a common scenario which will prove as much of a reference for me in the future as anything else.&lt;/p&gt;&lt;p style="CLEAR: both"&gt;The common scenario I'd like to deal with is one where there is a requirement to assign a task to users who will only be known at runtime. Further, when these tasks are assigned, depending upon the actual task/form which is in use, you may want to perform different actions.&lt;/p&gt;&lt;p style="CLEAR: both"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="CLEAR: both"&gt;&lt;strong&gt;The Requirements&lt;/strong&gt;&lt;/p&gt;&lt;ul style="CLEAR: both"&gt;&lt;li&gt;Provide task management for 1 or more users who will only be known at runtime&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Provide a customized summary report to an individual, who will only be known at runtime, which outlines what tasks were assigned, to whom, and what their response was.&lt;/li&gt;&lt;/ul&gt;&lt;p style="CLEAR: both"&gt;If you are familiar with the MOSS 2007 ECM Starter Kit workflow examples then you have probably seen the widely referenced WssTaskActivity custom activity within the ECM Activities solution. This solution was fine for MOSS 2007 but I actually found it a little heavy in terms of code for a lot of scenarios. A much nicer, cleaner and relevent example is the one which has been put together by Scott Hillier. I would point you to his article at&lt;/p&gt;&lt;p style="CLEAR: both"&gt;&lt;a title="Scott HIllier's article on Multiple and Parallel Workflow Tasks" href="http://www.shillier.com/archive/2010/08/04/Creating_Multiple_and_Parallel_Tasks%20_in_SharePoint_2010_Workflow.aspx" target="_blank"&gt;http://www.shillier.com/archive/2010/08/04/Creating&lt;em&gt;Multiple&lt;/em&gt;and&lt;em&gt;Parallel&lt;/em&gt;Tasks%20&lt;em&gt;in&lt;em&gt;SharePoint&lt;/em&gt;2010&lt;/em&gt;Workflow.aspx&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;and recommend you read that and become comfortable with the concepts before reading this article further.&lt;br /&gt;&lt;br /&gt;&lt;p style="CLEAR: both"&gt;&lt;strong&gt;&lt;span style="FONT-WEIGHT: normal" class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;The Problem&lt;/strong&gt;&lt;/p&gt;&lt;p style="CLEAR: both"&gt;The main advantage of custom activities in workflow is to increase reusability and repeatability. Using the SPTaskActivity custom activity from the article posted above is a great starting point, but there's something missing. Quite often, what we need to do is provide some notification in the workflow which hosts the custom activity that something has happened e.g. a task has changed. It is possible to deal with all events relating to the custom activity within the custom activity itself but this doesn't provide reusability. We need to achieve this within the host.&lt;/p&gt;&lt;p style="CLEAR: both"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style="CLEAR: both"&gt;&lt;strong&gt;The Solution&lt;/strong&gt;&lt;/p&gt;&lt;p style="CLEAR: both"&gt;The solution to this problem lies in the use of DependencyProperty objects to raise a custom event within the host workflow.&lt;/p&gt;&lt;ul style="CLEAR: both"&gt;&lt;br /&gt;&lt;li&gt;Create a custom EventArgs class&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Create a DependencyProperty which points to a generic EventHandler&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Raise the event at the appropriate point e.g. onTaskChanged_Invoked from within your Custom Activity&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Handle the event within your host workflow&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p style="CLEAR: both"&gt;&lt;em&gt;Create a custom EventArgs class&lt;/em&gt;&lt;/p&gt;&lt;p style="CLEAR: both"&gt;First we need to decide what information we need to pass back to the host. For the purposes of this blog post, I've used the TaskEventArgs class from the MOSS 2007 ECM starter kit. The class is very simple and is given below. Create a new class file within your workflow project and paste this code.&lt;/p&gt;&lt;pre class="csharpcode"&gt;[Serializable()]&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; TaskEventArgs : EventArgs&lt;br /&gt;{&lt;br /&gt;   &lt;span class="preproc"&gt;#region&lt;/span&gt; Private Variables&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;private&lt;/span&gt; SPWorkflowTaskProperties beforeProperties = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;br /&gt;   &lt;span class="kwrd"&gt;private&lt;/span&gt; SPWorkflowTaskProperties afterProperties = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;br /&gt;   &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; result = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br /&gt;   &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; executor = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;br /&gt;   &lt;span class="kwrd"&gt;private&lt;/span&gt; ExternalDataEventArgs externalArgs = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;   &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;   &lt;span class="preproc"&gt;#region&lt;/span&gt; Public Properties&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; SPWorkflowTaskProperties BeforeProperties&lt;br /&gt;   {&lt;br /&gt;       get&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.beforeProperties;&lt;br /&gt;       }&lt;br /&gt;       set&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;this&lt;/span&gt;.beforeProperties = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; SPWorkflowTaskProperties AfterProperties&lt;br /&gt;   {&lt;br /&gt;       get&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.afterProperties;&lt;br /&gt;       }&lt;br /&gt;       set&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;this&lt;/span&gt;.afterProperties = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; Result&lt;br /&gt;   {&lt;br /&gt;       get&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.result;&lt;br /&gt;       }&lt;br /&gt;       set&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;this&lt;/span&gt;.result = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Executor&lt;br /&gt;   {&lt;br /&gt;       get&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.executor;&lt;br /&gt;       }&lt;br /&gt;       set&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;this&lt;/span&gt;.executor = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; ExternalDataEventArgs ExternalArgs&lt;br /&gt;   {&lt;br /&gt;       get&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.externalArgs;&lt;br /&gt;       }&lt;br /&gt;       set&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;this&lt;/span&gt;.externalArgs = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;   &lt;span class="preproc"&gt;#region&lt;/span&gt; Constructors&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; TaskEventArgs(SPWorkflowTaskProperties before, SPWorkflowTaskProperties after, &lt;span class="kwrd"&gt;string&lt;/span&gt; executor, ExternalDataEventArgs externalArgs)&lt;br /&gt;   {&lt;br /&gt;       &lt;span class="kwrd"&gt;this&lt;/span&gt;.beforeProperties = before;&lt;br /&gt;       &lt;span class="kwrd"&gt;this&lt;/span&gt;.afterProperties = after;&lt;br /&gt;       &lt;span class="kwrd"&gt;this&lt;/span&gt;.executor = executor;&lt;br /&gt;       &lt;span class="kwrd"&gt;this&lt;/span&gt;.externalArgs = externalArgs;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p style="CLEAR: both"&gt;&lt;em&gt;Create a DependencyProperty which points to a generic EventHandler&lt;/em&gt;&lt;/p&gt;&lt;p style="CLEAR: both"&gt;This is pretty simple, and we can use code snippets to create this for us. You will want to ensure you specify that it is a generic EventHandler based on the TaskEventArgs class you've previously added to your workflow project. &lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; DependencyProperty InvokeEvent = DependencyProperty.Register(&lt;span class="str"&gt;"Invoke"&lt;/span&gt;, &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(EventHandler&amp;lt;TaskEventArgs&amp;gt;), &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(SPTaskActivity));&lt;br /&gt;&lt;br /&gt;   [Description(&lt;span class="str"&gt;"Invoke"&lt;/span&gt;)]&lt;br /&gt;   [Category(&lt;span class="str"&gt;"Invoke Category"&lt;/span&gt;)]&lt;br /&gt;   [Browsable(&lt;span class="kwrd"&gt;true&lt;/span&gt;)]&lt;br /&gt;   [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]&lt;br /&gt;   &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;event&lt;/span&gt; EventHandler&amp;lt;TaskEventArgs&amp;gt; Invoke&lt;br /&gt;   {&lt;br /&gt;       add&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;base&lt;/span&gt;.AddHandler(SPTaskActivity.InvokeEvent, &lt;span class="kwrd"&gt;value&lt;/span&gt;);&lt;br /&gt;       }&lt;br /&gt;       remove&lt;br /&gt;       {&lt;br /&gt;           &lt;span class="kwrd"&gt;base&lt;/span&gt;.RemoveHandler(SPTaskActivity.InvokeEvent, &lt;span class="kwrd"&gt;value&lt;/span&gt;);&lt;br /&gt;       }&lt;br /&gt;   }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The result should look something like the below&lt;br /&gt;&lt;br /&gt;&lt;p style="CLEAR: both"&gt;&lt;a class="image-link" href="http://lh5.ggpht.com/-PCpNIOREeWg/Tfz4vm5a4gI/AAAAAAAAAEM/u7KteylB9lA/s800/1.wde_code_snippet1.png"&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; DISPLAY: inline; FLOAT: left" class="linked-to-original" align="left" src="http://lh4.ggpht.com/-oQ3HbWT_1ak/Tfz5Dvcx6ZI/AAAAAAAAAEQ/Y7yvFswXnPA/s800/1-thumb.wde_code_snippet1.png" width="380" height="131" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="CLEAR: both"&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="CLEAR: both"&gt;&lt;em&gt;Raise the event at the appropriate point e.g. onTaskChanged_Invoked from within your Custom Activity&lt;/em&gt;&lt;/p&gt;&lt;p style="CLEAR: both"&gt;The next thing we need to do is actually raise this event. In this instance, I wanted the Custom Activity to really do nothing when onSPTaskChanged_Invoked was fired, I needed this to be handled externally by the host workflow. We can achieve this by first raising the event in the following way:&lt;br /&gt;&lt;span class="Apple-style-span"   style="font-family:monospace;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style=" white-space: pre;font-size:13px;"&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span"  style=" white-space: normal;font-size:16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; onSPTaskChanged_Invoked(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, ExternalDataEventArgs e)&lt;br /&gt;      {&lt;br /&gt;          TaskEventArgs args = &lt;span class="kwrd"&gt;new&lt;/span&gt; TaskEventArgs(SPBeforeProperties,&lt;br /&gt;                                                  SPAfterProperties, &lt;span class="kwrd"&gt;null&lt;/span&gt;, e);&lt;br /&gt;&lt;br /&gt;          &lt;span class="kwrd"&gt;base&lt;/span&gt;.RaiseGenericEvent&amp;lt;TaskEventArgs&amp;gt;(InvokeEvent, &lt;span class="kwrd"&gt;this&lt;/span&gt;, args);&lt;br /&gt;      }&lt;/pre&gt;&lt;br /&gt;&lt;p style="CLEAR: both"&gt;&lt;em&gt;Handle the event within your host workflow&lt;/em&gt;&lt;/p&gt;&lt;p style="CLEAR: both"&gt;We then need to handle the event in the workflow. Inspect the properties of your custom activity and notice you now have a new event which you can handle.&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; InvokedFromSPTaskActivity(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, TaskEventArgs e)&lt;br /&gt;   {&lt;br /&gt;       &lt;span class="kwrd"&gt;bool&lt;/span&gt; result = Boolean.Parse(e.AfterProperties.ExtendedProperties[&lt;span class="str"&gt;"Result"&lt;/span&gt;].ToString());&lt;br /&gt;   }&lt;/pre&gt;&lt;br /&gt;The result should look something like the below:&lt;br /&gt;&lt;br /&gt;&lt;p style="CLEAR: both"&gt;&lt;a class="image-link" href="http://lh6.ggpht.com/-yoz6U8o0n_M/Tfz1y5valuI/AAAAAAAAAEA/9gmt62vSl-U/s800/2.png"&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; DISPLAY: inline; FLOAT: left" class="linked-to-original" align="left" src="http://lh5.ggpht.com/-yrb78o4gCBo/Tfz1yXSPHbI/AAAAAAAAAD8/Hi6nZlopZS4/s800/2-thumb.png" width="380" height="124" /&gt;&lt;/a&gt; &lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="CLEAR: both"&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="CLEAR: both"&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;We have seen how we can leverage a DependencyProperty based generic EventHandler to add more reusability and flexibility to our custom activities within workflow. This is an important technique and one that, at first, may not seem straight-forward but is surprisingly simple.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3289826069092511990-4222824625314053511?l=sharepointplace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharepointplace.blogspot.com/feeds/4222824625314053511/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sharepointplace.blogspot.com/2011/06/sharepoint-2010-workflow-dealing-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/4222824625314053511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/4222824625314053511'/><link rel='alternate' type='text/html' href='http://sharepointplace.blogspot.com/2011/06/sharepoint-2010-workflow-dealing-with.html' title='SharePoint 2010 Workflow: Dealing with events in custom activities'/><author><name>Shaun O'Callaghan</name><uri>http://www.blogger.com/profile/01457074098308559187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-oQ3HbWT_1ak/Tfz5Dvcx6ZI/AAAAAAAAAEQ/Y7yvFswXnPA/s72-c/1-thumb.wde_code_snippet1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3289826069092511990.post-8391000161393119869</id><published>2011-05-05T12:42:00.001+01:00</published><updated>2011-05-05T13:00:00.843+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sharepoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='deployment'/><category scheme='http://www.blogger.com/atom/ns#' term='infopath'/><category scheme='http://www.blogger.com/atom/ns#' term='forms'/><category scheme='http://www.blogger.com/atom/ns#' term='workflow'/><title type='text'>Deploying InfoPath 2010 forms for custom workflow with SharePoint 2010 and Visual Studio 2010</title><content type='html'>&lt;span xmlns=""&gt;&lt;p&gt;I've spent a little time recently structuring a solution in Visual Studio and TFS for an upcoming project that relies heavily on workflow.  There are a couple of nuances that I thought I'd document given that the information out there at present seems fragmented at best.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The aim of this blog post is to provide guidance on how to structure a Visual Studio 2010 SharePoint workflow project that includes the deployment of InfoPath forms.  This article will not repeat advice which is already in abundance that relates to core workflow development concepts.  I assume you're familiar with writing custom workflow in Visual Studio 2008 and MOSS 2007.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span xmlns=""&gt;&lt;span&gt;&lt;span xmlns=""&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-hDYX9ejOyEM/TcKOpzG85ZI/AAAAAAAAAC4/oWCcEmQRfLE/s1600/1.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 363px;" src="http://4.bp.blogspot.com/-hDYX9ejOyEM/TcKOpzG85ZI/AAAAAAAAAC4/oWCcEmQRfLE/s400/1.png" alt="" id="BLOGGER_PHOTO_ID_5603197735147464082" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;   &lt;/p&gt;&lt;p&gt;Above we see the default solution structure for a state machine workflow.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span xmlns=""&gt;&lt;span&gt;&lt;span xmlns=""&gt;&lt;span&gt;&lt;span xmlns=""&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-io-dk5tavjk/TcKO7DlQ_zI/AAAAAAAAADA/2Zs6OagCmIQ/s1600/2.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 223px; height: 400px;" src="http://1.bp.blogspot.com/-io-dk5tavjk/TcKO7DlQ_zI/AAAAAAAAADA/2Zs6OagCmIQ/s400/2.png" alt="" id="BLOGGER_PHOTO_ID_5603198031627353906" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Add a new Module named "InfopathForms"&lt;br /&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;You can remove the "Sample.txt" placeholder file.  When you do this, notice that Elements.xml for the module will update automatically.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Add your InfoPath form to your InfopathForms module&lt;span xmlns=""&gt;&lt;p&gt;&lt;span&gt;&lt;span xmlns=""&gt;&lt;span&gt;&lt;span xmlns=""&gt;&lt;span&gt;&lt;span xmlns=""&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-ekvOK0chvfc/TcKPJCARcAI/AAAAAAAAADI/H00ckRgi9eE/s1600/3.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 244px;" src="http://2.bp.blogspot.com/-ekvOK0chvfc/TcKPJCARcAI/AAAAAAAAADI/H00ckRgi9eE/s400/3.png" alt="" id="BLOGGER_PHOTO_ID_5603198271721926658" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Double check to ensure that the "Deployment Type" property of your InfoPath form is set to &lt;strong&gt;Element File&lt;/strong&gt; and that the path is "InfopathForms\".&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Your elements .xml file should now look like the following&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Consolas;font-size:100%;color:blue;"   &gt;&amp;lt;?&lt;span style="color: rgb(163, 21, 21);"&gt;xml&lt;span style="color:blue;"&gt;&lt;span style="color:red;"&gt; version&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;1.0&lt;/span&gt;"&lt;span style="color:blue;"&gt;&lt;span style="color:red;"&gt; encoding&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;utf-8&lt;/span&gt;"&lt;span style="color:blue;"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Consolas;font-size:100%;color:blue;"   &gt;&amp;lt;&lt;span style="color: rgb(163, 21, 21);"&gt;Elements &lt;span style="color:blue;"&gt;&lt;span style="color:red;"&gt;xmlns&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;http://schemas.microsoft.com/sharepoint/&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Consolas;font-size:100%;color:blue;"   &gt;  &amp;lt;&lt;span style="color: rgb(163, 21, 21);"&gt;Module&lt;span style="color:blue;"&gt;&lt;span style="color:red;"&gt; Name&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;InfopathForms&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Consolas;font-size:100%;color:blue;"   &gt;  &amp;lt;&lt;span style="color: rgb(163, 21, 21);"&gt;File&lt;span style="color:blue;"&gt;&lt;span style="color:red;"&gt; Path&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;InfopathForms\InitiationForm.xsn&lt;/span&gt;"&lt;span style="color:blue;"&gt;&lt;span style="color:red;"&gt; Url&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;InfopathForms/InitiationForm.xsn&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Consolas;font-size:100%;color:blue;"   &gt;&amp;lt;/&lt;span style="color: rgb(163, 21, 21);"&gt;Module&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Consolas;font-size:9pt;color:blue;"   &gt;&lt;span style="font-size:100%;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;&lt;span style="font-size:100%;"&gt;Elements&lt;/span&gt;&lt;span style="color:blue;"&gt;&lt;span style="font-size:100%;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;By default, your feature.xml will look like the following:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Consolas;font-size:100%;color:blue;"   &gt;&amp;lt;?&lt;span style="color: rgb(163, 21, 21);"&gt;xml&lt;span style="color:blue;"&gt;&lt;span style="color:red;"&gt; version&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;1.0&lt;/span&gt;"&lt;span style="color:blue;"&gt;&lt;span style="color:red;"&gt; encoding&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;utf-8&lt;/span&gt;"&lt;span style="color:blue;"&gt; ?&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Consolas;font-size:100%;color:blue;"   &gt;&amp;lt;&lt;span style="color: rgb(163, 21, 21);"&gt;Feature&lt;span style="color:blue;"&gt;&lt;span style="color:red;"&gt; xmlns&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;http://schemas.microsoft.com/sharepoint/&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Consolas;font-size:100%;color:blue;"   &gt;  &amp;lt;&lt;span style="color: rgb(163, 21, 21);"&gt;Properties&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Consolas;font-size:100%;color:blue;"   &gt;    &amp;lt;&lt;span style="color: rgb(163, 21, 21);"&gt;Property&lt;span style="color:blue;"&gt;&lt;span style="color:red;"&gt; Key&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;GloballyAvailable&lt;/span&gt;"&lt;span style="color:blue;"&gt;&lt;span style="color:red;"&gt; Value&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;true&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Consolas;font-size:100%;color:blue;"   &gt;  &amp;lt;/&lt;span style="color: rgb(163, 21, 21);"&gt;Properties&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Consolas;font-size:9pt;color:blue;"   &gt;&lt;span style="font-size:100%;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;&lt;span style="font-size:100%;"&gt;Feature&lt;/span&gt;&lt;span style=";font-size:100%;color:blue;"  &gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Now we need to modify our feature.xml to register the location of the forms we want to use and set the correct feature receiver.  If you were used to using VSeWSS when developing workflows for MOSS 2007, these steps will have been undertaken for you automatically, you may have had to do little more than modify the path for the RegisterForms property below.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Consolas;font-size:100%;color:blue;"   &gt;&amp;lt;?&lt;span style="color: rgb(163, 21, 21);"&gt;xml&lt;span style="color:blue;"&gt;&lt;span style="color:red;"&gt; version&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;1.0&lt;/span&gt;"&lt;span style="color:blue;"&gt;&lt;span style="color:red;"&gt; encoding&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;utf-8&lt;/span&gt;"&lt;span style="color:blue;"&gt; ?&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Consolas;font-size:100%;color:blue;"   &gt;&amp;lt;&lt;span style="color: rgb(163, 21, 21);"&gt;Feature&lt;span style="color:blue;"&gt;&lt;span style="color:red;"&gt; xmlns&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;http://schemas.microsoft.com/sharepoint/&lt;/span&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:red;"&gt; ReceiverAssembly&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Microsoft.Office.Workflow.Feature, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c&lt;/span&gt;"&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Consolas;font-size:100%;color:blue;"   &gt;&lt;span style="color:red;"&gt;ReceiverClass&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Microsoft.Office.Workflow.Feature.WorkflowFeatureReceiver&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Consolas;font-size:100%;color:blue;"   &gt;  &amp;lt;&lt;span style="color: rgb(163, 21, 21);"&gt;Properties&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Consolas;font-size:100%;color:blue;"   &gt;    &amp;lt;&lt;span style="color: rgb(163, 21, 21);"&gt;Property&lt;span style="color:blue;"&gt;&lt;span style="color:red;"&gt; Key&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;GloballyAvailable&lt;/span&gt;"&lt;span style="color:blue;"&gt;&lt;span style="color:red;"&gt;Value&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;true&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Consolas;font-size:100%;color:blue;"   &gt;    &amp;lt;&lt;span style="color: rgb(163, 21, 21);"&gt;Property&lt;span style="color:blue;"&gt;&lt;span style="color:red;"&gt; Key&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;RegisterForms&lt;/span&gt;"&lt;span style="color:blue;"&gt;&lt;span style="color:red;"&gt; Value&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;InfopathForms\*.xsn&lt;/span&gt;"&lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Consolas;font-size:100%;color:blue;"   &gt;  &amp;lt;/&lt;span style="color: rgb(163, 21, 21);"&gt;Properties&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Consolas;font-size:9pt;color:blue;"   &gt;&lt;span style="font-size:100%;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;&lt;span style="font-size:100%;"&gt;Feature&lt;/span&gt;&lt;span style=";font-size:100%;color:blue;"  &gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;There are two additions here.  The first is:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Consolas;font-size:100%;color:blue;"   &gt;&amp;lt;&lt;span style="color: rgb(163, 21, 21);"&gt;Property&lt;span style="color:blue;"&gt;&lt;span style="color:red;"&gt; Key&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;RegisterForms&lt;/span&gt;"&lt;span style="color:blue;"&gt;&lt;span style="color:red;"&gt; Value&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;InfopathForms\*.xsn&lt;/span&gt;"&lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This tells our feature the location of the forms we want to deploy.  In this case it is all of the .xsn files within the InfopathForms module.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The second modification is the feature receiver assembly and class:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Consolas;font-size:100%;color:red;"   &gt;ReceiverAssembly&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Microsoft.Office.Workflow.Feature, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c&lt;/span&gt;"&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Consolas;font-size:9pt;color:blue;"   &gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-size:100%;color:red;"  &gt;ReceiverClass&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Microsoft.Office.Workflow.Feature.WorkflowFeatureReceiver&lt;/span&gt;"&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This is necessary in order for the forms to be present within the "Manage Form Templates" screen within Central Administration and is a necessary precursor to making your forms "Workflow Enabled".&lt;br /&gt;&lt;/p&gt;&lt;p&gt;At this point there is a ton of other work you need to do around building your workflow, registering your form URNs within the workflow elements file and any deserialization activities you need to do in order to take data from your initiation or association form into your workflow.  None of this information is repeated here and I would point you towards MSDN and the numerous blog articles out there on these subjects.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Once you've deployed your solution, your form should now be registered in the correct location.  Below we can see our IniitationForm at the top of the list within Central Administration.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-ViC8Vr2cJVg/TcKPWkW956I/AAAAAAAAADQ/iNuKvcI7M-4/s1600/4.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 210px;" src="http://4.bp.blogspot.com/-ViC8Vr2cJVg/TcKPWkW956I/AAAAAAAAADQ/iNuKvcI7M-4/s400/4.png" alt="" id="BLOGGER_PHOTO_ID_5603198504282220450" border="0" /&gt;&lt;/a&gt;&lt;p&gt;Using Modules in this way to manage form  templates means we simply need to drag and drop new xsn files into our Module and they will be automatically deployed with our solution.  We still of course need to modify the workflow elements file to register the URNs etc but it's one less thing to think about and certainly makes deployment easier.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I hope you've found this article useful and that it saves you some time when transitioning from workflow development using VSeWSS in MOSS 2007 to Visual Studio 2010 with SharePoint 2010.  Thanks for reading.&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3289826069092511990-8391000161393119869?l=sharepointplace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharepointplace.blogspot.com/feeds/8391000161393119869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sharepointplace.blogspot.com/2011/05/deploying-infopath-2010-forms-for.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/8391000161393119869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/8391000161393119869'/><link rel='alternate' type='text/html' href='http://sharepointplace.blogspot.com/2011/05/deploying-infopath-2010-forms-for.html' title='Deploying InfoPath 2010 forms for custom workflow with SharePoint 2010 and Visual Studio 2010'/><author><name>Shaun O'Callaghan</name><uri>http://www.blogger.com/profile/01457074098308559187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-hDYX9ejOyEM/TcKOpzG85ZI/AAAAAAAAAC4/oWCcEmQRfLE/s72-c/1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3289826069092511990.post-6728234889998622636</id><published>2011-05-04T16:58:00.001+01:00</published><updated>2011-05-04T16:59:54.053+01:00</updated><title type='text'>Migrating from Lotus Notes 8.5 to Microsoft SharePoint 2010: Real-world tales from the trenches</title><content type='html'>I've just published a new blog post on Nothing But SharePoint which outlines a real-world migration from Lotus Notes 8.5 to SharePoint 2010.  I actually went live with this project on the day of the SharePoint 2010 global launch.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Read more here...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="https://www.nothingbutsharepoint.com/sites/itpro/Pages/Migrating-from-Lotus-Notes-8-5-to-Microsoft-SharePoint-2010-Real-world-tales-from-the-trenches.aspx"&gt;https://www.nothingbutsharepoint.com/sites/itpro/Pages/Migrating-from-Lotus-Notes-8-5-to-Microsoft-SharePoint-2010-Real-world-tales-from-the-trenches.aspx&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3289826069092511990-6728234889998622636?l=sharepointplace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharepointplace.blogspot.com/feeds/6728234889998622636/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sharepointplace.blogspot.com/2011/05/migrating-from-lotus-notes-85-to.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/6728234889998622636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/6728234889998622636'/><link rel='alternate' type='text/html' href='http://sharepointplace.blogspot.com/2011/05/migrating-from-lotus-notes-85-to.html' title='Migrating from Lotus Notes 8.5 to Microsoft SharePoint 2010: Real-world tales from the trenches'/><author><name>Shaun O'Callaghan</name><uri>http://www.blogger.com/profile/01457074098308559187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3289826069092511990.post-6436514585914504636</id><published>2010-11-14T14:11:00.000Z</published><updated>2010-11-14T14:21:15.669Z</updated><title type='text'>European SharePoint Best Practices Conference 2011</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_vziqHKIbS1s/TN_wQIvU4eI/AAAAAAAAACA/UyVZ7X-9lJs/s1600/European_Best_Practi%25236ADDF0.jpg"&gt;&lt;img style="cursor: pointer; width: 320px; height: 78px;" src="http://2.bp.blogspot.com/_vziqHKIbS1s/TN_wQIvU4eI/AAAAAAAAACA/UyVZ7X-9lJs/s320/European_Best_Practi%25236ADDF0.jpg" alt="" id="BLOGGER_PHOTO_ID_5539410226703557090" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span lang="en-GB"&gt;&lt;span style="font-family:Calibri,sans-serif;font-size:85%;"&gt;&lt;span style="font-size:11pt;"&gt;  I am honoured to be contributing to next year's European SharePoint Best Practices Conference 2011 as a speaker.&lt;br /&gt;&lt;br /&gt;The conference takes places on April 11th - 13th 2011 at the Queen Elizabeth II Conference Centre, London.&lt;br /&gt;&lt;br /&gt;The conferences features 96 sessions , 69 speakers (includes the 15 community track speakers and  sessions) and this excludes the sponsor partner sessions, It will be  &lt;span style="font-weight: bold;"&gt;the&lt;/span&gt; SharePoint conference to attend in Europe in 2011 no other conference outside  Microsoft’s in the US will have this many talented SharePoint speakers  in one conference. Exhibitor Party / Conference Party / SharePint night  and full set of Video Recorded,MP3 and PowerPoint DVDs sent out after the conference, We are expecting the conference to sell  out so booking early is recommended.&lt;br /&gt;&lt;br /&gt;More information at &lt;a href="http://www.sharepointbestpractices.co.uk/index.html"&gt;http://www.sharepointbestpractices.co.uk/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3289826069092511990-6436514585914504636?l=sharepointplace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharepointplace.blogspot.com/feeds/6436514585914504636/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sharepointplace.blogspot.com/2010/11/european-sharepoint-best-practices.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/6436514585914504636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/6436514585914504636'/><link rel='alternate' type='text/html' href='http://sharepointplace.blogspot.com/2010/11/european-sharepoint-best-practices.html' title='European SharePoint Best Practices Conference 2011'/><author><name>Shaun O'Callaghan</name><uri>http://www.blogger.com/profile/01457074098308559187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_vziqHKIbS1s/TN_wQIvU4eI/AAAAAAAAACA/UyVZ7X-9lJs/s72-c/European_Best_Practi%25236ADDF0.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3289826069092511990.post-1920178990531264475</id><published>2010-08-30T22:47:00.000+01:00</published><updated>2010-08-30T22:57:17.260+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sharepoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='powerpivot'/><category scheme='http://www.blogger.com/atom/ns#' term='suguk'/><title type='text'>Self-Service BI and PowerPivot Session @ SharePoint UK User Group - 2nd September 2010</title><content type='html'>I'll be delivering another session at the Leeds/Bradford SharePoint UK User Group on 2nd September 2010 on Self-Service BI and PowerPivot.  I'll update this post to provide a link to the slide deck after the session.  In the meantime, see the agenda below:&lt;br /&gt;&lt;br /&gt;Agenda:&lt;br /&gt;&lt;br /&gt;- What is PowerPivot?&lt;br /&gt;&lt;br /&gt;- Architecture – PowerPivot for Excel and PowerPivot for SharePoint (Analysis Services &amp;amp; Vertipaq mode)&lt;br /&gt;&lt;p&gt;&lt;br /&gt;- Installing PowerPivot (Dev/Prod build considerations)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;- The client tools – Excel-Add In for PowerPivot&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;- Connecting to back end line of business applications with a worked example&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;- Modelling data in PowerPivot with a worked example&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;    - PivotTables/Charts&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;    - Slicing and Dicing data in PowerPivot&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;    - Custom queries using DAX&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;- Publishing PowerPivot applications to SharePoint&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3289826069092511990-1920178990531264475?l=sharepointplace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharepointplace.blogspot.com/feeds/1920178990531264475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sharepointplace.blogspot.com/2010/08/self-service-bi-and-powerpivot-session.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/1920178990531264475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/1920178990531264475'/><link rel='alternate' type='text/html' href='http://sharepointplace.blogspot.com/2010/08/self-service-bi-and-powerpivot-session.html' title='Self-Service BI and PowerPivot Session @ SharePoint UK User Group - 2nd September 2010'/><author><name>Shaun O'Callaghan</name><uri>http://www.blogger.com/profile/01457074098308559187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3289826069092511990.post-669774905597721048</id><published>2010-06-26T08:08:00.000+01:00</published><updated>2010-06-26T08:21:26.405+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sharepoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='sharepoint'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>A note on SharePoint and Windows Update KB938444</title><content type='html'>A Windows Update security patch (KB938444) has been known to cause a number of issues within a SharePoint farm after its application. Errors such as:&lt;br /&gt;&lt;br /&gt;- HTTP 404&lt;br /&gt;- Server Error&lt;br /&gt;- Cannot connect to the configuration database&lt;br /&gt;&lt;br /&gt;can appear after applying the patch. You should read Microsoft’s statement on the SharePoint blog and a complete description of the problem from the Small Business Server team at the following locations:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/b/sharepoint/archive/2010/06/22/installing-kb938444.aspx"&gt;http://blogs.msdn.com/b/sharepoint/archive/2010/06/22/installing-kb938444.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.technet.com/b/sbs/archive/2010/06/18/companyweb-and-sharepoint-central-admin-not-accessible-after-installing-kb983444.aspx"&gt;http://blogs.technet.com/b/sbs/archive/2010/06/18/companyweb-and-sharepoint-central-admin-not-accessible-after-installing-kb983444.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3289826069092511990-669774905597721048?l=sharepointplace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharepointplace.blogspot.com/feeds/669774905597721048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sharepointplace.blogspot.com/2010/06/note-on-sharepoint-and-windows-update.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/669774905597721048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/669774905597721048'/><link rel='alternate' type='text/html' href='http://sharepointplace.blogspot.com/2010/06/note-on-sharepoint-and-windows-update.html' title='A note on SharePoint and Windows Update KB938444'/><author><name>Shaun O'Callaghan</name><uri>http://www.blogger.com/profile/01457074098308559187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3289826069092511990.post-4545582848773348199</id><published>2010-06-21T15:11:00.001+01:00</published><updated>2010-06-21T15:33:24.014+01:00</updated><title type='text'>Custom Ranking Models with SharePoint 2010:  Background, Value and Administrative Overview</title><content type='html'>&lt;strong&gt;Introduction &lt;/strong&gt;&lt;p&gt;At a recent SharePoint user group session, where I spoke on Enterprise Search in SharePoint 2010, I was introduced as discussing the "black art" of search. The reason, I think, that search was described in that way reflects the way in which most people think about search: something that is pervasive and quickly yields the information required, usually on the first page of results. It's fair to say that the average user doesn't comprehend the complexity and effort required to maintain relevancy, and nor should they need to.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;With the accuracy, power and flexibility of the big-name internet search engines comes a certain expectation from end users in terms of search engine performance behind the corporate firewall. Striving to achieve the same level of fidelity of search results behind the firewall with most Enterprise Content Management (ECM) systems presents a major challenge and administrative headache. SharePoint 2010 alleviates some of this pain and provides the ability to override the default ranking model for enterprise search results. This enables the development of application and organisation specific enterprise search applications which provide contextual results.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;This article is the first of a series I'll produce on custom ranking models with SharePoint 2010. The aim of this article is to provide a background on custom ranking models, why they're important and how SharePoint 2010 supports the implementation and management of custom ranking models through PowerShell and XML configuration files.&lt;br /&gt;&lt;/p&gt;&lt;strong&gt;Background on Custom Ranking Models and SharePoint 2010&lt;/strong&gt;&lt;p&gt;The ranking model that SharePoint 2010 uses is based upon BM25F. BM25F is actually BM25, a ranking function originally implemented at London City University, with field weighting and per-field length normalisation and provides support for weightings for managed properties/metadata amongst other things. It is at this point that I would strongly urge the reader to investigate the references at the end of this article. There is an extent to which the successful implementation of custom ranking models depends upon foundation knowledge of BM25F.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;There are nine ranking models available out of the box with SharePoint 2010 and these are:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Main Results Default Ranking Model&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Expertise Social Distance Ranking Model&lt;br /&gt;&lt;/li&gt;&lt;li&gt;High Proximity Ranking Model&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Main People Social Distance Model&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Expertise Model&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Name Social Distance Ranking Model&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Name Model&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Main People Model&lt;br /&gt;&lt;/li&gt;&lt;li&gt;No Proximity Model&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;There is no support to modify these ranking models and you must create your own. For reference purposes, these can be viewed within the MSSRankingModels table of the SSA Admin DB as shown below:&lt;br /&gt;&lt;/p&gt;&lt;a href="http://3.bp.blogspot.com/_vziqHKIbS1s/TB94B-7GdZI/AAAAAAAAABw/OZp42uwRymo/s1600/1.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 228px;" src="http://3.bp.blogspot.com/_vziqHKIbS1s/TB94B-7GdZI/AAAAAAAAABw/OZp42uwRymo/s320/1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5485234846626641298" /&gt;&lt;/a&gt;&lt;p style="MARGIN-LEFT: 18pt"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I would urge you to 'look' at these ranking models in a development environment because that will give you an idea of the power and flexibility that you can leverage through XML files alone.&lt;br /&gt;&lt;/p&gt;&lt;strong&gt;Why are custom ranking models important?&lt;/strong&gt;&lt;p&gt;Custom Ranking Models are important because they allow search results to be tailored based upon what we know is already important within our organisation. Consider an Enterprise Search Center for a Sales division within an organisation. Sales people are sales driven and have an much greater interest in specific content types and information than others e.g. a PowerPoint slide deck relating to a SharePoint sales pitch rather than an extensive Word document along the technical aspects of SharePoint Enterprise Search. Ranking Models, simply put, allow us to define what is appropriate and &lt;em&gt;relevant&lt;/em&gt; within a specific organisation and promote/demote search results based on the criteria that we define.&lt;br /&gt;&lt;/p&gt;&lt;strong&gt;The Ranking Model Schema&lt;/strong&gt;&lt;p&gt;Microsoft provide a ranking model schema, given below, which provides a blueprint on which to validate your custom models.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas;font-size:10;color:black;"&gt;&amp;lt;rankingModel name="string" id="GUID" description="string" xmlns="http://schemas.microsoft.com/office/2009/rankingModel"&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas;font-size:10;color:black;"&gt;&amp;lt;queryDependentFeatures&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas;font-size:10;color:black;"&gt;&amp;lt;queryDependentFeature pid="PID" name="string" weight="weightValue" lengthNormalization="lengthNormalizationSetting" /&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas;font-size:10;color:black;"&gt;&amp;lt;/queryDependentFeatures&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas;font-size:10;color:black;"&gt;&amp;lt;queryIndependentFeatures&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas;font-size:10;color:black;"&gt;&amp;lt;categoryFeature pid="PID" default="defaultValue" name="string"&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas;font-size:10;color:black;"&gt;&amp;lt;category value="categoryValue" name="string" weight="weightValue" /&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas;font-size:10;color:black;"&gt;&amp;lt;/categoryFeature&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas;font-size:10;color:black;"&gt;&amp;lt;languageFeature pid="PID" name="string" default="defaultValue" weight="weightValue" /&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas;font-size:10;color:black;"&gt;&amp;lt;queryIndependentFeature pid="PID" name="string" default="defaultValue" weight="weightValue"&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas;font-size:10;color:black;"&gt;&amp;lt;transformRational k="value" /&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas;font-size:10;color:black;"&gt;&amp;lt;transformInvRational k="value" /&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas;font-size:10;color:black;"&gt;&amp;lt;transformLinear max="maxValue" /&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas;font-size:10;color:black;"&gt;&amp;lt;/queryIndependentFeature&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas;font-size:10;color:black;"&gt;&amp;lt;/queryIndependentFeatures&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Consolas;font-size:10;color:black;"&gt;&amp;lt;/rankingModel&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;This basic blueprint will be explored in future articles as we discuss the actual development of custom ranking models. For now, I would draw your attention to the QueryDependantFeature and QueryIndependantFeature XML elements.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Query Dependant Features within the ranking model provide the ability to define managed properties which supports dynamic ranking. Query Independent Features are static ranking properties that apply irrespective of the query issued or the results returned. Why is this important? Well… we may want to stipulate that we always want to rank PowerPoint presentations above Word documents. We could then express this as a Query Independent Feature.&lt;br /&gt;&lt;/p&gt;&lt;strong&gt;Administrative Overview&lt;/strong&gt;&lt;p&gt;The power of custom ranking models becomes even more impressive when we realise that developer intervention is not necessary for their implementation and management. The necessary tools to implement and manage custom ranking models are PowerShell and XML.&lt;br /&gt;&lt;/p&gt;&lt;strong&gt;Managing custom ranking models with PowerShell&lt;/strong&gt;&lt;p&gt;There are four PowerShell cmdlets that provide the functionality to manage existing, and implement new, ranking models.&lt;br /&gt;&lt;/p&gt;&lt;div style="MARGIN-LEFT: 5pt"&gt;&lt;table style="BORDER-COLLAPSE: collapse" border="0"&gt;&lt;colgroup&gt;&lt;col style="WIDTH: 265px"&gt;&lt;col style="WIDTH: 344px"&gt;&lt;/colgroup&gt;&lt;tbody valign="top"&gt;&lt;tr&gt;&lt;td style="BORDER-BOTTOM: 0.5pt solid; BORDER-LEFT: 0.5pt solid; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: 0.5pt solid; BORDER-RIGHT: 0.5pt solid"&gt;&lt;p&gt;&lt;span style="font-family:Segoe UI;font-size:9;color:#333333;"&gt;&lt;strong&gt;Get-SPEnterpriseSearchRankingModel&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: 0.5pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: 0.5pt solid; BORDER-RIGHT: 0.5pt solid"&gt;&lt;p&gt;&lt;span style="font-family:Segoe UI;font-size:9;color:#333333;"&gt;Returns a ranking model&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="BORDER-BOTTOM: 0.5pt solid; BORDER-LEFT: 0.5pt solid; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: medium none; BORDER-RIGHT: 0.5pt solid"&gt;&lt;p&gt;&lt;span style="font-family:Segoe UI;font-size:9;color:#333333;"&gt;&lt;strong&gt;New-SPEnterpriseSearchRankingModel&lt;/strong&gt;&lt;/span&gt; &lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: 0.5pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: medium none; BORDER-RIGHT: 0.5pt solid"&gt;&lt;p&gt;&lt;span style="font-family:Segoe UI;font-size:9;color:#333333;"&gt;Adds a ranking model to a shared search application&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="BORDER-BOTTOM: 0.5pt solid; BORDER-LEFT: 0.5pt solid; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: medium none; BORDER-RIGHT: 0.5pt solid"&gt;&lt;p&gt;&lt;span style="font-family:Segoe UI;font-size:9;color:#333333;"&gt;&lt;strong&gt;Remove-SPEnterpriseSearchRankingModel&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: 0.5pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: medium none; BORDER-RIGHT: 0.5pt solid"&gt;&lt;p&gt;&lt;span style="font-family:Segoe UI;font-size:9;color:#333333;"&gt;Deletes a ranking model&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="BORDER-BOTTOM: 0.5pt solid; BORDER-LEFT: 0.5pt solid; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: medium none; BORDER-RIGHT: 0.5pt solid"&gt;&lt;p&gt;&lt;span style="font-family:Segoe UI;font-size:9;color:#333333;"&gt;&lt;strong&gt;Set-SPEnterpriseSearchRankingModel&lt;/strong&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-BOTTOM: 0.5pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: medium none; BORDER-RIGHT: 0.5pt solid"&gt;&lt;p&gt;&lt;span style="font-family:Segoe UI;font-size:9;color:#333333;"&gt;Sets the properties of a ranking model for a shared search application&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;These speak for themselves and I won't discuss each in turn any more than the descriptions given above. Suffice to say, I urge you to look at those cmdlets within PowerShell and take some time to understand their parameters.&lt;br /&gt;&lt;/p&gt;Applying custom ranking models in Enterprise Search&lt;p&gt;Once you have a custom ranking model applied, using the aforementioned PowerShell cmdlets, there are three ways in which you can test the effects that other ranking models have on search results.&lt;br /&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;div&gt;Add rm={GUID} parameter to your search centre query string&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;This is the easiest way to test the effects that a custom ranking model will have on search results and is probably the route you will take during development and testing. To quickly see how search results change based on different ranking models, you can take one of the GUIDs from the ModelId column in the MSSRankingModels table and apply that.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Export Core Results WebPart, modify RankingModel parameter and reimport&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;This is useful when developer intervention is not required or available. A standard out of the box Core Results Web Part can be exported to a .webpart file. An administrator is then able to modify this file and insert the GUID of the ranking model to use before reimporting the file into the page or Web Part gallery.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Inherit the Core Results Web Part and wire up your ranking model in code&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;This is the most likely option when there is already a development effort underway or there are other specific customisations to the Core Results Web Part needed.&lt;br /&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;strong&gt;What's next?&lt;/strong&gt;&lt;p&gt;The next article will explore the development of custom ranking models. This would benefit from an entire blog post of its own. For now, and before you embark on developing custom ranking models, I would urge you to begin to understand the fundamental concepts of BM25F and begin to identify what information is important to your organisation that you can use to influence ranking.&lt;br /&gt;&lt;/p&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;p&gt;&lt;strong&gt;Microsoft Cambridge at TREC–14: Enterprise track&lt;br /&gt;&lt;a href="http://trec.nist.gov/pubs/trec14/papers/microsoft-cambridge.enterprise.pdf"&gt;&lt;/strong&gt;http://trec.nist.gov/pubs/trec14/papers/microsoft-cambridge.enterprise.pdf&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://trec.nist.gov/pubs/trec14/papers/microsoft-cambridge.enterprise.pdf"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3289826069092511990-4545582848773348199?l=sharepointplace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharepointplace.blogspot.com/feeds/4545582848773348199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sharepointplace.blogspot.com/2010/06/custom-ranking-models-with-sharepoint.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/4545582848773348199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/4545582848773348199'/><link rel='alternate' type='text/html' href='http://sharepointplace.blogspot.com/2010/06/custom-ranking-models-with-sharepoint.html' title='Custom Ranking Models with SharePoint 2010:  Background, Value and Administrative Overview'/><author><name>Shaun O'Callaghan</name><uri>http://www.blogger.com/profile/01457074098308559187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_vziqHKIbS1s/TB94B-7GdZI/AAAAAAAAABw/OZp42uwRymo/s72-c/1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3289826069092511990.post-4881350798087423657</id><published>2010-05-24T08:11:00.000+01:00</published><updated>2010-05-24T08:17:26.345+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sharepoint'/><category scheme='http://www.blogger.com/atom/ns#' term='enterprise search'/><category scheme='http://www.blogger.com/atom/ns#' term='suguk'/><title type='text'>Slide deck from SharePoint User Group -18th May 2010 - Enterprise Search and SharePoint 2010 - What's New?</title><content type='html'>I presented at the SharePoint User Group UK in Nottingham on 10th May 2010. I covered Enterprise Search in SharePoint 2010 from a "What's New/?" perspective around architecture, development and administration.&lt;br /&gt;&lt;br /&gt;The demos were how to create a Custom Connector for BCS and Search and Administering Custom Ranking Models using PowerShell and XML. Feedback is welcome, as always.&lt;br /&gt;&lt;br /&gt;Download my slide deck &lt;a href="http://docs.google.com/fileview?id=0BxhW7TRvaFM-MDU3NWVmOWQtYjdkZS00MTNkLWE0MTUtZDI3YzNkZGY4YzM0&amp;amp;hl=en"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3289826069092511990-4881350798087423657?l=sharepointplace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharepointplace.blogspot.com/feeds/4881350798087423657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sharepointplace.blogspot.com/2010/05/slide-deck-from-sharepoint-user-group.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/4881350798087423657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/4881350798087423657'/><link rel='alternate' type='text/html' href='http://sharepointplace.blogspot.com/2010/05/slide-deck-from-sharepoint-user-group.html' title='Slide deck from SharePoint User Group -18th May 2010 - Enterprise Search and SharePoint 2010 - What&apos;s New?'/><author><name>Shaun O'Callaghan</name><uri>http://www.blogger.com/profile/01457074098308559187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3289826069092511990.post-8832850074152653870</id><published>2010-03-23T10:57:00.001Z</published><updated>2010-03-23T10:57:42.545Z</updated><title type='text'>UserSelectionMode issue when extracting Person/Group field definitions in WSS 3.0/MOSS 2007</title><content type='html'>&lt;span xmlns=''&gt;&lt;p&gt;An issue exists when extracting Person or Group fields from SharePoint, specifically using SPSource but I'm guessing this issue transcends the use of SPSource due to the following article from &lt;a href='http://support.microsoft.com/kb/934613'&gt;http://support.microsoft.com/kb/934613&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The issue is that when you've extracted a field you may see an 'invalid' attribute value in UserSelectionMode="PeopleOnly".  Basically this value should be 0 for people only as the schema defines this as an int.  If you attempt to deploy a field definition in XML via Elements.xml you'll see the following error:&lt;br /&gt;&lt;/p&gt;&lt;p style='margin-left: 36pt'&gt;&lt;strong&gt;Feature definition with Id xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx failed validation, file 'ECM.SiteColumns\Columns.xml', line 17, character 98:&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style='margin-left: 36pt'&gt;&lt;strong&gt; The 'UserSelectionMode' attribute is invalid - The value 'PeopleOnly' is invalid according to its datatype 'http://www.w3.org/2001/XMLSchema:int' - The string 'PeopleOnly' is not a valid Int32 value.&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style='margin-left: 36pt'&gt;&lt;strong&gt;ECM.wsp: The Solution installation failed.&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The value for UserSelectionMode should be set to 0 for PeopleOnly or 1 for PeopleAndGroups.  I haven't tested yet, but I wonder whether this would be valid if the field was provisioned programmatically using AddFieldAsXml() method.  This would then yield consistent behaviour with the &amp;lt;Customization&amp;gt; child element bug discussed on the SharePointDev wiki @ &lt;a href='http://sharepointdevwiki.com/display/public/SharePoint+Custom+Fields?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+SharepointDevWiki+(SharePoint+Dev+Wiki+RSS+Feed)'&gt;http://sharepointdevwiki.com/display/public/SharePoint+Custom+Fields?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+SharepointDevWiki+(SharePoint+Dev+Wiki+RSS+Feed)&lt;/a&gt;&lt;br /&gt;			&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3289826069092511990-8832850074152653870?l=sharepointplace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharepointplace.blogspot.com/feeds/8832850074152653870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sharepointplace.blogspot.com/2010/03/userselectionmode-issue-when-extracting.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/8832850074152653870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/8832850074152653870'/><link rel='alternate' type='text/html' href='http://sharepointplace.blogspot.com/2010/03/userselectionmode-issue-when-extracting.html' title='UserSelectionMode issue when extracting Person/Group field definitions in WSS 3.0/MOSS 2007'/><author><name>Shaun O'Callaghan</name><uri>http://www.blogger.com/profile/01457074098308559187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3289826069092511990.post-604027903900713256</id><published>2010-03-05T15:47:00.001Z</published><updated>2010-03-05T15:47:21.735Z</updated><title type='text'>First article published on EndUserSharePoint.com</title><content type='html'>&lt;span xmlns=''&gt;&lt;p&gt;Head on over to &lt;a href='http://www.endusersharepoint.com'&gt;www.endusersharepoint.com&lt;/a&gt; and read my thoughts on the business value of SharePoint, and why we need to understand how that value changes when we apply SharePoint to different levels of an organisation.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Read more @ &lt;a href='http://www.endusersharepoint.com/2010/03/05/the-value-of-sharepoint-introduction/'&gt;http://www.endusersharepoint.com/2010/03/05/the-value-of-sharepoint-introduction/&lt;/a&gt;&lt;br /&gt;			&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3289826069092511990-604027903900713256?l=sharepointplace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharepointplace.blogspot.com/feeds/604027903900713256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sharepointplace.blogspot.com/2010/03/first-article-published-on.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/604027903900713256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/604027903900713256'/><link rel='alternate' type='text/html' href='http://sharepointplace.blogspot.com/2010/03/first-article-published-on.html' title='First article published on EndUserSharePoint.com'/><author><name>Shaun O'Callaghan</name><uri>http://www.blogger.com/profile/01457074098308559187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3289826069092511990.post-1516121018778642847</id><published>2010-02-24T20:04:00.001Z</published><updated>2010-02-24T20:13:45.293Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='sharepoint'/><category scheme='http://www.blogger.com/atom/ns#' term='timer jobs'/><title type='text'>Developing Custom SharePoint Timer Jobs and the importance of separating SharePoint development from SharePoint deployment</title><content type='html'>&lt;span xmlns=''&gt;&lt;p&gt;The catalyst for me writing this blog post was a pretty standard requirement for a daily timer job on a Web Content Management (WCM) project for a customer last week.  I spent the best part of a day writing the logic for the timer job inside a Console Application project where the debug cycle is far greater reduced.  I then spent 5 minutes packaging that up and deploying.  I then decided I needed to modify the schedule which was originally set via the Feature Receiver but I didn't want to redeploy or reactivate, and nor should I.  This reminded me of how many more junior SharePoint developers I see who forget very basic rules about not confusing the development process with the deployment process.  This blog post discusses the resources, and methods I used to quickly wrap a piece of SharePoint functionality into a timer job, deploy it to a WSP and modify its schedule via the UI.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;So, after you've got your logic written in your Console Application and you want to package that up into a timer job, then what?  Well, that's pretty simple.  Visit &lt;a href='http://www.andrewconnell.com/blog/'&gt;Andrew Connell's blog&lt;/a&gt; and read his article on &lt;a href='http://www.andrewconnell.com/blog/articles/CreatingCustomSharePointTimerJobs.aspx'&gt;Creating Custom SharePoint Timer Jobs&lt;/a&gt;.  This isn't groundbreaking, complex code but quite simply put; it works.  In the interests of brevity I'm not going to repeat any content here.  One thing you will notice is that the scheduling for the job is inside the FeatureActivated() event within the Feature Receiver.   This is fine if you know the schedule at the time you deploy.  The chances are however you're going to want to modify the schedule after you've deployed when the customer inevitably changes their mind about when, and how often, a specific piece of functionality runs.  For this, there's an awesome tool on the &lt;a href='http://www.codeplex.com/'&gt;CodePlex&lt;/a&gt; website called &lt;a href='http://sptimerjobadmin.codeplex.com/'&gt;SharePoint Timer Job Administration&lt;/a&gt;.  This is an awesome piece of software that gives you a link within SharePoint Central Administration called "Manage Timer Jobs" where you can modify the schedule and disable/delete timer jobs.  Simply modify the UI and restart the Windows SharePoint Services Timer Service (OWSTimer.exe) and you're good to go.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;So my point?  By 4:30pm last Thursday I had a piece of code written and tested.  By 5pm that code was wrapped in a timer job, packaged inside a WSP and deployed into a customer environment.  From that point its schedule was modified multiple times via the browser.  Even though I understand how to write timer jobs and how to package SharePoint artefacts into deployable solutions, I would have wasted a great deal of time if I was deploying code into SharePoint inside a timer job from the beginning.  Imagine how much timer I'd have wasted if I &lt;em&gt;didn't &lt;/em&gt;understand SharePoint timer jobs and I did that?  We need to think about what it is we're &lt;em&gt;testing&lt;/em&gt; when we write SharePoint code and be absolutely sure to separate functional testing of SharePoint artefacts (Content Types, Site Columns, Timer Jobs) from their deployment.  Tools such as the SharePoint Solution Generator, and more recently &lt;a href='http://www.codeplex.com/SPSource'&gt;SPSource&lt;/a&gt;, make it so much easier to separate development from deployment and we should take full advantage of them.  These tools allow us to generate entire publishing solutions via SharePoint Designer and the SharePoint UI and extract them afterwards.  I wrote a tweet today on how the variety and quality, in general, of CodePlex tools make the life of a SharePoint consultant so much easier.  I meant it, too.&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3289826069092511990-1516121018778642847?l=sharepointplace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharepointplace.blogspot.com/feeds/1516121018778642847/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sharepointplace.blogspot.com/2010/02/developing-custom-timer-jobs-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/1516121018778642847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/1516121018778642847'/><link rel='alternate' type='text/html' href='http://sharepointplace.blogspot.com/2010/02/developing-custom-timer-jobs-and.html' title='Developing Custom SharePoint Timer Jobs and the importance of separating SharePoint development from SharePoint deployment'/><author><name>Shaun O'Callaghan</name><uri>http://www.blogger.com/profile/01457074098308559187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3289826069092511990.post-4784095165361319900</id><published>2009-12-22T18:30:00.001Z</published><updated>2010-02-14T15:14:59.850Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenXML'/><category scheme='http://www.blogger.com/atom/ns#' term='sharepoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Office'/><title type='text'>Programmatically creating Word documents in SharePoint with the OpenXML SDK</title><content type='html'>&lt;span xmlns=""&gt; &lt;p&gt;A requirement on a recent SharePoint workflow development project involved the programmatic creation of a formatted Word document. The Word document itself was simple: a title and a table. The table contains rows for each SPListItem in an SPListItemCollection object. I spent a little while looking at how to achieve this without the use of Word automation/Interop before deciding to examine how quickly I could achieve this using the OpenXML SDK and streaming the contents of the XML into an SPFile object. This blog post describes the chosen approach.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Caveats: This post focuses on concepts rather than posting hundreds of lines of code. The idea is that you can take away a good understanding of the tools available to quickly generate OpenXML compliant documents and write them back to SharePoint. This post assumes a good level of knowledge of the SharePoint API and refactoring complex, auto-generated code from productivity tools such that it's production ready. This post also does not focus on using a .dotx template which in hindsight, would have been more appropriate. We'll leave that as a task for the reader :)&lt;/p&gt;&lt;p&gt;Okay.. so lets get started!&lt;br /&gt;&lt;/p&gt;&lt;p&gt;You will need to download the OpenXML SDK 2.0 (OpenXMLSDKv2.msi) and OpenXML Productivity Tool (OpenXMLSDKTool.msi) from the following location:&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=C6E744E5-36E9-45F5-8D8C-331DF206E0D0&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyId=C6E744E5-36E9-45F5-8D8C-331DF206E0D0&amp;amp;displaylang=en&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Step 1. Setup your project&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Once you have the SDK and productivity tools installed, create a new Console Application and add a reference to DocumentFormat.OpenXml.dll.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;a title="OpenXML1 by shaunocallaghan, on Flickr" href="http://www.flickr.com/photos/45824803@N07/4354110014/"&gt;&lt;img alt="OpenXML1" src="http://farm5.static.flickr.com/4013/4354110014_e456717219_o.jpg" width="500" height="335" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Step 2. Generate your base document&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The approach I took to quickly generate a document was to create the skeleton layout of the document as shown below. In this instance, I wanted to generate a table with rows comprised of items from an SPListItemCollection.&lt;/p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;a title="OpenXML2 by shaunocallaghan, on Flickr" href="http://www.flickr.com/photos/45824803@N07/4353362021/"&gt;&lt;img alt="OpenXML2" src="http://farm5.static.flickr.com/4027/4353362021_e1e226ddb4_o.jpg" width="500" height="335" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Step 3. Generate your code stub&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;p&gt;The OpenXML productivity tool now allows us to generate a C# stub of code, albeit quite verbose, that represents that document. Open the productivity tool from it's location on the file system (the actual file is OpenXmlSdkTool.exe) and click "Open File" and locate your previously created Word document. Now you need to click on "Reflect Code". The productivity tool will produce a code stub for you. Copy the contents of this file, obviously amending namespaces as necessary etc into your Visual Studio project.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a title="OpenXML3 by shaunocallaghan, on Flickr" href="http://www.flickr.com/photos/45824803@N07/4353362175/"&gt;&lt;img alt="OpenXML3" src="http://farm3.static.flickr.com/2701/4353362175_8224544b55_o.jpg" width="500" height="335" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Step 4. Refactor&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;What you are now able to do is create multiple instances of that document. This of course is no use, so we need to do some refactoring. The extent and nature of the refactoring process depends upon what you want to do. As such, I'm not going to post large amounts of application specific code, rather I'll focus on concepts.&lt;/p&gt;&lt;p&gt;In my case I needed to modify the constructor to take an SPListItemCollection which I then wanted it to use to generate a document and write that back to a document library. As such I modified the signature and behaviour of the CreatePackage() method such that it looked as follows:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre style="BORDER-BOTTOM: #999999 1px dashed; BORDER-LEFT: #999999 1px dashed; PADDING-BOTTOM: 5px; LINE-HEIGHT: 14px; BACKGROUND-COLOR: #eee; PADDING-LEFT: 5px; WIDTH: 100%; PADDING-RIGHT: 5px; FONT-FAMILY: Andale Mono, Lucida Console, Monaco, fixed, monospace; COLOR: #000000; FONT-SIZE: 12px; OVERFLOW: auto; BORDER-TOP: #999999 1px dashed; BORDER-RIGHT: #999999 1px dashed; PADDING-TOP: 5px"&gt;&lt;code&gt;public void CreatePackage(string fileName, SPListItemCollection Items,&lt;br /&gt;            string destinationOutputListName)&lt;br /&gt;        {&lt;br /&gt;            this.fileName = fileName;&lt;br /&gt;            this.items = Items;&lt;br /&gt;&lt;br /&gt;            SPFolder folder = web.GetFolder(destinationOutputListName);&lt;br /&gt;            using (MemoryStream memoryStream = new MemoryStream())&lt;br /&gt;            {&lt;br /&gt;                using (WordprocessingDocument package = WordprocessingDocument.Create(memoryStream, WordprocessingDocumentType.Document))&lt;br /&gt;                {&lt;br /&gt;                    CreateParts(package);&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                SPFile file = folder.Files.Add(fileName, memoryStream, true);&lt;br /&gt;                file.Update();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;The next piece of refactoring I did was inside the auto-generated method called GenerateMainDocumentPart1Content(). I created two methods, one called GenerateTable() and another called GenerateTableRows(). By default, the productivity tool will create the Table structure for you, what I needed to do was add multiple instances of TableRow objects to the Table object for my list items.&lt;/p&gt;&lt;p&gt;If you create a basic Word document as I did, and search through the code you'll see exactly how the Table object is being created. Based on the initial structure I had, the auto-generated code stub would create one row for me (the headers) which is great. I simply needed to refactor this code out into it's own method and call it multiple times, with each row being populated from each SPListItem. The end result of this is of course a document that looks something like this:&lt;/p&gt;&lt;a title="OpenXML5 by shaunocallaghan, on Flickr" href="http://www.flickr.com/photos/45824803@N07/4353362429/"&gt;&lt;img alt="OpenXML5" src="http://farm3.static.flickr.com/2708/4353362429_e5bed9dbd6.jpg" width="500" height="335" /&gt;&lt;/a&gt; &lt;p&gt;from a base SPList which may look something like this:&lt;/p&gt;&lt;a title="OpenXML4 by shaunocallaghan, on Flickr" href="http://www.flickr.com/photos/45824803@N07/4354110364/"&gt;&lt;img alt="OpenXML4" src="http://farm5.static.flickr.com/4009/4354110364_d6e4067886.jpg" width="500" height="335" /&gt;&lt;/a&gt; &lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Step 5. Package it up&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Exactly what you do here depends also depends upon your requirements. In my case I wrapped up these assemblies to be called from an external workflow, this could easily be a web part or some other SharePoint piece of functionality. Either way, you could quite easily call it in the following way:&lt;/p&gt;&lt;pre style="BORDER-BOTTOM: #999999 1px dashed; BORDER-LEFT: #999999 1px dashed; PADDING-BOTTOM: 5px; LINE-HEIGHT: 14px; BACKGROUND-COLOR: #eee; PADDING-LEFT: 5px; WIDTH: 100%; PADDING-RIGHT: 5px; FONT-FAMILY: Andale Mono, Lucida Console, Monaco, fixed, monospace; COLOR: #000000; FONT-SIZE: 12px; OVERFLOW: auto; BORDER-TOP: #999999 1px dashed; BORDER-RIGHT: #999999 1px dashed; PADDING-TOP: 5px"&gt;&lt;code&gt;        MyWordDoc generatedWordDoc = new MyWordDoc();&lt;br /&gt;&lt;br /&gt;                SPListItemCollection items = web.Lists["Links"].Items;&lt;br /&gt;&lt;br /&gt;                generatedWordDoc.CreatePackage("MyWordDoc.docx", items,&lt;br /&gt;                    "Shared Documents");&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;Until next time... happy SharePointing.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3289826069092511990-4784095165361319900?l=sharepointplace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharepointplace.blogspot.com/feeds/4784095165361319900/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sharepointplace.blogspot.com/2009/12/programmatically-creating-word.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/4784095165361319900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/4784095165361319900'/><link rel='alternate' type='text/html' href='http://sharepointplace.blogspot.com/2009/12/programmatically-creating-word.html' title='Programmatically creating Word documents in SharePoint with the OpenXML SDK'/><author><name>Shaun O'Callaghan</name><uri>http://www.blogger.com/profile/01457074098308559187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2708/4353362429_e5bed9dbd6_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3289826069092511990.post-8317822037686000208</id><published>2009-11-18T22:01:00.000Z</published><updated>2009-11-18T22:33:35.627Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='sharepoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><title type='text'>AllowInsecureTransport issue with SharePoint 2010 Public Beta Install</title><content type='html'>So, after the brouhaha regarding the public beta release of SharePoint 2010 it seems that installing the product is not straight forward when using Windows 7/Windows Server 2008 R2.&lt;br /&gt;&lt;br /&gt;There's an issue with WCF in .NET 3.5.1. where SharePoint relies on an attribute that isn't present, namely AllowInsecureTransport. You can simply remove this from the client.config files but this will break other services. There is talk of other work arounds but at the minute, the official advice if you want to run SharePoint 2010 Public Beta on Windows Server 2008 R2 is to wait for the official WCF Fix from Microsoft.&lt;br /&gt;&lt;br /&gt;When this is available, it can be downloaded from: &lt;a href="http://go.microsoft.com/fwlink/?LinkID=166231"&gt;KB976462&lt;/a&gt; at present this is not available.&lt;br /&gt;&lt;br /&gt;Note: There is a WCF Fix available for Windows Vista/Windows 2008 which &lt;strong&gt;will&lt;/strong&gt; fix this issue which is available from here &lt;a href="http://code.msdn.microsoft.com/KB971831"&gt;KB971831&lt;/a&gt; note that this fix is &lt;strong&gt;NOT&lt;/strong&gt; for Windows 7/Windows Server 2008 and if you attempt to install it you will receive the "This update is not applicable to your computer" error and the install will terminate.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3289826069092511990-8317822037686000208?l=sharepointplace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharepointplace.blogspot.com/feeds/8317822037686000208/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sharepointplace.blogspot.com/2009/11/allowinsecuretransport-issue-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/8317822037686000208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/8317822037686000208'/><link rel='alternate' type='text/html' href='http://sharepointplace.blogspot.com/2009/11/allowinsecuretransport-issue-with.html' title='AllowInsecureTransport issue with SharePoint 2010 Public Beta Install'/><author><name>Shaun O'Callaghan</name><uri>http://www.blogger.com/profile/01457074098308559187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3289826069092511990.post-4344251006370289591</id><published>2009-11-12T18:31:00.001Z</published><updated>2009-11-12T18:34:46.777Z</updated><title type='text'>Using the PortalSiteMapProvider to query data from large lists</title><content type='html'>Okay folks, one from the archives but certainly worth rediscovering.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=95450&amp;amp;clcid=0x409" mce_href="http://go.microsoft.com/fwlink/?LinkId=95450&amp;amp;clcid=0x409"&gt;Working with Large Lists in Office SharePoint Server 2007&lt;/a&gt; from Microsoft.  The performance metrics for querying large lists in SharePoint using the PortalSiteMapProvider object are quite impressive.  I often see customers wanting to manage large lists in SharePoint but hardly ever see implementations using the PortalSiteMapProvider.  Well worth a (re)read!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3289826069092511990-4344251006370289591?l=sharepointplace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharepointplace.blogspot.com/feeds/4344251006370289591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sharepointplace.blogspot.com/2009/11/using-portalsitemapprovider-to-query.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/4344251006370289591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/4344251006370289591'/><link rel='alternate' type='text/html' href='http://sharepointplace.blogspot.com/2009/11/using-portalsitemapprovider-to-query.html' title='Using the PortalSiteMapProvider to query data from large lists'/><author><name>Shaun O'Callaghan</name><uri>http://www.blogger.com/profile/01457074098308559187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3289826069092511990.post-5099186334666322122</id><published>2009-10-25T17:13:00.000Z</published><updated>2009-10-25T17:22:49.154Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='sharepoint 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='vhd'/><category scheme='http://www.blogger.com/atom/ns#' term='virtualisation'/><title type='text'>VHD Boot and Windows Server 2008 R2 for SharePoint 2010 Development</title><content type='html'>OK, I think I may have came to the party slightly late with VHD Boot.  It's one of those things that I've been meaning to look at for quite a while but never got around to.  The performance hit that my VM took when running SharePoint 2010 on Windows Server 2008 inside VMWare/Sun VirtualBox served as something of a catalyst.&lt;br /&gt;&lt;br /&gt;Simply put, VHD Boot allows you to boot from a VHD running Windows 7/Windows Server 2008 R2 operating system natively.  My base setup is a Dell Latitude D630 with 4GB RAM running Windows 7 as the host OS.  The steps I took were as follows:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Booted from a Windows Server 2008 R2 CD&lt;/li&gt;&lt;li&gt;Chose the "Repair my Computer" option&lt;/li&gt;&lt;li&gt;Opened &lt;strong&gt;diskpart&lt;/strong&gt; from the command prompt&lt;/li&gt;&lt;li&gt;Created and mounted a new VHD file on my &lt;strong&gt;local&lt;/strong&gt; disk, note: not an external USB drive, by doing the following:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;create vdisk file="d:\vhdboot\sp2010.vhd" type=expandable maximum=40960&lt;br /&gt;&lt;br /&gt;select vdisk="d:\vhdboot\sp2010.vhd"&lt;br /&gt;&lt;br /&gt;attach vdisk&lt;br /&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;I then closed the command prompt window, closed the repair options and went back to setup&lt;/li&gt;&lt;li&gt;The newly created drive was available as a resource to install to&lt;/li&gt;&lt;li&gt;Install Windows Server 2008 R2 as usual&lt;/li&gt;&lt;li&gt;Your boot menu will now have Windows Server 2008 R2 available as a bootable resource&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Enjoy all&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3289826069092511990-5099186334666322122?l=sharepointplace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharepointplace.blogspot.com/feeds/5099186334666322122/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sharepointplace.blogspot.com/2009/10/vhd-boot-and-windows-server-2008-r2-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/5099186334666322122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/5099186334666322122'/><link rel='alternate' type='text/html' href='http://sharepointplace.blogspot.com/2009/10/vhd-boot-and-windows-server-2008-r2-for.html' title='VHD Boot and Windows Server 2008 R2 for SharePoint 2010 Development'/><author><name>Shaun O'Callaghan</name><uri>http://www.blogger.com/profile/01457074098308559187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3289826069092511990.post-2853673382902958127</id><published>2009-08-15T22:25:00.001+01:00</published><updated>2009-08-16T19:42:30.690+01:00</updated><title type='text'>Extending Enterprise Search: Programmatically creating Keywords and Best Bets from existing business data</title><content type='html'>&lt;span xmlns=""&gt;I've been working with a number of customers lately on strategies to increase the value that enterprise search delivers to their users. I'm interested in "quick wins" with SharePoint: Low cost, high visibility solutions that increase user adoption and add real value to a customer's implementation. I recently had a conversation with some members of the SharePoint community who said that Enterprise Search was a good example of a quick win. I disagree strongly on this point. Simply enabling search within SharePoint will not, in my experience, enhance user adoption or deliver an intuitive and helpful user experience. The implementation of enterprise search is an iterative process of plan, design, implement and review. The correct implementation of keywords, best bets, scopes, managed properties and any number of customisations make search work in an individual environment but it is close to impossible to get enterprise search working optimally first time around. Today I'm going to talk about keywords and best bets and why there is value in creating these programmatically.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:9;"&gt;N.B. for examples of how to achieve this programmatically, please see Stefan Goßner's blog post listed in the references at the end of this article.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Keywords and Best Bets&lt;br /&gt;&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Keywords provide a way to supplement search results to deliver a context specific definition for a specific search term. Best bets provide a way to add URLs to these keywords that point to where the user is &lt;em&gt;most likely&lt;/em&gt; going to want to go to find the information, given their original search term. The screenshot below shows Keywords and Best Bets in action.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;a href="http://1.bp.blogspot.com/_vziqHKIbS1s/Soc6jIwzPcI/AAAAAAAAAA0/MFQYdrMsSYI/s1600-h/Bb905371_66c89e1a-3ea4-40dc-a9a3-3036921926a8(en-us,office_12).gif"&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; WIDTH: 398px; FLOAT: left; HEIGHT: 185px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5370325455984606658" border="0" alt="" src="http://1.bp.blogspot.com/_vziqHKIbS1s/Soc6jIwzPcI/AAAAAAAAAA0/MFQYdrMsSYI/s320/Bb905371_66c89e1a-3ea4-40dc-a9a3-3036921926a8(en-us,office_12).gif" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:8;"&gt;&lt;em&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:8;"&gt;&lt;em&gt;Figure 1: Keywords and Best Bets in action&lt;br /&gt;&lt;/p&gt;&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Why create them programmatically?&lt;br /&gt;&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The reason to create keywords and best bets programmatically is to increase the value of enterprise search by supplementing search results with information the user is likely to want to know from information that &lt;strong&gt;already exists&lt;/strong&gt; within the business – and there may be a large number of these! This point is worth examining a little further. SharePoint delivers true enterprise search capable of connecting to a number of different types of data sources. In practice every data store in the business is hardly ever indexed by SharePoint, so there is nearly always a gap between what the business knows and what SharePoint knows.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Exactly what keywords and best bets you will need to create will of course depend upon what data you have and whether that is already indexed by SharePoint. One good example is to create keywords of all customers from a CRM system, An internal user then can search for "Customer ABC" and be immediately presented with the customer's name (Keyword), the customer contact details (Keyword Description) and a link to the customer BDC profile page or some other location within SharePoint. The ability to make enterprise search ubiquitous in SharePoint means that users can tap in a customer name from anywhere in SharePoint and immediately get important contact information and links to additional information about the entity.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;This is one example and the real value is how this works in individual scenarios with real data. The important "take home" point is that we should think about how we can use keywords and best bets to enhance the user experience with information we already have available. This information may reside within SharePoint already, it may exist in the SharePoint index via BDC crawls or it may exist completely outside of SharePoint altogether. Wherever it exists the important thing is that we make best use of it to extend enterprise search functionality and enhance the user experience.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;References&lt;br /&gt;&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Stefan Goßner: How To: create Keywords and Best Bets for MOSS Search programmatically&lt;br /&gt;(&lt;a href="http://blogs.technet.com/stefan_gossner/archive/2007/03/28/how-to-create-keywords-and-best-bets-for-moss-search-programmatically.aspx"&gt;http://blogs.technet.com/stefan_gossner/archive/2007/03/28/how-to-create-keywords-and-best-bets-for-moss-search-programmatically.aspx&lt;/a&gt;)&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Figure 1 Image sourced from &lt;a href="http://technet.microsoft.com/en-us/library/bb905371.aspx"&gt;http://technet.microsoft.com/en-us/library/bb905371.aspx&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3289826069092511990-2853673382902958127?l=sharepointplace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharepointplace.blogspot.com/feeds/2853673382902958127/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sharepointplace.blogspot.com/2009/08/extending-enterprise-search.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/2853673382902958127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/2853673382902958127'/><link rel='alternate' type='text/html' href='http://sharepointplace.blogspot.com/2009/08/extending-enterprise-search.html' title='Extending Enterprise Search: Programmatically creating Keywords and Best Bets from existing business data'/><author><name>Shaun O'Callaghan</name><uri>http://www.blogger.com/profile/01457074098308559187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_vziqHKIbS1s/Soc6jIwzPcI/AAAAAAAAAA0/MFQYdrMsSYI/s72-c/Bb905371_66c89e1a-3ea4-40dc-a9a3-3036921926a8(en-us,office_12).gif' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3289826069092511990.post-5915228365709364649</id><published>2009-08-08T17:44:00.001+01:00</published><updated>2009-08-08T17:44:54.130+01:00</updated><title type='text'>Finally...</title><content type='html'>&lt;span xmlns=''&gt;&lt;p&gt;Blogging is something that I've played around with a few times in the past, and never really followed through on.  The principal reason for this is that there has never really been a focus.  Well, all that is to change!&lt;br /&gt;&lt;/p&gt;&lt;p&gt;As some of you may, or may not know, I'm a Microsoft SharePoint consultant working for a leading Gold Partner in the UK.  The work I undertake with customers ranges from helping them develop a business case for SharePoint, through to infrastructure/health-check work and development.  The emphasis of the development work I'm currently involved in is around Enterprise Search and general WCM and Publishing.  Naturally, there are a lot of things that I see during my time working with customers where I think "you know... I think some other folks really would be interested in that".  This blog will serve as a place for recording them in the hope they may help others.  More soon...&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3289826069092511990-5915228365709364649?l=sharepointplace.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharepointplace.blogspot.com/feeds/5915228365709364649/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://sharepointplace.blogspot.com/2009/08/finally.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/5915228365709364649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3289826069092511990/posts/default/5915228365709364649'/><link rel='alternate' type='text/html' href='http://sharepointplace.blogspot.com/2009/08/finally.html' title='Finally...'/><author><name>Shaun O'Callaghan</name><uri>http://www.blogger.com/profile/01457074098308559187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
