<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1588656802322476923</id><updated>2026-07-06T22:54:30.553+01:00</updated><category term="sharepoint"/><category term="development"/><category term="c#"/><category term="performance"/><category term="sharepoint 2013"/><category term="Error"/><category term="SQL Server"/><category term="performancepoint"/><category term="web part"/><category term="xsl"/><category term="programming"/><category term="sharepoint 2010"/><category term="beginners"/><category term="ios"/><category term="javascript"/><category term="permissions"/><category term="preview"/><category term="search"/><category term="sharepoint 2007"/><category term="sharepoint designer"/><category term=".net"/><category term="ASP.NET"/><category term="Analysis Services"/><category term="SQL Server Integration Services"/><category term="SSAS"/><category term="SSIS"/><category term="business"/><category term="business intelligence"/><category term="calendar"/><category term="code"/><category term="community"/><category term="csharp"/><category term="css"/><category term="dataviewwebpart"/><category term="documentation"/><category term="end user"/><category term="quicktip"/><category term="rage"/><category term="reporting services"/><category term="rss"/><category term="social media"/><category term="ssrs"/><category term="training"/><category term="visual studio 2010"/><category term="webparts"/><category term="xml"/><category term="DTExec"/><category term="Fail"/><category term="MDX"/><category term="OLAP"/><category term="REST"/><category term="Refresh"/><category term="SPSite"/><category term="SQL"/><category term="Schema"/><category term="Stored Procedures"/><category term="T-SQL"/><category term="Temporary Tables"/><category term="VMware"/><category term="administration"/><category term="analysis"/><category term="api"/><category term="appfabric"/><category term="awesome"/><category term="blogging"/><category term="book"/><category term="branding"/><category term="caching"/><category term="central admin"/><category term="cms"/><category term="conference"/><category term="content management"/><category term="curiosity"/><category term="database"/><category term="dataformwebpart"/><category term="delegates"/><category term="design manager"/><category term="developnent"/><category term="endusersharepoint"/><category term="enterprise"/><category term="event handlers"/><category term="events"/><category term="fba"/><category term="funny"/><category term="google news"/><category term="headers"/><category term="html"/><category term="http 503"/><category term="ia"/><category term="id-live"/><category term="iis"/><category term="information architecture"/><category term="introductory"/><category term="iphone"/><category term="master database"/><category term="masterpage"/><category term="moss"/><category term="newbie"/><category term="newbies"/><category term="object model"/><category term="objective c"/><category term="page layouts"/><category term="pointless"/><category term="processing"/><category term="project management"/><category term="psychology"/><category term="publishing"/><category term="ratings"/><category term="rebuild"/><category term="research"/><category term="review"/><category term="rollup"/><category term="sandbox"/><category term="server object model"/><category term="sharepoint branding css video"/><category term="sharepoint client object model javascript ecmascript"/><category term="sharepoint conference"/><category term="sharepoint development"/><category term="sharepoint fba sessions"/><category term="sharepoint ribbon fluent ui c#"/><category term="sharepoint roles fba"/><category term="site collection"/><category term="snippet"/><category term="social"/><category term="solutions"/><category term="spc12"/><category term="spevo"/><category term="spmobile"/><category term="suguk"/><category term="swot"/><category term="testing"/><category term="themes"/><category term="tldr"/><category term="tutorial"/><category term="twitter"/><category term="typography"/><category term="under the bonnet"/><category term="ux"/><category term="visual studio"/><category term="visual web part"/><category term="web design"/><category term="web development"/><category term="writing"/><category term="wspbuilder"/><category term="xslt"/><category term="year to view"/><title type='text'>Chronicles of a Chronic E-Junkie</title><subtitle type='html'>Pearls of (mostly) Microsoft SharePoint knowledge and wisdom.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://e-junkie-chronicles.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://e-junkie-chronicles.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>James Love</name><uri>http://www.blogger.com/profile/16992127964869412719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4I04pfPTNLzdSr5Bp3Riyhmo6aa8tmKGnqIudWP-VhZbDponrPOWye3gkRO7zV1ln3sINgVgEx9MjNPTtNNKzaUIbl27xSaHKThMBaJyJYbYfw5BTWeRyp8o5Fhxgew/s220/me.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>86</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1588656802322476923.post-7950087976567457965</id><published>2013-07-01T22:05:00.001+01:00</published><updated>2013-07-01T22:05:28.973+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="appfabric"/><category scheme="http://www.blogger.com/atom/ns#" term="caching"/><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint 2013"/><title type='text'>AppFabric Caching and Custom Solutions in SharePoint 2013</title><content type='html'>So you should&#39;ve heard by now that SharePoint 2013 uses the AppFabric Distributed Caching mechanism to (finally) manage caching across multiple nodes in a SharePoint farm.&lt;br /&gt;
&lt;br /&gt;
Awesome.&lt;br /&gt;
&lt;br /&gt;
So does that mean you can use it for your custom apps? Absolutely not, according to TechNet:&amp;nbsp;&lt;a href=&quot;http://technet.microsoft.com/en-us/library/jj219572.aspx&quot;&gt;http://technet.microsoft.com/en-us/library/jj219572.aspx&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #2a2a2a; font-family: &#39;Segoe UI&#39;, &#39;Lucida Grande&#39;, Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 18px;&quot;&gt;If you are using custom applications in SharePoint Server 2013 which use the AppFabric client APIs, or are creating custom caches, you should create a separate AppFabric cache cluster to support your custom applications. Do not use the AppFabric cache cluster supporting your SharePoint Server 2013 farm. Run your separate AppFabric cache cluster for your custom applications on separate servers from the servers dedicated to your SharePoint Server 2013 farm.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Basically, this means if you want something resembling a reliable* distributed cache store to hold a lot of data that you need quickly, you&#39;ll need to stand up more Windows servers if you want to use AppFabric.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;* = &#39;reliable&#39; as in, accessible from any server. It&#39;s not &quot;shared nothing&quot;, and doesn&#39;t have anything resembling &amp;nbsp;MapReduce, so it&#39;s an extremely volatile store. Think of it as HttpRuntime.Cache but code can access keys from any server in the cache cluster.&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://e-junkie-chronicles.blogspot.com/feeds/7950087976567457965/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1588656802322476923/7950087976567457965' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/7950087976567457965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/7950087976567457965'/><link rel='alternate' type='text/html' href='http://e-junkie-chronicles.blogspot.com/2013/07/appfabric-caching-and-custom-solutions.html' title='AppFabric Caching and Custom Solutions in SharePoint 2013'/><author><name>James Love</name><uri>http://www.blogger.com/profile/16992127964869412719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4I04pfPTNLzdSr5Bp3Riyhmo6aa8tmKGnqIudWP-VhZbDponrPOWye3gkRO7zV1ln3sINgVgEx9MjNPTtNNKzaUIbl27xSaHKThMBaJyJYbYfw5BTWeRyp8o5Fhxgew/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1588656802322476923.post-8272518076598188281</id><published>2013-06-17T13:03:00.002+01:00</published><updated>2013-06-17T13:04:09.188+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="end user"/><category scheme="http://www.blogger.com/atom/ns#" term="page layouts"/><category scheme="http://www.blogger.com/atom/ns#" term="publishing"/><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint"/><title type='text'>Find SharePoint Pages That Use a Specific Page Layout</title><content type='html'>When you try to delete a page layout that&#39;s in use, SharePoint will warn you (or rather, blow up on you) that it&#39;s currently in us, but rather unhelpfully doesn&#39;t tell you &lt;i&gt;which &lt;/i&gt;pages are using it.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvmqSiR4qHrPjskbpk5mMiH66gsK28G_jpwPUnuicq86-xOJ6BIWdTxfbLUq91ss3ZGqJ7pJsw9tfyWEc2nEz1yXNxizyHKftTZ6-9PYfsSAcwkRm_kN0FQ-OCORr-0n6JUgQBbLpKgzM/s1600/StillInUse.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvmqSiR4qHrPjskbpk5mMiH66gsK28G_jpwPUnuicq86-xOJ6BIWdTxfbLUq91ss3ZGqJ7pJsw9tfyWEc2nEz1yXNxizyHKftTZ6-9PYfsSAcwkRm_kN0FQ-OCORr-0n6JUgQBbLpKgzM/s1600/StillInUse.PNG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Luckily, a little-known feature in SharePoint that has existed since SharePoint 2007 will list you all the pages that are using a Page Layout.&lt;br /&gt;
&lt;br /&gt;
To get to it, navigate to your site collection&#39;s top level site, open up Site Content &amp;amp; Structure from the Site Actions menu in SharePoint 2007/2010 (or under Site Administration section of Site Settings in SharePoint 2013).&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2rkJcIBOf7v980BUdxp45Eg3VZAtb9Ut7yeqkSP779M1iJ7vBajcmOTHTyzjL2-tIbmWNESMKOSP4BCAvKuBU67wnqvDH0kTta3TKBSFGFdeFRRQhNew8wKl2TTvR_5pIvh7x5UFcWrw/s1600/Content+and+Structure.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2rkJcIBOf7v980BUdxp45Eg3VZAtb9Ut7yeqkSP779M1iJ7vBajcmOTHTyzjL2-tIbmWNESMKOSP4BCAvKuBU67wnqvDH0kTta3TKBSFGFdeFRRQhNew8wKl2TTvR_5pIvh7x5UFcWrw/s1600/Content+and+Structure.PNG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Once it has loaded up, select your Masterpage Gallery.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWUP4xNEqfmvVtSSuM2v79TY2n1InStK1DhAVZHbh8BCEsBhw3pBSViz7Deza5L02VpNWAExRsKO4oIuq5ybq1TppFFAi7vvdv1iZZJ8u8tc2xT0iIrr1JW0FDdahKwxLnUcMHadpa2r0/s1600/MasterpageGallery.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;318&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWUP4xNEqfmvVtSSuM2v79TY2n1InStK1DhAVZHbh8BCEsBhw3pBSViz7Deza5L02VpNWAExRsKO4oIuq5ybq1TppFFAi7vvdv1iZZJ8u8tc2xT0iIrr1JW0FDdahKwxLnUcMHadpa2r0/s320/MasterpageGallery.PNG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
Then, from the toolbar along the top of the right hand pane, click &#39;Show Related Resources&#39;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnUb4xk_s-TU7Wsiulq4hy0QoNO6gh_tRowgt0_BjMpnnT62hpmrnfjgvl8Jw0MdYV4fhZJGnUabMZYb-q7_l_7InuoPIdOL8cSqYpHxTuaO_dDMMnHFrZ_flCC1IR9sgvv5BCEQqbmjo/s1600/ShowRelatedResources.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;65&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnUb4xk_s-TU7Wsiulq4hy0QoNO6gh_tRowgt0_BjMpnnT62hpmrnfjgvl8Jw0MdYV4fhZJGnUabMZYb-q7_l_7InuoPIdOL8cSqYpHxTuaO_dDMMnHFrZ_flCC1IR9sgvv5BCEQqbmjo/s640/ShowRelatedResources.PNG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
A panel will open up at the bottom which shows all the items/documents in the site collection that use the currently selected item, and other items/documents that reference the selected item. Select your desired Page Layout, and you&#39;ll see Pages that are being used, with the column value &#39;Used By&#39; along side.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRmp-mB8DzGhzDEXc6v19WXBh6Qjw8mqqQJJMb8T1c7wk8ldd7oMn5sM_CIIpSjZTN7pyBq8_GKgCTU1A8gsQmREtxsYxhelQKuh2h0dRUJSA-Q4RPXf4vWgvkgYNTFcqGlWpKn-M6gOk/s1600/UsedBy.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;137&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRmp-mB8DzGhzDEXc6v19WXBh6Qjw8mqqQJJMb8T1c7wk8ldd7oMn5sM_CIIpSjZTN7pyBq8_GKgCTU1A8gsQmREtxsYxhelQKuh2h0dRUJSA-Q4RPXf4vWgvkgYNTFcqGlWpKn-M6gOk/s640/UsedBy.PNG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
This view does traverse the entire site collection and will show you all pages in all sites that reference this page layout.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, this won&#39;t work for masterpages, so you can&#39;t see what sites use a given masterpage - this panel will only show List Items (or Documents) that have a reference to a given file.</content><link rel='replies' type='application/atom+xml' href='http://e-junkie-chronicles.blogspot.com/feeds/8272518076598188281/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1588656802322476923/8272518076598188281' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/8272518076598188281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/8272518076598188281'/><link rel='alternate' type='text/html' href='http://e-junkie-chronicles.blogspot.com/2013/06/find-sharepoint-pages-that-use-specific.html' title='Find SharePoint Pages That Use a Specific Page Layout'/><author><name>James Love</name><uri>http://www.blogger.com/profile/16992127964869412719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4I04pfPTNLzdSr5Bp3Riyhmo6aa8tmKGnqIudWP-VhZbDponrPOWye3gkRO7zV1ln3sINgVgEx9MjNPTtNNKzaUIbl27xSaHKThMBaJyJYbYfw5BTWeRyp8o5Fhxgew/s220/me.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvmqSiR4qHrPjskbpk5mMiH66gsK28G_jpwPUnuicq86-xOJ6BIWdTxfbLUq91ss3ZGqJ7pJsw9tfyWEc2nEz1yXNxizyHKftTZ6-9PYfsSAcwkRm_kN0FQ-OCORr-0n6JUgQBbLpKgzM/s72-c/StillInUse.PNG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1588656802322476923.post-7451178619143104711</id><published>2013-06-13T15:20:00.002+01:00</published><updated>2013-06-13T15:20:34.318+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="ratings"/><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint"/><category scheme="http://www.blogger.com/atom/ns#" term="social"/><title type='text'>Setting Page Ratings using SharePoint Client Object Model</title><content type='html'>Want to set the Rating for the current page yourself with JavaScript?&lt;br /&gt;
&lt;br /&gt;
Here&#39;s how. You will probably need to build your own rating control to get the rating for the current page and render it nicely, but until I figure out the SP JavaScript to update the OOTB control, here&#39;s the code for actually setting the rating:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:csharp&quot; name=&quot;code&quot;&gt;(function () {
    var listId = _spPageContextInfo.pageListId;
    var itemId = _spPageContextInfo.pageItemId;
    var rating = 3; // Make sure you set this to what the user wanted
 
    EnsureScriptFunc(&#39;reputation.js&#39;,&amp;nbsp;&lt;/pre&gt;
&lt;pre class=&quot;brush:csharp&quot; name=&quot;code&quot;&gt;        &#39;Microsoft.Office.Server.ReputationModel.Reputation&#39;,&amp;nbsp;&lt;/pre&gt;
&lt;pre class=&quot;brush:csharp&quot; name=&quot;code&quot;&gt;        function() {
            var ctx = new SP.ClientContext();
            rating =&amp;nbsp;&lt;/pre&gt;
&lt;pre class=&quot;brush:csharp&quot; name=&quot;code&quot;&gt;            Microsoft.Office.Server.ReputationModel.Reputation.setRating(ctx, listId, itemId , rating);&lt;/pre&gt;
&lt;pre class=&quot;brush:csharp&quot; name=&quot;code&quot;&gt;            ctx.executeQueryAsync(done, fail);
        });
            
    function done() {
     //alert(&quot;Done&quot;);&amp;nbsp;&lt;/pre&gt;
&lt;pre class=&quot;brush:csharp&quot; name=&quot;code&quot;&gt;        // Handle something here, like updating the UI of your rating control.
    }
    
    function fail() {
     //alert(&quot;Failed&quot;);&amp;nbsp;&lt;/pre&gt;
&lt;pre class=&quot;brush:csharp&quot; name=&quot;code&quot;&gt;        // If it fails for whatever reason, dump it in the console for debugging,&lt;/pre&gt;
&lt;pre class=&quot;brush:csharp&quot; name=&quot;code&quot;&gt;        // or tell the user
    }
            
})();


