<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:thr="http://purl.org/syndication/thread/1.0">
    <title>Avanade ASG SharePoint Team Blog</title>
    
    
    <link rel="alternate" type="text/html" href="http://www.avanadeblog.com/sharepointasg/" />
    <id>tag:typepad.com,2003:weblog-86836276636718860</id>
    <updated>2012-05-18T09:23:57-07:00</updated>
    
    <generator uri="http://www.typepad.com/">TypePad</generator>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/AvanadeSharePointASG" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="avanadesharepointasg" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://hubbub.api.typepad.com/" /><entry>
        <title>Displaying Enterprise Keywords in a Tag Cloud Web Part</title>
        <link rel="alternate" type="text/html" href="http://www.avanadeblog.com/sharepointasg/2012/05/displaying-enterprise-keywords-in-a-tag-cloud-web-part.html" />
        <link rel="replies" type="text/html" href="http://www.avanadeblog.com/sharepointasg/2012/05/displaying-enterprise-keywords-in-a-tag-cloud-web-part.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-6a0120a757f751970b016765ee42cd970b</id>
        <published>2012-05-18T09:23:57-07:00</published>
        <updated>2012-05-18T09:28:06-07:00</updated>
        <summary>The Managed Metadata Service in SharePoint 2010 includes enterprise keywords. This is a column that can be added to content types, lists and document libraries. It allows users to add user-defined keywords to items. Social tags also allow users to tag content, but they are not exactly the same as...</summary>
        <author>
            <name>Avanade Blog</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="Customization" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="Metadata" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="SharePoint 2010" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="Social Media" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="Tagging" />
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.avanadeblog.com/sharepointasg/"><div xmlns="http://www.w3.org/1999/xhtml"><p>The Managed Metadata Service in SharePoint 2010 includes enterprise keywords. This is a column that can be added to content types, lists and document libraries. It allows users to add user-defined keywords to items.</p>
<p>Social tags also allow users to tag content, but they are not exactly the same as enterprise keywords in SharePoint. For example only social tags are displayed on a user’s MySite.<br />The tag cloud web part can only display social tags. In order to also display enterprise keywords in a tag cloud web part, they have to be saved as social tags. SharePoint includes a setting to also save the entered enterprise keywords as social tags. Curiously, this setting is only available to document libraries, not to other lists. For a document library this settings is available at the following location: <br />Library Settings -&gt; Enterprise Metadata and Keywords Settings -&gt; mark the second checkbox “Save metadata on this list as social tags ”.</p>
<p><a class="asset-img-link" style="display: inline;" href="http://www.avanadeblog.com/.a/6a0120a757f751970b016765ee41e1970b-pi"><img class="asset  asset-image at-xid-6a0120a757f751970b016765ee41e1970b" title="Save_as_social_tag" src="http://www.avanadeblog.com/.a/6a0120a757f751970b016765ee41e1970b-500wi" alt="Save_as_social_tag" /></a></p>
<p>In conclusion, only enterprise keywords from document libraries can be displayed in the tag cloud web part. Unfortunately this does not work for enterprise keywords from lists.</p>
<hr />
<table border="0" cellspacing="0" cellpadding="2" width="600">
<tbody>
<tr>
<td width="130" valign="top"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="MarkusKoebberling" src="http://www.avanadeblog.com/.a/6a0120a757f751970b0168eaf09fb2970c-120wi" border="0" alt="MarkusKoebberling" width="64" height="83" /><br /></td>
<td width="400" valign="top">Created by Markus Köbberling</td>
</tr>
</tbody>
</table><xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/AvanadeSharePointASG/~4/SwMJ5J5ZaFY" height="1" width="1" /></div></content>



    </entry>
    <entry>
        <title>SharePoint 2010 install with PowerShell and pre-created databases</title>
        <link rel="alternate" type="text/html" href="http://www.avanadeblog.com/sharepointasg/2012/04/sharepoint-2010-install-with-powershell-and-pre-created-databases.html" />
        <link rel="replies" type="text/html" href="http://www.avanadeblog.com/sharepointasg/2012/04/sharepoint-2010-install-with-powershell-and-pre-created-databases.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-6a0120a757f751970b0168ea1a511c970c</id>
        <published>2012-04-14T05:07:07-07:00</published>
        <updated>2012-04-14T05:04:06-07:00</updated>
        <summary>Depending on your requirements it often makes sense to install SharePoint on pre-created databases. On the one hand you might want to separate DB and SharePoint administrators. On the other hand you might want to adjust initial and growing sizes of your database. The Technet article describing that scenario unfortunately...</summary>
        <author>
            <name>Avanade Blog</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="PowerShell" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="SharePoint 2010" />
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.avanadeblog.com/sharepointasg/"><div xmlns="http://www.w3.org/1999/xhtml"><div>
<div>
<p>Depending on your requirements it often makes sense to install SharePoint on pre-created databases. On the one hand you might want to separate DB and SharePoint administrators. On the other hand you might want to adjust initial and growing sizes of your database. The <a href="http://technet.microsoft.com/en-us/library/cc262869.aspx">Technet article</a> describing that scenario unfortunately does not cover some major service applications and also does not talk about two ones where right now this is just not possible. So follow me on a quick way to install SharePoint and some of its major service applications mostly on pre-created databases.</p>
<p>The first steps you need to do and I don't want to explain here are:</p>
<ul>
<li>Install your supported and desired 64bit operating system including its latest software updates </li>
<li>Install SQL server 2008 including its latest software updates </li>
<li>Install SharePoint 2010 prerequisites on any SharePoint server in your farm </li>
<li>Install SharePoint 2010 prerequisites on any SharePoint server in your farm </li>
<li>Do NOT run the configuration wizard so far </li>
</ul>
<p>The first thing your new farm needs, is a farm configuration and a central administration. Usually the configuration wizard, running the first time in your farm, does this for you. But doing so, you are only able to enter the database name of the farm configuration database. The content database for the central administration cannot be named so you also cannot use any existing pre-created one doing this way.</p>
<p>What you need is, create the farm configuration and central administration by using PowerShell commands:</p>
<p><span style="font-family: courier new,courier;">New-SPConfigurationDatabase -DatabaseName "[SP_Farm_Config_DB]" -DatabaseServer "[Database_Server]" -Passphrase (ConvertTo-SecureString "[Passphrase_for_Farm]" -AsPlainText -force) -FarmCredentials (Get-Credential) -AdministrationContentDatabaseName "[Central_Admin_Content_DB]"</span></p>
<p>We have several placeholders/parameters here:<br />First of all the [Database_Server] holding our databases. Second we have two databases [SP_Farm_Config_DB] and [Central_Admin_Content_DB]. If both databases are already pre-created in a correct way they will be filled with the necessary schema. If they don't exist, they will be created. Apart from two exceptions any of the following PowerShell commands containing a DBName parameter work this way. Additionally you need a passphrase securing the farm and the FarmCredentials requested by a login window forced by the Get-Credential function. Enter the credentials the farm shall run with.<br />So what to do to pre-create our databases? Well, you just need to go to your SQL server create a database with the following parameters:</p>
<ul>
<li>A name of your choice (your chance to avoid the GUIDs with in the names, usually used by SharePoint OOTB) </li>
<li>The collation LATIN1_General_CI_AS_KS_WS is always required </li>
<li>The setup account running the installation needs DBO to every database </li>
<li>Initial size </li>
<li>Scale up / Limit </li>
<li>Recovery model </li>
</ul>
<p>For the latter parameters you can have a look at the following <a href="http://technet.microsoft.com/en-us/library/cc678868.aspx">Technet article</a> for more detailed description.</p>
<p>Having executed the PowerShell cmdlet above you can run the configuration wizard on any server in your farm. On the first server (where you ran your cmdlet) nothing else has to be specified. On additional servers you must attach them to the farm by selecting [Database_Server] and [SP_Farm_Config_DB].</p>
<p>The next thing you should configure is the Health &amp; Analysis service. This can be done by the following PowerShell cmdlet:</p>
<p><span style="font-family: courier new,courier;">New-SPUsageApplication -Name "[Usage_App_Name]" -DatabaseServer "[Database_Server]" -DatabaseName "[Health_Usage_DB]"</span></p>
<p><span style="font-family: courier new,courier;">$Usage = Get-SPServiceApplicationProxy | where {$_.TypeName -eq "Usage and Health Data Collection Proxy"}</span></p>
<p><span style="font-family: courier new,courier;">$Usage.provision()</span></p>
<p>Additionally (DB server and –name nothing really new) we only have a name here for the service application [Usage_App_Name].</p>
<p>But when we run this cmdlet against a pre-created database, we will receive an error that the "database already exist".</p>
<p>This is one of 2 scenarios where we cannot use a pre-created database. Search is the second one. This might be a bug as mentioned <a href="http://blogs.msdn.com/b/alimaz/archive/2010/08/04/provisioning-search-and-state-service-applications-using-dba-created-database-method.aspx">here</a>.</p>
<p>Next we want to create a first WebApplication for our content. We use the following command:</p>
<p><span style="font-family: courier new,courier;">New-SPWebApplication -Name "[WebApp Name]" -Port 80 -Url "[WebApp URL]" -ApplicationPool "<em>SharePoint - 80</em>" -ApplicationPoolAccount (Get-SPManagedAccount "[WebApp Account]") -DatabaseName "[WebApp DB]" -DatabaseServer "[Database_Server]"</span></p>
<p>New placeholders in this command are [WebApp Name] which is simply the name of the WebApplication as you see later in Central Administration or by listing with Get-SPWebApplication, <br />[WebApp URL] which is simply the URL for the WebApplication to be created and [WebApp DB] which is the (pre-created) content database.<br />Furthermore we have a [WebApp Account]. This must be a managed account which you already have or have to create in advance, by New-SPManagedAccount for instance. This time we assume you already have one and replace the parameter with "<em>Domain\Username"</em>. Another option within a whole script could be to create (and instantiate) a new managed account and to reuse the instance.</p>
<p>Additionally we can create a (first) SiteCollection:</p>
<p><span style="font-family: courier new,courier;">New-SPSite [SiteURL] -OwnerAlias "[Site Owner]"</span></p>
<p>This is the simple form of the New-SPSite command. We only use the URL [SiteURL] of the SiteCollection to be created and an owner [Site Owner] in the form "<em>Domain\Username"</em>.<br />For further options refer to the <a href="http://technet.microsoft.com/de-de/library/ff607937.aspx">syntax of New-SPSite</a>.</p>
<p>Next (if required) we want to create a UserProfile Synchronization. Therefore we have to create a Service Application:</p>
<p><span style="font-family: courier new,courier;">$AppPool = Get-SPServiceApplicationPool "SharePoint Web Services System"</span><br /><span style="font-family: courier new,courier;">$ServiceApp = New-SPProfileServiceApplication -ApplicationPool $AppPool -Name "[SPProfile Name]" -MySiteHostLocation "[SPProfile SiteURL]" -ProfileDBName "[SPProfile DB]" -ProfileSyncDBName "[SPProfile SyncDB]" -SocialDBName "[SPProfile SocialDB]"</span><br /><span style="font-family: courier new,courier;">New-SPProfileServiceApplicationProxy -ServiceApplication $ServiceApp -Name "[SPProfile ProxyName]"</span></p>
<p>First we use an existing AppPool "SharePoint Web Services System". In the next line we create a SPProfileServiceApplication with a name ([SPProfile Name]), the URL of an (already created) SiteCollection ([SPProfile SiteURL]), three database names ([SPProfile DB], [SPProfile SyncDB], [SPProfile SocialDB])<br />In the last line we create a necessary proxy for that application.<br />Finally we have to start the User Profile Service, start the User Profile Synchronization Service and make an IISReset to get the User Profile Synchronization working.</p>
<p>The next step (if required) is to create a Managed Metadata Service</p>
<p><span style="font-family: courier new,courier;">$AppPool = New-SPServiceApplicationPool -Name "[MetaData Application Pool]" –Account [Metadata Managed Account]</span></p>
<p><span style="font-family: courier new,courier;">$MetaDataServiceApp = New-SPMetadataServiceApplication -ApplicationPool $AppPool -Name "[Metadata Service Name]" -DatabaseName "[Metadata_DB]" -DatabaseServer "[Database_Server]"</span></p>
<p><span style="font-family: courier new,courier;">New-SPMetadataServiceApplicationProxy -Name "[Metadata Service App Proxy Name]" -ServiceApplication $MetaDataServiceApp -DefaultProxyGroup</span></p>
<p>The procedure (and parameters) is quite similar to that one creating the User Profile Synchronaization Service.</p>
<p>What I will not show you here is how you can configure your Search this way.</p>
<p>This is for two reasons: First, as I mentioned above, it does not work with a pre-created database and second there are so many options to discuss which requires an own blog post (series). Let me only metion the majpr decision if to use SharePoint Enterprise Search or FAST for SharePoint.</p>
<p>But the first mentioned <a href="http://technet.microsoft.com/en-us/library/cc262869.aspx">Technet Link</a> already shows an example.</p>
<p>I assume you are (latest by) now familiar with installing SharePoint using PowerShell and think about the option to pre-create your databases.<br />You should assemble the most often used commands in your own scenarios within a complete script to have it available any time you need and then you just need to replace your placeholders (names, URLs, users, …)</p>
</div>
</div>
<hr />
<table border="0" cellspacing="0" cellpadding="2" width="600">
<tbody>
<tr>
<td width="130" valign="top"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="MarkusMoeller" src="http://www.avanadeblog.com/.a/6a0120a757f751970b01538fa14e13970b-pi" border="0" alt="MarkusMoeller" width="64" height="83" /></td>
<td width="400" valign="top">Created by Markus Möller</td>
</tr>
</tbody>
</table><xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/AvanadeSharePointASG/~4/eQIYDChfgs4" height="1" width="1" /></div></content>



    </entry>
    <entry>
        <title>Client Object Model – Changing existing list views</title>
        <link rel="alternate" type="text/html" href="http://www.avanadeblog.com/sharepointasg/2012/03/client-object-model-changing-list-views.html" />
        <link rel="replies" type="text/html" href="http://www.avanadeblog.com/sharepointasg/2012/03/client-object-model-changing-list-views.html" thr:count="1" thr:updated="2012-04-03T21:27:48-07:00" />
        <id>tag:typepad.com,2003:post-6a0120a757f751970b0163032d092f970d</id>
        <published>2012-03-23T03:31:48-07:00</published>
        <updated>2012-03-23T03:30:12-07:00</updated>
        <summary>Introduction Before you start reading you need to be familiar using the Client Objet Model with JavaScript. If not, please refer to the posts by Patric Much: -- Reading list items -- Adding a list item -- Editing and deleting a list item -- Checking a user's lists permission If...</summary>
        <author>
            <name>Avanade Blog</name>
        </author>
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.avanadeblog.com/sharepointasg/"><div xmlns="http://www.w3.org/1999/xhtml"><h4><strong>Introduction</strong></h4>
<p>Before you start reading you need to be familiar using the Client Objet Model with JavaScript. If not, please refer to the posts by Patric Much:</p>
<p>-- <a href="http://www.avanadeblog.com/sharepointasg/2011/05/client-object-model-introduction-part-1-reading-list-items.html">Reading list items</a></p>
<p>-- <a href="http://www.avanadeblog.com/sharepointasg/2011/05/client-object-model-introduction-part-2-adding-a-list-item.html">Adding a list item</a></p>
<p>-- <a href="http://www.avanadeblog.com/sharepointasg/2011/06/client-object-model-introduction-part-3-editing-and-deleting-a-list-item.html">Editing and deleting a list item</a></p>
<p>-- <a href="http://www.avanadeblog.com/sharepointasg/2011/08/client-object-model-introduction-part-4-checking-a-users-list-permissions.html">Checking a user's lists permission</a></p>
<p>If you would like to know how to create a view with the Client Object Model, please refer to my last post on COM:</p>
<p><a href="http://www.avanadeblog.com/sharepointasg/2012/03/client-object-model-creating-list-views.html" target="_self" title="Client Object Model – Creating list views">Client Object Model – Creating list views</a></p>
<h4><strong>Overview</strong></h4>
<p>This post will describe how to change an existing list view. The code will show how to load the existing view and how to change its query. Additionally the sample will show how to overwrite the current query with a new one.</p>
<h4><strong>Preparing the list with the content web part</strong></h4>
<p>As in the last sample we will use a simple custom list with the default title column and some test items.</p>
<p>Add a content webpart to the list view and open the HTML view to insert the code.</p>
<h4><strong>Code Sample</strong></h4>
<p>Add a hyperlink to the HTML to call your JavaScript:</p>
<p><a class="asset-img-link" href="http://www.avanadeblog.com/.a/6a0120a757f751970b01676421fbcb970b-pi" style="display: inline;"><img alt="081911_0758_ClientObjec1" class="asset  asset-image at-xid-6a0120a757f751970b01676421fbcb970b" src="http://www.avanadeblog.com/.a/6a0120a757f751970b01676421fbcb970b-500wi" title="081911_0758_ClientObjec1" /></a></p>
<p><span style="font-family: consolas; font-size: 9pt;">&lt;a href=<span style="color: maroon;">"javascript:loadViewAndChangeIfExists()"</span>&gt;Change View&lt;/a&gt;&lt;script type=<span style="color: maroon;">"text/javascript"</span>&gt; </span></p>
<p>As you can see, it will call a JavaScript function named "loadViewAndChangeIfExists".</p>
<p>In the next step we will append the code. What exactly the code does is described as comments:</p>
<p><span style="font-family: consolas; font-size: 9pt;">&lt;script type=<span style="color: maroon;">"text/javascript"</span>&gt; </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//declare a variable for the exisitng view</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: blue;">var</span> existingview; </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: blue;">function</span> loadViewAndChangeIfExists() </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">{ </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//get the current client context</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">clientContext = <span style="color: blue;">new</span> SP.ClientContext.get_current(); </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//if the client context exists - proceed</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: blue;">if</span> (clientContext != undefined &amp;&amp; clientContext != <span style="color: blue;">null</span>) { </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//get the current web</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: blue;">var</span> web = clientContext.get_web(); </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//get all lists </span></span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: blue;">var</span> listCollection = web.get_lists(); </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//get te current list by name - alternative use getById(guid)</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: blue;">var</span> list = listCollection.getByTitle(<span style="color: maroon;">"COM"</span>); </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//get all current views of the list</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: blue;">var</span> viewcollection = list.get_views(); </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//get the view that you will change</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: blue;">this</span>.existingview = viewcollection.getByTitle(<span style="color: maroon;">"MYVIEW"</span>); </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//load your existing view and execute async</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">clientContext.load(existingview); </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//the asynchronous execution will try to load the existing view</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//if the view does not exist - it will call onQueryFailed - else it will call changeView</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">clientContext.executeQueryAsync(Function.createDelegate(<span style="color: blue;">this</span>, <span style="color: blue;">this</span>.changeView), Function.createDelegate(<span style="color: blue;">this</span>, <span style="color: blue;">this</span>.onQueryFailed)); </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">} </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">} </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: blue;">function</span> changeView() { </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//the varible existingview is now loaded with your view</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//get the current CAML query</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: blue;">var</span> existingquery = existingview.get_viewQuery(); </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//do somnething with the exisitng query here </span></span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//...</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//reset the query (as sample)</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">existingquery = <span style="color: maroon;">"&lt;Where&gt;&lt;In&gt;&lt;FieldRef Name=\"ID\" /&gt;&lt;Values&gt;"</span>; </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//add a CAML filter with the current selected items</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: blue;">var</span> selectedItems = SP.ListOperation.Selection.getSelectedItems(); </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: blue;">var</span> i; </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: blue;">for</span> (i <span style="color: blue;">in</span> selectedItems) { </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">existingquery += <span style="color: maroon;">"&lt;Value Type=\"Counter\"&gt;"</span> + selectedItems[i].id + <span style="color: maroon;">"&lt;/Value&gt;"</span>; <span style="color: darkgreen;">//add </span></span></p>
<p><span style="font-family: consolas; font-size: 9pt;">} </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//close the CAML XML</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">existingquery += <span style="color: maroon;">"&lt;/Values&gt;&lt;/In&gt;&lt;/Where&gt;"</span>; </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//assocciate the existing view with the changed query </span></span></p>
<p><span style="font-family: consolas; font-size: 9pt;">existingview.set_viewQuery(existingquery); </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//update the view!!!</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">existingview.update(); </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//execute the statements async - onQuerySucceeded for success - onQueryFailed for errors</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">clientContext.executeQueryAsync(Function.createDelegate(<span style="color: blue;">this</span>, <span style="color: blue;">this</span>.onQuerySucceeded), Function.createDelegate(<span style="color: blue;">this</span>, <span style="color: blue;">this</span>.onQueryFailed)); </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">} </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: blue;">function</span> onQueryFailed(sender, args) { </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//show error message ()stacktrace</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">alert(<span style="color: maroon;">'Request failed. '</span> + args.get_message() + <span style="color: maroon;">'\n'</span> + args.get_stackTrace()); </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">} </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: blue;">function</span> onQuerySucceeded() { </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//show successful message</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">alert(<span style="color: maroon;">'View successfully changed!'</span>); </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">} </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">&lt;/script&gt; </span></p>
<p>Save and close the content of the content editor webpart and stop editing the page. Your listview should now look something like this:</p>
<p><a class="asset-img-link" href="http://www.avanadeblog.com/.a/6a0120a757f751970b01676421ff0d970b-pi" style="display: inline;"><img alt="081911_0758_ClientObjec2" class="asset  asset-image at-xid-6a0120a757f751970b01676421ff0d970b" src="http://www.avanadeblog.com/.a/6a0120a757f751970b01676421ff0d970b-500wi" title="081911_0758_ClientObjec2" /></a></p>
<h4><strong>Testing the functionality</strong></h4>
<p>To test the functionality, select a few list items and click on "Change View".</p>
<p><a class="asset-img-link" href="http://www.avanadeblog.com/.a/6a0120a757f751970b01676422004c970b-pi" style="display: inline;"><img alt="081911_0758_ClientObjec3" class="asset  asset-image at-xid-6a0120a757f751970b01676422004c970b" src="http://www.avanadeblog.com/.a/6a0120a757f751970b01676422004c970b-500wi" title="081911_0758_ClientObjec3" /></a></p>
<p>If nothing went wrong, you should now receive the message "View successfully changed!".</p>
<p><a class="asset-img-link" href="http://www.avanadeblog.com/.a/6a0120a757f751970b0168e922d96f970c-pi" style="display: inline;"><img alt="081911_0758_ClientObjec4" class="asset  asset-image at-xid-6a0120a757f751970b0168e922d96f970c" src="http://www.avanadeblog.com/.a/6a0120a757f751970b0168e922d96f970c-500wi" title="081911_0758_ClientObjec4" /></a></p>
<p>Switch to the "List" tab and check if your view really exists. It should contain all items you have selected before you pressed the link "Change View":</p>
<p><a class="asset-img-link" href="http://www.avanadeblog.com/.a/6a0120a757f751970b016764220173970b-pi" style="display: inline;"><img alt="081911_0758_ClientObjec5" class="asset  asset-image at-xid-6a0120a757f751970b016764220173970b" src="http://www.avanadeblog.com/.a/6a0120a757f751970b016764220173970b-500wi" title="081911_0758_ClientObjec5" /></a></p>
<p><strong>Result Realized!</strong></p>
<hr />
<table border="0" cellpadding="2" cellspacing="0" width="600">
<tbody>
<tr>
<td valign="top" width="130"><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b0154385f1efd970c-pi"><img alt="MatthiasGlatz" border="0" height="73" src="http://www.avanadeblog.com/.a/6a0120a757f751970b0162fde1061c970d-pi" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="MatthiasGlatz" width="73" /></a></td>
<td valign="top" width="400">Created by Matthias Glatz</td>
</tr>
</tbody>
</table><xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/AvanadeSharePointASG/~4/q6vKa5DRzJo" height="1" width="1" /></div></content>



    </entry>
    <entry>
        <title>Client Object Model – Creating list views</title>
        <link rel="alternate" type="text/html" href="http://www.avanadeblog.com/sharepointasg/2012/03/client-object-model-creating-list-views.html" />
        <link rel="replies" type="text/html" href="http://www.avanadeblog.com/sharepointasg/2012/03/client-object-model-creating-list-views.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-6a0120a757f751970b016302abf3d6970d</id>
        <published>2012-03-10T03:42:59-08:00</published>
        <updated>2012-03-23T03:32:42-07:00</updated>
        <summary>Introduction Before you start reading you need to be familiar using the Client Objet Model with JavaScript. If not, please refer to the posts by Patric Much: -- Reading list items -- Adding a list item -- Editing and deleting a list item -- Checking a user's lists permission See...</summary>
        <author>
            <name>Avanade Blog</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="ClientOM" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="Code" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="SharePoint 2010" />
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.avanadeblog.com/sharepointasg/"><div xmlns="http://www.w3.org/1999/xhtml"><div>
<div>
<h4><strong>Introduction</strong></h4>
<p>Before you start reading you need to be familiar using the Client Objet Model with JavaScript. If not, please refer to the posts by Patric Much:</p>
<p>-- <a href="http://www.avanadeblog.com/sharepointasg/2011/05/client-object-model-introduction-part-1-reading-list-items.html">Reading list items</a></p>
<p>-- <a href="http://www.avanadeblog.com/sharepointasg/2011/05/client-object-model-introduction-part-2-adding-a-list-item.html">Adding a list item</a></p>
<p>-- <a href="http://www.avanadeblog.com/sharepointasg/2011/06/client-object-model-introduction-part-3-editing-and-deleting-a-list-item.html">Editing and deleting a list item</a></p>
<p>-- <a href="http://www.avanadeblog.com/sharepointasg/2011/08/client-object-model-introduction-part-4-checking-a-users-list-permissions.html">Checking a user's lists permission</a></p>
<p>See also the Client Object Model reference for JavaScript on MSDN:</p>
<p><a href="http://msdn.microsoft.com/en-us/library/hh185006.aspx">http://msdn.microsoft.com/en-us/library/hh185006.aspx</a></p>
<h4><strong>Overview</strong></h4>
<p>This post will describe how to create a list view based on a CAML query. The code will show how to declare personal and public views. Additionally a sample will show how you can create a CAML query with JavaScript based on the selected list items.</p>
<h4><strong>Preparing the list with the content web part</strong></h4>
<p>In this example we will use a simple custom list with the default title column but it will also work with complex lists. For this example I just added some test items.</p>
<p>To prepare the content webpart, navigate to the list and open the all items view. Edit the page and add a content webpart. This webpart will be used to host the source code (like the previous samples of Patric). Go to the webpart content configuration and open the HTML view. This is where the code will be added.</p>
<p><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b016302ae0ec3970d-pi" style="display: inline;" /><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b0168e8a39a66970c-pi" style="display: inline;"><img alt="081911_0716_ClientObjec1" class="asset  asset-image at-xid-6a0120a757f751970b0168e8a39a66970c" src="http://www.avanadeblog.com/.a/6a0120a757f751970b0168e8a39a66970c-500wi" title="081911_0716_ClientObjec1" /></a><br /><br /></p>
<h4><strong>Code Sample</strong></h4>
<p>First we need to add a hyperlink to call our JavaScript which will look like this:</p>
<p><span style="font-family: consolas; font-size: 9pt;">&lt;a href=<span style="color: maroon;">"javascript:CreateView()"</span>&gt;Create View&lt;/a&gt;&lt;script type=<span style="color: maroon;">"text/javascript"</span>&gt; </span></p>
<p>As you can see, it will call a JavaScript function named "CreateView". Append the following snipped behind the hyperlink to add the JavaScript code:</p>
<p><span style="font-family: consolas; font-size: 9pt;">&lt;script type=<span style="color: maroon;">"text/javascript"</span>&gt; </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: blue;">function</span> CreateView() </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">{ </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//creating the client context</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: blue;">var</span> clientContext = <span style="color: blue;">new</span> SP.ClientContext.get_current(); </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: blue;">if</span> (clientContext != undefined &amp;&amp; clientContext != <span style="color: blue;">null</span>) { </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//get the current web</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: blue;">var</span> web = clientContext.get_web(); </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//get all lists</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: blue;">var</span> listCollection = web.get_lists(); </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//get my demo list by name "COM" - alternative use getById(guid)</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: blue;">var</span> list = listCollection.getByTitle(<span style="color: maroon;">'COM'</span>); </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//get the view collection to add the view</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: blue;">var</span> viewcollection = list.get_views(); </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//create a viewinfo with the view properties</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: blue;">var</span> viewInfo = <span style="color: blue;">new</span> SP.ViewCreationInformation(); </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">viewInfo.set_title(<span style="color: maroon;">"MYVIEW"</span>); <span style="color: darkgreen;">//set the title</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">viewInfo.set_personalView(<span style="color: blue;">true</span>); <span style="color: darkgreen;">//set the view personal </span></span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//creating the CAML query by unsing "IN"</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: blue;">var</span> query = <span style="color: maroon;">"&lt;Where&gt;&lt;In&gt;&lt;FieldRef Name=\"ID\" /&gt;&lt;Values&gt;"</span>; </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//get all items selected in the UI</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: blue;">var</span> selectedItems = SP.ListOperation.Selection.getSelectedItems(); </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: blue;">var</span> i; </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: blue;">for</span> (i <span style="color: blue;">in</span> selectedItems) { </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//add the item ID of each selected item</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">query += <span style="color: maroon;">"&lt;Value Type=\"Counter\"&gt;"</span> + selectedItems[i].id + <span style="color: maroon;">"&lt;/Value&gt;"</span>; </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">} </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">query += <span style="color: maroon;">"&lt;/Values&gt;&lt;/In&gt;&lt;/Where&gt;"</span>; <span style="color: darkgreen;">//close CAML XML</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//associate the query to the view </span></span></p>
<p><span style="font-family: consolas; font-size: 9pt;">viewInfo.set_query(query); </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//add the view to the view collection</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">viewcollection.add(viewInfo); </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//load the view collection</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">clientContext.load(viewcollection); </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//execute the operation async - call onQueryFailed on errors and onQuerySucceeded on success</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">clientContext.executeQueryAsync(Function.createDelegate(<span style="color: blue;">this</span>, <span style="color: blue;">this</span>.onQuerySucceeded), Function.createDelegate(<span style="color: blue;">this</span>, <span style="color: blue;">this</span>.onQueryFailed)); </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">} </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">} </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: blue;">function</span> onQuerySucceeded() { </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//show successful message</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">alert(<span style="color: maroon;">'View successfully created!'</span>); </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">} </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: blue;">function</span> onQueryFailed(sender, args) { </span></p>
<p><span style="font-family: consolas; font-size: 9pt;"><span style="color: darkgreen;">//show error message ()stacktrace</span> </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">alert(<span style="color: maroon;">'Request failed. '</span> + args.get_message() + <span style="color: maroon;">'\n'</span> + args.get_stackTrace()); </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">} </span></p>
<p><span style="font-family: consolas; font-size: 9pt;">&lt;/script&gt; </span></p>
<p>Save and close the content of the content editor webpart and stop editing the page. Your listview should now look something like this:</p>
<p><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b016302ae1259970d-pi" style="display: inline;" /><br /> </p>
<h4><strong>Testing the functionality</strong></h4>
<p>To test the functionality, select a view list items and click on "Create View".</p>
<p><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b016302ae12eb970d-pi" style="display: inline;" /><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b016302ae14e3970d-pi" style="display: inline;"><img alt="081911_0716_ClientObjec3" class="asset  asset-image at-xid-6a0120a757f751970b016302ae14e3970d" src="http://www.avanadeblog.com/.a/6a0120a757f751970b016302ae14e3970d-500wi" title="081911_0716_ClientObjec3" /></a><br /><br /></p>
<p>If nothing went wrong, you should now receive the message "View successfully created!".</p>
<p> </p>
<p>Switch to the "List" tab and check i<a href="http://www.avanadeblog.com/.a/6a0120a757f751970b0168e8a39924970c-pi" style="display: inline;"><img alt="081911_0716_ClientObjec4" class="asset  asset-image at-xid-6a0120a757f751970b0168e8a39924970c" src="http://www.avanadeblog.com/.a/6a0120a757f751970b0168e8a39924970c-500wi" title="081911_0716_ClientObjec4" /></a><br /><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b0168e8a397e4970c-pi" style="display: inline;" /><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b016763a297f5970b-pi" style="display: inline;"><img alt="081911_0716_ClientObjec2" class="asset  asset-image at-xid-6a0120a757f751970b016763a297f5970b" src="http://www.avanadeblog.com/.a/6a0120a757f751970b016763a297f5970b-500wi" title="081911_0716_ClientObjec2" /></a><br /><br />f your view really exists. It should contain all items you have selected before you pressed the link "Create View":</p>
<p><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b0168e8a39874970c-pi" style="display: inline;"><img alt="081911_0716_ClientObjec5" class="asset  asset-image at-xid-6a0120a757f751970b0168e8a39874970c" src="http://www.avanadeblog.com/.a/6a0120a757f751970b0168e8a39874970c-500wi" title="081911_0716_ClientObjec5" /></a></p>
<p><strong>Result Realized! </strong></p>
<p>The next post will show how to <a href="http://www.avanadeblog.com/sharepointasg/2012/03/client-object-model-changing-list-views.html" target="_self" title="change an existing view">change an existing view</a>.</p>
</div>
</div>
<hr />
<table border="0" cellpadding="2" cellspacing="0" width="600">
<tbody>
<tr>
<td valign="top" width="130"><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b0154385f1efd970c-pi"><img alt="MatthiasGlatz" border="0" height="73" src="http://www.avanadeblog.com/.a/6a0120a757f751970b0162fde1061c970d-pi" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="MatthiasGlatz" width="73" /></a></td>
<td valign="top" width="400">Created by Matthias Glatz</td>
</tr>
</tbody>
</table><xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/AvanadeSharePointASG/~4/fjJr8HTZhlQ" height="1" width="1" /></div></content>



    </entry>
    <entry>
        <title>Custom Search refinements based on content type fields</title>
        <link rel="alternate" type="text/html" href="http://www.avanadeblog.com/sharepointasg/2011/12/custom-search-refinements-based-on-content-type-fields.html" />
        <link rel="replies" type="text/html" href="http://www.avanadeblog.com/sharepointasg/2011/12/custom-search-refinements-based-on-content-type-fields.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-6a0120a757f751970b0154385f1b2d970c</id>
        <published>2011-12-16T09:17:00-08:00</published>
        <updated>2011-12-16T01:17:17-08:00</updated>
        <summary>Intro This post describes some of the search customization like custom refinements and displaying custom properties in search results. A news list with the properties "News Date" and "News Category" will be created. After customizing the search the properties are displayed in the search results and the search results can...</summary>
        <author>
            <name>Avanade Blog</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="Customization" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="Search" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="SharePoint 2010" />
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.avanadeblog.com/sharepointasg/"><div xmlns="http://www.w3.org/1999/xhtml"><h4><font style="font-weight: bold">Intro </font></h4>  <p>This post describes some of the search customization like custom refinements and displaying custom properties in search results. A news list with the properties "News Date" and "News Category" will be created. After customizing the search the properties are displayed in the search results and the search results can be refined by these properties. </p>  <p>A prerequisite is that you have SharePoint 2010 Enterprise Edition and your search service is configured and running. </p>  <p><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b0154385f1936970c-pi"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.avanadeblog.com/.a/6a0120a757f751970b0154385f193e970c-pi" width="477" height="318" /></a></p>  <h4><font style="font-weight: bold">Create custom site column and demo list </font></h4>  <p>For our example we need a custom site column or content type with custom site columns. This can be created via Visual Studio or the SharePoint UI. We will create two custom site columns and a list for this demo. </p>  <p>Go to "Site SettingsàSite Columns" and click "create". Create a column "NewsCategory" as choice field and add "Public, Internal, HR and IT" as values. Finally select "Checkboxes (allow multiple selections)" and save the column. Add a second column "NewsDate" as datetime field, select "Date Only" and save it. </p>  <p><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.avanadeblog.com/.a/6a0120a757f751970b0162fde10041970d-pi" width="469" height="129" /></p>  <p>Create a new custom list "News" and verify that in advanced settings Search is set to "Yes". Go to list settings and add the created columns via "Add Columns from Site Columns" to the list. Additionally create a list column "News Content" as a multi-line text field. Finally add some data and vary the news category and date. All "News Content" columns of the test data should contain one same word that we use for testing ("search demo" in my example). </p>  <p><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b01675ed4ede4970b-pi"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.avanadeblog.com/.a/6a0120a757f751970b01675ed4ede8970b-pi" width="471" height="165" /></a></p>  <h4><font style="font-weight: bold">Add content type fields as metadata properties </font></h4>  <p>Now we need to add our two custom columns as metadata property in the search configuration. Open central administration and click on "Application ManagementàManage service applications" and click on your search service application. </p>  <p>First go to "Queries and ResultsàMetadata Properties" and click "New Managed Property". Type "NewsCategory" as property name and add a description. Select "Text" as field type and "Has Multiple Values". Click on "Add Mapping" and search for news. Finally add the field "ows_NewsCategory(Text)" and save the metadata field. </p>  <p><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b0162fde10080970d-pi"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.avanadeblog.com/.a/6a0120a757f751970b0162fde10087970d-pi" width="445" height="412" /></a></p>  <p>Add a metadata property and name it "NewsDate". Select "Date and Time" as type. Click on "Add Mapping" and search for news. </p>  <p><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b0162fde1008e970d-pi"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.avanadeblog.com/.a/6a0120a757f751970b0154385f1a0c970c-pi" width="384" height="352" /></a></p>  <p>Add the column "ows_NewsDate(Date and Time)". </p>  <p><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b0162fde100ca970d-pi"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.avanadeblog.com/.a/6a0120a757f751970b01675ed4ee3f970b-pi" width="437" height="266" /></a></p>  <p>To ensure your search data is mapped to the new metadata columns, go to "CrawlingàContent Sources" and start a full crawl on you content. </p>  <h4><font style="font-weight: bold">Create custom search page and set as site collection default </font></h4>  <p>Go back to your site collection and add web part page called "search.aspx". The layout template "Header, Footer, 3 Columns" fits ideal for a custom search page. </p>  <p>Enable the site collection feature "Search Server Web Parts" (eaf6a128-0482-4f71-9a2f-b1c650680e77) to have all search web parts available. </p>  <p>Open the "search.aspx" page in edit mode and add the following web parts: </p>  <ul>   <li>Search Statistics (Middle Column) </li>    <li>Search Paging (Middle Column) </li>    <li>Search Core Results (Middle Column) </li>    <li>Search Summary (Middle Column) </li>    <li>Search Box (Middle Column) </li>    <li>Refinement Panel (Left Column) </li> </ul>  <p>It should look like the following picture: </p>  <p><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b0154385f1a28970c-pi"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.avanadeblog.com/.a/6a0120a757f751970b0162fde10109970d-pi" width="450" height="343" /></a></p>  <p>Configure the "Search Box" webpart and set the value of "MiscellaneousàTarget search results page URL" to the current page "search.aspx". Stop editing the page and enter your search keyword of the news list ("search demo" in my case) in the search box. You should now see the items of the "News" list we created. Check also that the results are displayed on your "search.aspx" and you are not redirected to the default "/_layouts/OSSSearchResults.aspx" results page.</p>  <p><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.avanadeblog.com/.a/6a0120a757f751970b0154385f1a66970c-pi" width="452" height="468" /></p>  <p>Now you need to configure your site collection search to redirect to your custom search page. Because the default site search redirect to "/_layouts/OSSSearchResults.aspx". </p>  <p><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b0154385f1a6a970c-pi"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.avanadeblog.com/.a/6a0120a757f751970b01675ed4ee90970b-pi" width="442" height="85" /></a></p>  <p>Go to "Site SettingsàSearch Settings" and set the "Site Collection Search Results Page" value to your custom page. Verify the redirect by using the site search. The results should be displayed on your custom page. </p>  <p><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b0162fde10147970d-pi"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.avanadeblog.com/.a/6a0120a757f751970b0162fde10150970d-pi" width="448" height="226" /></a></p>  <h4><font style="font-weight: bold">Customize refinement panel on search page </font></h4>  <p>To add your metadata property to the refinements, go to your custom search page and edit the page. Edit the refinement panel web part and open "RefinementàFilter Category Definition". Copy the content to a XML file in Visual Studio or any other XML editor. </p>  <p>Add filter categories for your metadata properties to the "&lt;FilterCategories&gt;" section: </p>  <pre class="csharpcode"><span class="kwrd">&lt;</span><span class="html">FilterCategories</span><span class="kwrd">&gt;</span>

<span class="kwrd">&lt;</span><span class="html">Category</span> <span class="attr">Title</span><span class="kwrd">="News Category"</span> <span class="attr">Description</span><span class="kwrd">="News Categories"<br /></span><span class="attr">Type</span><span class="kwrd">="Microsoft.Office.Server.Search.WebControls.<br /></span><span class="kwrd">ManagedPropertyFilterGenerator"<br /></span><span class="attr">MetadataThreshold</span><span class="kwrd">="2"</span> <span class="attr">NumberOfFiltersToDisplay</span><span class="kwrd">="5"<br /></span><span class="attr">MaxNumberOfFilters</span><span class="kwrd">="20"</span> <span class="attr">SortBy</span><span class="kwrd">="Frequency"<br /></span><span class="attr">SortByForMoreFilters</span><span class="kwrd">="Name" </span><span class="attr">SortDirection</span><span class="kwrd">="Descending"<br /></span><span class="attr">SortDirectionForMoreFilters</span><span class="kwrd">="Ascending"<br /></span><span class="attr">ShowMoreLink</span><span class="kwrd">="True"</span> <span class="attr">MappedProperty</span><span class="kwrd">="NewsCategory"<br /></span><span class="attr">MoreLinkText</span><span class="kwrd">="show more" </span><span class="attr">LessLinkText</span><span class="kwrd">="show fewer"</span> <span class="kwrd">/&gt;</span> 

<span class="kwrd">&lt;</span><span class="html">Category</span> <span class="attr">Title</span><span class="kwrd">="News Date"</span> <span class="attr">Description</span><span class="kwrd">="News Date"<br /></span><span class="attr">Type</span><span class="kwrd">="Microsoft.Office.Server.Search.WebControls.<br />ManagedPropertyFilterGenerator"<br /></span><span class="attr">MetadataThreshold</span><span class="kwrd">="2"</span> <span class="attr">NumberOfFiltersToDisplay</span><span class="kwrd">="5"<br /></span><span class="attr">MaxNumberOfFilters</span><span class="kwrd">="20"</span> <span class="attr">SortBy</span><span class="kwrd">="Frequency"<br /></span><span class="attr">SortByForMoreFilters</span><span class="kwrd">="Name" </span><span class="attr">SortDirection</span><span class="kwrd">="Descending"<br /></span><span class="attr">SortDirectionForMoreFilters</span><span class="kwrd">="Ascending"<br /></span><span class="attr">ShowMoreLink</span><span class="kwrd">="True"</span> <span class="attr">MappedProperty</span><span class="kwrd">="NewsDate"<br /></span><span class="attr">MoreLinkText</span><span class="kwrd">="show more"</span> <span class="attr">LessLinkText</span><span class="kwrd">="show fewer"</span> <span class="kwrd">/&gt;</span> 
...</pre>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>

<p><strong>Visit <a href="http://msdn.microsoft.com/en-us/library/ff625183.aspx">MSDN</a> to get a description of each attribute. </strong></p>

<p>Copy the XML back to the web part and save your changes. Leave the edit mode of the page and enter your search keywords again. The refinement panel should now show your custom metadata properties and you are able to use the properties to refine the search results. If not, check if your full crawl has already finished. </p>

<p>You can also group your metadata field values and filter by ranges. To do so, you can use the "Result Type" or "Modified Date" category as a sample or visit <a href="http://msdn.microsoft.com/en-us/library/ff625185.aspx">MSDN</a> for documentation.</p>

<h4><font style="font-weight: bold">Customize results web part to display metadata property </font></h4>

<p>To display the metadata property also in the search results, you need to configure a few xsl properties of the "Core Results" web part. </p>

<p>Edit the custom search page and edit the "Core Results" web part. Go to "Display Properties" and edit the field "Fetched Properties". Add the columns to the XML: </p>

<pre class="csharpcode"><span class="kwrd">&lt;</span><span class="html">Columns</span><span class="kwrd">&gt;</span> 
…
<span class="kwrd">&lt;</span><span class="html">Column</span> <span class="attr">Name</span><span class="kwrd">="NewsCategory"</span><span class="kwrd">/&gt;</span>
<span class="kwrd">&lt;</span><span class="html">Column</span> <span class="attr">Name</span><span class="kwrd">="NewsDate"</span><span class="kwrd">/&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">Columns</span><span class="kwrd">&gt;</span> </pre>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>

<p>Click on "XSL Editor…" and copy the content XML in a XML editor to customize it. Add a XSL Parameter, a Call Template and a Template for your metadata property. </p>

<p><em>XSL Parameter Sample: </em></p>

<pre class="csharpcode"><span class="kwrd">&lt;</span><span class="html">xsl:param</span> <span class="attr">name</span><span class="kwrd">="NewsCategory"</span> <span class="kwrd">/&gt;</span>
<span class="kwrd">&lt;</span><span class="html">xsl:param</span> <span class="attr">name</span><span class="kwrd">="NewsDate"</span> <span class="kwrd">/&gt;</span></pre>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>

<p><em>XSL Call Template Sample:</em></p>

<pre class="csharpcode"><span class="kwrd">&lt;</span><span class="html">xsl:call-template</span> <span class="attr">name</span><span class="kwrd">="NewsCategory"</span><span class="kwrd">&gt;</span>
<span class="kwrd">  &lt;</span><span class="html">xsl:with-param</span> <span class="attr">name</span><span class="kwrd">="newscategory"</span> <span class="attr">select</span><span class="kwrd">="newscategory"</span> <span class="kwrd">/&gt;<br /></span><span class="kwrd">&lt;/</span><span class="html">xsl:call-template</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;</span><span class="html">xsl:call-template</span> <span class="attr">name</span><span class="kwrd">="NewsDate"</span><span class="kwrd">&gt;</span> 
<span class="kwrd">  &lt;</span><span class="html">xsl:with-param</span> <span class="attr">name</span><span class="kwrd">="newsdate"</span> <span class="attr">select</span><span class="kwrd">="newsdate"</span> <span class="kwrd">/&gt;<br /></span><span class="kwrd">&lt;/</span><span class="html">xsl:call-template</span><span class="kwrd">&gt;</span></pre>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>

<p><em>Place the call templates after the display size: </em></p>

<pre class="csharpcode"><span class="kwrd">&lt;</span><span class="html">xsl:call-template</span> <span class="attr">name</span><span class="kwrd">="DisplaySize"</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;</span><span class="html">xsl:with-param</span> <span class="attr">name</span><span class="kwrd">="size"</span> <span class="attr">select</span><span class="kwrd">="size"</span> <span class="kwrd">/&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">xsl:call-template</span><span class="kwrd">&gt;</span> 

<span class="rem">&lt;!-- place your template here --&gt;</span> </pre>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>

<p><em>XSL Templates Sample:</em></p>

<pre class="csharpcode"><span class="kwrd">&lt;</span><span class="html">xsl:template</span> <span class="attr">name</span><span class="kwrd">="NewsCategory"</span><span class="kwrd">&gt;</span>
  <span class="kwrd">&lt;</span><span class="html">xsl:param</span> <span class="attr">name</span><span class="kwrd">="newscategory"</span> <span class="kwrd">/&gt;</span>
  <span class="kwrd">&lt;</span><span class="html">xsl:if</span> <span class="attr">test</span><span class="kwrd">="string-length($newscategory) &amp;gt; 0"</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">xsl:if</span> <span class="attr">test</span><span class="kwrd">=<br />"string-length(write) &amp;gt; 0 or string-length(author) &amp;gt; 0"</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;</span><span class="html">xsl:text</span> <span class="attr">disable-output-escaping</span><span class="kwrd">="yes"</span><span class="kwrd">&gt;&lt;/</span><span class="html">xsl:text</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;/</span><span class="html">xsl:if</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">strong</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;</span><span class="html">xsl:text</span><span class="kwrd">&gt;</span>News Category: <span class="kwrd">&lt;/</span><span class="html">xsl:text</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;/</span><span class="html">strong</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">xsl:value-of</span> <span class="attr">select</span><span class="kwrd">="$newscategory"</span><span class="kwrd">/&gt;</span>
  <span class="kwrd">&lt;/</span><span class="html">xsl:if</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">xsl:template</span><span class="kwrd">&gt;</span> 

<span class="kwrd">&lt;</span><span class="html">xsl:template</span> <span class="attr">name</span><span class="kwrd">="NewsDate"</span><span class="kwrd">&gt;</span>
  <span class="kwrd">&lt;</span><span class="html">xsl:param</span> <span class="attr">name</span><span class="kwrd">="newsdate"</span> <span class="kwrd">/&gt;</span>
  <span class="kwrd">&lt;</span><span class="html">xsl:if</span> <span class="attr">test</span><span class="kwrd">="string-length($newsdate) &amp;gt; 0"</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">xsl:if</span> <span class="attr">test</span><span class="kwrd">=<br />"string-length(write) &amp;gt; 0 or string-length(author) &amp;gt; 0"</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;</span><span class="html">xsl:text</span> <span class="attr">disable-output-escaping</span><span class="kwrd">="yes"</span><span class="kwrd">&gt;&lt;/</span><span class="html">xsl:text</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;/</span><span class="html">xsl:if</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">strong</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;</span><span class="html">xsl:text</span><span class="kwrd">&gt;</span>News Date: <span class="kwrd">&lt;/</span><span class="html">xsl:text</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;/</span><span class="html">strong</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">xsl:value-of</span> <span class="attr">select</span><span class="kwrd">="$newsdate"</span><span class="kwrd">/&gt;</span>
  <span class="kwrd">&lt;/</span><span class="html">xsl:if</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">xsl:template</span><span class="kwrd">&gt;</span></pre>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>

<p><em>Place the templates after the display size templates: </em></p>

<pre class="csharpcode"><span class="rem">&lt;!-- The size attribute for each result is prepared here --&gt;</span>
<span class="kwrd">&lt;</span><span class="html">xsl:template</span> <span class="attr">name</span><span class="kwrd">="DisplaySize"</span><span class="kwrd">&gt;</span>
  <span class="kwrd">&lt;</span><span class="html">xsl:param</span> <span class="attr">name</span><span class="kwrd">="size"</span> <span class="kwrd">/&gt;</span>
  <span class="kwrd">&lt;</span><span class="html">xsl:if</span> <span class="attr">test</span><span class="kwrd">="string-length($size) &amp;gt; 0"</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">xsl:if</span> <span class="attr">test</span><span class="kwrd">="number($size) &amp;gt; 0"</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;</span><span class="html">xsl:if</span> <span class="attr">test</span><span class="kwrd">=<br />"string-length(write) &amp;gt; 0 or string-length(author) &amp;gt; 0"</span><span class="kwrd">&gt;</span>
       <span class="html">xsl:text</span> <span class="attr">disable-output-escaping</span><span class="kwrd">="yes"</span><span class="kwrd">&gt;</span>&amp;#8195;<span class="kwrd">&lt;/</span><span class="html">xsl:text</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;/</span><span class="html">xsl:if</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;</span><span class="html">xsl:value-of</span> <span class="attr">select</span><span class="kwrd">="$Size"</span> <span class="kwrd">/&gt;</span>
      <span class="kwrd">&lt;</span><span class="html">xsl:choose</span><span class="kwrd">&gt;</span>
        <span class="kwrd">&lt;</span><span class="html">xsl:when</span> <span class="attr">test</span><span class="kwrd">="round($size div 1024) &amp;lt; 1"</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span><span class="html">xsl:value-of</span> <span class="attr">select</span><span class="kwrd">="$size"</span> <span class="kwrd">/&gt;</span> Bytes
        <span class="kwrd">&lt;/</span><span class="html">xsl:when</span><span class="kwrd">&gt;</span>
        <span class="kwrd">&lt;</span><span class="html">xsl:when</span> <span class="attr">test</span><span class="kwrd">="round($size div (1024 *1024)) &amp;lt; 1"</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span><span class="html">xsl:value-of</span> <span class="attr">select</span><span class="kwrd">="round($size div 1024)"</span> <span class="kwrd">/&gt;</span>KB
        <span class="kwrd">&lt;/</span><span class="html">xsl:when</span><span class="kwrd">&gt;</span>
        <span class="kwrd">&lt;</span><span class="html">xsl:otherwise</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span><span class="html">xsl:value-of</span> <br />              <span class="attr">select</span><span class="kwrd">="round($size div (1024 * 1024))"</span><span class="kwrd">/&gt;</span>MB
        <span class="kwrd">&lt;/</span><span class="html">xsl:otherwise</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;/</span><span class="html">xsl:choose</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;/</span><span class="html">xsl:if</span><span class="kwrd">&gt;</span>
  <span class="kwrd">&lt;/</span><span class="html">xsl:if</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">xsl:template</span><span class="kwrd">&gt;</span> 
<span class="rem">&lt;!-- place your template here --&gt;</span></pre>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>

<ol>
  <li>Copy the XML back to the web part and save it </li>

  <li>Save the page and test your results page with your search keywords. Your properties should appear at the configured place. </li>
</ol>

<p>For each news item the custom properties appear in the results page. </p>

<p><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b01675ed4ef0f970b-pi"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.avanadeblog.com/.a/6a0120a757f751970b0162fde10161970d-pi" width="439" height="349" /></a></p>

<h4><font style="font-weight: bold">Results </font></h4>

<p>With all the modifications our custom site fields appear in the search results and we are able to refine the search results using our own metadata fields. </p>

<p><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b0154385f1aba970c-pi"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.avanadeblog.com/.a/6a0120a757f751970b01675ed4ef60970b-pi" width="474" height="322" /></a></p>

























<hr /> 

<table border="0" cellspacing="0" cellpadding="2" width="600"><tbody>
    <tr>
      <td valign="top" width="130"><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b0154385f1efd970c-pi"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="MatthiasGlatz" border="0" alt="MatthiasGlatz" src="http://www.avanadeblog.com/.a/6a0120a757f751970b0162fde1061c970d-pi" width="73" height="73" /></a></td>

      <td valign="top" width="400">Created by Matthias Glatz</td>
    </tr>
  </tbody></table><xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/AvanadeSharePointASG/~4/Kkg5JtEWRDU" height="1" width="1" /></div></content>



    </entry>
    <entry>
        <title>Using Excel Services REST API with InfoPath 2010</title>
        <link rel="alternate" type="text/html" href="http://www.avanadeblog.com/sharepointasg/2011/10/using-excel-services-rest-api-with-infopath-2010.html" />
        <link rel="replies" type="text/html" href="http://www.avanadeblog.com/sharepointasg/2011/10/using-excel-services-rest-api-with-infopath-2010.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-6a0120a757f751970b01539262634c970b</id>
        <published>2011-10-21T12:31:00-07:00</published>
        <updated>2011-10-21T05:31:20-07:00</updated>
        <summary>Intro With Excel Service REST API it is possible to get data from excel sheets. But it is also possible to send input parameter to Excel sheets with this API. Due to this you can send parameters to a calculated cell or change values in diagrams and retrieve the recalculated...</summary>
        <author>
            <name>Avanade Blog</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="Excel Services" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="InfoPath" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="REST" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="SharePoint 2010" />
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.avanadeblog.com/sharepointasg/"><div xmlns="http://www.w3.org/1999/xhtml"><h3>Intro </h3>  <p>With Excel Service REST API it is possible to get data from excel sheets. But it is also possible to send input parameter to Excel sheets with this API. Due to this you can send parameters to a calculated cell or change values in diagrams and retrieve the recalculated value or diagram. </p>  <p>With InfoPath 2010 it is possible to retrieve data from REST web services. In combination this can be used to retrieve data from Excel spreadsheets via the Excel Services REST API in InfoPath. In the flowing text I will describe how to use this features and combine them. As sample a simple multiplication calculator with InfoPath as user interface and Excel Services as business logic will be used. </p>  <h3>Preparing the Excel sheet </h3>  <p>First we need to prepare the excel sheet with formulas for our calculator. I created an Excel sheet and added the following headers and values to it: </p>  <ul>   <li>Paramter1 with cell B2 as value </li>    <li>Paramter2 with cell B3 as value </li>    <li>Result with formula: =B2*B3 </li> </ul>  <p><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.avanadeblog.com/.a/6a0120a757f751970b0153926262ce970b-pi" width="268" height="200" /><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.avanadeblog.com/.a/6a0120a757f751970b0153926262d6970b-pi" width="270" height="197" /> </p>  <p>As sample value each <strong>parameter</strong> will be set to 5 which will be calculated as <strong>result</strong> 25 in cell B4. Now it is important to set the parameter and result cells as named range. This makes it a lot easier to use with the REST API. Just select the cell and type the name of the range in the top left corner and hit enter. Name the ranges PARAMERER1, PARAMETER2 and RESULT. Save this excel file as "rest_demo.xlsx" in a SharePoint server document library (Excel services must be available and the enterprise feature activated in the site collection). </p>  <h3>Preparing the InfoPath 2010 form </h3>  <p>Open InfoPath 2010 and create a new empty form. Create 3 data fields of type text with the following names: </p>  <ul>   <li>Paramter1 </li>    <li>Parameter2 </li>    <li>Result </li> </ul>  <p>Drag and drop the fields onto your InfoPath form. It will look like this: </p>  <p><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.avanadeblog.com/.a/6a0120a757f751970b0153926262dd970b-pi" width="402" height="210" /></p>  <p>Now we will prepare the REST URL to call our Excel file (See "<a href="http://www.avanadeblog.com/sharepointasg/2011/08/sharepoint-2010-excel-services-rest-api.html">Sharepoint 2010 - Excel Services REST API</a>"). The first part of the URL will return the result value as HTML and will look like this: </p>  <p><a href="http://intranet.contoso.com/_vti_bin/ExcelRest.aspx/Shared Documents/rest_demo.xlsx/Model/Ranges('RESULT')">http://intranet.contoso.com/_vti_bin/ExcelRest.aspx/Shared%20Documents/rest_demo.xlsx/Model/Ranges('RESULT')</a></p>  <p>As the result will be HTML it is difficult to extract the result value in InfoPath. InfoPath is designed to use XML trees for data sources. To force Excel Services to return the result as XML tree we will append the parameter "?$format=atom": </p>  <p><a href="http://intranet.contoso.com/_vti_bin/ExcelRest.aspx/Shared Documents/rest_demo.xlsx/Model/Ranges('RESULT')?$format=atom">http://intranet.contoso.com/_vti_bin/ExcelRest.aspx/Shared%20Documents/rest_demo.xlsx/Model/Ranges('RESULT')?$format=atom</a></p>  <p>At the moment we will always receive the result value 25 because we have no parameters in our URL. The trick is now to inject values on the named ranges PARAMETER1 and PARAMETER2. This can be done by appending "&amp;Ranges('PARAMETER1')=6&amp;Ranges('PARAMETER2')=6" to the URL. Now it will look like this and return 36 as new result value: </p>  <p><a href="http://intranet.contoso.com/_vti_bin/ExcelRest.aspx/Shared Documents/rest_demo.xlsx/Model/Ranges('RESULT')?$format=atom&amp;Ranges('PARAMETER1')=6&amp;Ranges('PARAMETER2')=6">http://intranet.contoso.com/_vti_bin/ExcelRest.aspx/Shared%20Documents/rest_demo.xlsx/Model/Ranges('RESULT')?$format=atom&amp;Ranges('PARAMETER1')=6&amp;Ranges('PARAMETER2')=6</a></p>  <p>Our URL is now ready to be used in our InfoPath calculator. Open your InfoPath form and click "Data"-&gt;"From Web Service"-&gt;"From REST Web Service": </p>  <p><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b0162fbb7c688970d-pi"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.avanadeblog.com/.a/6a0120a757f751970b015436364de7970c-pi" width="394" height="275" /></a></p>  <p>Insert the URL we prepared in the steps before: </p>  <p><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b0162fbb7c694970d-pi"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.avanadeblog.com/.a/6a0120a757f751970b015436364dee970c-pi" width="357" height="253" /></a></p>  <p>Add a button with text "Calculate" to your form. To bind the REST action to your button click "Manage Rules". Add a rule of type "Change REST URL". </p>  <p><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b0153926262f2970b-pi"><img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.avanadeblog.com/.a/6a0120a757f751970b015436364dff970c-pi" width="244" height="186" /></a></p>  <p>Click "Insert Formula" and use the "concat" function to merge the URL. Replace the parameter values with the fields "Parameter1" and "Parameter2". It will look like this: </p>  <p><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b0162fbb7c6a6970d-pi"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.avanadeblog.com/.a/6a0120a757f751970b0162fbb7c6ab970d-pi" width="463" height="199" /></a></p>  <p>If we would now bind the result of the data connection to the result field we will always get the value 25 because the data service was only called at form load. You can disable this and add a second rule to your button after the first one. Select the action "Query for data" and choose your excel REST web service. </p>  <p><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b015392626316970b-pi"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.avanadeblog.com/.a/6a0120a757f751970b01539262631d970b-pi" width="387" height="325" /></a></p>  <p>Now we will receive the right value but it will not show up on the form. Therefore we need a third rule that sets the return value of the data service to our result field. Add a new rule of type "Set a field's value". Set the value of our result field with the value of the REST web service. You can find the value in the XML tree at "fv" (field value): </p>  <p><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b015392626326970b-pi"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.avanadeblog.com/.a/6a0120a757f751970b015436364e1a970c-pi" width="363" height="305" /></a></p>  <p>Entry-&gt;content-&gt;ns2:range-&gt;row-&gt;c-&gt;fv </p>  <p>The InfoPath calculator based on excel service REST API is now ready to test. Start the form in preview mode. Insert two values in the parameter fields and press the "Calculate" button. </p>  <p><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b0162fbb7c6de970d-pi"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.avanadeblog.com/.a/6a0120a757f751970b0162fbb7c6ec970d-pi" width="377" height="264" /></a></p>  <hr />  <table border="0" cellspacing="0" cellpadding="2" width="600"><tbody>     <tr>       <td valign="top" width="130"><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b0162fbb7c6f8970d-pi"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="MatthiasGlatz" border="0" alt="MatthiasGlatz" src="http://www.avanadeblog.com/.a/6a0120a757f751970b0162fbb7c6fc970d-pi" width="70" height="70" /></a></td>        <td valign="top" width="400">Created by Matthias Glatz</td>     </tr>   </tbody></table><xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/AvanadeSharePointASG/~4/FOpTc2omLqg" height="1" width="1" /></div></content>



    </entry>
    <entry>
        <title>Applying Social Computing in the Enterprise</title>
        <link rel="alternate" type="text/html" href="http://www.avanadeblog.com/sharepointasg/2011/10/applying-social-computing-in-the-enterprise.html" />
        <link rel="replies" type="text/html" href="http://www.avanadeblog.com/sharepointasg/2011/10/applying-social-computing-in-the-enterprise.html" thr:count="1" thr:updated="2012-04-01T19:46:54-07:00" />
        <id>tag:typepad.com,2003:post-6a0120a757f751970b015392626bba970b</id>
        <published>2011-10-19T15:58:00-07:00</published>
        <updated>2011-10-19T08:59:11-07:00</updated>
        <summary>4C’s of Social Media in the Enterprise To understand how Social Computing solutions can be of benefit within an enterprise context it is first important to understand their functions and capabilities. Organizations must then consider how each might be effectively applied within the context of a specific business scenario. The...</summary>
        <author>
            <name>Avanade Blog</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="Collaboration" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="Social Media" />
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.avanadeblog.com/sharepointasg/"><div xmlns="http://www.w3.org/1999/xhtml"><p><a name="_Toc264558666" /><strong>4C’s of </strong><strong>Social Media in the Enterprise</strong></p>  <p>To understand how Social Computing solutions can be of benefit within an enterprise context it is first important to understand their functions and capabilities. Organizations must then consider how each might be effectively applied within the context of a specific business scenario. </p>  <p>The different types of solutions available can typically be categorized in a number of ways. Here are four basic types, referred to as the 4C’s of Social Media: </p>  <ol>   <li>“<b>Content</b>”, </li>    <li>“<b>Collaboration</b>”, </li>    <li>“<b>Community</b>” and </li>    <li>“<b>Collective Intelligence</b>”. </li> </ol>  <p><strong>Expertise Location</strong></p>  <p>More and more organizations are pressured to make their employees more productive and achieve business results - and as social computing takes hold in the workplace, there are new opportunities to efficiently connect dispersed teams in new ways.<b /></p>  <p>As a first step there needs to be a simple and clear model for defining an expert with the minimum set of information items – without which covariance matrices can quickly turn ugly (and bipolar). </p>  <p>This canonical definition must answer the following:</p>  <ul>   <li>Who is an expert? </li>    <li>What is the minimum qualifying information we need to carry about an expert? </li>    <li>Where are the authoritative sources for this information? </li>    <li>What are the rules governing information association? </li>    <li>What are the rules governing information inference / derivation? </li>    <li>Is there a taxonomy that helps us organize information we have derived, inferred and associated with individuals? </li> </ul>  <p>Avanade identified the major requirements for a solution which requires </p>  <ul>   <li>Rich and easy-to-refresh user profiles </li>    <li>Search functions that find relevant people and expertise </li>    <li>Functionality to combine profile information with other contributions like blog post, document authoring and backend data sources (e.g. training transcripts) </li>    <li>Ability for users to tag content and rate colleagues for expertise </li> </ul>  <p>The <b>Avanade "Expert Source"</b> solution helps organizations by connecting people with experts who have the right skills and knowledge which is widely recognized as a major obstacle in collaboration among global teams. This is instrumental to reduce operational and deployment risks by identifying and engaging the most qualified specialists for critical initiatives. This is achieved by providing a horizontal application methodology as well as code with guidelines for vertical industries to establish a catalog of experts across an organization and process for users to access centralized information and locate experts.</p>  <p>However, in order to get the underlying data right and to make employees in an organization participate - a mind shift has to take place. This can be addressed in multiple ways:</p>  <ul>   <li>Top down, by leadership example. One of the most effective ways of promoting collaboration technologies inside Accenture is for employees to see the Executive Leadership Team, client senior executives and their direct reports using the tools, e.g., completing their profile information, creating their blogs, using instant messenger and LiveMeeting; </li>    <li>Bottom up, leveraging the younger generation of professionals who have grown up within this technology and are comfortable with it to help shape the way it is effectively used within the organization. </li> </ul>  <h3>Employee Networking Necessity</h3>  <p>The massive amounts of structured and unstructured information accumulating within and outside of organizations represent an opportunity and a challenge. If harnessed effectively it will become an opportunity. But it will also be a challenge in helping employees find the ‘right information’ efficiently and then take appropriate decisions and actions based upon it. </p>  <p>From an information perspective organizations won’t have the necessary resources to continually structure, classify, index, maintain and eventually decommission information that make up the knowledge capital of the enterprise. Often the creators of information, due to the lack of time or motivation, can’t maintain the information they produce. They may not even be able to post it and classify it within the appropriate team, project or department workspaces or within enterprise portals and knowledge management systems. There are thus already increasing quantities of disorganized and semi-maintained information today, particularly on the Internet but also within our enterprises. </p>  <p>The intelligent application of Social Networking solutions, and the aptitude and interest shown by Generation Y for their use in fact represents a significant opportunity for enterprises that want to address these challenges. Moreover, the necessity to effectively capture and leverage knowledge represents a serious challenge companies will face as they anticipate the potential loss of knowledge and experience as their “Baby Boomers” start to retire.</p>  <h3>Value of Enterprise Collaboration 2.0</h3>  <p>The development of a business case for the adoption of social computing within an organization is extremely complex. It is difficult to justify any business productivity type gains by pretending that the introduction of a solution will on average allow personnel to gain 15 minutes a day. The question quickly becomes, what happens to those 15 minutes? And then, what else are they doing now that they weren’t doing before?</p>  <p>If we just pick a few examples, it is relatively easy to see potential benefits of these solutions – so long its introduction is accompanied with an appropriate change in organization culture, behavior and policies. For example, the introduction of People Profiles that help to explain who is who within an organization enables people to integrate more quickly into an organization and find potential colleagues and experts who could help them with their work. The use of unified communications, virtual meetings and shared team spaces helps to reduce geographic barriers, travel and communication costs. It can install a stronger sense of belonging particularly in a context where working from home starts to become an option for many organizations. </p>  <p>These solutions help improve individual and group productivity. They also can help to improve the sense of belonging employees have to the enterprise. It can provide more opportunities for employees to feel implicated in and contribute to the future of the organization. And it allows them to get recognition for their contribution beyond the reach of their traditional professional hierarchy. </p>  <p>The adoption of these technologies in a controlled manner, within the enterprise firewall or on a privatized cloud, is also proactive. It ensures that technologies are used within a secure and reliable environment. </p>  <h3>Applying Enterprise Social Computing</h3>  <p>The types of solutions we implement are extremely varied. So have been the business drivers that to these implementations. It is rare to find organizations that immediately go for an enterprise wide transformation and implementation. Most identify an initial need within a specific business area, or employee population, where it is possible to run a controlled experiment.</p>  <p>A common approach is to segment the employee population and/or business functions with the objective of successfully deploying solutions. Then match them to specific communities in order to achieve precise and measurable business outcomes before then moving on to the next community. We may start, for example, with the global purchasing department of an international organization. The goal would be to allow them to share information and experience more easily with different suppliers. In particular, the focus could be on those that are international and different contacts within different countries. The next move might involve the marketing departments. They need to be able to improve collaboration with the different product development teams and marketing agencies they work with for the launch of new products, and so on.</p>  <p>In terms of concrete results, look at how the new solutions and their application can really change the daily activities of a specific role and community within an organization: <em>For one large group, sharing information in a more collaborative manner helped: It involved Financial Controllers from different countries. It allowed them to reduce the budget development process from six months to two months. The reduction occurred by allowing additional people to collaborate in the process using shared spreadsheets. For example, the directors of the different branches could provide feedback on the proposed budgets while at the same time negotiate their objectives. All of the negotiations and resulting changes were traceable. The resulting objectives were then also integrated directly into the performance management system and management dashboards to ensure a stronger sense of responsibility and greater transparency.</em></p>  <p>To be continued: How to measure success with the Avanade Collaboration Analytics Solution?</p>  <hr />  <table border="0" cellspacing="0" cellpadding="2" width="600"><tbody>     <tr>       <td valign="top" width="130"><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b0154363656d5970c-pi"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="ThomasKrofta" border="0" alt="ThomasKrofta" src="http://www.avanadeblog.com/.a/6a0120a757f751970b015392626bad970b-pi" width="46" height="67" /></a></td>        <td valign="top" width="400">Created by Thomas Krofta</td>     </tr>   </tbody></table><xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/AvanadeSharePointASG/~4/ddepgjvAFeU" height="1" width="1" /></div></content>



    </entry>
    <entry>
        <title>Silverlight: Splitting time consuming Tasks into smaller Chunks</title>
        <link rel="alternate" type="text/html" href="http://www.avanadeblog.com/sharepointasg/2011/10/silverlight-splitting-time-consuming-tasks-into-smaller-junks.html" />
        <link rel="replies" type="text/html" href="http://www.avanadeblog.com/sharepointasg/2011/10/silverlight-splitting-time-consuming-tasks-into-smaller-junks.html" thr:count="1" thr:updated="2012-02-08T01:18:00-08:00" />
        <id>tag:typepad.com,2003:post-6a0120a757f751970b015436365dd4970c</id>
        <published>2011-10-18T10:37:00-07:00</published>
        <updated>2011-10-18T10:37:00-07:00</updated>
        <summary>Silverlight provides a little event called CompositionTarget.Rendering that couldn't attract much attention in the wide range of Silverlight programmers but became a glittering brilliant for me when it comes to heavy data driven LOBs. Here is why: Let's look at the Rendering-Event in more detail. You use it to realize...</summary>
        <author>
            <name>Avanade Blog</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="Performance" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="Silverlight" />
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.avanadeblog.com/sharepointasg/"><div xmlns="http://www.w3.org/1999/xhtml"><p>Silverlight provides a little event called <a href="http://msdn.microsoft.com/en-us/library/system.windows.media.compositiontarget.rendering(v=VS.95).aspx">CompositionTarget.Rendering</a> that couldn't attract much attention in the wide range of Silverlight programmers but became a glittering brilliant for me when it comes to heavy data driven LOBs. </p>  <p>Here is why: </p>  <p>Let's look at the Rendering-Event in more detail. You use it to realize low-level-Animations how they are used in game development. The Silverlight rendering process fires this event on each rendering loop allowing you to animate a control on a frame based manner. </p>  <p>Per default Silverlight is rendering 60 frames per second what you can configure with the <a href="http://msdn.microsoft.com/en-us/library/cc838147(v=VS.95).aspx">MaxFrameRate</a> Parameter of the Silverlight-Object-Tag. So attaching to the Rendering-Event Silverlight will call your Eventhandler 60 times per second. Well, if it is able to: On each rendering loop the Silverlight PlugIn checks if an Eventhandler needs to be executed (e.g. a ButtonClickHandler that you've attached to). If so it executes the Eventhandler in a synchronous way before it continuous with the next rendering loop. The more time the PlugIn needs to execute your EventHandler the lower the frame rate is! A low frame rate results in visible stutter of animations or even in a complete freeze of your UI until the execution comes back from your EventHandler. </p>  <p>One solution is to outsource your long running task to another thread releasing the foreground thread and allowing the PlugIn to continue drawing its frames on the screen. You do this typically with the <a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker(v=VS.95).aspx">BackgroundWorker</a> but Silverlight supports most of the classes from the <a href="http://msdn.microsoft.com/en-us/library/system.threading(v=VS.95).aspx">System.Threading</a> Namespace as well. </p>  <p>But what if you are not able to execute your task on another thread? Just think about a heavy Grid with hundreds of rows and several nested groupings! Controls can't be manipulated on a background thread. When Executing </p>  <div class="csharpcode">   <pre class="alt"><span class="lnum">   1:  </span>DataGrid myGrid = <span class="kwrd">new</span> DataGrid();</pre>

  <pre><span class="lnum">   2:  </span>myGrid.ItemsSource = bigbigData;</pre>
</div>
<style type="text/css">


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>

<p>on line 2 the DataGrid will create the complete ControlTree with all rows and cells. This will block the foreground thread and freeze the UI. You have to split your task into smaller chunks and execute them step by step. That's the point where the CompositionTarget.Rendering-Event becomes handy. Executing only one chunk within one rendering loop you allow the PlugIn to execute other Eventhandlers as well and still keeping a high frame rate! </p>

<p>This Code Snippet will give you an idea how to attach and detach to the Rendering-Event:</p>

<div class="csharpcode">
  <pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">private</span> <span class="kwrd">void</span> LoadData()</pre>

  <pre><span class="lnum">   2:  </span>{</pre>

  <pre class="alt"><span class="lnum">   3:  </span>    Queue&lt;Work&gt; queue = <span class="kwrd">new</span> Queue&lt;Work&gt;();</pre>

  <pre><span class="lnum">   4:  </span>    queue.Enqueue(workPart1);</pre>

  <pre class="alt"><span class="lnum">   5:  </span>    queue.Enqueue(workPart2);</pre>

  <pre><span class="lnum">   6:  </span>    queue.Enqueue(workPart3);</pre>

  <pre class="alt"><span class="lnum">   7:  </span> </pre>

  <pre><span class="lnum">   8:  </span>    CompositionTarget.Rendering += CompTarget_Rendering;</pre>

  <pre class="alt"><span class="lnum">   9:  </span>}</pre>

  <pre><span class="lnum">  10:  </span> </pre>

  <pre class="alt"><span class="lnum">  11:  </span><span class="kwrd">private</span> <span class="kwrd">void</span> CompTarget_Rendering(<span class="kwrd">object</span> sender, EventArgs e)</pre>

  <pre><span class="lnum">  12:  </span>{</pre>

  <pre class="alt"><span class="lnum">  13:  </span>    <span class="kwrd">if</span> (queue.Count != 0)</pre>

  <pre><span class="lnum">  14:  </span>    {</pre>

  <pre class="alt"><span class="lnum">  15:  </span>        Work renderingWork = queue.Dequeue();</pre>

  <pre><span class="lnum">  16:  </span>        renderingWork.Do();</pre>

  <pre class="alt"><span class="lnum">  17:  </span>    }</pre>

  <pre><span class="lnum">  18:  </span>    <span class="kwrd">else</span></pre>

  <pre class="alt"><span class="lnum">  19:  </span>    {</pre>

  <pre><span class="lnum">  20:  </span>        CompositionTarget.Rendering -= CompTarget_Rendering;</pre>

  <pre class="alt"><span class="lnum">  21:  </span>    }</pre>

  <pre><span class="lnum">  22:  </span>}</pre>
</div>
<style type="text/css">


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>

<p>Work should be a delegate that is executed on line 16. On line 8 we attach to the Rendering-Event and detach in line 20 after all work is done. This code runs completely in the foreground thread, it’s no multithreading scenario. </p>

<hr />

<table border="0" cellspacing="0" cellpadding="2" width="600"><tbody>
    <tr>
      <td valign="top" width="130"><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b0162fbb7d68e970d-pi"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="AlexanderAuras" border="0" alt="AlexanderAuras" src="http://www.avanadeblog.com/.a/6a0120a757f751970b0162fbb7d697970d-pi" width="61" height="61" /></a></td>

      <td valign="top" width="400">Created by Alexander Auras</td>
    </tr>
  </tbody></table><xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/AvanadeSharePointASG/~4/CK8xfjZ-HFg" height="1" width="1" /></div></content>



    </entry>
    <entry>
        <title>Performance and Usability of Data Driven Silverlight Applications</title>
        <link rel="alternate" type="text/html" href="http://www.avanadeblog.com/sharepointasg/2011/10/performance-and-usability-of-data-driven-silverlight-applications.html" />
        <link rel="replies" type="text/html" href="http://www.avanadeblog.com/sharepointasg/2011/10/performance-and-usability-of-data-driven-silverlight-applications.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-6a0120a757f751970b0154363641b5970c</id>
        <published>2011-10-18T06:44:00-07:00</published>
        <updated>2011-10-18T06:44:00-07:00</updated>
        <summary>The Challenge of a good User Experience Designing and implementing a good UI can be quite challenging. Especially when there is no budget to employ a designer and all design tasks have to be done by the programmer. The challenge becomes even greater when it comes to applications that handle...</summary>
        <author>
            <name>Avanade Blog</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="Performance" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="Silverlight" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="User Experience" />
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.avanadeblog.com/sharepointasg/"><div xmlns="http://www.w3.org/1999/xhtml"><h4><font style="font-weight: bold">The Challenge of a good User Experience </font></h4>  <p>Designing and implementing a good UI can be quite challenging. Especially when there is no budget to employ a designer and all design tasks have to be done by the programmer. The challenge becomes even greater when it comes to applications that handle a lot of data. </p>  <p>I think providing a good user experience is mainly the question about usability and performance. Whereby a good usability can be achieved by doing your homework, performance can become a pitfall in heavy data driven applications. </p>  <p>Here is a summary of my lessons learned, investigations and general thoughts about Usability and Performance when developing data driven Silverlight Applications: </p>  <h4><font style="font-weight: bold">Usability Tips </font></h4>  <ul>   <li>Invest in a good Planning- and Design-Phase. </li>    <li>Agile aspects like prototyping, short iterative cycles or others that allow the customer to get a clear picture of their finished product early during the design and build phase. </li>    <li>Align your Layout to well-known applications.      <br />The more your application looks and feels like other applications the user knows already the faster he will adopt it. Often I hear from customers something like: "But in Excel I can do it this or that way…" So always when I see a solution of an UI problem I've never seen before, I am very skeptical and thinking about a way to solve the problem in a more familiar way.       <br />When facing a certain problem of how to arrange the controls to satisfy the way how the customer needs to work with his data it's a good practice to check a catalog of UI patterns first (like <a href="http://quince.infragistics.com/">Quince</a> for example). </li> </ul>  <h4><font style="font-weight: bold">Performance Tips </font></h4>  <ul>   <li>     <p>Show the UI as soon as possible.        <br />Why is this so important? The user experiences the start performance of an application not only by the time it takes until the initial data is loaded so he is able to work. Before he is able to work with the data he needs a time of orientation which happens in his subconscious. Where are the controls I am going to work with? Where will be the data? Therefor: </p>      <ul>       <li>Keep the size of your XAP small so it does not take too long to download it. Consider loading parts of your application with a satellite assembly on demand. </li>        <li>         <p>Don't do too much until the MainWindow is rendered first time on screen. Before the Silverlight PlugIn renders the MainWindow it: </p>          <ul>           <li>calls the Constructor of the App Class and the Startup EventHandler, </li>            <li>parses the App.xaml (and all embedded Resource Dictionaries) and instantiates all objects within it, </li>            <li>calls the constructor and the Loaded EventHandler of the MainWindow, </li>            <li>parses the MainWindow.xaml, builds the ControlTree and </li>            <li>sets up the bindings and EventHandlers. </li>         </ul>          <p>The more you do within that components and the bigger your Xaml-Files are, the longer it takes until your application appears the first time on screen. </p>       </li>     </ul>   </li>    <li>When loading a lot of Data at Startup begin the loading on the earliest point possible. Especially when you deal with a heavy UI that is time consuming to build up, consider to start loading your initial data within the constructor of the App Class even before InitializeComponent(). </li>    <li>Remove all unused references before going to Production!      <br />During development the list of references generally gets longer and longer. All DLLs that are listed are copied into the XAP! Visual Studio provides no logic that selects only those you actually use in your code. So when you've finished your work don't forget to clean up your references list. </li>    <li>Keep the Control Tree as flat as possible.      <br />During the rendering of the UI the Layout System of Silverlight walks the control tree several times down and up to measure the size of each control and define the position where it gets rendered finally. If you manipulate a control (e.g. change its size) the Layout System has to visit all its child controls as well.       <br />Especially when using image effects like drop shadow or blur this comes into effect. </li>    <li>Other performance tips can be found on <a href="http://msdn.microsoft.com/en-us/library/cc189071(v=VS.95).aspx">MSDN</a>. </li> </ul>  <h4><font style="font-weight: bold">Split time consuming Tasks into smaller Junks </font></h4>  <p>Especially when working with a lot of data you quickly get to a point where tasks you have to process on the UI thread get quite time consuming. Just think about a grid with a lot of rows and you add some group descriptors. Behind the scene the Grid-Control has to process a lot to get the rows rendered resulting in a frozen UI. Or think about adding a long list of pictures to a ListBox. </p>  <p>So instead of getting stuck within one rendering loop during a time consuming task and blocking the foreground thread, split your task into smaller junks and spread their processing over several rendering loops! That way you keep your UI responsive. In one of my next blog posts I will show you an example of how to archive this with the help of the <a href="http://msdn.microsoft.com/en-us/library/system.windows.media.compositiontarget.rendering(v=VS.95).aspx">CompositionTarget.Rendering</a> event.</p>  <hr />   <table border="0" cellspacing="0" cellpadding="2" width="600"><tbody>     <tr>       <td valign="top" width="130"><a href="http://www.avanadeblog.com/.a/6a0120a757f751970b01539262594a970b-pi"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="AlexanderAuras" border="0" alt="AlexanderAuras" src="http://www.avanadeblog.com/.a/6a0120a757f751970b0162fbb7bc6e970d-pi" width="71" height="71" /></a></td>        <td valign="top" width="400">Created by Alexander Auras</td>     </tr>   </tbody></table><xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/AvanadeSharePointASG/~4/5uQ1wRWwZ2M" height="1" width="1" /></div></content>



    </entry>
    <entry>
        <title>Tomorrow, today will be yesterday...</title>
        <link rel="alternate" type="text/html" href="http://www.avanadeblog.com/sharepointasg/2011/10/tomorrow-today-will-be-yesterday.html" />
        <link rel="replies" type="text/html" href="http://www.avanadeblog.com/sharepointasg/2011/10/tomorrow-today-will-be-yesterday.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-6a0120a757f751970b0154360c1b27970c</id>
        <published>2011-10-11T08:35:00-07:00</published>
        <updated>2011-10-11T08:35:00-07:00</updated>
        <summary>If, in the world of enterprise information systems you think of the “Baby Boomers” as the Database, Fax and Phone generation, then “Generation X” would be the Portal, Email and Mobile generation and Generation Y the “Always Connected Social Network”. The leaders in many organizations are faced with a variety...</summary>
        <author>
            <name>Avanade Blog</name>
        </author>
        <category scheme="http://www.sixapart.com/ns/types#category" term="Collaboration" />
        <category scheme="http://www.sixapart.com/ns/types#category" term="Social Media" />
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.avanadeblog.com/sharepointasg/"><div xmlns="http://www.w3.org/1999/xhtml"><p><font color="#646b86">If, in the world of enterprise information systems you think of the “Baby Boomers” as the Database, Fax and Phone generation, then “Generation X” would be the Portal, Email and Mobile generation and Generation Y the “Always Connected Social Network”.</font></p>  <p>The leaders in many organizations are faced with a variety of challenges when looking for ways to maximize return on IT investment and increase the performance of their enterprises. Two challenges in particular are increasingly impacting the way in which we look to evolve enterprise information systems in order to better support employee productivity:</p>  <ol>   <li>the arrival within the workforce of the Generation “Y”, or the “Digital Natives” generation, combined with the impending departure of the “Baby Boomers”;</li>    <li>the explosion of structured and unstructured information that is accumulating within our organizations and out on the Internet[1].</li> </ol>  <h3>Information Proliferation</h3>  <p>The volume of data and information accessible to us today continues to increase at a phenomenal rate. The amount of data to be managed doubles every 6 to 8 months with the typical enterprise. And that’s before we even begin to try to quantify the amount of information now available to our employees, customers and partners over the Internet. We can certainly raise questions about the information. What percentage of this information is actually valid? Is it up-to-date? Does it have real value to our people and enterprises? </p>  <p>Everyone will probably agree that ensuring to provide the most accurate information available matters. It also must be timely. And in a format that supports good decision making. This all contributes to an important competitive advantage to which all enterprises aspire. </p>  <p>Information and data stored within an organization was relevant in some way at some point in time. Often this information continues to be created and stored in an ad-hoc fashion within Office documents (Word, Excel or PowerPoint), perhaps stored on an Intranet, SharePoint or a file system. Combined with this, we also have an extremely powerful set of information sources directly available over the Internet - such as corporate websites, community sites like Facebook, or blogs or even Twitter. Regardless, it quickly becomes clear that the growth of information we capture, share and mine becomes an obstacle to finding the right information in the first place. </p>  <p>Data found needs to be validated. Social computing, in particular, the ability to manage expertise in an organization helps to define, capture, store, maintain, locate, act on the information.</p>  <h3>Generation Gap</h3>  <p>The arrival in the workplace of the “Generation Y” and the departure of the “Baby Boomers” poses an important challenge to organizations, not only in the transfer of knowledge and competency between experienced veterans leaving organizations to the new recruits joining them, but also in relation to serious questions we can pose around working methods and organizational culture.</p>  <p><i>Can we afford to ignore them ?</i></p>  <p>The evolution of new information technologies made available through the Internet has progressively outpaced the evolution of the information systems within our enterprises. Moreover, they are being more rapidly adopted by the “Generation Y” than any other generation before. They are used to new forms and methods of communication which are well anchored in their culture. Communicating through SMSs, Instant Messaging and Social Networks creates a generational divide as well as technical and security challenges for the CIO and others within the organization. </p>  <h3><font size="3">Convergence (or “Trivergence”[i]</font><font size="3">)</font></h3>  <p>The rapid adoption of Internet technologies occurred because of:</p>  <ul>   <li>readily accessible broadband networks,</li>    <li>the decreasing cost of computers and mobile phones </li>    <li>and the increasing availability of rich interactive content. </li> </ul>  <p>The technical foundations today are very real. New breeds of Internet sites flourish. Many of them prove to be more than financially viable. Social networks have become a phenomenon practiced by millions of people today and are entering into the behaviors and practices of the Generation Y. Advertising and marketing spend is starting to move away from the more traditional media channels such as television, magazines and radio. They are increasing spend on digital marketing that will address the new generation of consumers. These consumers spend more time on the Internet, in social networks and online games than in more traditional communication channels.</p>  <h3>The New World of Work</h3>  <p><font color="#646b86"><b>Generation Y</b> (1980 – 2009), including the “Millennials”, is the Internet generation of plug-and-play, on-line multiplayer gaming, SMS chatting and participative democracy. It’s the “Three Screens [PC, Mobile &amp; TV] and a Cloud [Internet]” generation who question authority. They are not necessarily interested in career progression within the company hierarchy, but instead favor their personal progression inside and outside of work, particularly within their network of friends. They work intelligently in order to try and achieve maximal results with minimal effort, and are interested in (interactive) training and coaching where it will contribute to helping them achieve rapid results. They need to be given direction regarding the results they need to achieve and the resources at their disposition, but wish to make their own choices on the methods and means they use for getting there.</font></p>  <p>The beginning of the 21st century focused on consolidating the fundamental physical infrastructure to support Internet technologies. It did so externally and internally within the enterprise. From 2005 to 2008 we witnessed the emergence and generalization of portals. There also were collaborative workspaces on the application side of information systems. And there was the centralized management of identities on the infrastructure and operations side. Use of personal information management systems, including electronic mail, contact management, calendaring and mobile phones became main stream. For many, it replaced the Fax, the Filofax and the PDA. We also saw the emergence of instant messaging. Other Internet- based solutions appeared for collaboration to support certain ad-hoc business activities, often outside of corporate guidelines, firewall and CIO control. </p>  <p>From 2008, Web 2.0 solutions have started to deploy at great speed. Their take-up within the work environment is already relatively significant. It often blurs the frontier between professional and personal life. Certain technologies have been identified by many enterprises and CIOs as having very tangible business benefits. These benefits are particularly evident in the difficult economy we currently face. It involves the convergence of communication technologies with Voice over IP and Internet-based video conferencing solutions. The availability of enterprise quality versions of instant messaging, social networking and “Enterprise 2.0” solutions also provide CIOs the possibility to propose secure alternatives. They can suggest using these types of solutions in a professional context to enable support for new ways of work, such as telecommuting. The availability of enterprise-class versions of these solutions proposed as a service from “<i>the Cloud</i>” also facilitates their rapid deployment and adoption, including to new populations for which existing legacy systems were often an inhibitor.</p>  <p>Avanade believes that Generation Y will look to use the same types of communication tools at work as the ones they use outside of work. They will want to have rapid access to information, be able to “chat” with their colleagues, their business partners, will expect to be able to get ready access to the “subject matter experts” within the organization, do ad-hoc video conferencing, use PodCasting, use interactive on-line training, get newsfeeds in order to remain informed and up-to-speed. In short, they will want to use all of the latest technologies in order to improve their productivity, save time and get fast results as dynamic markets require new collaboration capabilities. </p>  <p>However, the technology platform is not the biggest challenge. The major challenge is to get people to change their habits and become comfortable with using these new tools in a professional way. Experience has shown that anticipating and embracing change to achieve competitive advantage is better than resisting it. </p>  <p>To be continued: How to apply Social Computing in the Enterprise ?</p>  <hr align="left" size="1" width="33%" />  <p>[1] for some impressive facts watch <a href="http://www.youtube.com/watch?v=6ILQrUrEWe8">http://www.youtube.com/watch?v=6ILQrUrEWe8</a> and <a href="http://www.youtube.com/watch?v=3SuNx0UrnEo">http://www.youtube.com/watch?v=3SuNx0UrnEo</a></p>  <hr align="left" size="1" width="33%" />  <p>I. <a href="https://people.avanade.com/personal/thomas_krofta/Blog/Lists/Posts/NewPost.aspx?Source=/personal/thomas_krofta/Blog/&amp;IsDlg=1#_ednref1" name="_edn1" />Term coined by Accenture to describe the interplay of Devices, Data and Controls: <a href="http://www.accenture.com/Global/Accenture_Blogs/Trivergence_Blog/default.htm">http://www.accenture.com/Global/Accenture_Blogs/Trivergence_Blog/default.htm</a></p>  <hr />   <table border="0" cellspacing="0" cellpadding="2" width="600"><tbody>     <tr>       <td valign="top" width="130"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="ThomasKrofta" border="0" alt="ThomasKrofta" src="http://www.avanadeblog.com/.a/6a0120a757f751970b0154360c1b19970c-pi" width="42" height="61" /></td>        <td valign="top" width="400">Created by Thomas Krofta</td>     </tr>   </tbody></table><xhtml:img xmlns:xhtml="http://www.w3.org/1999/xhtml" src="http://feeds.feedburner.com/~r/AvanadeSharePointASG/~4/ltfsNM27YZc" height="1" width="1" /></div></content>



    </entry>
 
</feed><!-- ph=1 -->