&lt;/pre&gt;
</content><link rel='replies' type='application/atom+xml' href='http://e-junkie-chronicles.blogspot.com/feeds/7451178619143104711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1588656802322476923/7451178619143104711' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/7451178619143104711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/7451178619143104711'/><link rel='alternate' type='text/html' href='http://e-junkie-chronicles.blogspot.com/2013/06/setting-page-ratings-using-sharepoint.html' title='Setting Page Ratings using SharePoint Client Object Model'/><author><name>James Love</name><uri>http://www.blogger.com/profile/16992127964869412719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4I04pfPTNLzdSr5Bp3Riyhmo6aa8tmKGnqIudWP-VhZbDponrPOWye3gkRO7zV1ln3sINgVgEx9MjNPTtNNKzaUIbl27xSaHKThMBaJyJYbYfw5BTWeRyp8o5Fhxgew/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1588656802322476923.post-2325116530927057343</id><published>2013-06-03T13:30:00.002+01:00</published><updated>2013-06-03T14:05:23.919+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="design manager"/><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint 2013"/><title type='text'>SharePoint 2013 Design Manager - It Kinda Sucks, It&#39;s Kinda Good</title><content type='html'>SharePoint 2013 has touted quite a few new features which allegedly &#39;enable&#39; developers from more web design backgrounds to work in the platform. There is an encouragement to use more modern development techniques such as pure JavaScript and HTML to use technologies like REST to develop applications. And fitting in with this trend is the encouragement of web developers to be able to create designs for SharePoint sites without needing to know too in-depth knowledge about ASP.NET web forms, particularly how MasterPages and SharePoints Page Layouts work.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi34bBaC54HrYwGgXmymFA26yAYNLkmnjmmkdgCLOSq2dv6-6WbvtTOnbGxBUkggahsYjTsjvhkhVLGgRxEZkv1gZb0NP5RfdPMMeu6OIWBJm0omLNqdOltYVWyZmTLLUgKINyrrhqXNY4/s1600/DesignManagerSnip.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;176&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi34bBaC54HrYwGgXmymFA26yAYNLkmnjmmkdgCLOSq2dv6-6WbvtTOnbGxBUkggahsYjTsjvhkhVLGgRxEZkv1gZb0NP5RfdPMMeu6OIWBJm0omLNqdOltYVWyZmTLLUgKINyrrhqXNY4/s320/DesignManagerSnip.PNG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
The Design Manager steps in as promising to &quot;&lt;i&gt;makes it easier to create a fully customized, pixel-perfect design while using the web-design tools that you&#39;re already familiar with.&lt;/i&gt;&quot;. Now, designers were able to this perfectly well in previous versions of SharePoint, granted that they became familiar with dealing with extremely bloated markup, most of which SharePoint needed to provide its rich functionality. All we had to do was learn which bits never to remove and to build designs in and around the dozens and dozens of lines of code that SharePoint uses. &lt;a href=&quot;http://blog.drisgill.com/&quot;&gt;Randy Drisgill&lt;/a&gt; has kept the design world in SharePoint much more manageable with his stripped-down master pages which contain only the markup that SharePoint needs to get itself working.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
The general idea...&lt;/h3&gt;
In this post I&#39;ll go through my own experience of using the Design Manager, how it compares to what the tutorial actually recommends you do, and how I reckon it would work in real life. More importantly, if the Design Manager really is the better way forward for designers to go. (Spoiler: Yes. Yes it is. In my opinion.)&lt;br /&gt;
&lt;br /&gt;
The tutorial I&#39;ll follow is detailed on MSDN here:&amp;nbsp;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/jj822370.aspx&quot;&gt;How to: Convert an HTML file into a master page in SharePoint 2013&lt;/a&gt;&amp;nbsp;which covers the first and main thing we encounter when branding a site - building a masterpage.&lt;br /&gt;
&lt;br /&gt;
The general workflow of using the design manager is as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Create a static HTML Mockup of how you want the site to look&lt;/li&gt;
&lt;li&gt;Convert it into a masterpage&lt;/li&gt;
&lt;li&gt;Add SharePoint functionality using &quot;snippets&quot;&lt;/li&gt;
&lt;li&gt;Preview &amp;amp; Fix Issues&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
The main promise is that you can use your favourite HTML editor to create, fix and maintain your masterpage. You could do this before by editing .master files, as I said before, but there is one benefit now that comes into play that has a slight sting in its tail, but once you get used to it it may actually be a better way of working.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
What really happens is that SharePoint generates a .master masterpage file from your uploaded HTML markup file. The HTML markup file is then linked to that masterpage file. Any changes you make to the HTML file cause the .master file to re-generate. You can edit the resulting .master file if you want by unlinking from the HTML (it&#39;s a list item property of the HTML file, called &#39;Associated File&#39;), but then changes to the master file are lost when you re-associate.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;
Trying it out&lt;/h3&gt;
&lt;div&gt;
So to begin with, I started off with a nice little HTML mockup of a very simple design I created. I called it SampleDesign. Here&#39;s how the markup looks in my favourite HTML editor (Visual Studio 2012, which is a damned good HTML editor nowadays).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjD7EEdH2OBLIdtwL_OeVIIGdEhTLD830kVL5sqDLtL_IAA2a0aoE2so63hB2CHP2XgmzW55UnF0FfsT4PHvhHHfwlj_ygvYTo8mZO0qKC9l9Rcrq3kmjwWUE7i6o7eBaz7_Mo0o181P_Q/s1600/SampleDesign-BasicDesign.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;291&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjD7EEdH2OBLIdtwL_OeVIIGdEhTLD830kVL5sqDLtL_IAA2a0aoE2so63hB2CHP2XgmzW55UnF0FfsT4PHvhHHfwlj_ygvYTo8mZO0qKC9l9Rcrq3kmjwWUE7i6o7eBaz7_Mo0o181P_Q/s640/SampleDesign-BasicDesign.PNG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Now it&#39;s off to the Design Manager to upload. And this is where things get interesting. As the MSDN Documentation says, SharePoint will add some markup to your page when it&#39;s converted to a masterpage. Upload the file to somewhere in your masterpage gallery (preferably in its own folder in the gallery) then &amp;nbsp;use the &#39;Convert an HTML file to a masterpage&#39; option under &#39;Edit Master Pages&#39; within the Design Manager. Once you&#39;ve done this, open the file you uploaded, using your favourite HTML editor.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiS_5RCQJ5oNGWYM1RBl8J_K17jFlwC596u0jSLHFmu8fvSCiuFst5_Fw86cpSvteLN49OLWwp4LYN_xswaWynlGkWfsMb39hc1hsrLtWp5-LqMjkqQZDOPMaSozbUcymblqb6r8n8my-w/s1600/SampleDesign-VS-Office365.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;256&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiS_5RCQJ5oNGWYM1RBl8J_K17jFlwC596u0jSLHFmu8fvSCiuFst5_Fw86cpSvteLN49OLWwp4LYN_xswaWynlGkWfsMb39hc1hsrLtWp5-LqMjkqQZDOPMaSozbUcymblqb6r8n8my-w/s640/SampleDesign-VS-Office365.PNG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Whoa. Comment blocks everywhere! And this is one of the slightly nicer things about this method - no longer will your editor complain about lots and lots and lots of SharePoint ASP.NET tags all over the place, these are all commented out.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Now the next thing to do is to take your design, replace out all the &#39;stub&#39; content in your page with the SharePoint-Provided Snippets. Let&#39;s replace my site title in the H1 tag with the snippet provided in the design manager. But wait, here&#39;s our problem. Our beautifully simple design has been way too cluttered with SharePoint stuff. Lets add the snippet to our original, simple design mockup that&#39;s stored locally, by copying and pasting (ignore the fact I&#39;ve stuck a div inside an H1).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgyRTQDrAldpxB3tROHlDQkapmyWjWn1S_EpT6ZIxsaTZ1QkFf6hreo1buvSsgn-nCAApN7g2A13QRkTPQcHDNokOWDhUjJQr2I4vawDwQt_h_TrOwGPrL7MXMzbhD49t83lvLrga7peM/s1600/SampleDesign-VS.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;256&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgyRTQDrAldpxB3tROHlDQkapmyWjWn1S_EpT6ZIxsaTZ1QkFf6hreo1buvSsgn-nCAApN7g2A13QRkTPQcHDNokOWDhUjJQr2I4vawDwQt_h_TrOwGPrL7MXMzbhD49t83lvLrga7peM/s640/SampleDesign-VS.PNG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
That was relatively simple. Lets see what happens when we re-upload this to the site:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglZTWbO1p3a3Gb-ZbOb2XDKg6cq0NgQ0jt60_yc3Vg9heGEyPeJf0prmNFj4evi_eV8cx1d0W9fwnk_72kEccXVmXzxhMptObjC1y9Lmo-_lYQli-AbQi-NhAlc51QFJRo1q8iYXRYwiw/s1600/SampleDesign-VS-Office365-Snippet.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;312&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglZTWbO1p3a3Gb-ZbOb2XDKg6cq0NgQ0jt60_yc3Vg9heGEyPeJf0prmNFj4evi_eV8cx1d0W9fwnk_72kEccXVmXzxhMptObjC1y9Lmo-_lYQli-AbQi-NhAlc51QFJRo1q8iYXRYwiw/s640/SampleDesign-VS-Office365-Snippet.PNG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
That&#39;s.... not bad. A little less painful than trying to figure out where in the muddle of all the markup that snippet was supposed to go.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
But here we have a problem. We have a disconnect between our beautifully simple HTML mockup we created, complete with snippets, and the &#39;live&#39; SharePoint copy of the masterpage. What do we do? Microsoft recommends that we connect a shared drive to the masterpage gallery and let us edit the HTML masterpage directly from the gallery, yet it&#39;s full of comments and snippet code already injected by SharePoint.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Well what seems to make sense to me is to first design your simple HTML mockup. Then go into the Design Manager and get the snippets you need, and then insert them. Make sure you have ALL of the ones you think you will need for your design. Try to make the HTML markup that you have to upload as final as possible, in that you have the layout and snippets all in place, and have resolved some of the HTML markup issues using the Preview button. Keep as much control of the layout in CSS as possible (which is a good design practice anyway).&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
That way, once you&#39;ve uploaded the HTML file and SharePoint has converted it into a masterpage, you can continue to tweak the design directly on the server by only modifying the CSS files for your design.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Another thing that makes this whole method slightly more encouraging is what SharePoint does to generate the Ribbon - It&#39;s a single line of SharePoint snippet. This vastly reduces the bloat we used to have in the classic masterpages, but they still could have done it better by doing something similar with all the controls needed within the HEAD tag.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;
Another snippet&lt;/h3&gt;
&lt;div&gt;
Lets add another snippet and try out this workflow again. This time I&#39;ll add a searchbox snippet:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRmPBLBObMjOug0q1NWWk8vzAsykTKvCmX2xmOv6tl_Bxhzb_U7Ydu3iVmxODHuAP8X9jX6QtXYtYovn8-CnTFT7uUNPtEqv71V7FdeB1E1barQLoE8CDBNeMX3BqzbktF4SmSB70HJ7Y/s1600/SampleDesign-Local-SearchBox.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;430&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRmPBLBObMjOug0q1NWWk8vzAsykTKvCmX2xmOv6tl_Bxhzb_U7Ydu3iVmxODHuAP8X9jX6QtXYtYovn8-CnTFT7uUNPtEqv71V7FdeB1E1barQLoE8CDBNeMX3BqzbktF4SmSB70HJ7Y/s640/SampleDesign-Local-SearchBox.PNG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Nice and easy, got my referenced CSS file in there too to stick it up on the right:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8ZiK7keM9PKLKpG5AReKYYX0QylDgu2WZCstWn-sbKP43e-KgCPTDY2an_fdcRxUN2KbNRKbAE4pmNzcWCkSlsavwRzs759791jLE0P3YRpmu-59paXANpNJjGDWjR2c888S1-cd5FeM/s1600/SampleDesign-CSS.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;162&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8ZiK7keM9PKLKpG5AReKYYX0QylDgu2WZCstWn-sbKP43e-KgCPTDY2an_fdcRxUN2KbNRKbAE4pmNzcWCkSlsavwRzs759791jLE0P3YRpmu-59paXANpNJjGDWjR2c888S1-cd5FeM/s320/SampleDesign-CSS.PNG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Upload it back to the masterpage gallery, and have a look at the converted markup....&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhysZJ7xFIE8iUdXS52G96J4e0cY1fWuLz6y3xrAgtFtid9ErVDFs2JUyia7CSYKr8HuL0XrUN75_dr47m8fpD1dA2NuljxCzm28Zh0JGr-2L_yyLuKA5I53X0WAnV_fEB3NqE2o6LhEz0/s1600/SampleDesign-VS-Office365-SearchBox.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;422&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhysZJ7xFIE8iUdXS52G96J4e0cY1fWuLz6y3xrAgtFtid9ErVDFs2JUyia7CSYKr8HuL0XrUN75_dr47m8fpD1dA2NuljxCzm28Zh0JGr-2L_yyLuKA5I53X0WAnV_fEB3NqE2o6LhEz0/s640/SampleDesign-VS-Office365-SearchBox.PNG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
As predicted, it&#39;s converted everything nicely. Lets see how the Visual Studio Design View treats this, just out of curiosity...&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrrVDLWK5ZA_yosI_esIP3TaF4FQjd7GXOf9jgzjQKtSE0g1CnEwAcEMCYXtuXU6chTqDkZiIb4ZY5DDpx2Hf5Zc8o15yZ65mMxPTOypT6QHK17W_rea7XoEm1fQFtoXhGz05gUxaXRfY/s1600/SampleDesign-VS-Office365-DesignMode.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;440&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrrVDLWK5ZA_yosI_esIP3TaF4FQjd7GXOf9jgzjQKtSE0g1CnEwAcEMCYXtuXU6chTqDkZiIb4ZY5DDpx2Hf5Zc8o15yZ65mMxPTOypT6QHK17W_rea7XoEm1fQFtoXhGz05gUxaXRfY/s640/SampleDesign-VS-Office365-DesignMode.PNG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
... not so fantastic. Might as well stick to the code view and use the Design Manager Preview to see how things are going...&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3apne48ke35sJq-LVbfYU6jdu8VdhbpqIHeHOaRHwWhTlsm_-41FAsrGRpsgdd4nA9RRROp_Al9SaFAyAWAaXHkzQAMOGSrThK9SNmDtAWylXPnYKMI9v6JBwfRYljPPD0ovVYWPCziw/s1600/SampleDesign-Office365Preview.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;362&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3apne48ke35sJq-LVbfYU6jdu8VdhbpqIHeHOaRHwWhTlsm_-41FAsrGRpsgdd4nA9RRROp_Al9SaFAyAWAaXHkzQAMOGSrThK9SNmDtAWylXPnYKMI9v6JBwfRYljPPD0ovVYWPCziw/s640/SampleDesign-Office365Preview.PNG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
... that&#39;s a little better.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;
Validation&lt;/h3&gt;
&lt;div&gt;
Now, the MSDN tutorial recommends you upload a valid XML file. Fair enough, but lets see how &#39;valid&#39; our bare HTML mockup is with just the added snippets from the SharePoint site (not the generated HTML masterpage, but the one we started with, and then added to):&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlG53yOk9yuAq-NswqiIFhQbMiP-tcllf_PUWIa-Ug8ALm3G8SRMaAQV_6IY4Qn0VEIyC9IivhyphenhyphenMGVFwwb_m5XSkB18WoQ1Zi4pew_B-kLdtBKJAxibOeRctQqoUenTdV4193-iMnNoKQ/s1600/SampleDesign-W3CValidation-HTML5.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;526&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlG53yOk9yuAq-NswqiIFhQbMiP-tcllf_PUWIa-Ug8ALm3G8SRMaAQV_6IY4Qn0VEIyC9IivhyphenhyphenMGVFwwb_m5XSkB18WoQ1Zi4pew_B-kLdtBKJAxibOeRctQqoUenTdV4193-iMnNoKQ/s640/SampleDesign-W3CValidation-HTML5.PNG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
That&#39;s not too good. Ignore the 1 error I made by putting a div within an H1 tag, the rest are all to do with SharePoint&#39;s attributes that it&#39;s added (such as div webpartid=... ).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;
The Workflow as I see it&lt;/h3&gt;
&lt;div&gt;
So, to summarise the workflow as it appears to work best:&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;Design your HTML mockup for the masterpage as complete as you can make it.&lt;/li&gt;
&lt;li&gt;Use CSS extensively to control layout (as you should be)&lt;/li&gt;
&lt;li&gt;Add all the SharePoint snippets you will need to the appropriate areas&lt;/li&gt;
&lt;li&gt;Upload to the masterpage gallery, in its own folder for the design&lt;/li&gt;
&lt;li&gt;Convert it to a masterpage using the design manager&lt;/li&gt;
&lt;li&gt;Use the Preview tool to find and sort any problems.&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;Try to use the CSS files for your design to sort the issues where you can, but if you have to change the markup, then do so in your original, local file then re-upload.&lt;/li&gt;
&lt;li&gt;Try to make the uploaded HTML file a &#39;final&#39; kind of copy.&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;Publish it. Then get ready for deployment.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;
Design Packages&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
So now you&#39;ve got a design just the way you want it, and now you need to push it somewhere else. Enter the Design Packager. This generates a WSP file that will live in the Solutions gallery (Sandbox definitely not out of the picture then, especially if the Design Manager continues to live on in the next version of SharePoint). Bare in mind that when you create a design package, it saves it in the Solutions gallery of the site but doesn&#39;t activate it. It&#39;s probably not wise to activate it on the site you created it in anyway.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoxksn0wIWkVbcIkvf76yYCzrSahPKPn2Br5hdDXh2QKCd3y41i_4qiZHVnWJLi0yRSiNX0zJbGsT9YIQVOTYy0EAVqEEUhYIfjK-cMsXr5RSRRlttulXqcC9W_90S91kyBA876CD84XI/s1600/SampleDesign-ActivateError.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;238&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoxksn0wIWkVbcIkvf76yYCzrSahPKPn2Br5hdDXh2QKCd3y41i_4qiZHVnWJLi0yRSiNX0zJbGsT9YIQVOTYy0EAVqEEUhYIfjK-cMsXr5RSRRlttulXqcC9W_90S91kyBA876CD84XI/s320/SampleDesign-ActivateError.PNG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
Download it, upload it into the destination site and activate it. When I first did this I got an error (see right), but when I looked at the Solution gallery it seemed to be activated anyway. So no harm done (it seems).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN9wallVCg4AWsmwsLFArj-nhBUHxmZkmjonckLLLWs5xjglcrm_f1Xf7oQolDKFImD7Pg5MmGxeR6sKIMMZ2T028tPckghuzet66YRpiXsDf0lDVoKx71kvt94CpzEEeWNxKT7JBw548/s1600/SampleDesign-ActivatedAnyway.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;64&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN9wallVCg4AWsmwsLFArj-nhBUHxmZkmjonckLLLWs5xjglcrm_f1Xf7oQolDKFImD7Pg5MmGxeR6sKIMMZ2T028tPckghuzet66YRpiXsDf0lDVoKx71kvt94CpzEEeWNxKT7JBw548/s640/SampleDesign-ActivatedAnyway.PNG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp;It&#39;ll create the files/folders in the masterpage gallery. You can then see it available when you access the &#39;Assign master pages to your site based on device channel&#39; option, on the Publish and Apply Design page of the Design Manager. This page just happens to be the classic ChangeSiteMasterPage.aspx of yore. If you don&#39;t see it here, you might have to Publish and Approve the masterpage HTML file. Don&#39;t do this on the generated .master file, they are linked.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgciYnDSoZggmxezogzELIIOxkeCEPU0yj_3toOrSZhs3GmnbKiLmkkwMUbPrsyFO0lhlgPZKcblyeWnoqWmyBdfXRy4cz_6PYkKm2DsJheUrrSpmStoISuTrKfgAe74kmSIHjfsWi0QA/s1600/SampleDesig-Publish.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;86&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgciYnDSoZggmxezogzELIIOxkeCEPU0yj_3toOrSZhs3GmnbKiLmkkwMUbPrsyFO0lhlgPZKcblyeWnoqWmyBdfXRy4cz_6PYkKm2DsJheUrrSpmStoISuTrKfgAe74kmSIHjfsWi0QA/s640/SampleDesig-Publish.PNG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Publish the HTML file and both the html and master go to &#39;Pending&#39;...&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc7m72jj6176A7ww4TPqJ6ojJ9eS_HQB22FsDj8DSg2eYglzm5GH-MWPHuyeQpdn9Ny_I0MGDC3preU2QM3ifoOuSIS8u43VeKTQWhoxmgfeasBfyH5-W3sxzudW3q_ZFb2__wo2d-4EQ/s1600/SampleDesign-Approved.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;116&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc7m72jj6176A7ww4TPqJ6ojJ9eS_HQB22FsDj8DSg2eYglzm5GH-MWPHuyeQpdn9Ny_I0MGDC3preU2QM3ifoOuSIS8u43VeKTQWhoxmgfeasBfyH5-W3sxzudW3q_ZFb2__wo2d-4EQ/s640/SampleDesign-Approved.PNG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
... mark the HTML as approved and they both go to &#39;Approved&#39;.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;
In Summary&lt;/h3&gt;
&lt;div&gt;
So - good things (in my opinion) about the design manager:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Lets you edit HTML markup to describe a page layout, rather than a messy ASP.NET master page&lt;/li&gt;
&lt;li&gt;Lets you package and deploy all assets needed for your branding solution&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Bad things:&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;If you want to keep as much readability as possible, you will need to maintain a local / source-controlled version of your mockup, complete with inserted snippets.&lt;/li&gt;
&lt;li&gt;Snippet markup could probably be a bit more terse and lightweight. Your HTML is still a bit polluted.&lt;/li&gt;
&lt;li&gt;What you end up editing still isn&#39;t fully valid HTML5, so your editor might complain. But hopefully not as much as before.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h3&gt;
Would I use it in real life?&lt;/h3&gt;
&lt;div&gt;
... maybe. I&#39;m not a designer at heart, but I can implement a flat design concept. I like the ability of being able to do most stuff within the site itself and then being able to package it and deploy it elsewhere. A lot of the time &amp;nbsp;in Visual Studio doing this before was spent in getting the solution to do what I want, activating features and such. This has now been simplified greatly, if I use this technique.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://e-junkie-chronicles.blogspot.com/feeds/2325116530927057343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1588656802322476923/2325116530927057343' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/2325116530927057343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/2325116530927057343'/><link rel='alternate' type='text/html' href='http://e-junkie-chronicles.blogspot.com/2013/06/sharepoint-2013-design-manager-it-kinda.html' title='SharePoint 2013 Design Manager - It Kinda Sucks, It&#39;s Kinda Good'/><author><name>James Love</name><uri>http://www.blogger.com/profile/16992127964869412719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4I04pfPTNLzdSr5Bp3Riyhmo6aa8tmKGnqIudWP-VhZbDponrPOWye3gkRO7zV1ln3sINgVgEx9MjNPTtNNKzaUIbl27xSaHKThMBaJyJYbYfw5BTWeRyp8o5Fhxgew/s220/me.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi34bBaC54HrYwGgXmymFA26yAYNLkmnjmmkdgCLOSq2dv6-6WbvtTOnbGxBUkggahsYjTsjvhkhVLGgRxEZkv1gZb0NP5RfdPMMeu6OIWBJm0omLNqdOltYVWyZmTLLUgKINyrrhqXNY4/s72-c/DesignManagerSnip.PNG" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1588656802322476923.post-32683556399324126</id><published>2013-05-24T17:30:00.002+01:00</published><updated>2013-05-24T17:31:39.701+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ios"/><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint"/><category scheme="http://www.blogger.com/atom/ns#" term="spmobile"/><title type='text'>SharePoint from iOS - a new library - SPMobile</title><content type='html'>&lt;i&gt;Cut to the chase: github is here:&amp;nbsp;&lt;a href=&quot;https://github.com/jimmywim/SPMobile&quot;&gt;https://github.com/jimmywim/SPMobile&lt;/a&gt;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;
I have spent a bit of time recently tidying up and expanding the code possibilities with my iOS library - SPRESTApi.&lt;br /&gt;
&lt;br /&gt;
The changes have allowed me to extend it so it&#39;s no longer just a REST API helper, but can be used to called the ASMX web services in SharePoint. This effectively lets it work with any version since SharePoint 2007.&lt;br /&gt;
&lt;br /&gt;
And in order to enable it to work with all the way back to 2007, I&#39;ve extended the authentication mechanism to be able to log in using Forms Based Authentication.&lt;br /&gt;
&lt;br /&gt;
I have therefore refactored the code quite a lot and created a new Github repository - available here:&amp;nbsp;&lt;a href=&quot;https://github.com/jimmywim/SPMobile&quot;&gt;https://github.com/jimmywim/SPMobile&lt;/a&gt; (I&#39;ve also learnt a fair bit more about Git since my last try too, now quite enjoying it! :D)&lt;br /&gt;
&lt;br /&gt;
Code samples of authenticating into FBA and executing web service requests are all on the README on the Github site.&lt;br /&gt;
&lt;br /&gt;
With reference to my &lt;a href=&quot;http://e-junkie-chronicles.blogspot.co.uk/2013/05/sharepoint-forms-authentication-with.html&quot;&gt;last blog post&lt;/a&gt;, this is confirmation that I&#39;m no longer maintaining SPRESTApi, but I&#39;ll keep it there for future reference (and for historical purposes, so I can laugh at my poor learning of git in the future).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://e-junkie-chronicles.blogspot.com/feeds/32683556399324126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1588656802322476923/32683556399324126' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/32683556399324126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/32683556399324126'/><link rel='alternate' type='text/html' href='http://e-junkie-chronicles.blogspot.com/2013/05/sharepoint-from-ios-new-library-spmobile.html' title='SharePoint from iOS - a new library - SPMobile'/><author><name>James Love</name><uri>http://www.blogger.com/profile/16992127964869412719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4I04pfPTNLzdSr5Bp3Riyhmo6aa8tmKGnqIudWP-VhZbDponrPOWye3gkRO7zV1ln3sINgVgEx9MjNPTtNNKzaUIbl27xSaHKThMBaJyJYbYfw5BTWeRyp8o5Fhxgew/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1588656802322476923.post-913462556871383388</id><published>2013-05-14T23:26:00.000+01:00</published><updated>2013-05-14T23:26:36.321+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="ios"/><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint"/><title type='text'>SharePoint Forms Authentication (FBA) with Apple iOS</title><content type='html'>Over on my &lt;a href=&quot;https://github.com/jimmywim/SPRestAPI&quot;&gt;Github project&lt;/a&gt; I have finally got round to doing some updates to the code. I&#39;ve added a class that simplifies Forms Authentication, and allows you to issue the same REST API queries against SharePoint.&lt;br /&gt;
&lt;br /&gt;
Code samples are on the wiki on the Github site.&lt;br /&gt;
&lt;br /&gt;
Doing this wasn&#39;t really that difficult, you basically execute a SOAP operation on /_vti_bin/authentication.asmx - calling the &#39;Login&#39; operation. The envelope payload you pass in isn&#39;t complex, just the username and password structured in the required XML (to see details of that, just visit the asmx url on any SharePoint Farm then click &#39;Login&#39; to view the signature and response format. Once your request with a valid payload is completed, and if you&#39;re authenticated, you get a response which contains your FedAuth cookie. Just keep a hold of that, add it to every other request to the site and you&#39;re effectively logged in. Simple!&lt;br /&gt;
&lt;br /&gt;
I&#39;ve also modified the SPRESTQuery class to allow you to specify the SOAPAction and payload, which effectively lets you execute the classic ASMX web services - and thus makes it work with SharePoint 2010. Because of this, I&#39;m thinking of renaming the project and refactoring a lot of the code to make a simple &#39;SharePoint Connectivity Library for iOS&#39;. Not sure when I&#39;ll get round to doing this but hopefully sooner rather than later (it&#39;s been 5 months since I started this project and made the first batch of code commits!). So, as I say on the README, &#39;&lt;i&gt;watch this space&lt;/i&gt;&#39;.&lt;br /&gt;
&lt;br /&gt;
In summary of what I envisage the project/library to end up as - a helper class which will let you authenticate into SharePoint, persist the authentication cookies to keep you &#39;logged in&#39;, and to help you issue remote requests to the available client-side APIs (specifically, ASMX web servies and the REST API in 2013).&lt;br /&gt;
&lt;br /&gt;
It currently doesn&#39;t support NTLM, but this is something I do plan to include at some point.</content><link rel='replies' type='application/atom+xml' href='http://e-junkie-chronicles.blogspot.com/feeds/913462556871383388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1588656802322476923/913462556871383388' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/913462556871383388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/913462556871383388'/><link rel='alternate' type='text/html' href='http://e-junkie-chronicles.blogspot.com/2013/05/sharepoint-forms-authentication-with.html' title='SharePoint Forms Authentication (FBA) with Apple iOS'/><author><name>James Love</name><uri>http://www.blogger.com/profile/16992127964869412719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4I04pfPTNLzdSr5Bp3Riyhmo6aa8tmKGnqIudWP-VhZbDponrPOWye3gkRO7zV1ln3sINgVgEx9MjNPTtNNKzaUIbl27xSaHKThMBaJyJYbYfw5BTWeRyp8o5Fhxgew/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1588656802322476923.post-835671742317682458</id><published>2013-05-13T12:02:00.001+01:00</published><updated>2013-05-13T12:02:40.098+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="performancepoint"/><category scheme="http://www.blogger.com/atom/ns#" term="ssrs"/><title type='text'>Failed to load the appropriate report editor - PerformancePoint Server 2010 and SSRS 2012</title><content type='html'>If you are running PerformancePoint Server on SharePoint 2010, and have installed SSRS 2012, you will notice that you cannot edit any SSRS Reports within Dashboard Designer, you&#39;ll get the following message:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM8BChd08-7S7Cbhsdsg3SAQYaCYSAEpuLcUk8qELXJQDsLlo1P94JPGwVZUhKMhvw9KKaLPzypH0OuC0WnN_wRkm0R55AuFAHDu8PVBNuVwxF39BI7OR4Du9hHsjiGTrEOAe3cUGfbsQ/s1600/SSRSNotLoadingViewer.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;54&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM8BChd08-7S7Cbhsdsg3SAQYaCYSAEpuLcUk8qELXJQDsLlo1P94JPGwVZUhKMhvw9KKaLPzypH0OuC0WnN_wRkm0R55AuFAHDu8PVBNuVwxF39BI7OR4Du9hHsjiGTrEOAe3cUGfbsQ/s320/SSRSNotLoadingViewer.PNG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&quot;Failed to load the appropriate report editor. Please verify the appropriate plug-in is installed.&lt;br /&gt;
&lt;br /&gt;
Sometimes (though not always) you get this warning which helpfully gives you the link to the SSRS 2008 R2 Report Viewer utility.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiX1088ACerBvaUto1kYwhnbGnR-DZo11a554svvajoAHfRoEKTCZ2QqegQ_YIZWLrYlej79Zcpr1ngaY6l8D-HC9bIUe0TFL6UcVvNPXjSXRCh9sjt4635sl5gqAHj5GW2IW1csEPR5KI/s1600/SSRSViewerWarning.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;207&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiX1088ACerBvaUto1kYwhnbGnR-DZo11a554svvajoAHfRoEKTCZ2QqegQ_YIZWLrYlej79Zcpr1ngaY6l8D-HC9bIUe0TFL6UcVvNPXjSXRCh9sjt4635sl5gqAHj5GW2IW1csEPR5KI/s320/SSRSViewerWarning.PNG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
If not, here&#39;s the link anyway:&amp;nbsp;&lt;a href=&quot;http://www.microsoft.com/en-us/download/details.aspx?id=3841&quot;&gt;Microsoft Report Viewer 2008 SP1 Redistributable&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
SSRS 2012 does indeed install its own version of the Report Viewer assemblies, but PPS will only look for a specific version (that for SSRS 2008).&lt;br /&gt;
&lt;br /&gt;
Install this (the 2008 R2 version) and restart Dashboard Designer. You should now be able to edit SSRS ReportViews.&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://e-junkie-chronicles.blogspot.com/feeds/835671742317682458/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1588656802322476923/835671742317682458' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/835671742317682458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/835671742317682458'/><link rel='alternate' type='text/html' href='http://e-junkie-chronicles.blogspot.com/2013/05/failed-to-load-appropriate-report.html' title='Failed to load the appropriate report editor - PerformancePoint Server 2010 and SSRS 2012'/><author><name>James Love</name><uri>http://www.blogger.com/profile/16992127964869412719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4I04pfPTNLzdSr5Bp3Riyhmo6aa8tmKGnqIudWP-VhZbDponrPOWye3gkRO7zV1ln3sINgVgEx9MjNPTtNNKzaUIbl27xSaHKThMBaJyJYbYfw5BTWeRyp8o5Fhxgew/s220/me.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM8BChd08-7S7Cbhsdsg3SAQYaCYSAEpuLcUk8qELXJQDsLlo1P94JPGwVZUhKMhvw9KKaLPzypH0OuC0WnN_wRkm0R55AuFAHDu8PVBNuVwxF39BI7OR4Du9hHsjiGTrEOAe3cUGfbsQ/s72-c/SSRSNotLoadingViewer.PNG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1588656802322476923.post-4313926501797944266</id><published>2013-04-25T10:00:00.000+01:00</published><updated>2013-04-25T10:00:03.350+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="c#"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="performancepoint"/><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint"/><title type='text'>Creating Custom PerformancePoint Reports in C#</title><content type='html'>&lt;i&gt;(Concepts here are discussed around SharePoint 2010 but should equally be applicable to SharePoint 2013. All concepts here apply &lt;b&gt;only &lt;/b&gt;to full-trust farm solutions, and cannot be done at all with Sandboxed solutions or with the App model)&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;
&lt;br /&gt;
Occasionally you might give given the requirement (as a developer) to provide the ability to insert a chart in PerformancePoint that cannot be done with any other technology available to us (like SSRS, Excel Services, or even the native PerformancePoint charts).&lt;br /&gt;
&lt;br /&gt;
An example of this (and this is a real-life example) was the scenario where a customer wanted a chart where their users could select the axes for the chart at run time, but really this could be any kind of chart or some other data display that just isn&#39;t available within the &amp;nbsp;regular Excel Services or SSRS capabilities. You&#39;ve probably been through the spec and know it&#39;s possible, or even trivial, to create the type of display that you need using standard .NET Framework controls (such as WebParts, etc).&lt;br /&gt;
&lt;br /&gt;
However, in order to make this a real part of PerformancePoint Server, including the ability to use this chart within Dashboard Designer for both design and deployment purposes, we need to make use of the PerformancePoint Services Code Samples. These are already available on MSDN and they are documented. However I found the documentation was a bit dense and difficult to read for particular scenarios.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;The MSDN Documentation - a critique&lt;/b&gt;&lt;br /&gt;
The SDK for PerformancePoint (not the official title) describes how to create custom Tabular Data Sources, custom Filters and custom Reports. At this stage I don&#39;t think it&#39;s possible to create custom Scorecards. Note that while the MSDN Documentation refers to these custom objects as &#39;Extensions&#39;, the are really distinctly separate and new objects (whose underlying functionality inherits from the custom type you&#39;re defining), each are individually available within Dashboard Designer and are individually configurable.&lt;br /&gt;
&lt;br /&gt;
Another thing to point out is that you may see references to &#39;FCO&#39; or &#39;First Class Objects&#39;. This refers to anything in PerformancePoint, such as DataSources, Charts, Filters, Scorecards, etc. The SDK does not let you create new FCO types, but it lets you create new FCOs that extend existing ones. For example, there is an FCO type of ReportView, and PerformancePoint out of the box lets you create new SSRS Report Views (otherwise known as Analytical Report Views), Excel Services Report Views, and even a &#39;Web Page Report View&#39; (which is really just an IFrame that can be added to a PerformancePoint Dashboard). The sample project linked at the end of this article will create another type of Report View which we can use in Dashboard Designer.&lt;br /&gt;
&lt;br /&gt;
One of the things I disliked about the documentation on MSDN about this was the deployment model. The steps tell you to &#39;sign the assembly&#39; and then &#39;deploy to the GAC&#39;, as well as putting the Editor ASPX pages directly in the LAYOUTS directory in your 14 hive. These are all parts which are handled for you if you use the Visual Studio SharePoint project template. The only part of the deployment you will have to do manually is modifying the web.config file of the Monitoring Server endpoint. The attached solution contains a ReadMe.txt file in the Configuration folder describing how to do this to enable the functionality within that solution. The attached solution is also a SharePoint Project, which should easily be deployed to your development environment.&lt;br /&gt;
&lt;br /&gt;
Another point is that on this page (&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ee557288(v=office.14).aspx&quot;&gt;http://msdn.microsoft.com/en-us/library/ee557288(v=office.14).aspx&lt;/a&gt;) there is a line towards that end that calls &amp;nbsp;&lt;span style=&quot;font-family: Consolas, Courier, monospace; font-size: 13px; line-height: 17px;&quot;&gt;SPDataStore.GlobalDataStore.GetReportViewForExecution(elementLocation);&lt;/span&gt;&amp;nbsp;however the method here appears to be an Extension Method and none of the instructions tell you what assembly it&#39;s in, or even if it still exists (as I couldn&#39;t find it). In my code sample, I have replaced this method with just GetReportView() and this seems to work just as well.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;The Nuts &amp;amp; Bolts&lt;/b&gt;&lt;br /&gt;
So, despite the complexity of the documentation or the poor deployment model described therein, creating custom ReportViews for use in PerformancePoint Server is actually very straight forward.&lt;br /&gt;
&lt;br /&gt;
Essentially, there are only two parts to this (at least, only two parts to the PerformancePoint specific side of things. Your charting or display requirements could be more complex, but the actual bits to get it working in PerformancePoint only require these two bits).&lt;br /&gt;
&lt;br /&gt;
You need a Renderer class and an Editor page.&lt;br /&gt;
&lt;br /&gt;
Do pay attention to the details on creating these. Use the code samples they provide (along with the Helper classes) as templates for your own customisations. Doing so is a recommended practice as documented on MSDN. All of the helper classes provided on MSDN are included in my sample solution. I have modified the Renderer class to simplify the code to make it somewhat easier to read, although the sample code on MSDN will display every detail about the filters connected to the report.&lt;br /&gt;
&lt;br /&gt;
The Editor Page is a basic ASPX page, but this could just as easily be a SharePoint Application page, as long as it performs the necessary tasks to the underlying PerformancePoint object (in this case, the ReportView object).&lt;br /&gt;
&lt;br /&gt;
When using the Editor Page the make changes to your Report, and you&#39;ve clicked &#39;OK&#39; and returned back to Dashboard Designer, you will have to Refresh Dashboard Designer in order to load the changes you&#39;ve just made into Designer. This is because the Editor Page lives in SharePoint and isn&#39;t a series of Forms in a wizard like the native reports. This is a minor annoyance but once it becomes habit you tend not to notice as much.&lt;br /&gt;
&lt;br /&gt;
Within the Renderer class, you&#39;ll notice I&#39;m explicitly checking for and displaying the value of the MemberUniqueName and MeasureUniqueName columns (the latter is a custom one I&#39;ve added into Tabular filters I&#39;m using elsewhere in my environment). I&#39;ve yet to figure out how to get the value of whatever column was specified at run time, though this must be available somehow (I&#39;ve just yet to find out where). Modify the code as you need, or if you can, discover how to get just what was specified in Dashboard Designer.&lt;br /&gt;
&lt;br /&gt;
When developing your custom charts, do keep in mind maintainability and try to keep your code lightweight, and reduce dependencies. Try not to do all of the logic to draw the charts within the Chart Renderer class. Do your heavyweight logic within a separate class, such as a WebControl class or similar, then simply use the Chart Renderer to instantiate your separate class, and call the RenderControl method of that instance. This should keep your PerformancePoint-specific code more maintainable.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;EndPoints&lt;/b&gt;&lt;br /&gt;
A note on EndPoints - the way I have implemented EndPoints is to simply store a semi-colon separated list of EndPoint names in the reports CustomData property, which will be used to dynamically generate the EndPoints to which you can attach filters. The ReportView class which you have to use does not seem to allow adding extra properties (Though you may be able to inherit the ReportView class and add your own, I have not tried this, but I&#39;m not certain if the extra properties you add will be serialized - if they do then that is excellent - just extend the ReportView class into your object model and add the properties you need).&lt;br /&gt;
&lt;br /&gt;
Like I said earlier, you would ideally separate the logic for rendering your custom report away from the custom Renderer or Editor classes. This separate logic would have it&#39;s own requirements for how to draw the content, and what input data it needs (such as the path to an XML file perhaps). Your custom logic can then somehow expose the EndPoint information to dynamically create EndPoints in the Report (see CustomReportEditor.cs Line 236 for an example of generating the EndPoints).&lt;br /&gt;
&lt;br /&gt;
Note that in the Renderer class (in my example) there is little reference to the EndPoints themselves, rather the ParameterMessages object which contains the filter values that have been passed in.&lt;br /&gt;
&lt;br /&gt;
If you don&#39;t want to inherit ReportView or can&#39;t, then you can use the ReportView.Properties collection to create, store or read Properties for the report instance. These can be viewed and edited in Dashboard Designer on the Report Properties page. Keep in mind that you will need to cast the Property you want to create/edit/read to the correct BpmProperty type, and there are some available for storing different data types such as Text or DateTime. Try to use the correct one so your property values are correctly serialized.&lt;br /&gt;
&lt;br /&gt;
Do let me know if you can&#39;t get the Sample Code to work right, or if you spot any problems in the sample I&#39;ve given.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Resources&lt;/b&gt;:&lt;br /&gt;
Link to my code sample (CustomPPSReport.zip):&lt;a href=&quot;https://skydrive.live.com/redir?resid=C0F61214D82AC938!1809&amp;amp;authkey=!ACtgiRr81oxM-fs&quot; target=&quot;_blank&quot;&gt;&amp;nbsp;https://skydrive.live.com/redir?resid=C0F61214D82AC938!1809&amp;amp;authkey=!ACtgiRr81oxM-fs&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Create Report Extensions for PerformancePoint:&amp;nbsp;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/bb837254(v=office.14).aspx&quot;&gt;http://msdn.microsoft.com/en-us/library/bb837254(v=office.14).aspx&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
PerformancePoint Services Code Sample:&amp;nbsp;&lt;a href=&quot;http://msdn.microsoft.com/en-gb/library/ee558401(v=office.14).aspx&quot;&gt;http://msdn.microsoft.com/en-gb/library/ee558401(v=office.14).aspx&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://e-junkie-chronicles.blogspot.com/feeds/4313926501797944266/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1588656802322476923/4313926501797944266' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/4313926501797944266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/4313926501797944266'/><link rel='alternate' type='text/html' href='http://e-junkie-chronicles.blogspot.com/2013/04/creating-custom-performancepoint.html' title='Creating Custom PerformancePoint Reports in C#'/><author><name>James Love</name><uri>http://www.blogger.com/profile/16992127964869412719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4I04pfPTNLzdSr5Bp3Riyhmo6aa8tmKGnqIudWP-VhZbDponrPOWye3gkRO7zV1ln3sINgVgEx9MjNPTtNNKzaUIbl27xSaHKThMBaJyJYbYfw5BTWeRyp8o5Fhxgew/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1588656802322476923.post-3498870079982794208</id><published>2013-04-22T10:00:00.000+01:00</published><updated>2013-04-22T10:00:06.947+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="c#"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="performancepoint"/><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint"/><title type='text'>Get All PerformancePoint Filter Value selections in a Site Collection For the Current User</title><content type='html'>Here&#39;s some code to get all PerformancePoint filter selections for the current user in a web site.&lt;br /&gt;
&lt;br /&gt;
This is a fairly straightforward operation. First you need a collection of strings, each of which is the URL to a PerformancePoint Filter stored in SharePoint. In this code snippet I use SPSiteDataQuery (in the DiscoverFilterUrls() method). You might want to cache this, though in my implementation where I use this code I&#39;m using the singleton pattern to instantiate this class and to store an in-memory copy of this data.&lt;br /&gt;
&lt;br /&gt;
Once you have this collection of URLs, you need to iterate over them and use the PerformancePoint Monitoring API to get the Filter instance defined at that URL, and call the &lt;a href=&quot;http://msdn.microsoft.com/en-gb/library/ee735592.aspx&quot; target=&quot;_blank&quot;&gt;GetFilterDisplayData &lt;/a&gt;method. This will return a DataTable of the filter options. Note the&amp;nbsp;&lt;span style=&quot;font-family: Consolas, Courier, monospace; font-size: 13px; line-height: 17px;&quot;&gt;useSavedUserSelections&lt;/span&gt;&amp;nbsp;parameter, if I set this to true I will get the saved user selections, otherwise this should return all the options available in the filter. You might also want to do this, just modify the code as needed.&lt;br /&gt;
&lt;br /&gt;
In my code I&#39;m looking for the &#39;MemberUniqueName&#39; column, as I&#39;m dealing primarily with MDX Member Selection Filters in PerformancePoint, and these contain this column. You may have to modify the code in your implementation to extract the appropriate column.&lt;br /&gt;
&lt;br /&gt;
I have a utility method in here which I use when generating the Dictionary of filters and their values, called IsFilterEncodedInSet. In my implementation, my web.config has an AppSetting called &#39;ChartParametersEncodedAsSet&#39;, which I define a semi-colon separated list of PerformancePoint Filter Names which are passed in as sets. You can find out another way how to do this that&#39;s either more dynamic or more configurable (like storing in a SharePoint list). The only reason I use this method is to find out if I need to wrap the filter options in curly braces (&#39;{&#39; and &#39;}&#39;) or not. This is important as MDX member sets are defined like this, and thus makes this utility class more general to allowing either single MDX member options or sets of &amp;nbsp;MDX members. Note, however, that an MDX set can easily just contain a single member. My requirement needed me to only include the braces for multiple-member sets. If you have no such requirement for this, you can wrap every filter value that is returned in curly braces quite safely, and remove the dependency on the IsFilterEncodedAsSet method, and thus remove the dependency on the web.config AppSetting.&lt;br /&gt;
&lt;br /&gt;
Let me know in the comments if you have more questions about this code snippet or having problems getting it to work.&lt;br /&gt;
&lt;br /&gt;
Have fun!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:csharp&quot; name=&quot;code&quot;&gt;  
namespace MySampleStuff.PerformancePoint
{
    using System;
    using System.Collections.Generic;
    using System.Collections.Specialized;
    using System.Configuration;
    using System.Data;
    using Microsoft.PerformancePoint.Scorecards;
    using Microsoft.PerformancePoint.Scorecards.Store;
    using Microsoft.SharePoint;

    /// &lt;summary&gt;
    /// A class that can get filter values from PerformancePoint
    /// &lt;/summary&gt;
    public class FilterClient
    {
        /// &lt;summary&gt;
        /// The filter urls
        /// &lt;/summary&gt;
        private List&lt;string&gt; filterUrls;

        /// &lt;summary&gt;
        /// The filter values internal
        /// &lt;/summary&gt;
        private Dictionary&lt;string string=&quot;&quot;&gt; filterValuesInternal;

        /// &lt;summary&gt;
        /// The site
        /// &lt;/summary&gt;
        private SPSite site;

        /// &lt;summary&gt;
        /// The web
        /// &lt;/summary&gt;
        private SPWeb web;

        /// &lt;summary&gt;
        /// Initializes a new instance of the &lt;see cref=&quot;FilterClient&quot;&gt; class.
        /// &lt;/see&gt;&lt;/summary&gt;
        /// &lt;param name=&quot;site&quot; /&gt;The SharePoint Site which contains the Filters.
        public FilterClient(SPSite site)
        {
            this.site = site;
            this.web = site.OpenWeb();
            this.DiscoverFilterUrls();
        }

        /// &lt;summary&gt;
        /// Gets the PerformancePoint filter values in the given SharePoint Site
        /// &lt;/summary&gt;
        /// &lt;returns&gt;A Dictionary of filter names - filter values&lt;/returns&gt;
        public Dictionary&lt;string string=&quot;&quot;&gt; GetFilterValues()
        {
            // return null if not configured
            if (this.web == null || this.site == null || this.filterUrls == null)
                return null;

            //if (this.filterValuesInternal != null)
            //    return this.filterValuesInternal;
            this.filterValuesInternal = new Dictionary&lt;string string=&quot;&quot;&gt;();

            SPDataStore bistore = SPDataStore.GlobalDataStore;
            IBIMonitoringServiceApplicationProxy biservice = BIMonitoringServiceApplicationProxy.Default;
            
            foreach (string url in this.filterUrls)
            {
                RepositoryLocation filterLoc = new RepositoryLocation(&quot;/&quot; + url);
                Filter filter = bistore.GetFilter(filterLoc);
                ParameterDefinitionCollection parms = filter.BeginPoints;
                ParameterDefinition filterParm = null;

                foreach (ParameterDefinition parm in parms)
                {
                    // &quot;DisplayValue&quot; filters mean MDX Member filters, StaticList filters are SQL Table filters
                    if (parm.DisplayColumn == &quot;DisplayValue&quot; || parm.ParameterProviderId == &quot;StaticList&quot;)
                        filterParm = parm;
                }

                if (filterParm == null)
                    continue;

                DataTable displayData = biservice.GetFilterDisplayData(
                    filterLoc, filterParm, new List&lt;string&gt;(), true, true, null);

                string selection = string.Empty;
                bool isMultiple = this.IsFilterEncodedAsSet(filter.Name.Text);

                foreach (DataRow row in displayData.Rows)
                {
                    if (displayData.Columns.Contains(&quot;MemberUniqueName&quot;))
                        selection += row[&quot;MemberUniqueName&quot;].ToString() + &quot;,&quot;;
                    else if (displayData.Columns.Contains(&quot;MeasureName&quot;)) // specifically for Boston MAtrix, may be reused elsewhere
                    {
                        selection = row[0].ToString();
                        if (!this.filterValuesInternal.ContainsKey(filter.Name.Text + &quot; Caption&quot;))
                            this.filterValuesInternal.Add(filter.Name.Text + &quot; Caption&quot;, row[&quot;MeasureName&quot;].ToString());
                    }
                    else
                        selection = row[0].ToString(); // All other &#39;sql table&#39; type filters
                }

                selection = selection.TrimEnd(&#39;,&#39;);

                if (isMultiple)
                    selection = &quot;{&quot; + selection + &quot;}&quot;;

                if (!this.filterValuesInternal.ContainsKey(filter.Name.Text))
                    this.filterValuesInternal.Add(filter.Name.Text,selection );
            }

            return this.filterValuesInternal;
        }

        /// &lt;summary&gt;
        /// Discovers the filter urls.
        /// &lt;/summary&gt;
        private void DiscoverFilterUrls()
        {
            if (this.web == null)
                return;

            this.filterUrls = new List&lt;string&gt;();

            SPSiteDataQuery query = new SPSiteDataQuery();
            query.Query = &quot;&lt;where&gt;&lt;eq&gt;&lt;fieldref name=&quot;ContentType&quot;&gt;&lt;value type=&quot;Computed&quot;&gt;PerformancePoint Filter&lt;/value&gt;&lt;/fieldref&gt;&lt;/eq&gt;&lt;/where&gt;&quot;;
            query.ViewFields = &quot;&lt;fieldref name=&quot;FileRef&quot;&gt;&quot;;
            query.Webs = &quot;&lt;webs scope=&quot;SiteCollection&quot;&gt;&quot;;

            DataTable dt = this.web.GetSiteData(query);

            foreach (DataRow row in dt.Rows)
            {
                // we want the path to the item itself
                string url = row[&quot;FileRef&quot;].ToString();
                url = url.Substring(url.IndexOf(&#39;#&#39;) + 1); // These are site collection relative urls

                this.filterUrls.Add(url);
            }
        }

        /// &lt;summary&gt;
        /// Determines whether [is filter encoded as set] [the specified filter name].
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;filterName&quot; /&gt;Name of the filter.
        /// &lt;returns&gt;
        ///   &lt;c&gt;true&lt;/c&gt; if [is filter encoded as set] [the specified filter name]; otherwise, &lt;c&gt;false&lt;/c&gt;.
        /// &lt;/returns&gt;
        /// &lt;exception cref=&quot;System.ArgumentNullException&quot;&gt;Charts haven&#39;t been fully configured - check ChartParametersEncodedAsSet in web.config&lt;/exception&gt;
        private bool IsFilterEncodedAsSet(string filterName)
        {
            bool isSet = false;
            string filtersEncodedAsSet = ConfigurationManager.AppSettings[&quot;ChartParametersEncodedAsSet&quot;];
            if (string.IsNullOrEmpty(filtersEncodedAsSet))
                throw new ArgumentNullException(&quot;Charts haven&#39;t been fully configured - check ChartParametersEncodedAsSet in web.config&quot;);

            string[] filtersEncodedAsSetArray = filtersEncodedAsSet.Split(&#39;;&#39;);

            foreach (string s in filtersEncodedAsSetArray)
                if (s == filterName)
                    isSet = true;

            return isSet;
        }
    }
}

&lt;/webs&gt;&lt;/fieldref&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/pre&gt;
</content><link rel='replies' type='application/atom+xml' href='http://e-junkie-chronicles.blogspot.com/feeds/3498870079982794208/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1588656802322476923/3498870079982794208' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/3498870079982794208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/3498870079982794208'/><link rel='alternate' type='text/html' href='http://e-junkie-chronicles.blogspot.com/2013/04/get-all-performancepoint-filter-value.html' title='Get All PerformancePoint Filter Value selections in a Site Collection For the Current User'/><author><name>James Love</name><uri>http://www.blogger.com/profile/16992127964869412719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4I04pfPTNLzdSr5Bp3Riyhmo6aa8tmKGnqIudWP-VhZbDponrPOWye3gkRO7zV1ln3sINgVgEx9MjNPTtNNKzaUIbl27xSaHKThMBaJyJYbYfw5BTWeRyp8o5Fhxgew/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1588656802322476923.post-3236874284256035359</id><published>2013-04-19T21:11:00.000+01:00</published><updated>2013-04-19T21:11:52.139+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="newbie"/><category scheme="http://www.blogger.com/atom/ns#" term="server object model"/><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint"/><category scheme="http://www.blogger.com/atom/ns#" term="SPSite"/><category scheme="http://www.blogger.com/atom/ns#" term="visual studio"/><title type='text'>SPSite, FileNotFoundException and the Server Object Model in Console Applications and PowerShell Scripts</title><content type='html'>For a beginner SharePoint developer, there can be a fair amount of confusion around the seemingly trivial task of building a C# Console Application to connect to a SharePoint site and to learn the object model. You merely include a reference to the Microsoft.SharePoint.dll assembly, instantiate an object, passing in your site URL and you&#39;re off. Right? Well, hopefully, but you might also get the oft-thrown &#39;FileNotFoundException&#39; when trying this out for the first time (or even, the first time in a while if you&#39;ve been somewhat absent from doing this, or have been rolling around in the delights of &lt;a href=&quot;http://technet.microsoft.com/en-gb/library/ff678226.aspx&quot; target=&quot;_blank&quot;&gt;PowerShell&lt;/a&gt; too long).&lt;br /&gt;
&lt;br /&gt;
First of all you need to ensure your Visual Studio Console Application project is set to build to x64 (or AnyCPU) - this is because your application must be able to load the 64-bit Microsoft.SharePoint.dll assembly (this is the first, legit reason for a FileNotFoundException, it literally can&#39;t find a (64 bit version of a) file.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;(Hint: On CodePlex is there&#39;s an amazing toolkit known as &lt;a href=&quot;http://cksdev.codeplex.com/&quot; target=&quot;_blank&quot;&gt;CKS Dev (Community Kit for SharePoint) &lt;/a&gt;which includes, amongst many other very productive features, a &#39;SharePoint Console App&#39; project template, which streamlines most of this project setup process for you. Definitely something to install if you do a lot of SharePoint Development of any kind). As of time of writing, the Project Templates have yet to be imported in the Visual Studio 2012 but still work grand in the Visual Studio 2010 version).&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Next the problem usually is permissions - the security context of your console application (literally, the account you&#39;re logged in as) must have access to the SharePoint environment, and more specifically, the configuration database of your environment.&lt;br /&gt;
&lt;br /&gt;
Lastly, the SharePoint site you&#39;re trying to connect to MUST be local to the server on which you&#39;re running the console application. And it does not matter which Alternate Access Mapping URL you try to connect to.&lt;br /&gt;
&lt;br /&gt;
And this last reason is the main reason for my article. Why must the site be local?&lt;br /&gt;
&lt;br /&gt;
The reason is fairly simple. If you have followed other articles on the web to create Console (or Windows Forms, or Web Services, or anything .NET that&#39;s not a SharePoint project) applications that use the Microsoft.SharePoint.dll, you&#39;re using what&#39;s known as the Server Object Model. You probably already know this, or have read that you&#39;re doing this. You probably are also at least somewhat aware that there is also a Client Object Model out there. And a JavaScript Object Model.&lt;br /&gt;
&lt;br /&gt;
So what&#39;s with this Server Object Model, and why must code that uses it run solely on the server that hosts SharePoint? Also, when you do use this, have you noticed a significant delay when you first open that SPSite connection?&lt;br /&gt;
&lt;br /&gt;
The answer lies in the SPSite object. It has many &lt;a href=&quot;http://msdn.microsoft.com/en-gb/library/microsoft.sharepoint.spsite.spsite(v=office.15).aspx&quot; target=&quot;_blank&quot;&gt;constructors&lt;/a&gt; (6 in total, currently as of SharePoint 2013), but they all essentially do the same thing. Internally, your request to &#39;open&#39; a SharePoint site is passed right down to SharePoint&#39;s internal data connection layer (a native DLL with the obscure name &#39;owssvr.dll&#39;), which knows some very specific information about the system that is running your console application. This file can only be found on environments which have had SharePoint installed on them (another reason for the famous FileNotFoundException? Perhaps, but there is also a COMException that can be raised for when this dll can&#39;t be found)&lt;br /&gt;
&lt;br /&gt;
Whichever constructor you choose to use, the SharePoint internal code &#39;asks&#39; the local server where the configuration database is. It needs to do this because it has to ask it in which content database the SharePoint Site Collection with URL http://xyz or with Guid abcdef-... exists.&lt;br /&gt;
&lt;br /&gt;
Therefore, if you try to write a simple console application, and pass in the the URL to a SharePoint site that it NOT on your development server, you are basically asking SharePoint to find a Site that is registered on your local server.&lt;br /&gt;
&lt;br /&gt;
This story is exactly the same if you try to run a PowerShell script against a SharePoint Site URL that is not a part of the server&#39;s SharePoint Farm (there is an exception to this, namely for&amp;nbsp;&lt;a href=&quot;http://technet.microsoft.com/en-gb/library/fp161362.aspx&quot; target=&quot;_blank&quot;&gt;Office 365 hosted SharePoint Online&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
If you do actually intend to run your application on another server, then make sure the site collection URL is a parameter for your application somehow.&lt;br /&gt;
&lt;br /&gt;
If you need to interact with SharePoint and run a program that will NOT be running on the SharePoint server itself, then you will need to learn either the &lt;a href=&quot;http://msdn.microsoft.com/en-gb/library/ee857094(v=office.14).aspx&quot; target=&quot;_blank&quot;&gt;Managed Client Object Model&lt;/a&gt;, or one of the many Web Services that are now available (&lt;a href=&quot;http://msdn.microsoft.com/en-gb/library/ee705814(v=office.14).aspx&quot; target=&quot;_blank&quot;&gt;Classic (asmx) Web Services reference&lt;/a&gt;, &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ff798339.aspx&quot; target=&quot;_blank&quot;&gt;ListData.svc REST endpoint&lt;/a&gt;, &amp;nbsp;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/fp142380.aspx&quot; target=&quot;_blank&quot;&gt;SharePoint 2013 REST _api&lt;/a&gt;&amp;nbsp;[awesome, check this one out]).&lt;br /&gt;
&lt;br /&gt;
Notice that I didn&#39;t mention the JavaScript Object Model in that list. There is a reason for this also. I might go into this in detail in another article, for now it&#39;s similar to the Server Object Model problem - the SharePoint JavaScript Libraries are loaded only from SharePoint Sites, and can only run within pages that are hosted in the SharePoint site, as they make calls to internal web services that exist on the same SharePoint Site that is serving the page the code is running on. Confusing? I&#39;ll try to explain in another article by showing you what happens when you try to include SP.js outside of SharePoint sometime.&lt;br /&gt;
&lt;br /&gt;
But for now, &amp;nbsp;I hope that clears a few things up for new developers.</content><link rel='replies' type='application/atom+xml' href='http://e-junkie-chronicles.blogspot.com/feeds/3236874284256035359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1588656802322476923/3236874284256035359' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/3236874284256035359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/3236874284256035359'/><link rel='alternate' type='text/html' href='http://e-junkie-chronicles.blogspot.com/2013/04/spsite-filenotfoundexception-and-server.html' title='SPSite, FileNotFoundException and the Server Object Model in Console Applications and PowerShell Scripts'/><author><name>James Love</name><uri>http://www.blogger.com/profile/16992127964869412719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4I04pfPTNLzdSr5Bp3Riyhmo6aa8tmKGnqIudWP-VhZbDponrPOWye3gkRO7zV1ln3sINgVgEx9MjNPTtNNKzaUIbl27xSaHKThMBaJyJYbYfw5BTWeRyp8o5Fhxgew/s220/me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1588656802322476923.post-8994736233930978845</id><published>2013-04-19T09:45:00.003+01:00</published><updated>2013-04-19T09:55:56.139+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="c#"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint"/><category scheme="http://www.blogger.com/atom/ns#" term="webparts"/><title type='text'>SharePoint WebPart with Definable or Dynamic Filter Connections</title><content type='html'>Here&#39;s a code sample which will give you a web part that will &amp;nbsp;have a property (accessible via the Toolpane) that lets you define a semi-colon separated list of the names of Filter Connection points. You can then use any standard SharePoint (or even PerformancePoint) filters connected to the web part and use them how you wish in the code.&lt;br /&gt;
&lt;br /&gt;
Note that I&#39;m building the connection points via a Property, but you can do this any way you wish at runtime - just ensure you set the logic in the SetConnectionInterface method in the code. In my example, I&#39;m just getting an array of strings (from that Property) but this could really come from anywhere.&lt;br /&gt;
&lt;br /&gt;
Enjoy!&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Note:&lt;/b&gt;&lt;br /&gt;
If you intend to use the web part with PerformancePoint, do note that Filters will not work when you add the &#39;Apply Filters&#39; button. I will cover this in a later post but basically you don&#39;t build a standard web part if you want the full PerformancePoint experience.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:csharp&quot; name=&quot;code&quot;&gt;  
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls.WebParts;
using Microsoft.SharePoint.Utilities;
using Microsoft.SharePoint.WebPartPages;
using System.Linq;

namespace ConsumerWebPart.SampleWebPart
{
    [ToolboxItemAttribute(false)]
    public class SampleWebPart : Microsoft.SharePoint.WebPartPages.WebPart
    {
        private List&lt;ifiltervalues&gt; providers = new List&lt;ifiltervalues&gt;();

        [WebBrowsable(true),
        WebDisplayName(&quot;Filter EndPoints&quot;),
        WebDescription(&quot;&quot;),
        Personalizable(PersonalizationScope.Shared),
        Category(&quot;Custom Properties&quot;),
        DefaultValue(&quot;&quot;)]
        public string FilterEndPoints { get; set; }
        
        protected override void Render(HtmlTextWriter writer)
        {
            string str = &quot;&quot;;

            foreach (IFilterValues provider in this.providers)
            {
                if (provider != null)
                {
                    string prop = provider.ParameterName;
                    ReadOnlyCollection&lt;string&gt; values = provider.ParameterValues;

                    if (prop != null &amp;amp;&amp;amp; values != null)
                    {
                        str += SPEncode.HtmlEncode(prop) + &quot;=&quot;;

                        foreach (string v in values)
                        {
                            if (!string.IsNullOrEmpty(v))
                                str += v.Replace(&quot;&amp;amp;&quot;, &quot;%26&quot;);

                            str += &quot;&amp;amp;&quot;;
                        }
                    }
                }
            }

            writer.Write(str);
        }

        [ConnectionConsumer(&quot;Filter Values&quot;, &quot;IFilterValues&quot;, AllowsMultipleConnections = true)]
        public void SetConnectionInterface(IFilterValues provider)
        {
            this.providers.Add(provider);
            if (provider != null)
            {
                List&lt;consumerparameter&gt; l = new List&lt;consumerparameter&gt;();

                foreach (string parm in this.GetParameters())
                {
                    l.Add(new ConsumerParameter(parm, 
                        ConsumerParameterCapabilities.SupportsMultipleValues 
                        | ConsumerParameterCapabilities.SupportsAllValue));
                }

                provider.SetConsumerParameters(new ReadOnlyCollection&lt;consumerparameter&gt;(l));
            }
        }

        private List&lt;string&gt; GetParameters()
        {
            List&lt;string&gt; parmList = new List&lt;string&gt;();
            string[] parms = this.FilterEndPoints.Split(&#39;;&#39;);
            if (parms.Length &amp;gt; 0)
                parmList = parms.ToList&lt;string&gt;();

            return parmList;
        }
    }
}
    
&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/string&gt;&lt;/consumerparameter&gt;&lt;/consumerparameter&gt;&lt;/consumerparameter&gt;&lt;/string&gt;&lt;/ifiltervalues&gt;&lt;/ifiltervalues&gt;&lt;/pre&gt;
</content><link rel='replies' type='application/atom+xml' href='http://e-junkie-chronicles.blogspot.com/feeds/8994736233930978845/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1588656802322476923/8994736233930978845' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/8994736233930978845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/8994736233930978845'/><link rel='alternate' type='text/html' href='http://e-junkie-chronicles.blogspot.com/2013/04/sharepoint-webpart-with-definable-or.html' title='SharePoint WebPart with Definable or Dynamic Filter Connections'/><author><name>James Love</name><uri>http://www.blogger.com/profile/16992127964869412719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4I04pfPTNLzdSr5Bp3Riyhmo6aa8tmKGnqIudWP-VhZbDponrPOWye3gkRO7zV1ln3sINgVgEx9MjNPTtNNKzaUIbl27xSaHKThMBaJyJYbYfw5BTWeRyp8o5Fhxgew/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1588656802322476923.post-7543242731672879475</id><published>2013-03-21T15:50:00.002+00:00</published><updated>2013-03-21T18:12:29.301+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="performancepoint"/><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint"/><title type='text'>Unable to load first class Dao provider type - PerformancePoint Services error code 10201</title><content type='html'>If you&#39;re doing development against PerformancePoint Services API, whether in a custom ASP.NET site, a Console Application, make sure you have the Bpm configSection within your web.config (or App.config).&lt;br /&gt;
&lt;br /&gt;
You want to add the following configSection to your config file:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: white; background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 13px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;configSections&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;sectionGroup&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;Bpm&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;section&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;FCODaoProviders&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;System.Configuration.DictionarySectionHandler&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;sectionGroup&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;configSections&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
And you also want to include this under the root element of your config file, to let your application know which Dao providers to load for the various objects PerformancePoint can handle:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color: white; background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 13px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;Bpm&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;FCODaoProviders&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;key&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;DashboardSPDao&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;Microsoft.PerformancePoint.Scorecards.Store.Dao.DashboardSPDao,&amp;nbsp;Microsoft.PerformancePoint.Scorecards.Store,&amp;nbsp;Version=14.0.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=71e9bce111e9429c&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;key&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;DataSourceSPDao&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;Microsoft.PerformancePoint.Scorecards.Store.Dao.DataSourceSPDao,&amp;nbsp;Microsoft.PerformancePoint.Scorecards.Store,&amp;nbsp;Version=14.0.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=71e9bce111e9429c&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;key&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;FilterSPDao&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;Microsoft.PerformancePoint.Scorecards.Store.Dao.FilterSPDao,&amp;nbsp;Microsoft.PerformancePoint.Scorecards.Store,&amp;nbsp;Version=14.0.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=71e9bce111e9429c&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;key&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;IndicatorSPDao&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;Microsoft.PerformancePoint.Scorecards.Store.Dao.IndicatorSPDao,&amp;nbsp;Microsoft.PerformancePoint.Scorecards.Store,&amp;nbsp;Version=14.0.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=71e9bce111e9429c&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;key&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;KpiSPDao&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;Microsoft.PerformancePoint.Scorecards.Store.Dao.KpiSPDao,&amp;nbsp;Microsoft.PerformancePoint.Scorecards.Store,&amp;nbsp;Version=14.0.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=71e9bce111e9429c&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;key&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;ReportViewSPDao&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;Microsoft.PerformancePoint.Scorecards.Store.Dao.ReportViewSPDao,&amp;nbsp;Microsoft.PerformancePoint.Scorecards.Store,&amp;nbsp;Version=14.0.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=71e9bce111e9429c&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;key&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;ScorecardSPDao&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;=&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;Microsoft.PerformancePoint.Scorecards.Store.Dao.ScorecardSPDao,&amp;nbsp;Microsoft.PerformancePoint.Scorecards.Store,&amp;nbsp;Version=14.0.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=71e9bce111e9429c&lt;/span&gt;&quot;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;FCODaoProviders&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;Bpm&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;
It probably goes without saying, but if you&#39;re running this contextless of SharePoint you&#39;ll need to fake your HttpContext and point it to instances of SPWeb and SPSite (plenty of tutorials out on the web to do this). Oh, and with the rest of SharePoint code, it can only run on a SharePoint server. There is no client API for PerformancePoint in SharePoint 2010 and I doubt there is one for 2013. If you need you can create a service proxy that runs in SharePoint and gets the data you need.</content><link rel='replies' type='application/atom+xml' href='http://e-junkie-chronicles.blogspot.com/feeds/7543242731672879475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1588656802322476923/7543242731672879475' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/7543242731672879475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/7543242731672879475'/><link rel='alternate' type='text/html' href='http://e-junkie-chronicles.blogspot.com/2013/03/unable-to-load-first-class-dao-provider.html' title='Unable to load first class Dao provider type - PerformancePoint Services error code 10201'/><author><name>James Love</name><uri>http://www.blogger.com/profile/16992127964869412719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4I04pfPTNLzdSr5Bp3Riyhmo6aa8tmKGnqIudWP-VhZbDponrPOWye3gkRO7zV1ln3sINgVgEx9MjNPTtNNKzaUIbl27xSaHKThMBaJyJYbYfw5BTWeRyp8o5Fhxgew/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1588656802322476923.post-2768706065655415115</id><published>2013-02-21T15:21:00.001+00:00</published><updated>2013-02-21T15:41:34.456+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="headers"/><category scheme="http://www.blogger.com/atom/ns#" term="search"/><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint"/><title type='text'>SharePoint 2010 Server Search Only Crawling Top Level Site</title><content type='html'>This one cost me three evenings, and turned out to be a silly little thing, hope it can help someone else.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;The scenario:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
One web application has one site collection. Only pages in the top level site are being indexed by the crawler. These pages happen to be ones linked by the homepage. Another web application with a site collection and site hierarchy is able to be fully crawled. When I added a static link to a sub site, that sub site&#39;s homepage (and other pages it linked to) were being crawled OK, but no other sub sites. No SharePoint list items or documents in document libraries were being indexed in any site (even the top level site).&lt;br /&gt;
&lt;br /&gt;
This was a UAT environment, and our live environment, which appeared to be configured identically, did not have this issue - the entire site collection on live was able to be crawled without issue.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&amp;nbsp;Here&#39;s what I checked:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Web App URL was set in the Content Source&lt;/li&gt;
&lt;li&gt;Content Source was set as SharePoint Sites&lt;/li&gt;
&lt;li&gt;Content Source was set to crawl entire web application&lt;/li&gt;
&lt;li&gt;Crawler Account had Full Read on User Policy for the web app&lt;/li&gt;
&lt;li&gt;Same behaviour when setting the Crawler Account to a site collection admin account&lt;/li&gt;
&lt;li&gt;Same behaviour when crawling any AAM URL for the web app&lt;/li&gt;
&lt;li&gt;Was able to log in as any set crawler account and browse the full site&lt;/li&gt;
&lt;li&gt;There were no errors in the Crawl Log, only the 6 successes&lt;/li&gt;
&lt;li&gt;There were no errors reported in ULS, even when bumped to Verbose&lt;/li&gt;
&lt;li&gt;When using Fiddler as a reserve proxy, there were no errors reporting as the crawler happily crawled the 6 pages it could see&lt;/li&gt;
&lt;li&gt;Deleting and re-creating the Search Service Application from scratch had no effect&lt;/li&gt;
&lt;li&gt;Removing all Scopes and Crawl Rules had no effect&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;b&gt;What was the problem?&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Missing &#39;MicrosoftSharePointTeamServices&#39; header in the web application configuration in IIS, as I eventually found in a hint from this MSDN forum post (they are useful sometimes!):&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://social.technet.microsoft.com/forums/en-AU/sharepointadminprevious/thread/6fa317a5-9d2d-41a7-90f4-118050cf82dc&quot;&gt;http://social.technet.microsoft.com/forums/en-AU/sharepointadminprevious/thread/6fa317a5-9d2d-41a7-90f4-118050cf82dc&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNMzl8aguLXHxNinN8pZrgEYUsNOVX7dudhvyjIFBNHRj9wMearHeyX7D5CzDUoW_a2Ppe-PXmZDg450yCNUNnVNGeclOKjt4v1E3-nZtNE-yV-No7jATdQ_QF9vXWKopfvj2jlYdAkxc/s1600/SPHeaders.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;184&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNMzl8aguLXHxNinN8pZrgEYUsNOVX7dudhvyjIFBNHRj9wMearHeyX7D5CzDUoW_a2Ppe-PXmZDg450yCNUNnVNGeclOKjt4v1E3-nZtNE-yV-No7jATdQ_QF9vXWKopfvj2jlYdAkxc/s320/SPHeaders.PNG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
It turns out this header is required by the SharePoint crawler to ensure that the crawled site is indeed a SharePoint site and it can use the standard SharePoint APIs to discover the site&#39;s content. If it can&#39;t see this, the crawler treats the site as a standard static HTML web site and follows links to discover content. That is why I could only see a handful of pages that were linked from the homepage in the crawl log.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I was able to prove this first by checking the response headers from hitting both the UAT and live environments and checking the headers - when I noticed the the MicrosoftSharePointTeamServices response header missing from the UAT environment, I knew where to start looking.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
If you come across this issue, beware that there are several places in an ASP.NET web site where you can control/alter the HTTP Response headers - you can do this in a custom Control (ASCX or CLR type style), in a HTTP Module or, as was the case here, in the application configuration (done in IIS, but can also be done in the web.config). Do also ensure when you manually recreate this you set the version number to the correct version of your SharePoint farm. Subsequent updates to your environment should keep this value up to date. (Actually, I&#39;m unsure if the PSConfig wizard will update this header if it has been removed from a web app...).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Why was this removed?&lt;/b&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Security (I guess, someone else did it but has since left the company).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Here&#39;s a link to a blog post as to why it&#39;s good security practice to remove these headers on public facing websites:&amp;nbsp;&lt;a href=&quot;http://www.marc-lognoul.me/itblog-en/post/2012/12/05/SharePoint-Removing-HTTP-Headers-for-Security-Reasons.aspx&quot;&gt;http://www.marc-lognoul.me/itblog-en/post/2012/12/05/SharePoint-Removing-HTTP-Headers-for-Security-Reasons.aspx&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
But do beware, if you choose to follow these practices, ensure you have a web application available which could just be internally accessable but lets search work properly!&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://e-junkie-chronicles.blogspot.com/feeds/2768706065655415115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1588656802322476923/2768706065655415115' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/2768706065655415115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/2768706065655415115'/><link rel='alternate' type='text/html' href='http://e-junkie-chronicles.blogspot.com/2013/02/sharepoint-2010-server-search-only.html' title='SharePoint 2010 Server Search Only Crawling Top Level Site'/><author><name>James Love</name><uri>http://www.blogger.com/profile/16992127964869412719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4I04pfPTNLzdSr5Bp3Riyhmo6aa8tmKGnqIudWP-VhZbDponrPOWye3gkRO7zV1ln3sINgVgEx9MjNPTtNNKzaUIbl27xSaHKThMBaJyJYbYfw5BTWeRyp8o5Fhxgew/s220/me.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNMzl8aguLXHxNinN8pZrgEYUsNOVX7dudhvyjIFBNHRj9wMearHeyX7D5CzDUoW_a2Ppe-PXmZDg450yCNUNnVNGeclOKjt4v1E3-nZtNE-yV-No7jATdQ_QF9vXWKopfvj2jlYdAkxc/s72-c/SPHeaders.PNG" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1588656802322476923.post-402526417775704318</id><published>2013-02-14T09:23:00.000+00:00</published><updated>2013-02-14T09:24:06.358+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET"/><category scheme="http://www.blogger.com/atom/ns#" term="c#"/><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><title type='text'>ASP.NET Modules - reading InputStream with StreamReader</title><content type='html'>If, like me, if you&#39;ve gotten into habit of wrapping most things that implement IDisposable in a &#39;using&#39; statement, then you&#39;ll be wondering why the hell you can&#39;t read from the Requests&#39;s InputStream property using a StreamReader without your request pipeline breaking.&lt;br /&gt;
&lt;br /&gt;
Turns out, that you mustn&#39;t dispose of the StreamReader immediately, as when you do this it will implicitly dispose of your InputStream also.&lt;br /&gt;
&lt;br /&gt;
So, declare your StreamReader as a private member of your Module class, and only explicitly Dispose of it within the pre-canned Dispose method in the Module class.&lt;br /&gt;
&lt;br /&gt;
Like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:csharp&quot; name=&quot;code&quot;&gt;  public class LoggingModule : IHttpModule
    {
        private StreamReader reader; // Declare the StreamReader here

        public void Dispose()
        {
            if (this.reader != null)  // Dispose of it here
                this.reader.Dispose();  
        }

        public void Init(HttpApplication context)
        {
          
            context.LogRequest += new EventHandler(context_LogRequest);
        }

        void context_LogRequest(object sender, EventArgs e)
        {
            // DO NOT DISPOSE OF IT HERE!
            // It&#39;ll can your InputStream object if you do
            this.reader = new StreamReader(HttpContext.Current.Request.InputStream);

            string s = reader.ReadToEnd();

            //Do some funky stuff with the text content of the input stream
        }      
    }     
&lt;/pre&gt;
&lt;br /&gt;
Goes without saying, remember to use BinaryReader if you&#39;re not reading plain text in the input stream (in this case, I&#39;m getting the payload of a POST request).</content><link rel='replies' type='application/atom+xml' href='http://e-junkie-chronicles.blogspot.com/feeds/402526417775704318/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1588656802322476923/402526417775704318' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/402526417775704318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/402526417775704318'/><link rel='alternate' type='text/html' href='http://e-junkie-chronicles.blogspot.com/2013/02/aspnet-modules-reading-inputstream-with.html' title='ASP.NET Modules - reading InputStream with StreamReader'/><author><name>James Love</name><uri>http://www.blogger.com/profile/16992127964869412719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4I04pfPTNLzdSr5Bp3Riyhmo6aa8tmKGnqIudWP-VhZbDponrPOWye3gkRO7zV1ln3sINgVgEx9MjNPTtNNKzaUIbl27xSaHKThMBaJyJYbYfw5BTWeRyp8o5Fhxgew/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1588656802322476923.post-4462128955372642160</id><published>2012-12-20T08:54:00.001+00:00</published><updated>2012-12-20T08:54:39.612+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="administration"/><category scheme="http://www.blogger.com/atom/ns#" term="central admin"/><category scheme="http://www.blogger.com/atom/ns#" term="fba"/><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint"/><title type='text'>Unable to resolve NTLM or Windows users in People Picker in Central Admin</title><content type='html'>This totally drove me round the bend.&lt;br /&gt;
&lt;br /&gt;
If you&#39;re in Central Administration and you can resolve FBA accounts find but not NTLM, then check to make sure you&#39;re on the correct Alternate Access Mapping for the site.&lt;br /&gt;
&lt;br /&gt;
You might be using http://centraladmin.mydomain.local:12345 and it may not work, until you access Central Admin via http://centraladmin:12345.&lt;br /&gt;
&lt;br /&gt;
Also, if you have a Claims-aware web application with both FBA and NTLM memberships (extended or not) and you have broken the configuration for FBA, this may also break NTLM resolution of names. Make sure you have the Membership provider delcared properly in Central Admin, the Secure Token Service and the target web application.</content><link rel='replies' type='application/atom+xml' href='http://e-junkie-chronicles.blogspot.com/feeds/4462128955372642160/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1588656802322476923/4462128955372642160' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/4462128955372642160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/4462128955372642160'/><link rel='alternate' type='text/html' href='http://e-junkie-chronicles.blogspot.com/2012/12/unable-to-resolve-ntlm-or-windows-users.html' title='Unable to resolve NTLM or Windows users in People Picker in Central Admin'/><author><name>James Love</name><uri>http://www.blogger.com/profile/16992127964869412719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4I04pfPTNLzdSr5Bp3Riyhmo6aa8tmKGnqIudWP-VhZbDponrPOWye3gkRO7zV1ln3sINgVgEx9MjNPTtNNKzaUIbl27xSaHKThMBaJyJYbYfw5BTWeRyp8o5Fhxgew/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1588656802322476923.post-6514799924270141443</id><published>2012-12-13T19:07:00.001+00:00</published><updated>2012-12-16T21:56:39.169+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="api"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="ios"/><category scheme="http://www.blogger.com/atom/ns#" term="iphone"/><category scheme="http://www.blogger.com/atom/ns#" term="objective c"/><category scheme="http://www.blogger.com/atom/ns#" term="REST"/><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint"/><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint 2013"/><title type='text'>SharePoint 2013 REST API in iOS</title><content type='html'>This post and the included code is the result of a couple of weeks of confusion, hard work and a tonne of research and collaboration between myself and &lt;a href=&quot;https://twitter.com/mosslover&quot; target=&quot;_blank&quot;&gt;Becky Isserman&lt;/a&gt;. There is very little documentation out there on how to do this so we hope that some people will get some use out of this.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;TL:DR - show me da code:&amp;nbsp;&lt;a href=&quot;https://github.com/jimmywim/SPRestAPI&quot;&gt;https://github.com/jimmywim/SPRestAPI&lt;/a&gt;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;I&#39;ve written a proper usage guide to the API too, available here:&amp;nbsp;&lt;a href=&quot;https://github.com/jimmywim/SPRestAPI/wiki/Usage&quot; target=&quot;_blank&quot;&gt;https://github.com/jimmywim/SPRestAPI/wiki/Usage&lt;/a&gt;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
All of this relates to the Office 365 offering of SharePoint Online, not the on-premises SharePoint Server 2013 (yet). The methods used here aren&#39;t (I think) documented and things are subject to change, so I&#39;ll try to keep the code up to date for those downloading this at a later date.&lt;br /&gt;
&lt;br /&gt;
The basic task of using any sort of API with SharePoint is authentication. Getting SharePoint to know who you are and for you (the client software) to remember who you are is made easy with the Microsoft provided APIs (Managed and JavaScript Client Object Models), but there is very little out there for anything else. With the release of SharePoint 2013 and the App Model, there has been talk (that I&#39;ve heard) that makes development for SharePoint using iOS, PHP, Ruby, in fact anything, possible. For iOS in particular, we haven&#39;t seen much yet. So we decided to figure it out.&lt;br /&gt;
&lt;br /&gt;
In the .NET world, &lt;a href=&quot;https://twitter.com/wictor&quot; target=&quot;_blank&quot;&gt;Wictor Wilen&lt;/a&gt; wrote &lt;a href=&quot;http://www.wictorwilen.se/Post/How-to-do-active-authentication-to-Office-365-and-SharePoint-Online.aspx&quot; target=&quot;_blank&quot;&gt;this post on actively authenticating to Office 365&lt;/a&gt;. His code demonstrates the steps performed using a helper class he wrote that handles the authentication and the cookie storage needed to remain authenticated. At the heart of his code is some Windows Identity Foundation classes that talks to the SharePoint Secure Store. To replicate what his code does for iOS, I had to use Fiddler Web Debugger to identity what the app was talking to and what messages it was sending.&lt;br /&gt;
&lt;br /&gt;
As he explains in his blog (and as I&#39;ve seen with Fiddler), there are 3 basic steps to authentication:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Pass the username, password and intended site collection to the Secure Token Service exposed by Office 365&lt;/li&gt;
&lt;li&gt;Receive a secure token response from the STS, and pass it to your site&#39;s login page.&lt;/li&gt;
&lt;li&gt;The response from your login page will redirect to your site&#39;s home page, and also include 2 cookies needed to keep you logged in.&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;br /&gt;
The first step is performed using WIF code, and essentially authors a SOAP envelope with your authentication data included. The response from this is packaged into a regular Web Request and sent to your site&#39;s login page using standard .NET APIs. The cookies from this are then stored and added to each subsequent request to your SharePoint site to ensure you&#39;re kept logged in. If you wish to &#39;log out&#39;, you only need to discard the cookies (and possibly make a request to SignOut.aspx, incase there is any Session information stored on the server that needs to be cleared).&lt;br /&gt;
&lt;br /&gt;
So, let&#39;s describe how I&#39;ve implemented the above concepts into a re-usable framework for iOS. Hopefully I&#39;ve made this as simple as possible, though at this stage the code can only issue GET requests, and therefore can&#39;t add new data to a site.&lt;br /&gt;
&lt;br /&gt;
I should probably point out that I&#39;m no expert programmer in Objective C, having come from a C# background of nearly 8 years experience. There are parts of the code I don&#39;t fully understand (in particular, the delegates) and parts that are just syntactically wrong or could be done better. I&#39;m very open to suggestions on how to improve parts, even if just for widening my own understanding of the language.&lt;br /&gt;
&lt;br /&gt;
First we need to authenticate. I do this using a class called SPClaimsHelper.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot; name=&quot;code&quot;&gt;    NSString *site = siteUrlField.text;
    NSString *username = usernameField.text;
    NSString *password = passwordField.text;
    
    SPClaimsHelper *spClaims = [[SPClaimsHelper alloc] initWithUsernamePasswordSite:username password:password site:site];
    [spClaims setDelegate:(id)self];
    [spClaims GetTokens];
&lt;/pre&gt;
The call to GetTokens initiates the authentication process to log into SharePoint and retrieve your cookies. This class issues a delegate when this is completed to let your application proceed as &#39;logged in&#39;.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot; name=&quot;code&quot;&gt;- (void)tokenDelegate: (SPClaimsToken *)tokenClass didReceiveToken: (int)count
{
    NSLog(@&quot;Tokens received&quot;);
    MasterViewController *masterVC = [[MasterViewController alloc] init];
    [self presentViewController:masterVC animated:TRUE completion:nil];
}
&lt;/pre&gt;
&lt;br /&gt;
This code above simple logs that the tokens have been received and loads the next ViewController.&lt;br /&gt;
&lt;br /&gt;
Once we&#39;re logged in, we can then issue queries:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot; name=&quot;code&quot;&gt;    SPRESTQuery *titleQuery = [[SPRESTQuery alloc] initWithUrlRequestId:@&quot;http://mycompany.sharepoint.com/_api/web/Title&quot; id:@&quot;SiteTitle&quot;];
    [titleQuery setDelegate:(id)self];
    [titleQuery executeQuery];
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
At this stage of development, you&#39;ll see I&#39;ve not implemented &#39;remembering&#39; the site collection URL, so the request currently has to include this. Hopefully someone can do a more efficient implementation when using this code such that the site collection URL remains defined once and re-used for the queries.&lt;br /&gt;
&lt;br /&gt;
An interesting point to note here is the &#39;id&#39; parameter of the SPRESTQuery&#39;s init method. Here I pass in a string with which I can identify which request has completed within the response&#39;s delegate method.&lt;br /&gt;
&lt;br /&gt;
Here&#39;s an example of the delegate method handling this request (plus my shoddy idea of how delegates are structured, but hey - it works):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot; name=&quot;code&quot;&gt;-(void)SPREST:(id)SPREST didCompleteQueryWithRequestId:(SMXMLDocument *)result requestId:(NSString *)requestId{
    
    if (requestId == @&quot;SiteTitle&quot;)
    {
        SMXMLElement *bodyElement = result.root;
        NSString *titleText = [bodyElement value];
        self.navigationItem.title = titleText;
        webtitle = titleText;
    }
    [self.tableView reloadData];
}
&lt;/pre&gt;
&lt;br /&gt;
When we issue more requests from within the same ViewController (or other class) that has the SPRESTQuery&#39;s delegate, we can use the requestId to identify which request has completed.&lt;br /&gt;
&lt;br /&gt;
As you can see, the response XML is returned as an SMXMLDocument object, which comes thanks to these guys, for making an awesomely simple XML parser:&amp;nbsp;&lt;a href=&quot;https://github.com/nfarina/xmldocument&quot;&gt;https://github.com/nfarina/xmldocument&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
And that&#39;s all there is to it!&lt;br /&gt;
&lt;br /&gt;
Finally, here&#39;s the link to the GitHub repository where I&#39;ll be maintaining the code.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://github.com/jimmywim/SPRestAPI&quot;&gt;https://github.com/jimmywim/SPRestAPI&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Cheers!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://e-junkie-chronicles.blogspot.com/feeds/6514799924270141443/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1588656802322476923/6514799924270141443' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/6514799924270141443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/6514799924270141443'/><link rel='alternate' type='text/html' href='http://e-junkie-chronicles.blogspot.com/2012/12/sharepoint-2013-rest-api-in-ios.html' title='SharePoint 2013 REST API in iOS'/><author><name>James Love</name><uri>http://www.blogger.com/profile/16992127964869412719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4I04pfPTNLzdSr5Bp3Riyhmo6aa8tmKGnqIudWP-VhZbDponrPOWye3gkRO7zV1ln3sINgVgEx9MjNPTtNNKzaUIbl27xSaHKThMBaJyJYbYfw5BTWeRyp8o5Fhxgew/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1588656802322476923.post-4335918343710709229</id><published>2012-11-25T13:39:00.002+00:00</published><updated>2012-11-25T13:49:44.093+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="conference"/><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint conference"/><category scheme="http://www.blogger.com/atom/ns#" term="spc12"/><title type='text'>SharePoint Conference 2012</title><content type='html'>So this year I was given the opportunity to go to the Microsoft SharePoint Conference at The Mandalay Bay Convention Center in Las Vegas this year, and damn was it an experience! After a week of being back in the UK I thought I&#39;d just jot down a few thoughts on the conference overall, as well as some key messages I took away from the event.&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;
&lt;i&gt;EDIT: This turned out way longer and less organised than expected. The conference, however, passed way quicker and was far more organised than this :)&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;
&lt;br /&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: right; margin-left: 1em; text-align: right;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://fbcdn-sphotos-g-a.akamaihd.net/hphotos-ak-prn1/29358_533768065756_1740895030_n.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;https://fbcdn-sphotos-g-a.akamaihd.net/hphotos-ak-prn1/29358_533768065756_1740895030_n.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Mandalay Bay Hotel overlooking the Convention Center&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;b&gt;We&#39;re all headed to the big blue!&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
MS were really pushing Cloud stuff big time. Most session demos were hosted in Office 365, and given the problems with the wireless connectivity, most of these demos seemed to work really well! They were keen to show off the performance of Office 365 too in the keynote, where the demo environment was apparently hosted in datacenters in the Netherlands (some 8000km away) with sub-1 second page loads every time (though how they forced their environment not to use a geographically closer one I don&#39;t know, and something they didn&#39;t allude to either). New technology demos (of the App Model for SharePoint and Office) were all using Azure-hosted solutions too.&lt;br /&gt;
&lt;br /&gt;
It was emphasized (although only a couple of times) that the &#39;classic model&#39; of SharePoint development (now known as &#39;full-trust solutions&#39;) are still fully supported &#39;for the time being&#39;, though it&#39;s strongly suggested to consider the new App Model (starting with SharePoint Hosted) when scoping out new development requirements for projects. It was also made &#39;official&#39; that the Sandbox environment is officially deprecated, though Sandbox solutions will still work, they probably won&#39;t at all in vNext.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Opportunity awaits!&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Going on from the App Model for Office and SharePoint, they were keen to demonstrate that it&#39;s now possible to develop small apps for the two that can be available for purchase from the App Stores for both products, which present opportunities to monetize on add-ons that can be available to potentially millions of Office users across the world as everyone upgrades to Office 2013 (although I reckon it&#39;ll probably take until the vNext release of Office to get to serious numbers of potential customers).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Simplicity wins the crowd&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Throughout the week I saw examples of the crowd going &#39;nuts&#39; (from minor applauses to raucous cheering) for the most trivial of updates to the user experience, from things like dragging &amp;amp; dropping directly into document libraries in the browser, to the ability to paste &#39;raw text&#39; from formatted documents such as Word into Publishing page text fields. It seems true that no matter what huge architectural changes you make to the platform, people still love the smaller changes that the end users actually notice. Good to see Microsoft making these changes though.&lt;br /&gt;
&lt;br /&gt;
Everything works much better in other browsers now, too. Even &#39;Napa&#39;, the browser-based development environment for SharePoint-Hosted apps works perfectly in Chrome. Think of a trimmed-down Visual Studio with a full code editor (complete with IntelliSense and syntax checking), but without a Design view, and that is Napa. Very impressive, and even moreso by the fact it works in Chrome.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;SharePoint Designer? What SharePoint Designer?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Although I attended maybe around a dozen of sessions throughout the week, I don&#39;t think I even heard SPD being mentioned once. We all know (or should&#39;ve by now) that the Design View has gone (making some people &lt;a href=&quot;http://social.technet.microsoft.com/Forums/en-US/sharepointitpropreview/thread/8f8e2cb3-a90f-4653-9d22-050f9f0d8612&quot; target=&quot;_blank&quot;&gt;kinda pissed&lt;/a&gt;, to say the least) one thing I did notice is that according to the&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/jj164060.aspx#DeprecatedAPIs&quot; target=&quot;_blank&quot;&gt; MSDN Documentation&lt;/a&gt;, there are some deprecated API sets, both of which I believe SPD uses almost exlusively. Does this mean huge changes to SPD vNext, or maybe it&#39;ll be disappearing altogether!&lt;br /&gt;
&lt;br /&gt;
One of the coolest things to come to SharePoint 2013 for designers is the ability to author their designs using whatever HTML design package they fancy (they demonstrated Dreamweaver), and to upload their designs directly into SharePoint (using something called the Design Manager) and have it generate the masterpage for the site. This might be another downfall for SharePoint Designer, who knows. I didn&#39;t see any sessions on creating Page Layouts though (I only saw one WCM session but it didn&#39;t touch on this), so I&#39;ve yet to see how these fall into the Design Manager in SP2013.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Yammer&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
I&#39;m beginning to hate that word. Purely for the lack of direction that Microsoft seem to be taking with this seemingly rushed aquisition. They&#39;ve sweetened the deal for some, by giving all new Office 365 customers the full (normally paid-for) Yammer service as part of the bundle. Integration between the two services seems very hack-and-slash, with the ability to &#39;link&#39; through to SharePoint from Yammer, and to roll-up content from Yammer into SharePoint, but that&#39;s about it. Yammer got a decent amount of coverage in the Keynote, but everything that was shown off about Yammer was already a feature in SharePoint&#39;s Social features, but the two are completely separate. I really hope that either Yammer is fully pulled into SharePoint or the Social features of SharePoint get dropped, as this is one area of Microsoft where it seems there is no clear vision whatsoever on where things are going. If I was a key decision maker I&#39;d be pretty frustrated at this.&lt;br /&gt;
&lt;br /&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: left; margin-right: 1em; text-align: left;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://fbcdn-sphotos-b-a.akamaihd.net/hphotos-ak-ash4/374543_533768280326_1543460602_n.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;https://fbcdn-sphotos-b-a.akamaihd.net/hphotos-ak-ash4/374543_533768280326_1543460602_n.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;The Keynote was quite well presented, felt like some &lt;br /&gt;
huge concert&amp;nbsp;from the front row&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;b&gt;Freebies? What Freebies?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Considering the tickets for this conference were verging on $2,000 each, one thing that was hushly mentioned throughout the week was the fact that a few weeks previous, attendees to the Build conference received a Surface with Windows RT and a Nokia Lumia 920, whereas we got nothing of the sort. I do suppose you have to remember that this conference is not primarily a developer conference, but you&#39;d have though that if they were pushing Cloud so much, there&#39;d be some kind of discount or vouchers for Azure and Office 365 (longer than the standard 90 days that currently anyone can get). There was occasions though, where you thought that you (or your company) has paid nearly $2,000 to be advertised to for four days. It&#39;s a cleanly good job, however, that were the usual community speakers, recognized faces, and networking opportunities that helped make the conference an awesome all-round experience.&lt;br /&gt;
&lt;br /&gt;
In the Expo Hall there was an area devoted to Microsoft Products we all know and use daily, such as Visual Studio, Project, a stand for web stuff, and others. Manning these stands were folks from the Product Groups and communities who were keen to talk about new stuff and give demos. That was pretty neat for anyone who didn&#39;t get a full pass and an Exhibit-Hall only one.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Entertainment&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Unfortunately due to heavy jetlag I was unable to make it out to the Monday night parties, but the general message from others was that the Avepoint Red Party seemed to be the best (closely followed by Axceler&#39;s party) - though I did nip for a bit out with a few folks to the Vesper Cocktail bar at The Cosmopolitan (a very swanky place indeed, though at the time I had no idea how prestigious a cocktail bar it is!).&lt;br /&gt;
&lt;br /&gt;
Jon Bon Jovi and The Kings of Suburbia played a pretty decent set on the Tuesday night event at the Mandalay Bay beach resort outside the hotel, I think that the gig had just the right amount of &#39;cheese&#39; that you could hand to 10,000 IT folks.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Overall&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Overall the conference was indeed worth it. A huge advert at times, but enough of the usual suspects to make up for it. Here&#39;s the biggest messages:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Cloud is better&lt;/li&gt;
&lt;li&gt;Full-trust solutions out, Azure In&lt;/li&gt;
&lt;li&gt;Social is still vision-less but still talked about hell of a lot&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bitterac.posterous.com/&quot; target=&quot;_blank&quot;&gt;Andrew Clark&lt;/a&gt; knows his cocktails&lt;/li&gt;
&lt;li&gt;It is indeed possible to feed 10,000 folk without massive queues, and provide real table service!&lt;/li&gt;
&lt;li&gt;Next time I do something like this, head out a few days earlier to recover from jetlag, and to see some other sights the place has to offer!&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://e-junkie-chronicles.blogspot.com/feeds/4335918343710709229/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1588656802322476923/4335918343710709229' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/4335918343710709229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/4335918343710709229'/><link rel='alternate' type='text/html' href='http://e-junkie-chronicles.blogspot.com/2012/11/sharepoint-conference-2012.html' title='SharePoint Conference 2012'/><author><name>James Love</name><uri>http://www.blogger.com/profile/16992127964869412719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4I04pfPTNLzdSr5Bp3Riyhmo6aa8tmKGnqIudWP-VhZbDponrPOWye3gkRO7zV1ln3sINgVgEx9MjNPTtNNKzaUIbl27xSaHKThMBaJyJYbYfw5BTWeRyp8o5Fhxgew/s220/me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1588656802322476923.post-3624552611398461596</id><published>2012-07-19T15:45:00.002+01:00</published><updated>2012-07-19T15:45:57.104+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="preview"/><category scheme="http://www.blogger.com/atom/ns#" term="reporting services"/><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint 2013"/><title type='text'>Reporting Web Service Proxy does not exist in the farm - SharePoint 2013 Preview and SQL Server Reporting Services</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM-eyWjXofNtzBim0Gu8uhtoBPwqjR9Ah9FHx9imIP4aCc9Yv8sWB3zsmwb5OPTwWv0YQa6bYPo8r38C-11uOrO9BvECGtvbSWMfoFJwb_QwTYraBVxwg5vDM6waFVJwVOE0vTf4npeFs/s1600/RSServiceAppFail.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM-eyWjXofNtzBim0Gu8uhtoBPwqjR9Ah9FHx9imIP4aCc9Yv8sWB3zsmwb5OPTwWv0YQa6bYPo8r38C-11uOrO9BvECGtvbSWMfoFJwb_QwTYraBVxwg5vDM6waFVJwVOE0vTf4npeFs/s1600/RSServiceAppFail.PNG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
If you get the above error when trying to create a SQL Server Reporting Service Service Application with SharePoint Server 2013 Preview, you will need to register the RS Service Proxy via powershell..&lt;br /&gt;
&lt;br /&gt;
Follow these steps to do this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ol style=&quot;color: #2a2a2a; font-family: &#39;Segoe UI&#39;, &#39;Lucida Grande&#39;, Verdana, Arial, Helvetica, sans-serif; font-size: 12px; line-height: 16px; text-align: left;&quot;&gt;
&lt;li&gt;SharePoint 2010 Management Shell with administrator privileges.Right click the icon and click, &quot;Run As Administrator&quot;. Run the following three cmdlets from the shell:&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &#39;times new roman&#39;;&quot;&gt;Install-SPRSService&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &#39;times new roman&#39;;&quot;&gt;Install-SPRSServiceProxy&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &#39;times new roman&#39;;&quot;&gt;Get-SPServiceInstance -all |where {$_.TypeName -like &quot;SQL Server Reporting*&quot;} | Start-SPServiceInstance&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Verify the SQL Server Reporting Services Service shows status as “Started” on the page: SharePoint 2010 Central Administration -&amp;gt; &quot;Application Management&quot; -&amp;gt; &quot;Manage Services on Server&quot;&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;br /&gt;
Now attempt to create a RS Service Application, it should complete without fail.&lt;br /&gt;
&lt;br /&gt;
This information was found on the&amp;nbsp;&lt;a href=&quot;http://social.technet.microsoft.com/wiki/contents/articles/3942.aspx&quot;&gt;SQL Server 2012 Reporting Services Tips, Tricks, and Troubleshooting&lt;/a&gt; page on TechNet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://e-junkie-chronicles.blogspot.com/feeds/3624552611398461596/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1588656802322476923/3624552611398461596' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/3624552611398461596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/3624552611398461596'/><link rel='alternate' type='text/html' href='http://e-junkie-chronicles.blogspot.com/2012/07/reporting-web-service-proxy-does-not.html' title='Reporting Web Service Proxy does not exist in the farm - SharePoint 2013 Preview and SQL Server Reporting Services'/><author><name>James Love</name><uri>http://www.blogger.com/profile/16992127964869412719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4I04pfPTNLzdSr5Bp3Riyhmo6aa8tmKGnqIudWP-VhZbDponrPOWye3gkRO7zV1ln3sINgVgEx9MjNPTtNNKzaUIbl27xSaHKThMBaJyJYbYfw5BTWeRyp8o5Fhxgew/s220/me.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM-eyWjXofNtzBim0Gu8uhtoBPwqjR9Ah9FHx9imIP4aCc9Yv8sWB3zsmwb5OPTwWv0YQa6bYPo8r38C-11uOrO9BvECGtvbSWMfoFJwb_QwTYraBVxwg5vDM6waFVJwVOE0vTf4npeFs/s72-c/RSServiceAppFail.PNG" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1588656802322476923.post-3471233272086343335</id><published>2012-07-18T14:23:00.001+01:00</published><updated>2012-07-18T14:23:48.018+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="business intelligence"/><category scheme="http://www.blogger.com/atom/ns#" term="preview"/><category scheme="http://www.blogger.com/atom/ns#" term="reporting services"/><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint 2013"/><category scheme="http://www.blogger.com/atom/ns#" term="ssrs"/><title type='text'>SharePoint Server 2013 Preview - Testing BI on SQL Server 2012? You need CTP3!</title><content type='html'>If you have installed SQL Server 2012 and wish to test out the Business Intelligence features (particularly SSRS in SharePoint 2013 Preview) you will need to install SQL Server 2012 SP1 CTP3 - this release is designed solely for testing out the Business Intelligence capabilities of SharePoint Server 2013 Preview.&lt;br /&gt;
&lt;br /&gt;
You can download the installers from the Microsoft Download Centre here:&lt;br /&gt;
&lt;a href=&quot;http://www.microsoft.com/en-us/download/details.aspx?id=30375&quot;&gt;http://www.microsoft.com/en-us/download/details.aspx?id=30375&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
Do note that this page&amp;nbsp;expressly&amp;nbsp;states that this release of SQL Server is for testing BI in SP2013, and not as a regular service pack / patch.&lt;br /&gt;
&lt;br /&gt;
If you don&#39;t use this edition of SQL Server 2012 you may find that you will be unable to create a Reporting Services Service Application in SharePoint 2013. I believe this is because SQL Server 2012 has installed the RS files required for SharePoint Server 2010 (everything in the 14 Hive), and of course SharePoint 2013 Preview has everything it needs in the 15 Hive for normal use.&lt;br /&gt;
&lt;br /&gt;
You can download the ISO image, or for a smaller download size, retrieve the EXE and associated BOX file (the install requires both, and run the EXE file once you&#39;ve got both).</content><link rel='replies' type='application/atom+xml' href='http://e-junkie-chronicles.blogspot.com/feeds/3471233272086343335/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1588656802322476923/3471233272086343335' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/3471233272086343335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/3471233272086343335'/><link rel='alternate' type='text/html' href='http://e-junkie-chronicles.blogspot.com/2012/07/sharepoint-server-2013-preview-testing.html' title='SharePoint Server 2013 Preview - Testing BI on SQL Server 2012? You need CTP3!'/><author><name>James Love</name><uri>http://www.blogger.com/profile/16992127964869412719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4I04pfPTNLzdSr5Bp3Riyhmo6aa8tmKGnqIudWP-VhZbDponrPOWye3gkRO7zV1ln3sINgVgEx9MjNPTtNNKzaUIbl27xSaHKThMBaJyJYbYfw5BTWeRyp8o5Fhxgew/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1588656802322476923.post-3040577176095352565</id><published>2012-07-18T13:36:00.002+01:00</published><updated>2012-07-18T13:37:12.490+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="performancepoint"/><category scheme="http://www.blogger.com/atom/ns#" term="preview"/><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint 2013"/><title type='text'>Connecting to Analysis Services on SQL Server 2012 from PerformancePoint on SharePoint 2013 Preview</title><content type='html'>You might notice in PerformancePoint Dashboard Designer that when you create an Analysis Services Data Source, typing in a server name throws no error but the Database dropdown box never populates.&lt;br /&gt;
&lt;br /&gt;
Look to the event logs and you might find this error shown shortly after loading Dashboard Designer:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;Unable to load custom data source provider type: Microsoft.PerformancePoint.Scorecards.DataSourceProviders.AdomdDataSourceProvider, Microsoft.PerformancePoint.Scorecards.DataSourceProviders.Standard, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;System.IO.FileNotFoundException: Could not load file or assembly &#39;Microsoft.AnalysisServices.AdomdClient, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91&#39; or one of its dependencies. The system cannot find the file specified.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;File name: &#39;Microsoft.AnalysisServices.AdomdClient, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91&#39;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp;at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMarkHandle stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName, ObjectHandleOnStack type)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp;at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark&amp;amp; stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp;at System.Type.GetType(String typeName, Boolean throwOnError)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp;at Microsoft.PerformancePoint.Scorecards.Server.PmServer.InitializeCustomDataSourceProviders()&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;PerformancePoint Services error code 10107.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As you can see, PerformancePoint here isn&#39;t using ADOMD.NET 11, the SQL Server 2012 version.&lt;br /&gt;
&lt;br /&gt;
You need to find the version 10 of ADOMD.NET installer which comes with the SQL Server 2008 R2 Feature Pack from the Microsoft Download Centre. Install this, perform an IIS Reset then open PeformancePoint again to see the Data Source editor working fine once again.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://go.microsoft.com/fwlink/?LinkID=188442&amp;amp;clcid=0x409&quot;&gt;Direct Link for ADOMD.NET10 for x64&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&amp;amp;id=16978&quot;&gt;Microsoft Download Centre page for SQL Server 2008 R2 Feature Pack&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://e-junkie-chronicles.blogspot.com/feeds/3040577176095352565/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1588656802322476923/3040577176095352565' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/3040577176095352565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/3040577176095352565'/><link rel='alternate' type='text/html' href='http://e-junkie-chronicles.blogspot.com/2012/07/connecting-to-analysis-services-on-sql.html' title='Connecting to Analysis Services on SQL Server 2012 from PerformancePoint on SharePoint 2013 Preview'/><author><name>James Love</name><uri>http://www.blogger.com/profile/16992127964869412719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4I04pfPTNLzdSr5Bp3Riyhmo6aa8tmKGnqIudWP-VhZbDponrPOWye3gkRO7zV1ln3sINgVgEx9MjNPTtNNKzaUIbl27xSaHKThMBaJyJYbYfw5BTWeRyp8o5Fhxgew/s220/me.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1588656802322476923.post-8372146238190568056</id><published>2012-06-08T18:19:00.002+01:00</published><updated>2012-06-08T18:19:41.823+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="community"/><category scheme="http://www.blogger.com/atom/ns#" term="rage"/><title type='text'>If You Do This, I Hate You</title><content type='html'>I&#39;ll come clean. I know a lot of what I know because I know how to Google/Bing for answers. Yes, other people have taken the time to answer other&#39;s questions, I just know how to get them.&lt;br /&gt;
&lt;br /&gt;
But there&#39;s a certain kind of person that hampers my efforts in finding out other people&#39;s answers to my questions. If you&#39;re this kind of person - please change your habits lest I hate you forever.&lt;br /&gt;
&lt;br /&gt;
These people are found in the public fora of StackExchange and the MSDN forums. Not so much the StackExchange fora as they&#39;re moderated by the community and so bitchslap these offenders anyway. MSDN forums are not really moderated at all (other than removing sweary posts), have no &#39;negative&#39; voting system and are littered with the following annoying habits:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&#39;Answering&#39; a post with just the words &#39;I have this problem too&#39;&lt;/li&gt;
&lt;li&gt;&#39;Answering&#39; a post with just a link to a blog that now returns a 404, with no explanation as to what was done to resolve the issue&lt;/li&gt;
&lt;li&gt;&#39;Answering&#39; a post with just the words &#39;Thanks, I got it working&#39; with no indication of what was done to resolve their issue&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Seriously folks - by &#39;taking&#39; from the community by just asking for free answers to questions, you can &#39;give&#39; back by being a bit more verbose in your answers. Part of what makes a community great is being able to find answers to any question thanks to those in the community answering questions fully in the first place.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://e-junkie-chronicles.blogspot.com/feeds/8372146238190568056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1588656802322476923/8372146238190568056' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/8372146238190568056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/8372146238190568056'/><link rel='alternate' type='text/html' href='http://e-junkie-chronicles.blogspot.com/2012/06/if-you-do-this-i-hate-you.html' title='If You Do This, I Hate You'/><author><name>James Love</name><uri>http://www.blogger.com/profile/16992127964869412719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4I04pfPTNLzdSr5Bp3Riyhmo6aa8tmKGnqIudWP-VhZbDponrPOWye3gkRO7zV1ln3sINgVgEx9MjNPTtNNKzaUIbl27xSaHKThMBaJyJYbYfw5BTWeRyp8o5Fhxgew/s220/me.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1588656802322476923.post-2344614204961837366</id><published>2012-05-04T23:01:00.002+01:00</published><updated>2012-05-04T23:12:37.337+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Analysis Services"/><category scheme="http://www.blogger.com/atom/ns#" term="business intelligence"/><category scheme="http://www.blogger.com/atom/ns#" term="performance"/><category scheme="http://www.blogger.com/atom/ns#" term="processing"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server"/><category scheme="http://www.blogger.com/atom/ns#" term="SSAS"/><title type='text'>SSAS 2008 R2 Processing Performance Tips</title><content type='html'>I haven&#39;t posted on this for a while as I&#39;ve been neck-deep in a fairly decent sized Business Intelligence project in SQL Server Analysis Services 2008 R2, but have subsequently learnt an enormous amount with regards to performance. So I thought I&#39;d share a list of the biggest things I&#39;ve learnt from various places (mostly Books Online and TechNet) to help make things that bit quicker when you have a large OLAP cube to process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Reduce the number of attributes where ever possible in your dimensions&lt;/b&gt;&lt;br /&gt;
This is particularly important if you have Intermediate Dimensions used for Many to Many relationships. Because these tables can grow enormous relative to the size of the other dimensions, you want to minimize the number of columns that SSAS needs to worry about. If you are using Intermediate Dimensions, remove all but the keys used in the joins, and don&#39;t try to join to other tables. The Intermediate Dimension shouldn&#39;t be visible to the end user anyway (use Perspectives).&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;b&gt;Remove unnecessary attributes from your dimensions where possible.&amp;nbsp;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
Yes, I&#39;ve listed this twice, as it really does help performance. It can also reduce the final footprint of the database on the filesystem!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;b&gt;Script out the process job.&amp;nbsp;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
Use two separate jobs, one to issue a ProcessData command and the other to do ProcessIndexes. By default, a ProcessFull is issued (unless you do an Update), which does both of these, but some other (seemingly unnecessary stuff) and adds about 10% to the overall processing time. If you try to do this with a single job with a Parallel task it&#39;ll probably error out (trying to process indexes on data that doesn&#39;t exist yet).&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;As well as the above, put the two jobs into a SQL Job as two separate steps.&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
This lets you execute these on the server and log off your session, leaving the server precious resource to do its thing.&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Learn XMLA&lt;/b&gt;&lt;br /&gt;
You&#39;ll be doing this as you do the above two steps anyway. In SQL Server Management Studio open up the Template Explorer (from the View menu), switch to Analysis Services (by clicking the Cube at the top of the panel) and play with the different XMLA templates available (careful where you execute the DROP command ;) )&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;If at all possible, have the source relational database on separate physical volumes to where the analysis services databases will end up.&amp;nbsp;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
Not only will this help processing performance, but if your SQL Database instance is used for other things, queries against your cubes shouldn&#39;t aversely affect the performance of that SQL instance. Even better, have it on a separate server and free up those resources! Just make sure you have a VERY good network connection between the two (to speed up reads. Try and get at least 50-100MB/sec transfer rates between the boxes).&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Add more RAM&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
Lots of RAM. Max out the box. &lt;i&gt;Seriously&lt;/i&gt;. As the process happens, it queries SQL Server for the relational data, and this works faster the more RAM it has (buffers fill faster than they can be flushed, it seems), and Analysis Services will grind to a halt if it doesn&#39;t have enough RAM. An easy way to spot if SSAS is low on memory during a process is to spin up Resource Monitor from Task Manager (under Performance Tab), go to the Disk tab, and see what files are currently being requested. If you see minimal CPU usage and many .khstore files being trickled (at 300kb/sec) off disks, SSAS doesn&#39;t have enough RAM (it&#39;s doing what&#39;s known as multipass processing, which in my experience is very, very slow - we&#39;ve seen times go from 12 hours down to 90mins just because we upped a box form 32GB of RAM to 64GB).&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Make sure the Lower Memory Limit is set properly&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
And by properly, keep it around 15-20 below what the Max Limit is set. When SSAS runs after a restart it needs to allocate memory as it needs it, I&#39;m somewhat almost convinced things run faster if it&#39;s already preallocated itself everything when it first starts up. That might just be me though. Just make sure it has enough RAM regardless :P&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Restart the SSAS Service before you process&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
You can either do this or just flush the cache of everything in the instance before you kick off the Process. What you want is for SSAS to have as much RAM as possible for the Process tasks as it can, and for that precious memory not to be taken up with useless* cached queries and aggregations it has hogging up all that juicy memory.&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Have a separate physical box just for processing changes...&lt;/b&gt;... and backup/restore the newly processed cubes onto your staging/production server. This alleviates performance issues on the live cubes to keep users happy. Also this&#39;ll prevent their horrendously complex queries swallowing up the RAM you need to reduce the chance of your Process going into multipass mode. You&#39;ll need a fat wallet for this though. But you&#39;re on a BI project, so you probably knew this fact already, right? :)&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
*everything out of hours is useless, right? And you are doing processing out of hours, right? ;)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
This can probably go on and on, but these are the big ones that jumped out at me. I&#39;ll probably add a &#39;Part Two&#39; at some point with more tips when they come to mind.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Toodle-oo!&lt;/div&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://e-junkie-chronicles.blogspot.com/feeds/2344614204961837366/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1588656802322476923/2344614204961837366' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/2344614204961837366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/2344614204961837366'/><link rel='alternate' type='text/html' href='http://e-junkie-chronicles.blogspot.com/2012/05/ssas-2008-r2-processing-performance.html' title='SSAS 2008 R2 Processing Performance Tips'/><author><name>James Love</name><uri>http://www.blogger.com/profile/16992127964869412719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4I04pfPTNLzdSr5Bp3Riyhmo6aa8tmKGnqIudWP-VhZbDponrPOWye3gkRO7zV1ln3sINgVgEx9MjNPTtNNKzaUIbl27xSaHKThMBaJyJYbYfw5BTWeRyp8o5Fhxgew/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1588656802322476923.post-376509879961340116</id><published>2012-02-13T19:51:00.001+00:00</published><updated>2012-02-13T20:05:36.621+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="beginners"/><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint"/><category scheme="http://www.blogger.com/atom/ns#" term="site collection"/><title type='text'>What The Hell Is A SharePoint Site Collection?</title><content type='html'>Here&#39;s another introductory post about something that I always see confusion over when new users to SharePoint hear these terms - Site Collection and Web site. What the hell is the difference between the two?&lt;br /&gt;
&lt;br /&gt;
Here&#39;s my TL;DR answer (followed by a lengthy discussion):&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;SITE COLLECTIONS DO NOT STORE CONTENT&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
A site collection is just a container for a collection of web sites.&lt;br /&gt;
&lt;br /&gt;
So why do we have a differentiation between that and a website and what&#39;s so special about them?&lt;br /&gt;
&lt;br /&gt;
A site collection groups together websites, and (perhaps most importantly) the security data for these websites. Every piece of &#39;content&#39; in a website, and even the website itself stores information about who can and cannot access it (any developers reading this - SPWeb, SPList and SPListItem inherit a class called &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsecurableobject.aspx&quot;&gt;SPSecurableObject&lt;/a&gt; which provides the security functionality). Incidentally, each of these items also contains a reference to it&#39;s &#39;parent&#39;.&lt;br /&gt;
&lt;br /&gt;
A List Item must exist in a List, therefore it has a parent, and a List must exist in a site, there it has a parent. A Web Site also has a parent, as you can have nested websites. And here&#39;s the interesting part.&lt;br /&gt;
&lt;br /&gt;
To the Site Collection - all the websites within it are in a flat hierarchy (Programmers: &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsite.allwebs.aspx&quot;&gt;SPSite.AllWebs&lt;/a&gt;). The &#39;Parents&#39; of each website are irrelevant to the Site Collection itself - what it does care about is a single website that it denotes as its &#39;Root Website&#39;. There can only be one RootWeb within a Site Collection. This is also known as a Top-Level site in SharePoint (typically, developers will refer to it as the Root Web).&lt;br /&gt;
&lt;br /&gt;
Now, it&#39;s possible to &#39;re-parent&#39; a web site in SharePoint by simply changing it&#39;s URL. Let&#39;s say we have a site collection at URL: &#39;http://server/sites/&#39;. If a website &#39;subsite2&#39; exists at URL &#39;http://server/sites/subsite1/subsite2&#39; then its parent is &#39;subsite1&#39;. If we simply changed the URL to &#39;http://server/sites/subsite2&#39; then its parent is the Root Website of the site collection, which is at &#39;http://server/sites/&#39;.&lt;br /&gt;
&lt;br /&gt;
So if every website has a parent, what about the Root Website of a site collection? It&#39;s a website like any other therefore exposes a Parent, but what does it come back with? Well, URLs are everything when it comes to the hierarchy of a web site. When you ask for the parent, it simply looks for the &#39;next level up&#39; in the URL. If it reaches the actual URL of the site collection, it will return itself.&lt;br /&gt;
&lt;br /&gt;
So a Site Collection contains a flat hierarchy of websites, whose hierarchy is defined in themselves, and these websites store their own security data. What else?&lt;br /&gt;
&lt;br /&gt;
Well, a Site Collection stores references to a bunch of information critical to any web site. This information includes, but is not limited to:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Web Parts&lt;/li&gt;
&lt;li&gt;Users which have access to the website&lt;/li&gt;
&lt;li&gt;Themes&lt;/li&gt;
&lt;li&gt;Sandboxed Solutions&lt;/li&gt;
&lt;li&gt;MasterPages&lt;/li&gt;
&lt;li&gt;List Templates&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Now each of these sets of information is made accessible via special lists that are only accessible from a site collections root website. These Lists do not exists in the same way that they do in any other website in a site collection, instead the &#39;list&#39; is dynamically generated under what&#39;s known as a virtual folder (_catalogs) on the server. SharePoint provides a familiar List interface for interacting and managing this critical metadata.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Exceptions to the list of information above includes Users, but also Content Types and Site Columns. These objects are handled slightly differently as these objects can be associated to have a web site as a parent. &amp;nbsp;As these objects are tied to the site collection, they are restricted to that site collection and cannot typically be shared between. You can add a user to multiple site collections, but if you add her to one site collection, you need to add her manually to another site collection if she must have access to it. A notable exception to this is the&lt;a href=&quot;http://www.sharepoint4developers.net/en-nz/post/sharepoint-2010-content-type-hub.aspx&quot;&gt; Content Type Hub in SharePoint 2010&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
One last point, is that a site collection and all its relevant data, and all the websites that it contains are all stored within a single content database. You can pile as many as you want (up to 250,000!) site collections in a content database, but you cannot split websites across content databases.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So there we have it. A Site Collection is a container for a collection of web sites, with important information that all of the websites use in some way, and a reference to one special website denoted as its Root Web.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://e-junkie-chronicles.blogspot.com/feeds/376509879961340116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1588656802322476923/376509879961340116' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/376509879961340116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/376509879961340116'/><link rel='alternate' type='text/html' href='http://e-junkie-chronicles.blogspot.com/2012/02/what-hell-is-site-collection.html' title='What The Hell Is A SharePoint Site Collection?'/><author><name>James Love</name><uri>http://www.blogger.com/profile/16992127964869412719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4I04pfPTNLzdSr5Bp3Riyhmo6aa8tmKGnqIudWP-VhZbDponrPOWye3gkRO7zV1ln3sINgVgEx9MjNPTtNNKzaUIbl27xSaHKThMBaJyJYbYfw5BTWeRyp8o5Fhxgew/s220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1588656802322476923.post-3230642895846703114</id><published>2012-02-10T19:26:00.000+00:00</published><updated>2012-02-10T19:26:39.333+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="beginners"/><category scheme="http://www.blogger.com/atom/ns#" term="c#"/><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint"/><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint development"/><title type='text'>SharePoint Development - What to Learn?</title><content type='html'>I thought I&#39;d jot down a few things which I believe fresh SharePoint developers need to know when they&#39;re confronted with the daunting task of developing something for SharePoint for the first time.&lt;br /&gt;
&lt;br /&gt;
SharePoint development has a massively steep learning curve. It literally takes years to get good at not only developing solutions in SharePoint, but also using the right techniques and tools to develop those solutions. And the reason for this is because the platform itself is so big. There are so many facets to consider when choosing how to architect a solution, as well as the tools available are themselves quite involved. Not only does it take a long time to learn how to develop, it can take just as long, if not even longer, to understand the full capabilities of the tools at hand.&lt;br /&gt;
&lt;br /&gt;
In this post I&#39;m going to list a few key &#39;areas&#39; I think any first time developer should look into, gain a brief understanding of, and most importantly, be aware of, when getting started with SharePoint. Not only will this make the new developer aware of the scale of the task ahead, but also (hopefully) give some direction as to what technologies they should research as they go into the journey that is SharePoint Development.&lt;br /&gt;
&lt;br /&gt;
I have added various links to pages I think will give you a start in reading about the various areas. Some of these links may be written for earlier versions of SharePoint but the topic may still be relevant in SharePoint 2010. If I haven&#39;t included a link for a specific topic... I&#39;m sure you know how to use Google :)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Microsoft SharePoint Foundation&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
This might sound obvious, but it is vital. If you are going to develop for SharePoint, you need to know SharePoint. And know it well. If you&#39;re new to SharePoint and have been given the task of building a solution in it (I feel for you if that&#39;s the case, many of us have been there!), you already have a mountain of a task ahead of you. It won&#39;t take too long, and there are plenty of resources out there, but you need to gain an understanding of what SharePoint is already capable of, without customisation.&lt;br /&gt;
&lt;br /&gt;
This brief list is a collection of things I believe you need to have a basic understanding of:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;How Lists and Libraries work&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://sp365.co.uk/2012/01/initial-topology-planning-site-collections-vs-subsites/&quot;&gt;How Site Collections are related to Web Sites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://sp365.co.uk/2011/07/introduction-to-content-types/&quot;&gt;How Content Types work within Site Collections and web sites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;How permissions work within Site Collections&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://nishantrana.wordpress.com/2009/04/25/understanding-iis-web-site-and-sharepoint-web-application/&quot;&gt;What Web Applications are&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;How Web Apps are tied into IIS&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://technet.microsoft.com/en-us/edge/Video/ff945209&quot;&gt;Know your way around SharePoint Central&amp;nbsp;Administration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.harbar.net/articles/sp2010sa2.aspx&quot;&gt;What a Service Application is&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://technet.microsoft.com/en-us/library/cc678870.aspx&quot;&gt;What a Timer Job is&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;What a Feature is (and what makes up a Feature)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://weblogs.asp.net/soever/archive/2007/05/03/sharepoint-features-elements-scope-and-other-info.aspx&quot;&gt;What Feature Scope is&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.understandingsharepoint.com/justask/what-is-a-wsp-file&quot;&gt;What a SharePoint Solution Package (.wsp file) is&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;What an &lt;a href=&quot;http://www.dotnetcurry.com/ShowArticle.aspx?ID=649&quot;&gt;Event&lt;/a&gt;/&lt;a href=&quot;http://blog.qumsieh.ca/2010/10/07/how-to-attach-an-event-receiver-to-the-web-added-event-and-for-what-purpose/&quot;&gt;Web&lt;/a&gt;/&lt;a href=&quot;http://blog.pentalogic.net/2010/06/sharepoint-feature-receivers-events-details/&quot;&gt;Feature&lt;/a&gt; Receiver is (and how they&#39;re registered)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blogs.msdn.com/b/vesku/archive/2010/10/14/sharepoint-2010-and-web-templates.aspx&quot;&gt;What a web template is (and what they consist of)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://sharepointchick.com/archive/0001/01/01/site-definitions-vs.-webtemplates.aspx&quot;&gt;What a site definition is (and what they consist of)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
That list is not exhaustive, but I think it&#39;s a brief look at the scale of what makes up a SharePoint environment in terms of what&#39;s customisable. Also note, that none of the above necessarily means any C# source code is involved, though quite a few are built up of XML files.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Microsoft SharePoint Server&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
You what? There&#39;s more? Damn right. SharePoint Server is essentially a licensed pack of enterprise-level customisations built on top of SharePoint Foundation. Whilst I&#39;m not going to list here what you should know about SharePoint Server, you should at least have a look around on the &lt;a href=&quot;http://sharepoint.microsoft.com/en-us/Pages/default.aspx&quot;&gt;Microsoft website for SharePoint &lt;/a&gt;to see the differences between the editions of SharePoint, and see what&#39;s &quot;available&quot; in terms of feature sets. Each of these has a significant amount of documentation already on what they do, how to set them up, and what they&#39;re capable of.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
A couple of elements I will suggest that a new developer look at is how the &lt;a href=&quot;http://technicallead.wordpress.com/2011/02/09/sharepoint-publishing-how-are-the-components-related/&quot;&gt;Publishing framework &lt;/a&gt;works within SharePoint Server 2010, and &lt;a href=&quot;http://blogs.msdn.com/b/ecm/archive/2010/04/12/variations-in-sharepoint-2010-connecting-people-with-content.aspx&quot;&gt;Variations&lt;/a&gt;. You don&#39;t at this stage need to know in-depth of how to create a page layout, for example (unless you&#39;re being thrown into a Web Content Management project!), but at least have an awareness of how page layouts work, how they&#39;re tied closely into Content Types and the special &quot;Pages&quot; library in a Publishing site. Variations is a method of creating versions of content targeted to specific locales (languages) or devices (mobiles, tablets, etc). This is a slightly complex framework that is not at all customisable, but you should have an awareness of how this works just in case it sounds like a feature that you may need one day (and also know when to avoid it!).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Is this necessary if you only have SharePoint Foundation in your environment? Absolutely - if you want to strike up a cost-benefit analysis to see if it&#39;s cheaper to develop and support a small piece of functionality that&#39;s already available (and fully supported) in SP Server, or if there are features that will satisfy requirements, and benefit the rest of the business by upgrading your licenses to SharePoint Server.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
In short, for this and the previous section - a good SharePoint Developer has a clear understanding of the majority of the capabilities of the platform as it comes.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Microsoft Office 365 SharePoint Online&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
This is yet another SharePoint offering from Microsoft which provides hosted services. If your environment is hosted in this manner, this will affect the decisions you make in terms of your architect for your solution. There are many differences and restrictions to what&#39;s possible for customising SharePoint Online in Office 365 compared to &#39;on premises&#39; environments, and as a developer, you should read up on what those differences are.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/gg317460.aspx&quot;&gt;Here&#39;s a link on MSDN&lt;/a&gt; as an overview of SharePoint Online for the developer.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;The Tools - SharePoint Designer&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Learning what SharePoint is already capable of is a very steep struggle as it&#39;s so expansive a platform. There are a fair number of business cases that it can easily satisfy from just configuring a SharePoint site, for example creating lists, libraries, applying simple branding themes, alerts, etc. SharePoint Designer is a client application that can connect to a SharePoint web site and provide an easy way to quickly create lists, content types, and even simple workflows. You can also do slightly more advanced customisations in terms of modifying Publishing page layouts and web part pages, for example to provide advanced List Views with custom XSL style sheets to display data in any way you want.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
As a developer you need to understand that this tool connects directly to a SharePoint site, know that restrictions can be put in place as to what can done in SharePoint Designer, and what is ultimately possible.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Here&#39;s a link to an &lt;a href=&quot;http://sp365.co.uk/2011/07/introduction-to-sharepoint-designer-2010/&quot;&gt;introduction to SPD&lt;/a&gt; on the SP365 website.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
It&#39;s also possible to extend SharePoint Designer - you can add more &#39;workflow actions&#39; to allow workflow designers in SharePoint Designer to do satisfy more business specific scenarios. This kind of customisation of SPD leads onto the next section...&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;The Tools - Visual Studio&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
Visual Studio 2010 is the tool most associated with the developer. The developer is seen as a code hack who lives in VS and swims in C# and XML all day. Whilst this may be true for some, a good developer has a reasonable cause to go to Visual Studio. They want their solution to be easily re-deployable, to be version-controlled, and most likely, the feature set provided with SharePoint Designer and the SharePoint platform itself does not satisfy the original business requirement.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So, what do you need to know about Visual Studio? Hell of a lot, before you even start writing code! There is a good selection of different project and item templates provided with Visual Studio, and they have their shortcomings. The SharePoint community has satisfied many of these shortcomings with the &lt;a href=&quot;http://cksdev.codeplex.com/&quot;&gt;CKS:Dev toolkit&lt;/a&gt; available from codeplex. But before diving straight in and getting the template, you need to fully understand the capabilities of the templates already provided, what restrictions you may have if you go straight into a CKS:Dev template - for example if you&#39;re in a team environment, other team members may not be able to open your projects if you created it from a CKS dev template!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
You also need to understand how Packages and Features are structured within a Solution in Visual Studio, how SharePoint Project Items in Visual Studio can be inserted into Features, how Feature Scope is set up, how to add SafeControl elements to items, how to add extra assemblies into a package (in addition to those generated by a Visual Studio Project).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
If you&#39;re developing in Visual Studio, or think you may need to do so, then you&#39;ll need to understand that will never, ever, EVER deploy to a live environment. You will always develop to a local server. You may need to have a virtual machine with a SharePoint environment set up and running, with Visual Studio also installed, and you develop in that environment. You will also need to understand that what you develop, is tested and debugged in your local environment, but it absolutely must, with no exceptions, be deployed on a test environment (completely separate to your development environment) which closely matches that of the live environment (but again, is completely separate from the live environment).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Already the costs involved here are very high - you need licenses for Visual Studio, Windows Server and SharePoint for your Virtual Machine, you need an environment which can closely match the live environment for testing your solution. As these costs are already quite high (and you&#39;ve not even spent a day writing code towards your solution yet!), you better have a good knowledge of SharePoint itself, and SharePoint Designer, to justify going to these lengths, and be certain you&#39;re not reinventing the wheel, and not redeveloping something SharePoint can already do.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;The Technologies - ASP.NET&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
SharePoint Foundation is a very complex application structure built on top of ASP.NET, which is an application development framework designed to produce web-based systems. The development of ASP.NET is, and has been for the past 8 years, far quicker than that of SharePoint. To give an example, the version number of ASP.NET that SharePoint runs on is ASP.NET 3.5. The most current version of ASP.NET is 4.0. There are quite a lot of &lt;a href=&quot;http://www.wiseowl.co.uk/versions/asp.net/&quot;&gt;very cool features in ASP.NET 4.0&lt;/a&gt; that you cannot take advantage of within SharePoint, as these features are not compatible with SharePoint. We will not see SharePoint use ASP.NET 4.0 until the next version (which may be released next year). At this time, ASP.NET 5 will be under development and may even have a release soon after SharePoint&#39;s next release.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The short of that is, if you are coding for SharePoint 2010, ensure everything you do is built towards ASP.NET 3.5.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
More of what you need to know about ASP.NET is the basic building blogs, such as master pages, the &#39;web.config&#39; file, the Page Lifecycle (what events are triggered in code as a page is loaded), caching, etc.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
With Visual Studio 2010, there is the Web Application template provided, can you can create and test out simple ASP.NET Web Applications that run on your development environments own debugging web server.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
You don&#39;t need to have a fantastically in-depth view of ASP.NET, but again, at least have an awareness of what makes up an ASP.NET website and how pages are built.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;The Technologies - C#&amp;nbsp;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
FINALLY, THE CODEZ! Yup, once you&#39;ve got an idea of how all the above works, you can finally be let loose on some code. But what to code? And how? Well there are plenty of tutorials for &#39;simple&#39; projects for getting started with code, but here&#39;s what I think a new developer should look at in terms of learning C# for SharePoint Development:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikibooks.org/wiki/C_Sharp_Programming/Syntax&quot;&gt;C# Syntax&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/dd460654.aspx&quot;&gt;Object Oriented Programming for C#&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/zw4w595w(v=vs.90).aspx&quot;&gt;.NET Framework fundamentals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Only develop in .NET 3.5 when coding for SharePoint 2010&lt;/li&gt;
&lt;li&gt;How to browse the MSDN Class Libraries&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms473633.aspx&quot;&gt;The SharePoint Object model&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The following classes and how they are linked to SharePoint itself:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsite.aspx&quot;&gt;SPSite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spweb.aspx&quot;&gt;SPWeb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.splist.aspx&quot;&gt;SPList&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.splistitem.aspx&quot;&gt;SPListItem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.administration.spwebapplication.aspx&quot;&gt;SPWebApplcation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.administration.spfarm.aspx&quot;&gt;SPFarm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.administration.spjobdefinition.aspx&quot;&gt;SPJobDefinition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.utilities.sputility.aspx&quot;&gt;SPUtility&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div&gt;
That list is nowhere near exhaustive. SharePoint development in C# is probably the largest topic, as there is many, many ways to solve the same problem using a custom coded solution.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
You should also be aware of &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/gg615454.aspx&quot;&gt;what restrictions you have&lt;/a&gt; when development for the &#39;Sandboxed&#39; User Code environment, available both in SharePoint Foundation, but also the only option when doing custom development for SharePoint Online in Office 365. &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/hh147180.aspx&quot;&gt;The Developer Guide for Office 365&lt;/a&gt; is available on MSDN.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;That&#39;s NOT all folks...&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
This post has barely scratched the surface of SharePoint development, and I have not covered &lt;a href=&quot;http://sp365.co.uk/2011/09/how-to-use-the-sharepoint-client-object-model/&quot;&gt;Client Side Development Techniques&lt;/a&gt; or &lt;a href=&quot;http://sharepoint911.com/blogs/laura/default.aspx&quot;&gt;Infopath&lt;/a&gt;! However, I think (and hope) it gives people some direction as to what tools and technologies and areas they need to research and do their homework on, to satisfy that oft-asked question... &quot;How do I get started with SharePoint Development?&quot;.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://e-junkie-chronicles.blogspot.com/feeds/3230642895846703114/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1588656802322476923/3230642895846703114' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/3230642895846703114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/3230642895846703114'/><link rel='alternate' type='text/html' href='http://e-junkie-chronicles.blogspot.com/2012/02/sharepoint-development-what-to-learn.html' title='SharePoint Development - What to Learn?'/><author><name>James Love</name><uri>http://www.blogger.com/profile/16992127964869412719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4I04pfPTNLzdSr5Bp3Riyhmo6aa8tmKGnqIudWP-VhZbDponrPOWye3gkRO7zV1ln3sINgVgEx9MjNPTtNNKzaUIbl27xSaHKThMBaJyJYbYfw5BTWeRyp8o5Fhxgew/s220/me.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1588656802322476923.post-6173523219169110872</id><published>2012-02-05T17:11:00.002+00:00</published><updated>2012-02-05T17:14:49.736+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="branding"/><category scheme="http://www.blogger.com/atom/ns#" term="css"/><category scheme="http://www.blogger.com/atom/ns#" term="sharepoint"/><title type='text'>Applying CSS Customisations in SharePoint - A Technique</title><content type='html'>Having done numerous branding exercises in SharePoint over the past few years, I have had the opportunity to try out various different methods of both loading CSS into your environment, and also the actual writing of the CSS.&lt;br /&gt;
&lt;br /&gt;
I have previous covered methods of loading CSS, and spoke about it in a video, which you can view here:&amp;nbsp;&lt;a href=&quot;http://e-junkie-chronicles.blogspot.com/2011/10/video-sharepoint-branding-with-css.html&quot;&gt;Video - SharePoint Branding with CSS Customisations&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
In this post I&#39;m going to show a technique for writing CSS that I&#39;ve recently came across, that definitely can help to improve both legibility of your CSS files, but also the reusability and flexibility of the classes you customise.&lt;br /&gt;
&lt;br /&gt;
My first couple of branding attempts in SharePoint (back in the 2007 days) were examples of what I&#39;d describe as &#39;blanket&#39; branding. Each element I wanted to change, I would select in Firebug or Chrome&#39;s DOM explorer, find out the CSS that applied whatever was there, and write a line of CSS to change it.&lt;br /&gt;
&lt;br /&gt;
This quickly resulted in a rapidly growing CSS file that would apply a single look and feel across the entire site, and proved very difficult to modify later on.&lt;br /&gt;
&lt;br /&gt;
Here is a method that makes your specific CSS changes much more &#39;modular&#39;, in that all you need to do to apply the specified change is to (somehow) wrap the selected element in a DIV or SPAN with a particular class.&lt;br /&gt;
&lt;br /&gt;
Here&#39;s an example of why this would be useful. Let&#39;s say you wanted to have two List Views on a page, but you wanted one to have a different title bar colour to the other. Now the title bar is covered by CSS class &#39;ms-standardheader&#39;. If you apply a style change to this class, it will affect both (and all other) instances of the List View on the page (and all other pages!).&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6X5IVJ9lBZTK3wWNg0qonOloJoQP2FfGlJkCAywwU05RZvrRyOgO-bU7-BqIoqhZFPjKNdS_NaZmJmC-N5_Nfd5f7xsupvkEJuTNzrUC9wVU8LMvAlFGDATkBg_NfZDDEjn-W5VpAWfE/s1600/Screen+shot+2012-02-05+at+16.55.36.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;231&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6X5IVJ9lBZTK3wWNg0qonOloJoQP2FfGlJkCAywwU05RZvrRyOgO-bU7-BqIoqhZFPjKNdS_NaZmJmC-N5_Nfd5f7xsupvkEJuTNzrUC9wVU8LMvAlFGDATkBg_NfZDDEjn-W5VpAWfE/s400/Screen+shot+2012-02-05+at+16.55.36.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
If you were to duck into the HTML Editor for this page, and see how the two ListViews have been added:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDQVr7KuyA6ZxJj1Q9XJEgOT9ZlnnRvhMeeFsa0imuuSKihFn5NDPXT1isupY1B98KjQBKdgUON_3O-u9GSA3UYHnJjkTyMKPgedkU4_11dJIYTMI_2bGYqFyDo1uI-OnUFyamV3p_OnM/s1600/Screen+shot+2012-02-05+at+16.58.23.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDQVr7KuyA6ZxJj1Q9XJEgOT9ZlnnRvhMeeFsa0imuuSKihFn5NDPXT1isupY1B98KjQBKdgUON_3O-u9GSA3UYHnJjkTyMKPgedkU4_11dJIYTMI_2bGYqFyDo1uI-OnUFyamV3p_OnM/s1600/Screen+shot+2012-02-05+at+16.58.23.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieZpF5lVvffcg1jR1Wy4KxqXHc7H1iQjlyocZRJOZdIvLdxSAgMGz37l4rO8q79MojOF-wZj5fU8y9o14u1kDP2jl4djOoNW2oEAeGH40gzRk6BNGFoYLFZ4xkR3twQLhXERG1VphD_Rc/s1600/Screen+shot+2012-02-05+at+16.59.34.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;153&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieZpF5lVvffcg1jR1Wy4KxqXHc7H1iQjlyocZRJOZdIvLdxSAgMGz37l4rO8q79MojOF-wZj5fU8y9o14u1kDP2jl4djOoNW2oEAeGH40gzRk6BNGFoYLFZ4xkR3twQLhXERG1VphD_Rc/s320/Screen+shot+2012-02-05+at+16.59.34.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
What we want to do is to wrap the two list views each inside a DIV container, and apply a different class to each. We&#39;ll call one &#39;blue&#39; and one &#39;green&#39;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQUZjZgJH7feHLtrB_a8GyQ5I0YQrhyphenhyphenIwW_tLSL_rud7VsRhYuWNpzhSBMy8cuw7-NZGqNAmw4ddFelyZhCiTfBsJDHZNjTtEbVamclD0egd0WN4XcTa-lCguzHFL3ZFBhOF1TVfu3Mas/s1600/Screen+shot+2012-02-05+at+17.01.48.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;218&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQUZjZgJH7feHLtrB_a8GyQ5I0YQrhyphenhyphenIwW_tLSL_rud7VsRhYuWNpzhSBMy8cuw7-NZGqNAmw4ddFelyZhCiTfBsJDHZNjTtEbVamclD0egd0WN4XcTa-lCguzHFL3ZFBhOF1TVfu3Mas/s320/Screen+shot+2012-02-05+at+17.01.48.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Now we want to write and deploy some CSS. You can use whatever method you&#39;re used to, for this I&#39;m using my favourite method of a DelegateControl to load up an ASCX with CssRegistration. See the video linked above for how to do this.&lt;br /&gt;
&lt;br /&gt;
The CSS I&#39;ve written for this example looks like this:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOflPqYbUpvvjikDbEQw3vLJe3D04LCcHdE8gYR5Yzkrc9AJkJWHsyvqzcAwMwrdBQPpZBsKxVyOM5AAk_0VyG3X20_i0D2_vCga2muTi0APAjak9x9yhj3HFxFf-PPGrmJY5RIV8hbdI/s1600/Screen+shot+2012-02-05+at+17.03.26.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;166&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOflPqYbUpvvjikDbEQw3vLJe3D04LCcHdE8gYR5Yzkrc9AJkJWHsyvqzcAwMwrdBQPpZBsKxVyOM5AAk_0VyG3X20_i0D2_vCga2muTi0APAjak9x9yhj3HFxFf-PPGrmJY5RIV8hbdI/s320/Screen+shot+2012-02-05+at+17.03.26.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
As you can see, this is a really straight forward background colour change to each element. I&#39;m using the CSS wrapper that we added to the content above to contain the ms-standardheader class, and applying different style changes to each &#39;wrapped&#39; element.&lt;br /&gt;
&lt;br /&gt;
Get your CSS into the environment and see the results:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEeacFHWA_R_WyrIZ2udwuhwckaQxPkAF5Zw0ibP-ZorF-gSU2NLKOXCSnjSqIH0Jl5DI342oi54q5FhMt12SmpkQA3mUDQavmcLyfv_0PpUDaWf8T_OSAFxpbLA85XNJQqOle_dgVK_c/s1600/Screen+shot+2012-02-05+at+17.05.32.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;246&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEeacFHWA_R_WyrIZ2udwuhwckaQxPkAF5Zw0ibP-ZorF-gSU2NLKOXCSnjSqIH0Jl5DI342oi54q5FhMt12SmpkQA3mUDQavmcLyfv_0PpUDaWf8T_OSAFxpbLA85XNJQqOle_dgVK_c/s320/Screen+shot+2012-02-05+at+17.05.32.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
OK, not the most accessible example :) But you can see the premise. I have a usable CSS class that I can use to set the colour of any List View title bar on a page.&lt;br /&gt;
&lt;br /&gt;
You can extend this technique to entire pages, by adding an overall &#39;wrapper&#39; to the page layout around the content fields, or even the entire site by modifying the master page and adding a &#39;wrapper&#39; around the content placeholders.&lt;br /&gt;
&lt;br /&gt;
Let me know if you use this technique, or if you have other techniques that you typically use that you&#39;d like to share.</content><link rel='replies' type='application/atom+xml' href='http://e-junkie-chronicles.blogspot.com/feeds/6173523219169110872/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1588656802322476923/6173523219169110872' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/6173523219169110872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1588656802322476923/posts/default/6173523219169110872'/><link rel='alternate' type='text/html' href='http://e-junkie-chronicles.blogspot.com/2012/02/applying-css-customisations-in.html' title='Applying CSS Customisations in SharePoint - A Technique'/><author><name>James Love</name><uri>http://www.blogger.com/profile/16992127964869412719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='28' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4I04pfPTNLzdSr5Bp3Riyhmo6aa8tmKGnqIudWP-VhZbDponrPOWye3gkRO7zV1ln3sINgVgEx9MjNPTtNNKzaUIbl27xSaHKThMBaJyJYbYfw5BTWeRyp8o5Fhxgew/s220/me.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6X5IVJ9lBZTK3wWNg0qonOloJoQP2FfGlJkCAywwU05RZvrRyOgO-bU7-BqIoqhZFPjKNdS_NaZmJmC-N5_Nfd5f7xsupvkEJuTNzrUC9wVU8LMvAlFGDATkBg_NfZDDEjn-W5VpAWfE/s72-c/Screen+shot+2012-02-05+at+16.55.36.png" height="72" width="72"/><thr:total>5</thr:total></entry></feed>