<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://unfoldingneurons.com/"
	>

<channel>
	<title>SharePoint Magazine</title>
	<atom:link href="http://sharepointmagazine.net/feed" rel="self" type="application/rss+xml" />
	<link>http://sharepointmagazine.net</link>
	<description>SharePoint Magazine is an online Magazine dedicated to the world of SharePoint</description>
	<lastBuildDate>Fri, 12 Mar 2010 12:38:24 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Sharepoint 2010 and Authentication</title>
		<link>http://sharepointmagazine.net/technical/administration/sharepoint-2010-and-authentication</link>
		<comments>http://sharepointmagazine.net/technical/administration/sharepoint-2010-and-authentication#comments</comments>
		<pubDate>Fri, 12 Mar 2010 12:36:18 +0000</pubDate>
		<dc:creator>Mint</dc:creator>
				<category><![CDATA[Administration]]></category>
		<category><![CDATA[Customisation]]></category>
		<category><![CDATA[2010]]></category>
		<category><![CDATA[authentication]]></category>
		<category><![CDATA[Based]]></category>
		<category><![CDATA[FBA]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[forms]]></category>
		<category><![CDATA[iis7]]></category>
		<category><![CDATA[kernal]]></category>
		<category><![CDATA[sharepoint]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=3932</guid>
		<description><![CDATA[In the following article I will introduce and show you how to enable the Windows (Kernel Mode Authentication) in Shareoint 2010 based on the new security settings built into Windows 2008.]]></description>
			<content:encoded><![CDATA[<p>In the last few articles I&#8217;ve shown you how to configure FBA in MOSS 2010 and @007 as well as shown you the fundamental difference in Windows Authentication and FBA. In the following article I will introduce and show you how to enable the Windows (Kernel Mode Authentication) in Shareoint 2010 based on the new security settings built into Windows 2008.</p>
<p><strong>Sharepoint 2010 Kernel-mode Authentication</strong></p>
<p>This is a new setting in IIS7 (Windows 2008 and Vista SP1) that when enabled increases authentication performance by requiring less switching between user-mode and kernel-mode code.</p>
<p>You can find this setting in Authentication section in IIS</p>
<p><img src="http://sharepointmagazine.net/wp-content/uploads/2010/03/figure-1.jpg" alt="" width="224" height="234" /></p>
<p><strong>Figure 1: Authentication  Settings in IIS</strong></p>
<p>Then right click &#8220;<em>Windows Authentication</em>&#8221; and click &#8220;<em>Advanced Settings&#8230;</em>&#8221;</p>
<p><img src="http://sharepointmagazine.net/wp-content/uploads/2010/03/figure-2.jpg" alt="" width="269" height="319" /></p>
<p><strong> Figure 2: IIS Advanced Windows Authentication Settings</strong></p>
<p><a href="http://blog.michelbarneveld.nl/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/michel/IIS-Authentication-_2D00_-Advanced-Settings.png"></a></p>
<p>And there you have the toggle box to switch Kernel-mode Authentication on or off.</p>
<p><img src="http://sharepointmagazine.net/wp-content/uploads/2010/03/figure-3.jpg" alt="" width="436" height="323" /></p>
<p><strong> Figure 3: Kernel Mode Authenication </strong></p>
<p><a href="http://blog.michelbarneveld.nl/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/michel/IIS-_2D00_-Kernel_2D00_mode-authentication.png"></a></p>
<p>And according to the description we want to have it enabled: &#8220;&#8230;<em>improve authentication performance and prevent authentication problems&#8230;</em>&#8221; <img src='http://sharepointmagazine.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><strong><br />
Kerberos-only authentication provider (Negotiate:Kerberos provider)</strong></p>
<p>Before this setting was introduced if you wanted to use Kerberos, you would use the Negotiate authentication provider instead of NTLM. However the Negotiate provider will fall back to NTLM authentication if Kerberos authentication fails. So there was no way to enforce Kerberos. With this new provider you can enforce Kerberos.It will <strong>not</strong> fall back to NTLM.</p>
<p>You can find that setting in the same Authentication section as above. However you choose &#8220;<em>Providers&#8230;</em>&#8221; instead of &#8220;<em>Advanced Settings&#8230;</em>&#8220;.</p>
<p><img src="http://sharepointmagazine.net/wp-content/uploads/2010/03/figure-4.jpg" alt="" width="346" height="313" /></p>
<p><strong> Figure 4: Provider Settings</strong></p>
<p><a href="http://blog.michelbarneveld.nl/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/michel/IIS-Authentication-_2D00_-Providers.png"></a></p>
<p>And that will give you option to select which Authentication Provider to use:</p>
<p><img src="http://sharepointmagazine.net/wp-content/uploads/2010/03/figure-5.jpg" alt="" width="376" height="310" /></p>
<p><strong> Figure 5: Available Providers</strong></p>
<p><a href="http://blog.michelbarneveld.nl/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/michel/IIS-Authentication-_2D00_-All-providers.png"></a></p>
<p>So there are 3 options: NTLM, Negotiate and Negotiate:Kerberos.</p>
<p>When you select <em>Negotiate:Kerberos</em> and have Kernel-mode authentication turned on, you will get the following warning however:</p>
<p><img src="http://sharepointmagazine.net/wp-content/uploads/2010/03/figure-6.jpg" alt="" width="413" height="165" /></p>
<p><strong> Figure 6: Providers Dialog Box</strong></p>
<p><a href="http://blog.michelbarneveld.nl/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/michel/Negotiate-Kerberos-Error.png"></a></p>
<p>So this new provider is not compatible with Kernel-mode authentication. NTLM and Negotiate are compatible and will not give this warning.</p>
<p><strong>Negotiate provider and Kernel-mode authentication</strong></p>
<p>Note that the setting of Kernel-mode Authentication will change the behaviour of the Negotiate provider.</p>
<p>If Kernel-mode authentication is enabled, then the Kerberos tickets will be decrypted with the local system account. That means that your SPN must be register to the machine account!!!<br />
If Kernel-mode authentication is disabled, it will show the normal behaviour of decrypting Kerberos tickets with the application pool identity. The SPN must be registered to the used application pool identity then.</p>
<p><em>&#8220;So you change the account you register the SPN on when using Kernel-mode, so what&#8217;s the deal?&#8221;</em><br />
Well, if you are using a (loadbalanced) multi web frontend SharePoint farm (which is like 95% of the SharePoint farm configurations I do), you must run the application pool on each web server with the same domain account if you want to use Kerberos. The SPN for the loadbalanced url can only be registered to 1 single account and not to 2 or more machine accounts, otherwise Kerberos authentication will fail.<br />
So this would mean that you can&#8217;t use Kernel-mode authentication when doing Kerberos on a webfarm.</p>
<p><strong>There is a way however to use Kernel-mode authentication and Kerberos authenticated webfarms</strong>.<br />
There is a setting which is <strong>NOT in the GUI interface of IIS</strong>to enable the use of the Application Pool Identity to decrypt the Kerberos tickets. It&#8217;s explained in the <a href="http://technet.microsoft.com/en-us/library/dd573004(office.13).aspx" target="_blank">OCS 2007 R2 documentation</a>, which basically tells us to set the <strong><em>useAppPoolCredentials </em></strong>attribute to <strong><em>true</em></strong> of the <strong><em>WindowsAuthentication</em></strong> element in the file <strong><em>%windir%\system32\inetsrv\config\ApplicationHost.config.</em></strong> This look like some undocumented feature because it&#8217;s not in the <a href="http://msdn.microsoft.com/en-us/library/aa347472.aspx" target="_blank">documentation</a></p>
<p>Example of configuration:<br />
&lt;system.webServer&gt;<br />
&lt;security&gt;<br />
&lt;authentication&gt;<br />
&lt;windowsAuthentication enabled=&#8221;true&#8221;<strong> useAppPoolCredentials=&#8221;true&#8221;</strong> /&gt;<br />
&lt;/authentication&gt;<br />
&lt;/security&gt;<br />
&lt;/system.webServer&gt;</p>
<p><strong>What are the SharePoint 2010 defaults?</strong></p>
<p>When you create a new webapplication you have the choice of using Negotiate (Kerberos) or NTLM as the authentication provider.</p>
<p><img src="http://sharepointmagazine.net/wp-content/uploads/2010/03/figure-8.jpg" alt="" width="394" height="312" /></p>
<p><strong> Figure 7: Authentication Providers in MOSS 2010</strong></p>
<p><a href="http://blog.michelbarneveld.nl/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/michel/SharePoint-_2D00_-Security-Configuration.png"></a></p>
<p><strong>Negotiate (Kerberos)<br />
</strong>Before I tested this I was wondering if on a Windows Server 2008 R2 environment the <strong>Negotiate:Kerberos</strong>(Kerberos only) or the normal <strong>Negotiate</strong> provider was used.<br />
I created a new web application and it enabled the <strong>normal</strong> <strong>Negotiate</strong> and <strong>NTLM authentication  provider</strong> and <strong>Kernel-mode authentication was turned off.<br />
</strong>That the Kernel-mode was turned off makes some sense: a lot of SharePoint farms will use multiple web frontends and setting a hidden and lesser documented setting in IIS to make it work might create extra support calls But if Kernel-mode was turned off anyway, they could have used the Kerberos only provider. But maybe there is some kind of compatibilty issue?</p>
<p>I have tested SharePoint 2010 in a webfarm with the following 2 scenario&#8217;s:<br />
1) Negotiate:Kerberos (Kerberos only) and Kernel-mode authentication turned off<br />
2) Negotiate (Normal Negotiate) and Kernel-mode authentication plus the useAppPoolCredentials setting in the ApplicationHost.config file</p>
<p>And they both worked without problems with SharePoint 2010. So I am not sure if there was some design reason behind this. I&#8217;ll ask some friends at Microsoft about this soon.</p>
<p><strong>NTLM<br />
</strong>So now NTLM. When you choose it, it will <strong>only enable the NTLM</strong> provider and <strong>turns off Kernel-mode authentication</strong>. Normally Kernel-mode is on by default. But SharePoint turns it off. I have no idea why. I tested it when turned on and it worked with SharePoint 2010. So the SharePoint team probably decided somewhere to turn it off.</p>
<p><strong>Note: </strong></p>
<p>SharePoint 2010 (beta 2) does not use the new authentication features offered by Windows Server 2008 and R2. It will turn off the use of Kernel-mode authentication. Hopefully I have some answers soon if this was a design choice. In my testing scenario&#8217;s SharePoint 2010 can work in Kernel-mode. I haven&#8217;t discovered any issues yet.</p>
<p><strong>Conclusion:</strong></p>
<p>In closing there are multiple ways to allow users to gain access to your sites in both MOSS 2010 and MOSS 2007. I have found however that MOSS 2010 has allowed administrators to configure these settings a lot quicker using the above mentioned built in settings as opposed to re-creating completed authentication methods from scratch. As you may have also noticed from this article IIS 7 and MOSS 2010 work a lot better to MOSS 2007 and IIS 6 to anyone that has worked with the latter probably knows what sort of headaches it has caused and convoluted solutions to the most basic of authentication situations.</p>
<p>Hope you&#8217;ve enjoyed the series and I will look to continue ellaborating more on the authenticaion models used and possible scenarios whcih would best suit each solution in the near future.</p>
]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/technical/administration/sharepoint-2010-and-authentication/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[Partner Spotlight: Mint]]></series:name>
	</item>
		<item>
		<title>Forms Authentication vs. Windows Authentication in SharePoint</title>
		<link>http://sharepointmagazine.net/technical/administration/forms-authentication-vs-windows-authentication-in-sharepoint</link>
		<comments>http://sharepointmagazine.net/technical/administration/forms-authentication-vs-windows-authentication-in-sharepoint#comments</comments>
		<pubDate>Thu, 11 Mar 2010 16:23:21 +0000</pubDate>
		<dc:creator>Mint</dc:creator>
				<category><![CDATA[Administration]]></category>
		<category><![CDATA[Customisation]]></category>
		<category><![CDATA[2007]]></category>
		<category><![CDATA[2010]]></category>
		<category><![CDATA[authentication]]></category>
		<category><![CDATA[Based]]></category>
		<category><![CDATA[FBA]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[forms]]></category>
		<category><![CDATA[sharepoint]]></category>
		<category><![CDATA[vs]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=3878</guid>
		<description><![CDATA[Now that you're aware of the Authentication types in MOSS 2007 and MOSS 2010 I thought it would be necessary to go into the differences and pros and cons between the two.]]></description>
			<content:encoded><![CDATA[<p><a href="http://sharepointmagazine.net/wp-content/uploads/2010/03/FBAvsWin2.jpg"></a><a href="http://sharepointmagazine.net/wp-content/uploads/2010/03/FBAvsWIN1.jpg"></a><a href="http://sharepointmagazine.net/wp-content/uploads/2010/03/FBAvsWin21.jpg"></a>Now that you&#8217;re aware of the Authentication types in MOSS 2007 and MOSS 2010 I thought it would be necessary to go into the differences and pros and cons between the two.</p>
<p>Note: Both authentication ,methods can be applied to both SharePoint 2007 and SharePoint 2010.</p>
<p>There are several functional and operational differences between sites that are secured with Windows authentication and those that are secured with forms authentication. The following sections highlight several of the more important differences that you should be aware of as you plan your implementation.</p>
<p><strong><span style="text-decoration: underline;">Crawling Content</span></strong></p>
<p>The crawl process for Microsoft Office SharePoint Server 2007 and Windows SharePoint Services 3.0 content (in this article series, collectively referred to as SharePoint Products and Technologies) is designed to use Windows authentication. When Office SharePoint Server 2007 was released, it was not able to crawl content that was secured with forms authentication. In Service Pack 1, SharePoint Products and Technologies includes the ability to set special crawl rules that describe cookie-based authentication so those sites can be crawled. However, it does a simple crawl of the content only, and does not capture security information or the kind of rich metadata that the crawler can gather when using the native SharePoint protocol handler.</p>
<p>For those reasons, whether or not you have applied Service Pack 1, it is recommended that you crawl SharePoint sites protected by forms authentication by using the native SharePoint protocol handler. If your Web application already includes a zone that is secured with Windows authentication, in most cases you can use that zone for crawling. If your Web application has only a single zone and it is secured with forms authentication, you need to extend it into a new zone by using Windows authentication to support the native protocol handler. For more information, see <a href="http://technet.microsoft.com/en-us/library/cc287830.aspx">Prepare to Crawl Host-Named Sites That Use Forms Authentication</a> (Microsoft TechNet).</p>
<p>When you extend the Web application into a new zone, remember the following rules:</p>
<ul type="disc">
<li>If you are using only Windows SharePoint Services, the Default zone must be secured with Windows authentication. If the Default zone is secured with forms authentication and a secondary zone uses Windows authentication, the crawler will not be able to index it.</li>
<li>If you are using Office SharePoint Server 2007, the Default zone can be secured with Windows authentication, but it does not have to be. You can use forms authentication for the Default zone and extend a separate zone for Windows authentication. However, you must change the start address in the default content source to the URL for the Windows authentication zone. When a new Web application is created, a start address is automatically added that uses the URL for the Default zone. Office SharePoint Server 2007 gives you the flexibility to change the values in the list of start addresses, but Windows SharePoint Services does not.</li>
</ul>
<p>To change the start address</p>
<ol type="1">
<li>Open your browser and navigate to the Shared Services Provider (SSP) Web site.</li>
<li>Click the Search Settings link.</li>
<li>Click the Content sources and crawl schedules link.</li>
<li>Click the Local Office SharePoint Server sites link.</li>
<li>In the Edit Content Source page that opens, in the Start Addresses section, edit the addresses in the box.</li>
<li>Click OK to save your changes.</li>
</ol>
<p><strong><span style="text-decoration: underline;">Integrating with the 2007 Microsoft Office System</span></strong></p>
<p>Office SharePoint Server 2007 and Windows SharePoint Services 3.0 users who also have the 2007 Microsoft Office system of applications installed enjoy a high level of integration between the 2007 Office system and SharePoint Products and Technologies. Many of those integration features, however, depend on Windows authentication. Without Windows authentication, some integration points do not work, and others are changed considerably. To help minimize user confusion, SharePoint Products and Technologies offer a mode in which certain menu items that require Windows authentication are removed. In the Central Administration Web site, on the Authentication Provider page, this mode is controlled via the Enable Client Integration box.</p>
<p>When you configure a zone to use forms authentication, the Enable Client Integration box is cleared by default. If a zone is configured in this way, the following changes occur in functionality:</p>
<ul type="disc">
<li>Support for remote interfaces is turned off. That includes WebDAV, SOAP, and Microsoft Office FrontPage remote procedure calls (RPC). Some functionality is not available, such as Web folders or the Web services for accessing content in that site.</li>
<li>Some toolbar items no longer appear:</li>
<li>New Document</li>
<li>Open in Outlook</li>
<li>Open In Windows Explorer</li>
<li>Export to Spreadsheet</li>
<li>Open with Database Program</li>
<li>Explorer View option is hidden.</li>
<li>Create an Access View option is hidden.</li>
<li>In picture libraries, the following functionality is removed:</li>
<li>Upload Multiple</li>
<li>Edit Picture</li>
<li>Download</li>
<li>Send To</li>
<li>On the Edit Control Block (ECB) menu, the drop-down menu that appears when you click items in document libraries, the following items are removed:</li>
<li>Edit in Word</li>
<li>Edit in Excel</li>
<li>Edit in PowerPoint</li>
<li>Discuss</li>
<li>Connect To Outlook</li>
<li>In slide libraries the following functionality is removed:</li>
<li>Publish Slide</li>
<li>Send to PowerPoint</li>
</ul>
<p>Also, syncing SharePoint data with Microsoft Office Outlook no longer works.</p>
<p>When operating in this mode, users can still work with documents in SharePoint libraries, but they must right-click items and choose to save a copy to disk. They can then edit and update the document, and then upload it and check it back in when they are finished editing.</p>
<p>Some organizations might want to use forms authentication, but also require the same level of integration they get when using Windows authentication. There are a couple of possible workarounds in this scenario, but it is helpful to examine why this limitation exists.</p>
<p>When a user accesses a page on a site protected by forms authentication, the server looks for a valid authentication cookie. If no cookie is found, or if the cookie is not valid, the server redirects the browser to the logon page by using an HTTP 302 status code. At this page, the user is allowed to authenticate by using his or her credentials. After the credentials are validated, the server creates a valid authentication cookie and sends it back to the browser, with the originally requested page. The browser keeps the cookie in memory and sends it back to the server with every subsequent request to that Web server. With each request, the server checks the validity of the cookie to ensure that it is good (that it has not expired or been tampered with), and then processes the request.</p>
<p>Because the authentication cookie is in memory with the browser process, it introduces some limitations:</p>
<ul type="disc">
<li>The cookie is retained only as long as the browser is open; when the browser is closed the cookie is destroyed with everything else in memory that the browser was using.</li>
<li>The cookie belongs to the browser&#8217;s application process (such as the .exe file for the browser), and cannot be shared with other processes. Office system applications run in their own processes, for example, msword.exe for Microsoft Office Word. As such, a cookie that a user generated when logging into the site in the browser cannot be shared with Word.</li>
</ul>
<p>The issues described in this article clarify why the Enable Client Integration option was developed: to help make the end-user experience more uniform and predictable in that environment; however, the user experience is somewhat different for users that are accustomed to SharePoint sites secured with Windows authentication. Even with those restrictions, there are still a few options that can be used to allow for using forms authentication and yet still provide many or all of the deep integration points with Office applications that are available when using Windows authentication.</p>
<p><strong><span style="text-decoration: underline;">The Forms Authentication Integration Update for Office 2007</span></strong></p>
<p>When Office SharePoint Server 2007 and Microsoft Office 2007 were first released, the Office client applications such as Microsoft Office Word and Microsoft Office Excel could not directly open a document from a site that was secured with forms authentication. This is because, as explained earlier, a 302 HTTP response code is sent back to the client when it tries to open an item in a site using forms authentication. The Office clients were not able to respond to a 302 response code, and as a result would display the actual forms logon page in the application, instead of the requested document.</p>
<p>An update is available for Office 2007 client applications that allow the applications to process a 302 HTTP response code. The applications that are affected by this update are Microsoft Office Word 2007, Microsoft Office Excel 2007, Microsoft Office PowerPoint 2007 and Microsoft Office SharePoint Designer2007. Because of this update, an Office application can display the forms logon page that is being used for the site in a pop-up dialog box. To do this, the application issues a request to the SharePoint site. The server sends a response that indicates its authentication method is forms authentication, including the location of the logon page that the client should use to authenticate. The Office application then renders the HTML from that logon page and enables the user to enter credentials. The credentials are sent via an HTTP POST back to the server. If the server returns a redirect response for the document that was originally requested, the Office application assumes that the identity is successfully established. It then uses the authorization cookie that the HTTP POST gave it to retrieve the document and any associated metadata, and open the item.</p>
<p>By using this approach, you can use whatever forms authentication logon page the site uses—whether this is the logon page provided with SharePoint Server, a custom logon page, or even a multifactor logon page. The following figure shows an example of the logon dialog box&#8217;s appearance when an item is opened on a SharePoint site that uses the standard forms logon page.</p>
<p><img src="http://sharepointmagazine.net/wp-content/uploads/2010/03/FBAvsWIN1.jpg" alt="" width="618" height="437" /></p>
<p>Figure 1. Standard forms logon page</p>
<p>To implement this support, use the following procedure.</p>
<p>To implement support for Forms Authentication Integration on the client</p>
<ol type="1">
<li>Download the <a href="http://support.microsoft.com/kb/970230">Office 2007 Cumulative Update for April 2009</a> (Microsoft Help and Support).</li>
</ol>
<ol type="1">
<li>Install the service pack on each client computer running Office 2007 from which you want to use the Office client to open documents from a site secured with forms authentication.</li>
<li>Configure the appropriate set of registry values on each client computer to enable the Office client applications to use the forms authentication integration features. For more information about the registry values and their locations and functions, see <a href="http://msdn.microsoft.com/en-us/library/bb977430.aspx#registryvalues">Registry Values</a>.</li>
<li>Install Internet Explorer 7 or later, required to support this feature, on the client computer. However, it is not required to be the default browser.</li>
</ol>
<p>To implement support for Forms Authentication Integration on the farm running SharePoint Server</p>
<ol type="1">
<li>Go to Central Administration, click the Application Management tab, and click the Authentication Providers link.</li>
<li>In the Web Applications drop–down list, select the Web application that contains a forms authentication zone, and then click the link for the zone that is configured to use forms authentication.</li>
<li>On the Settings page for the zone, select the Enable anonymous access check box, and then set Enable Client Integration? to Yes.</li>
</ol>
<p>Figure 2 shows how the authentication settings for the Web application should appear.</p>
<p><img src="http://sharepointmagazine.net/wp-content/uploads/2010/03/FBAvsWin21.jpg" alt="" width="619" height="447" /></p>
<p>Figure 2. Web application authentication settings</p>
<p><strong><span style="text-decoration: underline;">In Closing</span></strong></p>
<p>With having gone through both authentication methods and enabling FBA on both platforms, you will definitely have noticed pros and cons to both, as well as the reason that either of the authentication methods would be likely to be chosen as the required authentication method.</p>
]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/technical/administration/forms-authentication-vs-windows-authentication-in-sharepoint/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[Partner Spotlight: Mint]]></series:name>
	</item>
		<item>
		<title>Setting up Forms Based Authentication for SharePoint 2007</title>
		<link>http://sharepointmagazine.net/technical/administration/setting-up-forms-based-authentication-for-sharepoint-2007</link>
		<comments>http://sharepointmagazine.net/technical/administration/setting-up-forms-based-authentication-for-sharepoint-2007#comments</comments>
		<pubDate>Wed, 10 Mar 2010 17:35:27 +0000</pubDate>
		<dc:creator>Mint</dc:creator>
				<category><![CDATA[Administration]]></category>
		<category><![CDATA[Customisation]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[2007]]></category>
		<category><![CDATA[authentication]]></category>
		<category><![CDATA[Based]]></category>
		<category><![CDATA[FBA]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[forms]]></category>
		<category><![CDATA[sharepoint]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=3880</guid>
		<description><![CDATA[In this article I'll go through SharePoint 2007' s FBA setup which   is built on top of ASP.NET 2.0, so ASP.NET developers should feel right at home developing against, and customizing this method.]]></description>
			<content:encoded><![CDATA[<p><a href="http://sharepointmagazine.net/wp-content/uploads/2010/03/image-1.jpg"></a><a href="http://sharepointmagazine.net/wp-content/uploads/2010/03/image-3.jpg"></a><a href="http://sharepointmagazine.net/wp-content/uploads/2010/03/image-4.jpg"></a><a href="http://sharepointmagazine.net/wp-content/uploads/2010/03/image-5.jpg"></a>In this article I&#8217;ll go through SharePoint 2007&#8242; s FBA setup which   is built on top of ASP.NET 2.0, so ASP.NET developers should feel right at home developing against, and customizing this method.</p>
<p>As most of you are aware some of the technologies in SharePoint, like Master Pages and Forms Authentication, are &#8220;not-quite-the-latest technologies&#8221; from ASP.NET.</p>
<p>In this article, I&#8217;ll cover some of the quirks to Forms Authentication that you will or have encountered when trying to set it up in SharePoint.</p>
<p>Following is a checklist for setting up Forms Authentication in SharePoint 2007</p>
<ol type="1">
<li>Setup the membership data store</li>
<li>Add a new user to the membership data store</li>
<li>Configure SharePoint Central Administration web.config</li>
<li>Configure the SharePoint site&#8217;s web.config</li>
<li>Enable Forms authentication on the SharePoint site</li>
<li>Authorize the Forms-based user to access the site</li>
<li>Login</li>
</ol>
<p>In this article, we will be using the SQL Server membership provider to authenticate users, but you can use any membership provider that you so choose. The steps involved will be about same, but the specifics of those steps may change depending on your provider. I&#8217;m also assuming that you&#8217;ve already installed SharePoint and created the SharePoint site on which you&#8217;re trying to enable forms authentication.</p>
<p><strong><span style="text-decoration: underline;">Step 1: Setup the membership data store</span></strong></p>
<p>Before you can use the SQL Server membership provider, you have to set up the database that the provider uses to store member and role information. Microsoft ships a handy tool named the ASP.NET SQL Server Setup Wizard along with the .NET Framework, which will guide you through the process of creating the table structure and stored procedures required for the provider. You can launch the wizard by running aspnet_regsql.exe from the .NET Framework folder, which is normally found in the following location:</p>
<p>&lt;WindowsDirectory&gt;\Microsoft.NET\Framework\&lt;version&gt;\aspnet_regsql.exe</p>
<p>C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe</p>
<p>When you launch the wizard, the &#8220;Welcome&#8221; screen appears and tells you all sorts of useful things about what the wizard does and the command line parameters you can use to get more options. It makes for great reading. When you&#8217;ve satisfied your literary pallet, click the Next button to display the &#8220;Select a Setup Option&#8221; screen (Figure 1).</p>
<p><img src="http://sharepointmagazine.net/wp-content/uploads/2010/03/image-1.jpg" alt="" width="550" height="427" /></p>
<p>Figure 1 – ASP.NET SQL Server Setup Wizard – Select a Setup Option screen</p>
<p>From the &#8220;Select a Setup Option&#8221; screen, choose the &#8220;Configure SQL Server for application services&#8221; option button. This lets the wizard know you want to add new tables and stored procedures to a membership database. You can also use the wizard to remove the table structure and delete all data in the database, but we don&#8217;t need to deal with that right now. If you accidentally add the structure to the wrong dataset, you may have to deal with it later. Click &#8220;Next&#8221; to move to the &#8220;Select the Server and Database&#8221; screen (Figure 2).</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2010/03/image-2.jpg"><img class="aligncenter size-full wp-image-3926" src="http://sharepointmagazine.net/wp-content/uploads/2010/03/image-2.jpg" alt="" width="550" height="427" /></a></p>
<p>Figure 2 – ASP.NET SQL Server Setup Wizard – Select the Server and Database screen</p>
<p>Enter the name of your database server in the Server textbox to let the wizard know which SQL Server it needs to access. Then enter or select a database name in the Database combo box. The combo box displays a drop down containing a list of existing databases. If you want to add the tables and stored procedures for the provider to an existing database, select the database from the list. If you want to create a new database, then just type the name of the new database directly in the combo box and the wizard will create the database automatically. You may also need to enter SQL Server authentication credentials if you connect to the database using SQL Server authentication instead of Windows authentication. These credentials are not used outside of the wizard, so it won&#8217;t affect your SharePoint configuration one way or the other. Click the Next button to continue to the &#8220;Confirm Your Settings&#8221; screen.</p>
<p>The &#8220;Confirm Your Settings&#8221; screen displays a summary of the epoch-defining choices you&#8217;ve made thus far in the wizard. In other words, the server and database name. If you&#8217;re feeling hesitant about either, then this is your chance to back out. When you&#8217;ve got your courage built up, click the Next button.</p>
<p>In about a second, or about one and half seconds if you&#8217;re using a Virtual PC image (like me), the wizard creates all of the tables and stored procedures required by the membership provider. If it takes longer than that, you&#8217;ve entered a setting incorrectly and the wizard is waiting to time out (or you have a really slow machine). The wizard then displays a final status screen indicating success or failure. If the wizard fails, it details the reasons why so you can fix the problem. There are only six settings in the entire wizard (if you count option buttons as &#8220;settings&#8221;) so you should have a sporting chance at troubleshooting the problem. The success screen just tells you that everything worked and to click the Finish button.</p>
<p>At this point, the database you selected is populated with the proper table structure and stored procedures required by the provider, so now you can add a user to the membership database.</p>
<p><strong><span style="text-decoration: underline;">Step 2: Add a user to the membership data store</span></strong></p>
<p>In IIS 7.0, there is a convenient &#8220;Add User&#8221; feature that uses the membership provider configured for the website to create a user. Unfortunately, IIS 7.0 isn&#8217;t available for Windows Server 2003 so, in a production environment, you&#8217;re probably stuck with IIS 6.0, which doesn&#8217;t have a comparable add user feature. This makes adding users a bit tedious, but here&#8217;s how you do it.</p>
<ol type="1">
<li>Create a new ASP.NET web application</li>
<li>Configure the new application for Forms authentication and point it at your newly-created membership database</li>
<li>Copy the machine key element from your SharePoint site&#8217;s Web.config into to your new web application</li>
<li>Add users and roles using the ASP.NET Web Site Administration Tool (if you have Visual Studio 2005 handy) or create users via the CreateUserWizard ASP.NET control.</li>
</ol>
<p>I&#8217;m assuming you know how to create a new web site, so I&#8217;m not delving into any of the specifics of step 1. Once you have the website created, add a new Web.config to the application root and add the following configuration setting to the file:</p>
<p><strong><em>Listing 01 – Web.config for the User Creation Website</em></strong></p>
<p><em>&lt;?xml version=&#8221;1.0&#8243;?&gt;</em></p>
<p><em>&lt;configuration xmlns=&#8221;</em><a href="http://schemas.microsoft.com/.NetConfiguration/v2.0"><em>http://schemas.microsoft.com/.NetConfiguration/v2.0</em></a><em>&#8220;&gt;</em></p>
<p><em>&lt;connectionStrings&gt;</em></p>
<p><em><strong>&lt;add name=&#8221;MembershipDatabaseCNX&#8221; connectionString=&#8221;SERVER=localhost;</strong></em></p>
<p><em><strong>DATABASE=MembershipDatabase; TRUSTED_CONNECTION=true;&#8221;/&gt;</strong></em></p>
<p><em>&lt;/connectionStrings&gt;</em></p>
<p><em>&lt;system.web&gt;</em></p>
<p><em><strong>&lt;machineKey</strong></em></p>
<p><em><strong>validationKey=&#8221;8E074B186056F889587355255B167DA297AD837E43FD9850&#8243;</strong></em></p>
<p><em><strong>decryptionKey=&#8221;991D4DEB57A2263855C31AA1D3FF4F1AD508A53D2A94658F&#8221;</strong></em></p>
<p><em><strong>validation=&#8221;SHA1&#8243;</strong></em></p>
<p><em><strong>/&gt;</strong></em></p>
<p><em>&lt;authentication mode=&#8221;Forms&#8221;/&gt;</em></p>
<p><em>&lt;membership defaultProvider=&#8221;<strong>DemoMembershipProvider</strong>&#8220;&gt;</em></p>
<p><em>&lt;providers&gt;</em></p>
<p><em>&lt;add</em></p>
<p><em>name=&#8221;<strong>DemoMembershipProvider</strong>&#8220;</em></p>
<p><em>type=&#8221;System.Web.Security.SqlMembershipProvider,</em></p>
<p><em>System.Web, Version=2.0.0.0, Culture=neutral,</em></p>
<p><em>PublicKeyToken=b03f5f7f11d50a3a&#8221;</em></p>
<p><em><strong>connectionStringName=&#8221;MembershipDatabaseCNX&#8221;</strong></em></p>
<p><em>enablePasswordRetrieval=&#8221;false&#8221;</em></p>
<p><em>enablePasswordReset=&#8221;true&#8221;</em></p>
<p><em>requiresQuestionAndAnswer=&#8221;true&#8221;</em></p>
<p><em><strong>applicationName=&#8221;/&#8221;</strong></em></p>
<p><em>requiresUniqueEmail=&#8221;false&#8221;</em></p>
<p><em>passwordFormat=&#8221;Hashed&#8221;</em></p>
<p><em>maxInvalidPasswordAttempts=&#8221;5&#8243;</em></p>
<p><em>minRequiredPasswordLength=&#8221;7&#8243;</em></p>
<p><em>minRequiredNonalphanumericCharacters=&#8221;1&#8243;</em></p>
<p><em>passwordAttemptWindow=&#8221;10&#8243;</em></p>
<p><em>passwordStrengthRegularExpression=&#8221;"</em></p>
<p><em>/&gt;</em></p>
<p><em>&lt;/providers&gt;</em></p>
<p><em>&lt;/membership&gt;</em></p>
<p><em>&lt;roleManager enabled=&#8221;true&#8221; defaultProvider=&#8221;<strong>DemoRoleProvider</strong>&#8220;&gt;</em></p>
<p><em>&lt;providers&gt;</em></p>
<p><em>&lt;add</em></p>
<p><em><strong>name=&#8221;DemoRoleProvider&#8221;</strong></em></p>
<p><em><strong>connectionStringName=&#8221;MembershipDatabaseCNX&#8221;</strong></em></p>
<p><em><strong>applicationName=&#8221;/&#8221;</strong></em></p>
<p><em>type=&#8221;System.Web.Security.SqlRoleProvider, System.Web,</em></p>
<p><em>Version=2.0.0.0, Culture=neutral,</em></p>
<p><em>PublicKeyToken=b03f5f7f11d50a3a&#8221;</em></p>
<p><em>/&gt;</em></p>
<p><em>&lt;/providers&gt;</em></p>
<p><em>&lt;/roleManager&gt;</em></p>
<p><em>&lt;/system.web&gt;</em></p>
<p><em>&lt;/configuration&gt;</em></p>
<p>I&#8217;ve bolded a few areas of Listing 01 because you will need to modify them to work on your system:</p>
<ol type="1">
<li>Replace the machineKey element from the listing with the machine key element in the Web.config from your SharePoint site. The machine key from the listing is the machineKey from my SharePoint site (on a VPC local to my box, so calm down you crazy Hax0rs) so it won&#8217;t do you much good. The machineKey element changes from site to site, so make sure you get it from the site you want to configure for Forms authentication and not another site, or the SharePoint Central Administration site. You need matching machineKeys in the web application and the SharePoint site because user passwords are hashed (one way encrypted) and the hash routine uses the machine key value as part of the hashing algorithm.</li>
<li>Make sure your connection string points at the appropriate server that houses the membership database you just created. Also make sure the appropriate credentials are supplied to the connection string.</li>
<li>You can name your connection string anything you want, just make sure you use the same name later on in the connectionStrngName parameter for the membership and roleManager provider configurations.</li>
<li>Make sure your applicationName parameters match in both the membership and roleManager provider configurations. The SqlMembershipProvider allows multiple applications to use the same membership database, so a mismatched name makes the provider think there are two applications instead of one and your members and roles won&#8217;t associate correctly.</li>
<li>Feel free to configure the password settings of the membership provider as you see fit.</li>
</ol>
<p>Once you have the configuration settings in place for your web application, you need a way to add users. If you are using Visual Studio 2005, you can use the built-in Web Site Administration Tool:</p>
<ol type="1">
<li>Click the Website menu and choose the ASP.NET Configuration menu item. This launches a new web browser window that displays the Web Site Administration Tool.</li>
<li>Click on the Security tab or link.</li>
<li>Click on the Create User link and create a new user. Remember the login information because you&#8217;ll be needing it later.</li>
</ol>
<p>If you do not have Visual Studio 2005, then you can use the CreateUserWizard control to add a new user to the membership database. It&#8217;s not as nice as the Web Site Administration Tool interface, but it does get the job done. Create a new page named CreateUser.aspx and add the following markup to the file:</p>
<p>Listing 02 – CreateUser.aspx</p>
<p lang="en-US">&lt;%@ Page Language=&#8221;C#&#8221; %&gt;</p>
<p lang="en-US">&lt;!DOCTYPE html PUBLIC &#8220;-//W3C//DTD XHTML 1.0 Transitional//EN&#8221;</p>
<p lang="en-US">&#8220;<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</a>&#8220;&gt;</p>
<p lang="en-US">&lt;html xmlns=&#8221;<a href="http://www.w3.org/1999/xhtml">http://www.w3.org/1999/xhtml</a>&#8221; &gt;</p>
<p lang="en-US">&lt;head runat=&#8221;server&#8221;&gt;</p>
<p lang="en-US">&lt;title&gt;Create User Wizard&lt;/title&gt;</p>
<p lang="en-US">&lt;/head&gt;</p>
<p lang="en-US">&lt;body&gt;</p>
<p lang="en-US">&lt;form id=&#8221;form1&#8243; runat=&#8221;server&#8221;&gt;</p>
<p lang="en-US">&lt;asp:CreateUserWizard ID=&#8221;CreateUserWizard1&#8243;</p>
<p lang="en-US">runat=&#8221;server&#8221;&gt;&lt;/asp:CreateUserWizard&gt;</p>
<p lang="en-US">&lt;/form&gt;</p>
<p lang="en-US">&lt;/body&gt;</p>
<p lang="en-US">&lt;/html&gt;</p>
<p>Once you save the file, navigate to the CreateUser.aspx page using your browser and create a new user. One way or another, you should have a user in the membership database at this point.</p>
<p><strong><span style="text-decoration: underline;">Step 3: Configure SharePoint Central Administration Web.config</span></strong></p>
<p>Now that you have a user in the membership database, you&#8217;ve got to let SharePoint know that the user exists and grant the user access to your SharePoint site, which means configuring your site to use Forms authentication. You configure authentication through the SharePoint Central Administration web interface, but Central Administration needs to know about your membership and roleManager providers before that configuration can take place. That means you have to add the appropriate &lt;connectionString&gt;, &lt;membership&gt;, and &lt;roleManager&gt; configuration elements to the Central Administration Web.config. The configuration for Central Administration is almost identical to Listing 01, but this time around you do NOT set the defaultProvider attribute on the &lt;membership&gt; and &lt;roleManager&gt; elements, and do not set the enabled attribute on the &lt;roleManager&gt; element. Also, the Web.config for Central Administration already contains a great deal of configuration data, so make sure you do not accidentally remove or modify any existing settings.</p>
<p>Open the Central Administration&#8217;s Web.config. If you do not know where this is located, use the IIS Manager to determine the home directory for Central Administration and open the Web.config from that directory.</p>
<p>Add the following configuration elements to the Central Administration&#8217;s Web.config. Please note that some element, like &lt;membership&gt;, &lt;connectionStrings&gt;, and &lt;roleManager&gt;, may already exist in the Web.config. If they do, add the child elements to the existing item.</p>
<p>Listing 03 – Additions to the Central Administration Web.config</p>
<p lang="en-US">&lt;?xml version=&#8221;1.0&#8243;?&gt;</p>
<p lang="en-US">&lt;configuration xmlns=</p>
<p lang="en-US">&#8220;<a href="http://schemas.microsoft.com/.NetConfiguration/v2.0">http://schemas.microsoft.com/.NetConfiguration/v2.0</a>&#8220;&gt;</p>
<p lang="en-US">&#8230;</p>
<p lang="en-US">&lt;connectionStrings&gt; &lt;!&#8211; element may already exist &#8211;&gt;</p>
<p lang="en-US">&lt;add name=&#8221;MembershipDatabaseCNX&#8221;</p>
<p lang="en-US">connectionString=&#8221;SERVER=localhost;</p>
<p lang="en-US">DATABASE=MembershipDatabase;</p>
<p lang="en-US">TRUSTED_CONNECTION=true;&#8221;/&gt;</p>
<p lang="en-US">&lt;/connectionStrings&gt;</p>
<p lang="en-US">&#8230;</p>
<p lang="en-US">&lt;system.web&gt;</p>
<p lang="en-US">&#8230;</p>
<p lang="en-US">&lt;membership&gt; &lt;!&#8211; element may already exist &#8211;&gt;</p>
<p lang="en-US">&lt;providers&gt; &lt;!&#8211; element may already exist &#8211;&gt;</p>
<p lang="en-US">&lt;add</p>
<p lang="en-US">name=&#8221;DemoMembershipProvider&#8221;</p>
<p lang="en-US">type=&#8221;System.Web.Security.SqlMembershipProvider,</p>
<p lang="en-US">System.Web, Version=2.0.0.0, Culture=neutral,</p>
<p lang="en-US">PublicKeyToken=b03f5f7f11d50a3a&#8221;</p>
<p lang="en-US">connectionStringName=&#8221;MembershipDatabaseCNX&#8221;</p>
<p lang="en-US">enablePasswordRetrieval=&#8221;false&#8221;</p>
<p lang="en-US">enablePasswordReset=&#8221;true&#8221;</p>
<p lang="en-US">requiresQuestionAndAnswer=&#8221;true&#8221;</p>
<p lang="en-US">applicationName=&#8221;/&#8221;</p>
<p lang="en-US">requiresUniqueEmail=&#8221;false&#8221;</p>
<p lang="en-US">passwordFormat=&#8221;Hashed&#8221;</p>
<p lang="en-US">maxInvalidPasswordAttempts=&#8221;5&#8243;</p>
<p lang="en-US">minRequiredPasswordLength=&#8221;7&#8243;</p>
<p lang="en-US">minRequiredNonalphanumericCharacters=&#8221;1&#8243;</p>
<p lang="en-US">passwordAttemptWindow=&#8221;10&#8243;</p>
<p lang="en-US">passwordStrengthRegularExpression=&#8221;"</p>
<p lang="en-US">/&gt;</p>
<p lang="en-US">&lt;/providers&gt;</p>
<p lang="en-US">&lt;/membership&gt;</p>
<p lang="en-US">&lt;roleManager&gt; &lt;!&#8211; element may already exist &#8211;&gt;</p>
<p lang="en-US">&lt;providers&gt; &lt;!&#8211; element may already exist &#8211;&gt;</p>
<p lang="en-US">&lt;add</p>
<p lang="en-US">name=&#8221;DemoRoleProvider&#8221;</p>
<p lang="en-US">connectionStringName=&#8221;MembershipDatabaseCNX&#8221;</p>
<p lang="en-US">applicationName=&#8221;/&#8221;</p>
<p lang="en-US">type=&#8221;System.Web.Security.SqlRoleProvider,</p>
<p lang="en-US">System.Web, Version=2.0.0.0, Culture=neutral,</p>
<p lang="en-US">PublicKeyToken=b03f5f7f11d50a3a&#8221;</p>
<p lang="en-US">/&gt;</p>
<p lang="en-US">&lt;/providers&gt;</p>
<p lang="en-US">&lt;/roleManager&gt;</p>
<p lang="en-US">&#8230;</p>
<p lang="en-US">&lt;/system.web&gt;</p>
<p lang="en-US">&#8230;</p>
<p lang="en-US">&lt;/configuration&gt;</p>
<p>Now the Central Administration knows about your provider configurations. You would think that having the information in the &#8220;SharePoint Central Administration&#8221; would be enough, but no. You&#8217;ve got to add it to the Web.config in your SharePoint site as well.</p>
<p>NOTE: Notice that Listing 03 never refers to the machineKey. Not even once. This is because you should not mess with the machineKey in SharePoint Central Administration. Leave it alone. Do not change it. Do not delete it. Your provider does not do any encrypting or hashing from the Central Administration, so you don&#8217;t have to synchronize the machineKey between the two sites. If you change the machineKey in Central Administration, bad things could happen.</p>
<p><strong><span style="text-decoration: underline;">Step 4: Configure SharePoint Site Web.config</span></strong></p>
<p>At this point, you should be tired of messing with configuration settings, but the end is near. Go ahead and open the Web.config in the root directory of your SharePoint site, and make the same changes that you made to the SharePoint Central Administration&#8217;s Web.config. Use Listing 03 as your guide. When you are finished, you need to set the defaultProvider attributes in the &lt;membership&gt; and &lt;roleManager&gt; elements, and the enabled attribute in the &lt;roleManager&gt; element, as shown in Listing 04.</p>
<p>Listing 04 – Attributes that appear in the SharePoint site Web.config (but not in the Central Administration Web.config)</p>
<p lang="en-US">&lt;?xml version=&#8221;1.0&#8243;?&gt;</p>
<p lang="en-US">&lt;configuration xmlns=</p>
<p lang="en-US">&#8220;<a href="http://schemas.microsoft.com/.NetConfiguration/v2.0">http://schemas.microsoft.com/.NetConfiguration/v2.0</a>&#8220;&gt;</p>
<p lang="en-US">&#8230;</p>
<p lang="en-US">&lt;system.web&gt;</p>
<p lang="en-US">&#8230;</p>
<p lang="en-US">&lt;membership defaultProvider=&#8221;DemoMembershipProvider&#8221;&gt;</p>
<p lang="en-US">&#8230;</p>
<p lang="en-US">&lt;/membership&gt;</p>
<p lang="en-US">&lt;roleManager enabled=&#8221;true&#8221; defaultProvider=&#8221;DemoRoleProvider&#8221;&gt;</p>
<p lang="en-US">&#8230;</p>
<p lang="en-US">&lt;/roleManager&gt;</p>
<p lang="en-US">&#8230;</p>
<p lang="en-US">&lt;/system.web&gt;</p>
<p lang="en-US">&#8230;</p>
<p lang="en-US">&lt;/configuration&gt;</p>
<p>Once you&#8217;ve entered the configuration settings, SharePoint Central Administration and your SharePoint site have the settings required to enable Forms authentication. Time to jump back to the SharePoint Central Administration site.</p>
<p><strong><span style="text-decoration: underline;">Step 5: Enable Forms Authentication on the SharePoint site</span></strong></p>
<p>You enable Forms Authentication for SharePoint sites using SharePoint Central Administration. Navigate to the Central Admin site using your browser. You can normally find a shortcut to the site in the Start menu:</p>
<p>Programs &gt; Office Server 2007 &gt; SharePoint 3.0 Central Administration</p>
<p>Once the Central Administration Home page is loaded, click on the Application Management link on the left hand navigation bar. You are taken to the Application Management page, which displays a variety of administration links. Click on the Authentication Providers link under the Application Security section on the right hand column of the page. The Authentication Providers page loads, as shown in Figure 3.</p>
<p><img src="http://sharepointmagazine.net/wp-content/uploads/2010/03/image-3.jpg" alt="" width="550" height="460" /></p>
<p>Figure 3 – Authentication Providers screen</p>
<p>When working in SharePoint Central Administration website, make sure the correct Web Application is selected when you are about to change configuration settings; otherwise you&#8217;ll be applying changes to the wrong site. There&#8217;s a small light-blue bar in the content pane of the page that displays the current Web Application URL. Make sure it&#8217;s the web application on which you want to enable Forms authentication. If it&#8217;s not, click the little down-arrow next to the URL and choose &#8220;Change Web Application&#8221; from the drop down list. SharePoint then displays a popup window with a list of web application from which you may choose.</p>
<p>Once you have the right web application selected, the Authentication Providers page displays a list of the zones in that application. Click on the name of the zone in which you want to enable Forms authentication. The Edit Authentication page displays (Figure 4).</p>
<p><img src="http://sharepointmagazine.net/wp-content/uploads/2010/03/image-4.jpg" alt="" width="550" height="388" /></p>
<p>Figure 4 – Edit Authentication Page</p>
<p>In the Edit Authentication page, choose the &#8220;Forms&#8221; option for Authentication Type. The page refreshes and displays the Membership provider and Role manager sections. Enter DemoMembershipProvider in the Membership provider name textbox, and DemoRoleProvider in the Role manager name textbox, then click the Save button. You are taken back to the Authentication Providers screen, but your zone should now say DemoMembershipProvider under the Membership Provider Name column. Forms authentication is now enabled on the site.</p>
<p><strong><span style="text-decoration: underline;">Step 6: Authorize the Forms-based user to access the site</span></strong></p>
<p>Now that Forms authentication is enabled on the site, you can hit the site and see the login form (Figure 6). Microsoft spared no expense making this the blandest form you&#8217;ll ever see. You will probably want to customize it so it looks a lot nicer. Maybe include some text about how the user should enter their username and password. Nobody will read it, but it definitely makes a login form look like a login form. Anyway, if you enter your username and password, you will be successfully authenticated and then promptly denied access because you have no authorization to be in the site. So, how do you get authorization? You have to use the Site Collection Administrator account.</p>
<p>You may remember setting up a Site Collection Administrator when you first created the site a while back, and it was almost certainly a Windows user account. If you extended the site and have both a Windows zone and a Forms authentication zone, then you can login to the Windows zone and setup the Forms user in Site Settings as you would any other user.</p>
<p>If you have not extended the site, then you&#8217;ve only got one zone and its using Forms authentication. As such, the Windows account associated with the site collection administrator is effectively useless and you need to change the site collection administrator over to a Forms based account. To do this, open SharePoint Central Administration and click on the Application Management link in the left navigation menu. When the Application Management page displays, click the Site Collection Administrators link under the SharePoint Site Management section in the left-hand column of the page. The Site Collection Administrators page displays (Figure 5).</p>
<p><img src="http://sharepointmagazine.net/wp-content/uploads/2010/03/image-5.jpg" alt="" width="550" height="397" /></p>
<p>Figure 5 – Site Collection Administrators Page</p>
<p>On the Site Collection Administrators page, make sure that correct site collection is selected. Then, enter the username of the user you created back in Step 2 in the Primary Site Collection Administrator textbox. Click on the Check Names icon (the little red guy with a check mark) next to the textbox. It may take a few seconds, but the page should underline the text in the textbox indicating that the username is valid. If the username is not valid, the page puts a red squiggly line under the username and informs you that the user was not found. If the user is not found, make sure you typed the name correctly. If the issue persists, go back and check your configuration settings to ensure the connection string is valid and there are no typos.</p>
<p>Click on the OK button to save the changes. Your Forms authentication account is now a Site Collection Administrator who has authorization to visit the site. You can use that account to get into the site and setup additional Forms authentication users in Site Settings.</p>
<p><strong><span style="text-decoration: underline;">Step 7: Login</span></strong></p>
<p>When you access the site, you are presented with the previously-mentioned default SharePoint login page (Figure 6). Enter your username and password, and then click the Sign In button. You should be authenticated and authorized, and the site should display as you would expect.</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2010/03/image-6.jpg"><img class="aligncenter size-full wp-image-3930" src="http://sharepointmagazine.net/wp-content/uploads/2010/03/image-6.jpg" alt="" width="550" height="337" /></a></p>
<p>Figure 6 – SharePoint Forms Authentication Login Page</p>
<p><strong><span style="text-decoration: underline;">Forms Authentication and the search crawler</span></strong></p>
<p>If you are planning on using the searching capabilities of SharePoint, then you need to know one major obstacle with Forms authentication. The search crawler can only access zones configured for Windows authentication. If your crawler is pointed at the default zone, and then you change the default zone to use Forms authentication, then your search is going to break. To get around this issue, extend your web application and create a zone that uses Windows authentication, then point the crawler at the new zone. Even though the search is hitting a different zone, the search findings will be available in your Forms authentication zone.</p>
<p>Once you know how to do it, getting Forms authentication up and running on a SharePoint site is fairly easy. You still have a bit of work to do getting your security planned out and adding users and roles to the site, but that&#8217;s the case with almost any SharePoint project. I would also highly recommend customizing the Forms login page since it&#8217;s not much better looking out of the box than the browser based password dialog you&#8217;re trying to avoid in the first place.</p>
<p><strong><span style="text-decoration: underline;">Conclusion</span></strong></p>
<p>Micorosoft also have an article around this however I have ualways used the abve process which has always seemed to work. In closing  and now that we  have covered both FBA setup methods in both MOSS 2007 and MOSS 2010, I thought the next step would be to outline the differences between the two type of methods Forms based authentication and Windows . Based on different environmental scenarios you probably wont have choice; but I find that having all round knowledge of both of the authentication types will better skill a SharePoint administrator to troubleshoot and provide the best recommendation.</p>
]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/technical/administration/setting-up-forms-based-authentication-for-sharepoint-2007/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[Partner Spotlight: Mint]]></series:name>
	</item>
		<item>
		<title>Setting up Forms Based Authentication in SharePoint 2010</title>
		<link>http://sharepointmagazine.net/technical/administration/setting-up-forms-based-authentication-in-sharepoint-2010</link>
		<comments>http://sharepointmagazine.net/technical/administration/setting-up-forms-based-authentication-in-sharepoint-2010#comments</comments>
		<pubDate>Tue, 09 Mar 2010 11:57:57 +0000</pubDate>
		<dc:creator>Mint</dc:creator>
				<category><![CDATA[Administration]]></category>
		<category><![CDATA[Customisation]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[2010]]></category>
		<category><![CDATA[authentication]]></category>
		<category><![CDATA[Based]]></category>
		<category><![CDATA[FBA]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[forms]]></category>
		<category><![CDATA[sharepoint]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=3873</guid>
		<description><![CDATA[Welcome to the first of a 4 part series where I'll be guiding you through the do's and don'ts of setting up SharePoint FBA on different versions of the SharePoint platforms, being MOSS 2007 and SharePoint 2010.]]></description>
			<content:encoded><![CDATA[<p>Welcome to the first of a 4 part series where I&#8217;ll be guiding you through the do&#8217;s and don&#8217;ts of setting up SharePoint FBA on different versions of the SharePoint platforms, being MOSS 2007 and SharePoint 2010 as well as outlining specific differences, which I&#8217;ve bumped my head on a few times over the years to realize and become fully aware of.</p>
<p>For those of you that don&#8217;t know, Forms Based Authentication (FBA) allows a web user to access a SharePoint site and get access to the relevant permissions normally imposed using the groups and permissions within SharePoint. This is basically done by creating a database outlining the necessary roles and permissions that SharePoint can lookup to define what sort of permissions the user has when they logged in externally.</p>
<p>Due to SharePoint 2010 being only  recently released the following is more of a how I managed to flow through the process and doesn&#8217;t allow for much deviation form a vanilla deployment of SharePoint 2010 and its other dependent items, being IIS 7 and the Central Admin console.</p>
<p>This article details FBA configuration on a SharePoint 2010 site. If you are looking for information regarding the configuration of FBA on a SharePoint 2007 / WSS 3.0 site, have a look at Part 2 of this series of articles.</p>
<p><strong><span style="text-decoration: underline;">Setup your SharePoint 2010 site</span></strong></p>
<ol type="1">
<li>In Central Admin, create a new site. By default, this will use Windows Authentication. Since we haven’t setup FBA yet, we need to setup the Web Application first as a Windows site.</li>
<li>Create the Web Application</li>
<li>Create a default Site Collection, and make a windows user (below we’ve used the Administrator account) a Site Administrator.</li>
</ol>
<p><strong><span style="text-decoration: underline;">Setup your User Database</span></strong></p>
<ol type="1">
<li>Setup the ASP.NET Membership Database. Note: You can use custom membership stores, DotNetNuke, even Live! credentials. But the .NET membership database is very simple to setup. This requires the SQL Server database. You can use the integrated version that is supplied with SharePoint, Express or a fully featured SQL Server (Standard or Enterprise) Edition.</li>
<li>Find the setup file aspnet_regsql.exe located at either of the following locations depending upon your OS:<br />
%windir%\Microsoft.NET\Framework\v2.0.5027<br />
%windir%\Microsoft.NET\Framework64\v2.0.5027</li>
<li>When the ASP.NET SQL Server Setup Wizard appears, select “Configure SQL Server for application services”, then click Next</li>
<li>Enter the SQL Server and Database name</li>
<li>Above, I have named the database FBADB</li>
<li>Click Next and Finish</li>
</ol>
<p><img src="http://sharepointmagazine.net/wp-content/uploads/2010/02/server-and-Database.png" alt="" width="304" height="236" /></p>
<p><strong><span style="text-decoration: underline;">Provide Access to the Membership Database</span></strong></p>
<p>As an administrator, you’ll be able to add and modify user accounts. But from the SharePoint runtime, we’ll have to provide access to the membership store. This can be done in two ways. If using SSPI (Integrated Security) for the connectionstring from SharePoint, you’ll need to determine the Service Account that runs the Application Pool. Then you’ll provide access to this windows (or service) account in SQL Server to the FBADB database. Or, if you don’t want to use SSPI, or don’t want to take the time to figure out the startup service account for SharePoint you can simply create a login to the FBADB database. Following are steps for the second approach.</p>
<ol type="1">
<li>Open SQL Server Management Studio (SSMS 2008) and select Security , then Logins</li>
<li>Right Click Logins and Select “New Login”</li>
<li>Create a SQL Server account. Below, we’d created the account FBAService with password pw</li>
<li>Select “User Mapping”</li>
<li>Mark the checkbox next to FBADB, and select the row.</li>
<li>In “Database role membership”, make the user a dbo_owner.</li>
<li>Click OK to save the new user.</li>
</ol>
<p><img src="http://sharepointmagazine.net/wp-content/uploads/2010/03/dbrole.jpg" alt="" width="234" height="246" /></p>
<p><strong><span style="text-decoration: underline;">Setup IIS 7.0 Defaults</span></strong></p>
<ol type="1">
<li>Open up Internet Information Services Manager</li>
<li>Select the Web Server, then double click Connection Strings</li>
<li>Click Add..</li>
<li>Enter the Server (.), Database (FBADB) and the Credentials for the user FBAService (by clicking the Set button). If you want to use SSPI, simpy select “Use Windows Integrated Security” instead.</li>
<li>Click OK to save</li>
<li>Click to Select the Server from the Connections pane again, and double click Providers.</li>
<li>On the Feature dropdown, select .NET Users. Your machine may take a while to respond while the configuration is read.</li>
<li>On the Actions menu, click Add.</li>
<li>On the Add Provider form, select SqlMembershipProvider as the Type</li>
<li>Provide a name: FBA.</li>
<li>Drop down ConnectionStringName and select FBADB</li>
<li>Set any other parameters you’d like. I set some Password related options for user interaction later.</li>
<li>Click OK to save</li>
<li>From the Feature dropdown, select .NET Roles, then click Add..</li>
<li>Provide a name: FBARole, and select Type: SqlRoleProvider</li>
<li>Select the ConnectionStringName: FBADB</li>
<li>Click OK to save the .NET role.</li>
</ol>
<p><img src="http://sharepointmagazine.net/wp-content/uploads/2010/03/iisrole.jpg" alt="" width="304" height="81" /></p>
<p><strong><span style="text-decoration: underline;">Setup the FBA Zone in SharePoint 2010</span></strong></p>
<ol type="1">
<li>Browse to SharePoint 4.0 Central Administration, Select Security<img src="http://sharepointmagazine.net/wp-content/uploads/2010/03/centraladmin.jpg" alt="" width="330" height="195" /></li>
<li>In Application Security, select Specify Authentication Providers<img src="http://sharepointmagazine.net/wp-content/uploads/2010/03/speczone.jpg" alt="" width="304" height="149" /></li>
<li>Select the Web Application.</li>
<li>Click the Default Zone.</li>
<li>Ensure the Web Application is the correct one on the next page!</li>
<li>Change Authentication Type to Forms</li>
<li>Check Enable Anonymous (* note that this does not immediately enable Anonymous access; it merely makes the option available on the front-end web application *</li>
<li>Click Save.</li>
<li>When the process is finished, the membership provider should now display FBA.</li>
</ol>
<p>What SharePoint has done behind the scenes is make the necessary changes to the IIS website to support Forms based authentication. But we still have a little problem. If we browse to the site right now, we won’t be prompted for Windows credentials anymore. Not only do we NOT have a user in the .NET membership database, but we have no FBA based administrators. Let’s tackle that next.</p>
<p><strong><span style="text-decoration: underline;">IIS 7.0 Web Site Configuration for SharePoint 2010 FBA</span></strong></p>
<ol type="1">
<li>In IIS Manager, select the SharePoint site. In this example, we used the default site (80).</li>
<li>Double click the .NET Users icon</li>
<li>Click Set Default Provider from the actions pane on the left and select FBA<img src="http://sharepointmagazine.net/wp-content/uploads/2010/03/defprov.jpg" alt="" width="304" height="191" /></li>
<li>Click OK to save.</li>
<li>While we’re here, let’s add our first user. This will be used as an administrative account on the FBA site. Click Add..</li>
<li>Select a User, Email and Password. Depending upon parameters you defined earlier you may be prompted with challenge/response questions.</li>
<li>** The password may require some strength by default. If you receive an error message that states the “password is invalid”, simply add a number or non-alpha character.</li>
<li>Next, select the SharePoint Central Administration v4 web site from the connections menu in IIS.</li>
<li>Click .Net Users, then in the Actions menu select “Set Default Provider” and set that to FBA.</li>
</ol>
<p><strong><span style="text-decoration: underline;">Set the User as Site Administrator on the SharePoint 2010 Web Site</span></strong></p>
<ol type="1">
<li>In SharePoint Central Admin v4, go to Application Management</li>
<li>In the Site Collections section, select “Change Site Collection Administrators”</li>
<li>On the next page, select the Site Collection we’ve been using.</li>
<li>You’ll note that the primary site collection administrator has a little red squiggly. Why? We don’t have Windows Authentication enabled for this site and therefore no way to resolve. Delete the Administator account.</li>
<li>In the field type the user created above (we used fbaadmin), then click the Check Names button. You should see a black underline noting that the name was resolved.</li>
</ol>
<p><strong><span style="text-decoration: underline;">Test the site</span></strong></p>
<ol type="1">
<li>In a Web Browser, when you access the site <a href="http://localhost:500/">http://localhost</a>(if that’s what you used), you’ll be presented with the SharePoint login screen, not a Windows login pop-up.</li>
<li>Login with the fbaadmin credentials and you should be able to access the site.<img src="http://sharepointmagazine.net/wp-content/uploads/2010/03/signin.jpg" alt="" width="300" height="148" /></li>
</ol>
<p><strong><span style="text-decoration: underline;">Add the reference to the user friendly people picker</span></strong></p>
<p>You know the picker…so you can easily find those needles in the haystack. For that to work in Central Admin and this site against your .NET membership database, you need to add a reference to the provider.</p>
<ol type="1">
<li>In IIS Manager, browse to the Central Admin web application. Explore the folder and find the web.config file. Open in Notepad.</li>
<li>Find the &lt;PeoplePickerWildcards&gt; node and use the following:</li>
</ol>
<blockquote><p>&lt;PeoplePickerWildcards&gt;</p>
<p>&lt;clear /&gt;</p>
<p>&lt;add key=”FBA” value=”%” /&gt;</p>
<p>&lt;/PeoplePickerWildcards&gt;</p></blockquote>
<p><strong><span style="text-decoration: underline;">Note:</span> </strong>If you plan to use the same membership database for multiple SharePoint sites AND you choose to encrypt the passwords, you’ll need to add one final step. In IIS 7,  on the first site, select the Machine Keys icon. Copy those keys. In the next site that you create, you’ll need to use the same machine keys and disable “Automatically Generate” and disable “Generate Unique Key”. This is crucial as the machine key is used to determine the encrypted password that is passed back to the .NET membership database</p>
<p><strong><span style="text-decoration: underline;">Conclusion</span></strong></p>
<p>In closing the way that you&#8217;ve seen FBA being setup in moSS 2010 is very similar to the way it&#8217;s required to be setup in 2007. This is because as you can see the same method of authentication will be used for MOSS 2007. The few differences are with the way that  IIS 7 permissions which will be clear in the next article. In the next article I&#8217;ll attempt to go into depth with the configuration of MOSS 2007 FBA and show every aspect of the configuration with the assistance on one of my colleagues who has also spent many hours in understanding the way FBA has been architected and fuctons within MOSS 2007.</p>
]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/technical/administration/setting-up-forms-based-authentication-in-sharepoint-2010/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<series:name><![CDATA[Partner Spotlight: Mint]]></series:name>
	</item>
		<item>
		<title>Partner Spotlight: Mint Management Technologies</title>
		<link>http://sharepointmagazine.net/companies/microsoft-partners/partner-spotlight-mint-management-technologies</link>
		<comments>http://sharepointmagazine.net/companies/microsoft-partners/partner-spotlight-mint-management-technologies#comments</comments>
		<pubDate>Mon, 08 Mar 2010 15:04:26 +0000</pubDate>
		<dc:creator>Mint</dc:creator>
				<category><![CDATA[Microsoft Partners]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[magazine]]></category>
		<category><![CDATA[partner]]></category>
		<category><![CDATA[sharepoint]]></category>
		<category><![CDATA[spotlight]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=3868</guid>
		<description><![CDATA[Mint Management Technologies (Pty) Ltd was established in 1971 and has rendered market intelligence gathering and deployment solutions to South African corporate and multi-national companies for over 38 years.]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;"><strong>Mint Management Technologies (Pty) Ltd -  Profile</strong><strong> </strong></p>
<p><strong> </strong></p>
<p>Mint Management Technologies (Pty) Ltd was established in 1971 and has rendered market intelligence gathering and deployment solutions to South African corporate and multi-national companies for over 38 years.</p>
<p><em>Mint Research</em> (traditional) provided a traditional print media advertising verification service to the South African advertising industry.  It includes checking of CI&#8217;s against newspaper and magazine tear sheets; surveys monitoring competition and ad hoc provision of current and historic tear sheets.</p>
<p>This division also provided a New Age service which provides ad spend and promotional pricing of products and companies that advertise their offerings in publications, TV and radio, via in-store promotions, direct-to-home distributions and the Internet.  Its in-store observation enables virtual real-time reading of what happens in-store in terms of pricing, promotional activity, product availability, assortment offered, merchandising technique, share of facings, consumer behaviour and a check on the distribution agent.</p>
<p>Clients of Mint Research included retail specialists such as Woolworths, Shoprite and Pick n Pay.  The division also assists leading brands such as Clover, Proctor and Gamble, Kelloggs to manage its advertising output and vehicle manufacturers Volkswagen and Nissan.</p>
<p><em>Mint Mobile’s</em> locally developed Territory Management System is a real time intelligence gathering solution. It enables sales people to schedule appointments, manage a customer database, process sales orders and collect research information at customer and product level by means of a mobile device. In addition, the system enables sales representatives to manage all customer appointments via a Microsoft calendar. Vehicle information, expenses and mileage logging can be entered into the system. Red flag issues captured will distribute alerts to the line or product managers involved, and are kept open until closed or solved. The system allows for detailed drill down reporting and analysis. A bi-directional messaging system allows for communication between the sales force and head office.</p>
<p>A dedicated Website enables sales managers to view and track the sales force progress. Drill down graphing allows managers to evaluate the sales force individually. It provides sales managers with real time snap shots of a sales representative’s daily performance in terms of orders, planning and execution thereof, types of contracts signed and accurate sales statistics. It fosters improved communication, provides sales managers with the ability to analyse and institute coaching within a real time environment.  The Website also allows for electronic images and detailed product information to be sent to the device.  A powerful reporting engine generates the necessary reports for the various management levels and these reports are scheduled to be automatically distributed in the desired format when required. Examples of report types are: Call Rates, Strike Rates, Call Coverage, Planned vs Actual etcetera. This solution ensures that customers enjoy real time status updates with regards to orders and stock levels.</p>
<p>They are able to review previous order patterns immediately and make better informed decisions. Sales representatives will be able to solve red flag issues far quicker as a result of the real time reporting and information at hand on Mint Mobile’s system, as well as provide customers with new product information as soon as it is launched.</p>
<p>In 2007, Mint Management Technologies (Pty) Ltd expanded its offering with the acquisition of Mint Net (Pty) Ltd.  Mint Net was established in 2000 and designed, implemented and supported over 40 Enterprise Content Management solutions globally.  These include Sappi Limited’s Global Intranet (4 continents), Ford &amp; Mazda corporate web presence in South Africa, Microsoft South Africa Intranet, Deloitte’s Intranet and various others.</p>
<p>Clients of Mint include the pharmaceutical industry such as Adcock Ingram Health Care, Aspen Pharmacare, Novartis Consumer Health, Novartis Pharma SA and Pharmaplan to name a few, as well as the telecommunications industry namely Vodacom and MTN, and the banking industry namely Standard Bank, Nedbank, Absa, Investec and National Commercial Bank of Saudi Arabia.</p>
<p style="text-align: center;"><a href="http://sharepointmagazine.net/wp-content/uploads/2010/02/company-flow.jpg"><img class="aligncenter size-medium wp-image-3869" src="http://sharepointmagazine.net/wp-content/uploads/2010/02/company-flow-300x179.jpg" alt="" width="331" height="182" /></a></p>
<p>If you would like to be featured on the <a href="http://sharepointmagazine.net/announcements/sharepoint-magazine-partner-spotlight" target="_blank">SharePoint Magazine Partner Spotlight</a>, please <a href="http://sharepointmagazine.net/contactus.php" target="_blank">contact us</a></p>
]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/companies/microsoft-partners/partner-spotlight-mint-management-technologies/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[Partner Spotlight: Mint]]></series:name>
	</item>
		<item>
		<title>SPoint.me &#8211; The SharePoint Social Network</title>
		<link>http://sharepointmagazine.net/featured/spoint-me-the-sharepoint-social-network</link>
		<comments>http://sharepointmagazine.net/featured/spoint-me-the-sharepoint-social-network#comments</comments>
		<pubDate>Tue, 02 Mar 2010 15:50:13 +0000</pubDate>
		<dc:creator>Arno Nel</dc:creator>
				<category><![CDATA[Featured]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=3897</guid>
		<description><![CDATA[It gives me great pleasure to introduce you to SPoint.me . SPoint is aiming to become the premier Social Network for people in the SharePoint Industry. Its a little bit of Facebook, Twitter, LinkedIn, Digg, and Wordpress, all rolled into one.]]></description>
			<content:encoded><![CDATA[<h2><a title="SPoint.me" href="http://spoint.me" target="_blank"><img class="alignnone size-full wp-image-3898" title="Spoint" src="http://sharepointmagazine.net/wp-content/uploads/2010/03/header_splash_blue.jpg" alt="" width="573" height="248" /></a></h2>
<p>It gives me great pleasure to introduce you to <a href="http://spoint.me" target="_blank">SPoint.me</a> . SPoint is aiming to become the premier Social Network for people in the SharePoint Industry. Its a little bit of Facebook, Twitter, LinkedIn, Digg, and Wordpress, all rolled into one.</p>
<ul>
<li>Differentiate yourself</li>
<li>Create a User Group</li>
<li>Launch your products</li>
<li>Provide Support</li>
<li>Engage</li>
<li>Connect</li>
</ul>
<p>Some of the features are listed below, but the best way to understand, is to sign up <img src='http://sharepointmagazine.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  More details in the next few weeks.</p>
<h2>Blogging</h2>
<p>Start a blog built on the best blogging software in the world. Even allow each of your users to start their own full powered WordPress blog. Track new posts and comments across your site.</p>
<p><img src="http://spoint.me/email/blog.gif" alt="" /></p>
<p><img src="http://spoint.me/email/hr_small.gif" alt="" width="400" height="21" /></p>
<h2>Groups</h2>
<p>Powerful public, private or hidden groups allow your users to break the discussion down into specific topics</p>
<p><img src="http://spoint.me/email/group.gif" alt="" /><br />
<img src="http://spoint.me/email/hr_small.gif" alt="" width="400" height="21" /></p>
<h2>Friends</h2>
<p>Let your users make connections so they can track the activity of others, or filter on only those users they care about the most.<br />
<img src="http://spoint.me/email/friends.gif" alt="" /></p>
<p><img src="http://spoint.me/email/hr_small.gif" alt="" width="400" height="21" /></p>
<h2>Messaging</h2>
<p>Private messaging will allow your users to talk to each other directly, and in private. Not just limited to one on one discussions, your users can send messages to multiple recipients.<br />
<img src="http://spoint.me/email/messaging.gif" alt="" /></p>
<p><img src="http://spoint.me/email/hr_small.gif" alt="" width="400" height="21" /></p>
<h2>Activity Streams</h2>
<p>Global, personal and group activity streams with threaded commenting, direct posting, favoriting and @mentions. All with full RSS feed and email notification support..</p>
<p><img src="http://spoint.me/email/activity.gif" alt="" /></p>
<p><img src="http://spoint.me/email/hr_small.gif" alt="" width="400" height="21" /></p>
<h2>Profiles</h2>
<p>LinkedIn style profiles fields allow members to describe themselves..</p>
<p><img src="http://spoint.me/email/profile.gif" alt="" /></p>
<p><img src="http://spoint.me/email/hr_small.gif" alt="" width="400" height="21" /></p>
<h2>Forums</h2>
<p>Full powered discussion forums built directly into groups allow for more conventional in-depth conversations..</p>
<p><img src="http://spoint.me/email/forums.gif" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/featured/spoint-me-the-sharepoint-social-network/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Everything You Need to Know about BDC: Part 8 of 8</title>
		<link>http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-8-of-8</link>
		<comments>http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-8-of-8#comments</comments>
		<pubDate>Mon, 08 Feb 2010 10:53:04 +0000</pubDate>
		<dc:creator>Wen He</dc:creator>
				<category><![CDATA[Administration]]></category>
		<category><![CDATA[Customisation]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[BDC]]></category>
		<category><![CDATA[BI]]></category>
		<category><![CDATA[Business Data Catalog]]></category>
		<category><![CDATA[Business Intelligence]]></category>
		<category><![CDATA[Customization]]></category>
		<category><![CDATA[Dashboards]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[platform]]></category>
		<category><![CDATA[reporting]]></category>
		<category><![CDATA[search]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=3838</guid>
		<description><![CDATA[An action is simply an operation upon a selected item. The operation can retrieve information about the selected item, or it can launch a program or Web page with the selected item as a parameter.]]></description>
			<content:encoded><![CDATA[<p>Welcome back to Part 8 of our 8-part series on the Business Data Catalog (BDC). From the previous 7 installments, we have covered everything about BDC, from BDC architecture, ADF, BDC Web parts, BDC search and profile, to the BDC object model in details.  We also touched the surface of BDC actions in <a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-4-of-8">Part 4</a> and <a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-5-of-8">Part 5</a>. As promised, we’ll dedicate this final article to actions. We’ll explain what the BDC actions are and what they can do for you.  We’ll then walk you through how to create custom actions and how to perform these actions by using custom Web parts and InfoPath forms. As you will soon learn, this is another power capability of BDC because it extends the ability to link content to Web sites.  This allows you to quickly create mashups that are item-specific so that you can take actions in context, such as write back to your LOB systems.</p>
<p>For your reference, these are our previous seven articles:</p>
<ol>
<li><a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-1-of-8">Part 1</a>, BDC Purpose and technical architecture</li>
<li><a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-2-of-8">Part 2</a>, Application Definition File (ADF) and its Development</li>
<li><a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-3-of-8">Part 3</a>, Developing an ADF to Connect to Web Services</li>
<li><a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-4-of-8">Part 4</a>, Consuming Business Data through Web Parts and SharePoint Lists</li>
<li><a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-5-of-8">Part 5</a>, Implementing Enterprise Search with Business Data</li>
<li><a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-6-of-8">Part 6</a>, Integrating User Profiles with Business Data</li>
<li><a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-7-of-8">Part 7</a>, Working with the BDC Object Model</li>
</ol>
<p>With that, let’s dive into BDC actions and start by asking what is an action.</p>
<h3>What is an action?</h3>
<p>An action is simply an operation upon a selected item. The operation can retrieve information about the selected item, or it can launch a program or Web page with the selected item as a parameter. The operation is a predefined URL link in each BDC item that enables you to act on the item, such as editing, or mapping it using Live Search as we demonstrated in Part 4.<br />
An action is composed of a URL target where the action is to occur, and the matching parameters in the URL QueryString format. When we associate an action with an entity, we can pass parameters to that action based on the contents of one or more fields. For example, in the Live Search example in Part 4, we associate the Live Search page’s URL with a customer and provide the customer’s address to parameterize the search.</p>
<p>From the above, major characteristics of actions are as follows:</p>
<ol>
<li>URL-based, parameter-driven</li>
<li>Actions on any entity and appear everywhere an entity goes</li>
<li>User can take action in ECB menu</li>
<li>Custom actions means custom code</li>
</ol>
<p>A perfect example of action is the default View Profile action, as shown in <strong>Figure 1</strong>.</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2010/02/image.png"><img style="border-width: 0px;" src="http://sharepointmagazine.net/wp-content/uploads/2010/02/image_thumb.png" border="0" alt="image" width="644" height="331" /></a><br />
Figure 1  View Profile action in a Business Data Actions Web Part</p>
<p>Through a View Profile action we can navigate to the profile page of an entity. Clicking the View Profile action in a Business Data Actions Web Part as shown in Figure 1 above, as well as in a Business Data column, or in a Business Data List Web Part, lets us view the details of an item on that item&#8217;s profile page. <strong>Figure 2</strong> shows that a Profile page that displays employee details.</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2010/02/image1.png"><img style="border-width: 0px;" src="http://sharepointmagazine.net/wp-content/uploads/2010/02/image_thumb1.png" border="0" alt="image" width="299" height="484" /></a><br />
Figure 2  A Profile page that displays employee details</p>
<h4>What is a Profile page?</h4>
<p>A profile page is automatically generated for each entity that has a SpecificFinder method after BDC imports an ADF file, a profile page can display all the information from a record in the BDC.  As we’ve seen in <strong>Figure 2</strong>, a profile page can display all the fields in a record for a specific employee. The default profile page contains a BDC Item Web Part for that entity.<br />
If we put the profile page in Edit mode, there are actually two Web parts: a Business Data Item Builder and a Business Data Item that connect together. The Item Builder parses the querystring (<a href="http://win7:10001/ssp/admin/Content/Employee.aspx?EmployeeID=1)">http://win7:10001/ssp/admin/Content/Employee.aspx?EmployeeID=1)</a> and passes the EmployeeID value to the Business Data Item, which then executes the SpecificFinder method and returns a record of Employee data.</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2010/02/image2.png"><img style="border-width: 0px;" src="http://sharepointmagazine.net/wp-content/uploads/2010/02/image_thumb2.png" border="0" alt="image" width="543" height="484" /></a><br />
Figure 3  Profile page components</p>
<h4>Default Profile Page and default action</h4>
<p>As we have seen from above section, the default action (View Profile) along with the default Profile page is automatically created when the entity has a SpecificFinder method.  To provide an ECB menu user experience, we can also add actions in a Business Data List Web part without using the Business Data Actions Web Part.</p>
<h4>Defining an Action</h4>
<p>There are three ways to add an action: 1) defining it in the ADF, 2) adding it in the BDC admin page after the ADF has been imported into BDC, and 3) through the BDC Object Model. Here we’re focus the first two.</p>
<h5>Defining it in the ADF</h5>
<p>To define an Action for the specified BDC entity, we’ll first locate the &lt;Actions&gt; section within the &lt;Entities&gt; and &lt;Entity&gt; hierarchy.</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2010/02/image3.png"><img style="border-width: 0px;" src="http://sharepointmagazine.net/wp-content/uploads/2010/02/image_thumb3.png" border="0" alt="image" width="644" height="241" /></a><br />
Figure 4  Actions is nested within the Entities/Entity in ADF</p>
<p>And insert the &lt;action&gt; portion like this one:</p>
<p>&lt;Actions&gt;<br />
&lt;Action Name=&#8221;Update Employee&#8221; Position=&#8221;1&#8243; IsOpenedInNewWindow=&#8221;false&#8221; Url=&#8221;pages/editemployee.aspx?EmployeeID={0}&#8221; ImageUrl=&#8221;"&gt;<br />
&lt;ActionParameters&gt;<br />
&lt;ActionParameter Name=&#8221;EmployeeID&#8221; Index=&#8221;0&#8243; /&gt;<br />
&lt;/ActionParameters&gt;<br />
&lt;/Action&gt;</p>
<h5>Adding an action in the BDC admin page</h5>
<p>In the SSP administration page (View Application –&gt; View Entity), the action is defined below and the URL that takes EmployeeID as a parameter: <a href="http://dpm:10001/ssp/admin/Content/Employee.aspx?EmployeeID={0}">http://dpm:10001/ssp/admin/Content/Employee.aspx?EmployeeID={0}</a></p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2010/02/image4.png"><img style="border-width: 0px;" src="http://sharepointmagazine.net/wp-content/uploads/2010/02/image_thumb4.png" border="0" alt="image" width="644" height="277" /></a><br />
Figure 5  Add an action the SSP Admin page</p>
<h4>Custom Actions</h4>
<p>We also can create custom actions for entities in BDC. Among other things, custom actions allow users to navigate to any custom page to manipulate business data.<br />
Here are some scenarios that custom actions can do:</p>
<ol>
<li>Parameterize custom search</li>
<li>Update employee in HR system</li>
<li>Customize profile page for an entity</li>
<li>Integrate BDC search into enterprise report center</li>
</ol>
<p>We’ll be creating custom actions in the last part the article.</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2010/02/image5.png"><img style="border-width: 0px;" src="http://sharepointmagazine.net/wp-content/uploads/2010/02/image_thumb5.png" border="0" alt="image" width="644" height="313" /></a><br />
Figure 6 Enable View Profile action in a Business Data List Web part</p>
<p>This enables the ECB-style action, we will specify a Title property and add the following in the ADF:<br />
&lt;Entity EstimatedInstanceCount=&#8221;0&#8243; Name=&#8221;Employee&#8221;&gt;<br />
&lt;Properties&gt;<br />
&lt;Property Name=&#8221;Title&#8221; Type=&#8221;System.String&#8221;&gt;LastName&lt;/Property&gt;<br />
&lt;/Properties&gt;<br />
&lt;/Entity&gt;</p>
<p>It specifies which column in the Business Data List/Related List Web part displays the Actions menu. It also specifies the name of the TypeDescriptor that corresponds to the column you want to display as the default column in Business Data lists.</p>
<p>In the Business Data Column scenario, we can also display the action menu and link the column to the business data profile in a Business Data list.</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2010/02/image6.png"><img style="border-width: 0px;" src="http://sharepointmagazine.net/wp-content/uploads/2010/02/image_thumb6.png" border="0" alt="image" width="644" height="160" /></a><br />
Figure 7  View Profile action in Business Data Column</p>
<p>This is default behavior OOB for a Business Data column.  When adding the column, just make sure the following two are checked:</p>
<ul>
<li>Display the actions menu</li>
<li>Link this column to the profile page to</li>
</ul>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2010/02/image7.png"><img style="border-width: 0px;" src="http://sharepointmagazine.net/wp-content/uploads/2010/02/image_thumb7.png" border="0" alt="image" width="644" height="410" /></a><br />
Figure 7  Enable the actions menu and profile page in Business Data list</p>
<p>These profile pages are used and being indexed by BDC Search. The following search results display the profile pages that contain the search keyword (s).  Notice in Figure 8 how a search for Great Lakes will display the profile pages for both this customer and their orders.</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2010/02/image8.png"><img style="border-width: 0px;" src="http://sharepointmagazine.net/wp-content/uploads/2010/02/image_thumb8.png" border="0" alt="image" width="543" height="480" /></a><br />
Figure 8  BDC Search Results in Profile Pages</p>
<h4>Enhancing the Profile Page</h4>
<p>By default, the profile page is hosted on the Shared Services Provider site collection where the BDC administration site is located. The search result (that is, the URL) links back to the Shared Services Administration site collection address that is not scalable when you extend the Web application. In real world, we may not want to give end users access to the SSP Admin site for security reason. A better practice is to create our own profile pages and host them in any site that is not part of the SSP site collection.<br />
In this example, we’ve created a dashboard page in Report Center to replace the default Profile Page. The Report Center provides enterprise reporting capabilities that are scalable and centralized.  We can direct users to custom profile pages by updating the View Profile action.</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2010/02/image9.png"><img style="border-width: 0px;" src="http://sharepointmagazine.net/wp-content/uploads/2010/02/image_thumb9.png" border="0" alt="image" width="644" height="446" /></a><br />
Figure 9  Replace the default Profile Page with Custom Report Center</p>
<p>As an alternative, we can also replace the default the URL in Action element in ADF with the path to the Profile.aspx page:</p>
<p>&lt;Actions&gt;<br />
&lt;Action Position=&#8221;1&#8243; IsOpenedInNewWindow=&#8221;false&#8221; Url=&#8221;<a href="http://reportcenter/Pages/Profile.aspx?EmployeeID={0">http://reportcenter/Pages/Profile.aspx?EmployeeID={0}&#8221;</a> ImageUrl=&#8221;/_layouts/1033/images/viewprof.gif&#8221; Name=&#8221;View Profile&#8221;&gt;<br />
&lt;ActionParameters&gt;<br />
&lt;ActionParameter Index=&#8221;0&#8243; Name=&#8221;EmployeeID&#8221; /&gt;<br />
&lt;/ActionParameters&gt;<br />
&lt;/Action&gt;<br />
&lt;/Actions&gt;</p>
<p>An action to call the Profile.aspx page for each Employee ID has been defined. This action will be the default action provides in the search result.</p>
<p>Now let’s create Profile page to display information about the Employee entity in Report Center. (The Report Center is a site that provides a central location for business-intelligence-related information.)</p>
<ol>
<li>In the <a href="http://reportcenter">http://reportcenter</a> site, create a new Blank Web Part Page called “Profile.aspx”.</li>
<li>Add the following two web parts: Query String (URL) Filter Web Part and Report Viewer Web Part.</li>
<li>Configure the Query String (URL) Filter Web Part to pickup parameter “EmployeeID” from the URL query string.</li>
<li>Configure the Report Viewer Web Part to display the employee profile report called “Employee Profile”.</li>
<li>Connect the Query String (URL) Filter Web Part parameter to the SQL Server Reporting Services Report Viewer Web Part parameter “EmployeeID”.</li>
</ol>
<blockquote><p><a href="http://sharepointmagazine.net/wp-content/uploads/2010/02/image10.png"><img style="border-width: 0px;" src="http://sharepointmagazine.net/wp-content/uploads/2010/02/image_thumb10.png" border="0" alt="image" width="644" height="67" /></a><br />
Figure 10  SQL Server Reporting Services Report Viewer</p>
<p>Note: Please make sure you use this Web Part and not the OOB Report Viewer Web Part.</p></blockquote>
<p>Test that the page is picking up the URL string parameter “EmployeeID” correctly by typing the following URL: <a href="http://reportcenter/Pages/Profile.aspx?EmployeeID=108">http://reportcenter/Pages/Profile.aspx?EmployeeID=108</a></p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2010/02/image11.png"><img style="border-width: 0px;" src="http://sharepointmagazine.net/wp-content/uploads/2010/02/image_thumb11.png" border="0" alt="image" width="644" height="218" /></a><br />
Figure 11  Custom Profile Page in Report Center</p>
<h4>Creating Custom Actions</h4>
<p>Creating custom actions requires custom code. The approach we take is to treat the BDC source simply as a data reader, and to build our CRUD (create/read/update/delete) logic in custom code. The BDC object model provides the means to retrieve collections, list items and enumerators, and we can use GenericInvoker to perform CRUD, which has been extensively covered in Part 7. We get the Web Parts to display data, and then we can use custom actions to create and update records by using Web parts and InfoPath Forms.</p>
<h4>Creating Web Parts</h4>
<p>We have created and deployed two Web Parts using the Object Model as shown below, with one inserting a record and one updating an existing record. (Special thanks to Lightning Tools! I’ve used <a href="http://www.lightningtools.com/bdc-meta-man/default.aspx">BDC Meta Man</a> to help with creating the Web parts.)</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2010/02/image12.png"><img style="border-width: 0px;" src="http://sharepointmagazine.net/wp-content/uploads/2010/02/image_thumb12.png" border="0" alt="image" width="467" height="480" /></a><br />
Figure 12  The two Custom Web Parts can be used to add and update employee records</p>
<p>Add these two actions in the SSP Admin page:</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2010/02/image13.png"><img style="border-width: 0px;" src="http://sharepointmagazine.net/wp-content/uploads/2010/02/image_thumb13.png" border="0" alt="image" width="644" height="166" /></a><br />
Figure 13  Adding actions in the SSP Admin page</p>
<p>Now you can access the two actions from the content menu in the Employee List:</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2010/02/image14.png"><img style="border-width: 0px;" src="http://sharepointmagazine.net/wp-content/uploads/2010/02/image_thumb14.png" border="0" alt="image" width="644" height="241" /></a><br />
Figure 14  Custom Actions Add Employee and Update Employee in the context menu</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2010/02/image15.png"><img style="border-width: 0px;" src="http://sharepointmagazine.net/wp-content/uploads/2010/02/image_thumb15.png" border="0" alt="image" width="644" height="342" /></a><br />
Figure 15  Add Employee Web Part</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2010/02/image16.png"><img style="border-width: 0px;" src="http://sharepointmagazine.net/wp-content/uploads/2010/02/image_thumb16.png" border="0" alt="image" width="561" height="484" /></a><br />
Figure 16  Update Employee Web Part</p>
<h4>Creating InfoPath Form</h4>
<p>MSDN has a great article titled Using Business Data Catalog Actions to Pass Parameters to InfoPath 2007 Browser Forms that walks you through this in detail.  So I’ve created our InfoPath Form and added the action using the Form Template path:<br />
<a href="http://dpm/_layouts/FormServer.aspx?XsnLocation=http://dpm/FormServerTemplates/EmployeeUpdate.xsn&amp;DefaultItemOpen=1&amp;EmployeeID={0}&amp;FirstName={1}&amp;LastName={2}">http://dpm/_layouts/FormServer.aspx?XsnLocation=http://dpm/FormServerTemplates/EmployeeUpdate.xsn&amp;DefaultItemOpen=1&amp;EmployeeID={0}&amp;FirstName={1}&amp;LastName={2}</a><br />
<a href="http://sharepointmagazine.net/wp-content/uploads/2010/02/image17.png"><img style="border-width: 0px;" src="http://sharepointmagazine.net/wp-content/uploads/2010/02/image_thumb17.png" border="0" alt="image" width="644" height="277" /></a><br />
Figure 17  Adding Custom Action that uses InfoPath Form</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2010/02/image18.png"><img style="border-width: 0px;" src="http://sharepointmagazine.net/wp-content/uploads/2010/02/image_thumb18.png" border="0" alt="image" width="644" height="475" /></a><br />
Figure 18  Update Employee in InfoPath Form</p>
<h4>Conclusion</h4>
<p>In this final article, we have focused on actions that users can take on the business entities. We can define actions in ADF or add it “after the fact”. We have also created custom actions using the BDC object model by using custom Web parts and InfoPath forms to enable CRUD (create/read/update/delete) operation support. Once added, actions can be performed from within the list, which becomes relatively transparent to the user where the data comes from. [The statement that the BDC data is read-only is not true anymore as we have just demonstrated.] As you have learned from our 8-part series, BDC enables user interaction in business intelligence, enterprise content management, collaboration and social features, and enterprise search.</p>
<h4>Looking Forward to SharePoint Server 2010</h4>
<p>BDC has evolved to what is now called BCS (business connectivity services) in SharePoint 2010. Even though we can use BDC to enable connectivity to external systems, it was difficult to create solutions because of the lack of a designer and it was not so simple to create a solution that enabled users to make changes and write that data back to the external store. BCS now enables you to integrate LOB data into SharePoint and Office with full CRUD support, tighter integration with Office client applications, and better tools for modeling business entities. BCS is all about connecting to external data. We look forward to sharing with you the exciting new features in BCS and what they can do for you in the near future. Until then, aloha!</p>
]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-8-of-8/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Avoid Newbie Mistakes: 10 Steps to Successful SharePoint Deployments</title>
		<link>http://sharepointmagazine.net/technical/administration/avoid-newbie-mistakes-10-steps-to-successful-sharepoint-deployments</link>
		<comments>http://sharepointmagazine.net/technical/administration/avoid-newbie-mistakes-10-steps-to-successful-sharepoint-deployments#comments</comments>
		<pubDate>Thu, 17 Sep 2009 09:30:14 +0000</pubDate>
		<dc:creator>Joel Oleson</dc:creator>
				<category><![CDATA[Administration]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[deployments]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[governance]]></category>
		<category><![CDATA[joel]]></category>
		<category><![CDATA[mistakes]]></category>
		<category><![CDATA[newbie]]></category>
		<category><![CDATA[oleson]]></category>
		<category><![CDATA[sharepoint]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=3772</guid>
		<description><![CDATA[A common word that keeps popping up around SharePoint deployments is “Governance,” as if it will help you avoid chaos and have a more successful deployment. The answer is, when executed properly, it can. ]]></description>
			<content:encoded><![CDATA[<p>A common word that keeps popping up around SharePoint deployments is “Governance,” as if it will help you avoid chaos and have a more successful deployment. The answer is, when executed properly, it can. Governance consists of rules and guidelines for designing a service offering. Its goals aren’t to shut down a deployment and make it take forever, but, rather, to find balance in user flexibility while providing for IT oversight. Here are 10 key steps to help you be successful in designing your SharePoint deployment.</p>
<p><strong>1. Confront Reality</strong></p>
<p>Understanding where your company is in its maturity of SharePoint can better help you understand the next steps, as well as the challenges your corporate culture will face. Confronting reality is something that can be done at any time during a deployment. Often, it isn’t a greenfield deployment; there is already something in place, and that current solution may or may not be working. Why?</p>
<p>An assessment of your Intranet, collaborative platforms, file sharing platforms and usage scenarios will help you understand where to begin. It’s time to wake up and see that there are better ways to do things, and you may need resources to accomplish this.</p>
<p>You will find that making any changes will affect the balance of empowerment for the business, and give up some control from IT. It may feel unnatural at first. Doing this with the out-of-the-box deployment often is where companies start with SharePoint. They find that giving the business site collections to create projects, workspaces and team sites makes them very happy.</p>
<p>The balance can get out of control when the business is left with a default install. The default install has faults. There are no quotas enabled, and all data goes into one content database that continues to grow until it fills the drive. Auditing is off, versions aren’t enabled and chaos can reign quite easily without some forethought about the answers to these questions. The newbie mistake is to decide to figure out many of these things later. Later comes too late, when the environment is down or, worse, never backed up. Again, it’s something that by default isn’t automatically configured. Backing up the drives isn’t good enough. The data is in databases, and the binaries and development assets are on the disks, while the configuration is spread across the system. This might seem obvious to those running the system for awhile, but unfortunately it is a common mistake.</p>
<p><strong>2. Create a Governance Plan<br />
</strong><strong><br />
</strong>Before we can create a governance plan, we need to understand what governance is. I’m a fan of the definition from the Burton Group: “Governance uses people, process, technology, and policies to define a service, resolve ambiguity, and mitigate conflict within an organization.” The governance plan does just that&#8212;it defines the service, roles, team, technology and the policies.</p>
<p><strong>People</strong> – Think virtual teams. The roles for a SharePoint environment can be as simple as a Portal Admin and an IT Infrastructure Admin. This provides some level of delegation and empowerment for the business, while maintaining patch levels and optimizing administrative tasks by someone who has the appropriate skill set. The larger the enterprise, the more these tasks become divided into roles stemming from a development lifecycle. It may be an SDLC (Software Development Lifecycle) or an Operations framework like MOF 4.0, where a framework is laid out with staged deployment involving different roles&#8212; the Dev team, the Test team, the Ops team, the Engineering team and the Service Manager, along with the Project Management Office. A support desk, along with communication functions and release management, can provide these teams with simple to highly-structured support, based on the requirements and complexity of the application and organization.</p>
<p><strong>Process </strong>– The process for this service most often determines how the site or site collections live and die&#8212;it’s about the lifecycle management of the unit of provisioning. Exchange supports mailboxes and SharePoint supports Site Collection as its most scalable unit, but, in some cases, the unit of provisioning actually is a site. The process is the system set up to support the provisioning process. Imagine it as a workflow from creation all the way through to the archive and deletion process. Who can create sites? Who approves them? How are they managed?</p>
<p>A great way to achieve stability and address cultural issues is to include Site Admin training as a prerequisite to owning a site or site collection. In the training session, you could include HR policies on security and risk associated with your information policies. Your SharePoint community will be happy they were told the rules ahead of time.</p>
<p><strong>Technology</strong> – The technology is the platform. It’s also what I like to call the “Buzzwords.” In nearly every SharePoint marketing deck, you will find the SharePoint pie. This pie consists of buzzwords from Portals, web content management, records management, BI and others. The SharePoint Platform is plastic, so mold it to support the service you envision.</p>
<p><strong>Policies</strong> – Customization policies will keep you out of trouble. Security policies are right up there, as well. You need to establish the rules of the game and learn how to enforce them. A customization policy might define who can use SharePoint designer, or, it might determine how you support custom development assets and how they are evaluated even before reaching your dev boxes.</p>
<p><strong>Service </strong>– The service is what you’re building. It’s what helps you be consistent and achieve scale. The service definition will give you, in black and white, what everyone agreed that you would build and support.</p>
<p><strong>3. Get an Exec Sponsor</strong></p>
<p>Without a stakeholder who has a budget, your deployment is doomed from the start. You need the visibility and support of the business. At Microsoft, they are called shadow apps. The key stakeholder might be the director of HR, Marketing or Communications. It isn’t always the CEO, or even a C-level executive. While it is great to be on their radar&#8212;and have the awesome visibility that goes with a spot on the radar screen, the day-to-day details are rarely discussed in the board room. The CIO’s vision for information management and the ability to support the growth of the business is critical. The platform the CMO chooses to push the marketing message can either hurt or embrace your service. Vision is a key word.</p>
<p> <strong>4. Create the Dream Team<br />
</strong><br />
You don’t need to hire an army. You can find people with the right skill sets right in your corporation. It also is extremely helpful to have the guidance of someone who has performed previous SharePoint deployments. Microsoft’s SharePoint Deployment Planning Services provide the option of working with a skilled partner to get your service scoped. I can’t over-emphasize the importance of training by a skilled SharePoint instructor, especially one who is a SharePoint MVP. There are many out there who have built instruction based on their deployment experience. While Microsoft’s Official curriculum training may help you learn how to install, the insight of the instructor will provide the core lessons.</p>
<p><strong>5. Build Services not Stuff</strong></p>
<p>While a lot of Microsoft applications come with a simple wizard-based install, you would never just install Active Directory or Exchange and then hand over the keys to someone. It’s the same with SharePoint&#8212;you need to design a service around it. You need to decide what you’re providing and how you’re providing it. This service-based approach will help you to scale, and set the expectations of the business. It’s an approach that is mandatory to achieve the core requirements of the business and IT. Balance is essential to success, and the only way to achieve it is to scope the service and roll it out in a phased approach as the service delivery team can handle the rate of change.</p>
<p><strong>6. Define Clear Policies and Standards<br />
</strong><br />
The assembly line was built on the idea of standardization. “You can have any color car you want, as long as it’s black,” Henry Ford said. While automakers have come a long way since then, standardization is what allowed them to support high demands and keep their costs low. In IT, the commodity service of SharePoint needs to be very similar. The service provides a consistent quota, template, and provisioning and de-provisioning processes. The business users can expect a consistent service, know what they’re getting and adjust their needs around it. You may find off the shelf tools such as the Quest Site Administrator tool (<a href="http://www.quest.com/sharepoint">http://www.quest.com/sharepoint</a>) or the codeplex sp configurator tool (<a href="http://www.codeplex.com/spconfigurator">http://www.codeplex.com/spconfigurator</a>) can help you set and keep your auditing policy settings consistent. Out of the box there are challenges for turning on settings across large numbers of sites to capture who changed or deleted a document, settings not enabled by default.</p>
<p>This is not to say that a custom application-based service can’t be successful. It can be very successful when similar principals provided as policies are adhered to. Customization policies, for example, may require that all code introduced into the environment be rolled up in a solution package. It may require that third party software have support and maintenance agreements to avoid situations where problematic code has no developer. Within an organization, it may require all code introduced into the SharePoint environment to be supported not by an individual, but by a development team associated with a division or business unit. You don’t want to be stuck supporting an application where the key and only developer just left the company.</p>
<p><strong>7. Invest in a Scalable Information Architecture</strong></p>
<p>The capacity boundaries of lists, site collections, sites and so on may quickly be passed on as things that are only of concern to IT. Think again. Unfortunately, the reality of the scalability of lists is a somewhat common issue. This issue is ultimately escalated to IT, but it could have been prevented by a bit of end user training in the use of folders and custom views.</p>
<p><strong>Web Applications</strong> – These are good for memory isolation and department level applications in a multi-tenant environment. You do want to limit the use of these objects as they require a lot of memory.</p>
<p><strong>Site Collections</strong> – The most scalable object in SharePoint is the site collection. It is the most common unit in a collaboration environment, and is automatically enforced with my sites. This is the rollup of ownership, permissions and galleries, yet is the smallest unit of quota.</p>
<p><strong>Sites </strong>– While site collections obviously are collections of sites, they can contain more diverse sites. They are useful for breaking up content and often are used in delegation of an internet site or Intranet portal. They can be useful for separating one project from another as they each have a separate home page with web parts and lists.</p>
<p>Discovery is an important part of any Intranet SharePoint deployment. Navigation, site directories and cross-site navigation can help make content more consumable. Users definitely will be happier when they can actually find things.</p>
<p><strong>8.  Don’t forget Change Management</strong></p>
<p>Running SharePoint on a single box is a challenge. The biggest mistake a newbie can make is to put all the eggs in that one basket and then forget about it. What happens when someone needs a webpart? A simple rollout can take down the environment due to a memory leak. Even a service pack can put the environment at risk. You must have an environment where these issues can be fleshed out. The more complex the environment, the more like environments are required: development teams need a dev environment and IT teams need a preproduction evaluation environment. What about restores? What about test? With virtual environments, these can quickly be built up and torn down to perform validation, or they might exist as long as work is being done on the development projects. The key here is not only to stage the deployment effect of a software lifecycle, but also to manage change and mitigate risk. IT is working on evaluating Service Pack 2 and the dev team is working on the latest solution. You don’t want them both to go out at the same time, because any issue will result in a finger-pointing and yelling match. No one wins. Stability comes from managing risk.</p>
<p>Change control dictates that changes are rolled out and validated at each stage, and production changes happen during a maintenance window where usage is brought to a minimum and communication is clear about what’s going on. IT is happier, Development is happier and the business reaps the benefits of high availability. The change management process can involve a change management board or a release manager, or, it can be as simple as a SharePoint list tracking changes rolled out and validated by the infrastructure. A note of caution: make sure your key steps to recover a deployment, along with the change management list with the package’s deployment, are not found only in the deployment you’re trying to recover. Various straightforward ways exist to accomplish this beyond a client with offline capabilities.</p>
<p>For example, a development environment is set up, code is introduced by the business units and the policies are established. Tthe code is wrapped in solution packages (.WSP), tested with standard unit tests, including one for memory leaks using SPDisposeCheck. Code introduced goes through a staged deployment process and is stored in TFS with source control and a change process. All this requires more resources, and that’s where the tradeoffs exist. Are you building high value applications on SharePoint or are you designing an out-of-the-box service with the concept of a commodity or utility in mind. The commodity out-of –he-box design may not include just the out-of-the-box code, but also may have features benefitting everyone who went through full scale rigorous performance testing. It’s about tradeoffs.</p>
<p><strong>9.  Adoption is What Counts<br />
</strong><br />
You could create the most fabulous, rock solid SharePoint deployment but, if no one uses it, your efforts were wasted. In the section above on confronting reality, we mentioned that you need to understand where the business is, and what other platforms are available. You can’t force feed the business, but you can lead it to the solution through training. They likely will be very happy to be involved in the master page acceptance and will provide feedback on the navigation. While they may not understand the challenges of deciding whether the service should provide sites or site collections, they may be able to tell you which of their requirements can be impacted by that decision.</p>
<p>Adoption doesn’t end after deployment. Care and feeding are required throughout the lifecycle of the environment. SharePoint deployments don’t need to be stagnant. They can evolve along with the skills of the deployment team.</p>
<p><strong>10. Keep it Simple<br />
</strong><br />
Overly complex and over-structured deployments can bring a deployment to a halt. In all of this guidance, it may sound like a ton of overhead is required. In reality, it’s more about having insight and using that insight to provide flexibility, and providing clear boundaries so your users can achieve scale and build the solutions they are so interested in using.</p>
<p>SharePoint is a lights-on experience; not everything needs to be enabled from day one. All of the functionality from forms allows workflows, BI dashboards and Excel services to wait as users figure out how to create and manage a list. They can learn how search works, and emphasis can be placed on making it work. Relevance is something that easily can be managed with some focus on what users are looking for, as well as paying attention to keywords and placement on the portal in relation to what they need.</p>
]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/technical/administration/avoid-newbie-mistakes-10-steps-to-successful-sharepoint-deployments/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>SharePoint&#8217;s Branding Limitations, Part 4</title>
		<link>http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-4</link>
		<comments>http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-4#comments</comments>
		<pubDate>Fri, 24 Jul 2009 07:51:47 +0000</pubDate>
		<dc:creator>Diantha van Marion</dc:creator>
				<category><![CDATA[Customisation]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Calendar]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Customization]]></category>
		<category><![CDATA[Date picker]]></category>
		<category><![CDATA[Design Decisions]]></category>
		<category><![CDATA[Front-end]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[HTML-mark up]]></category>
		<category><![CDATA[MOSS]]></category>
		<category><![CDATA[My site]]></category>
		<category><![CDATA[Paging]]></category>
		<category><![CDATA[search]]></category>
		<category><![CDATA[Search results]]></category>
		<category><![CDATA[Sifr]]></category>
		<category><![CDATA[Stylesheet]]></category>
		<category><![CDATA[Styling]]></category>
		<category><![CDATA[Tabs]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=3056</guid>
		<description><![CDATA[Not all graphical designs for a portal will work in a SharePoint environment. There are a couple of limitations the Graphical Designer must know. A Graphical designer needs to know the scope of the graphical design.

This article will give the graphical designers more insight into the effect of these design decisions.]]></description>
			<content:encoded><![CDATA[<h1>Introduction</h1>
<p>As a Front-end Developer with a background in designing I&#8217;ll show you how to make a graphical design that works for a default SharePoint-environment. If you want to take control over the front-end, don&#8217;t use any themes. Create your art by using style sheets!</p>
<p>Not all graphical designs for a portal will work in a SharePoint environment. There are a couple of limitations the Graphical Designer must know. A Graphical designer needs to know the scope of the graphical design. For example, if a Graphical Designer puts a border on an element like a table, that will take him about 3 minutes to design, but this simple border could take the Front-end Developer a few hours to implement.</p>
<p>It&#8217;s really important that the Graphical Designer and the Front-end Developer work together and have a clear communication about the graphical design. Making a graphical design specifically for a MOSS environment could save you days on the implementation! This article will give the Graphical Designers more insight into the effect of these design decisions.</p>
<p>This article assumes that the reader has SharePoint and basic HTML knowledge.</p>
<h2>Search</h2>
<p>There are multiple search interface within a SharePoint portal. One of them is the search interface in the header. Part 1 of &#8220;The art of SharePoint, how to make a graphical design work for SharePoint&#8221; discusses that one.</p>
<p>The search result page has it&#8217;s own page layout. If you take a look at  the search results page you will see that the search interface is no longer in the header but is now onto the content area. It is not another web part, because it has kept it&#8217;s ID <span style="color: #ff6600;">#1</span>, that is reserved for the search interface.</p>
<pre><a rel="attachment wp-att-3102" href="http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-4/attachment/search11"></a><a rel="attachment wp-att-3610" href="http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-4/attachment/search1-2"><img class="alignnone size-medium wp-image-3610" src="http://sharepointmagazine.net/wp-content/uploads/2009/06/search1-300x226.jpg" alt="search1" width="300" height="226" /></a></pre>
<h2>Page layout</h2>
<p>There is a specific page layout for the search results. If you take a closer look at the Black Search Page (Welcome page)  you can identify the following page elements:</p>
<p>• Tabs</p>
<p>• Input fields</p>
<p>• Results bar</p>
<p>• Search results</p>
<p>• Paging (only visible when there are more then 10 item found)</p>
<pre><a rel="attachment wp-att-3611" href="http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-4/attachment/search15"><img class="alignnone size-full wp-image-3611" src="http://sharepointmagazine.net/wp-content/uploads/2009/06/search15.jpg" alt="search15" width="600" height="353" /></a></pre>
<p>The next section discusses all page elements in detail.</p>
<h2>Tabs</h2>
<p>The code in the following image shows that the tabs are rendered inside a table, the<span style="color: #ff6600;"> .ms-ptabarea</span>, which is rendered inside the <span style="color: #ff6600;">.ms-pagetitleareaframe</span> of the web part</p>
<pre><a rel="attachment wp-att-3612" href="http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-4/attachment/search2-2"><img class="alignnone size-full wp-image-3612" src="http://sharepointmagazine.net/wp-content/uploads/2009/06/search2.jpg" alt="search2" width="769" height="292" /></a></pre>
<p>This table has one more cell as there are tabs. In this case there are two tabs, so there are three cells. The last cell of the table has only one function; it makes sure that the whole table has a bottom border all the way to the right.</p>
<p>The &lt;td&gt;&#8217;s with a tab all contain the class name <span style="color: #ff6600;">.ms-sctabcf</span>, or if the tab is selected, the class name is <span style="color: #ff6600;">.ms-sctabcn</span>. This makes it possible to style the selected tab different from the others. The last&lt;td&gt;, the one for the border, has the class name <span style="color: #ff6600;">.ms-sctabrx</span>.</p>
<p>You can make the tabs look like textual links by removing the background color and the borders of the &lt;td&gt;&#8217;s. Make sure that the selected item will be styled a bit different so that it is still visible that it&#8217;s the one selected. Also make sure you style the rollover state of them. Every class name will get &#8220;hover&#8221; behind the usual class name (except for the<span style="color: #ff6600;"> .ms-sctabrx</span>). For example <span style="color: #ff6600;">.ms-sctabcfhover</span> and <span style="color: #ff6600;">.ms-sctabcnhover</span>.</p>
<pre><a rel="attachment wp-att-3104" href="http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-4/attachment/search31"></a><a rel="attachment wp-att-3613" href="http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-4/attachment/search3-2"><img class="alignnone size-full wp-image-3613" src="http://sharepointmagazine.net/wp-content/uploads/2009/06/search3.jpg" alt="search3" width="406" height="38" /></a></pre>
<h2>Input fields</h2>
<p>Another web part on the search result page is where the input fields are. The table the input fields are in, has a cell for every element, plus one.</p>
<p>All the &lt;td&gt;&#8217;s have the class name <span style="color: #ff6600;">.ms-sbcell</span>, except for the last cell, that is empty. This one is called <span style="color: #ff6600;">.ms-slLastcel</span><span style="color: #ff6600;">l</span>. The cell that has the search button in it, has two class names, the <span style="color: #ff6600;">.ms-sbcell</span> and the <span style="color: #ff6600;">.ms-sbgo</span>. You can style this area by using these class names.</p>
<pre><a rel="attachment wp-att-3614" href="http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-4/attachment/search4-2">
<img class="alignnone size-full wp-image-3614" src="http://sharepointmagazine.net/wp-content/uploads/2009/06/search4.jpg" alt="search4" width="446" height="402" /></a></pre>
<h2>Results bar</h2>
<p>The results bar is located just above the search results. It has it&#8217;s own web part zone called <span style="color: #ff6600;">#MidUpperLeftCell</span>. This web part has a table with three &lt;<span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;">tr</span>&gt;&#8217;s. The first ans the second &lt;<span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;">tr</span>&gt;&#8217;s are empty. The third one has a &lt;td&gt; with a web part that is responcible for showing the result text. The text and the sort-links have a classname, you can use to style it.</p>
<pre><a rel="attachment wp-att-3616" href="http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-4/attachment/search51-2">
<img class="alignnone size-full wp-image-3616" src="http://sharepointmagazine.net/wp-content/uploads/2009/06/search51.jpg" alt="search51" width="868" height="628" /></a></pre>
<p>The second results-row, is an other web part, in the web part zone <span style="color: #ff6600;">#MidLowerLeftCell</span>. Inside the <span style="color: #ff6600;">.ms-WPBody</span> is a div.srch-WPBody. In there is the div<span style="color: #ff6600;"> .srch-stats</span> in where the text is located.</p>
<p>Inside the <span style="color: #ff6600;">#MidLowerRightCell</span> is the upper paging positioned.</p>
<pre><a rel="attachment wp-att-3619" href="http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-4/attachment/search6-2"><img class="alignnone size-full wp-image-3619" src="http://sharepointmagazine.net/wp-content/uploads/2009/06/search6.jpg" alt="search6" width="519" height="283" /></a></pre>
<h2>Search results</h2>
<p>The search results are positioned in the web part zone<span style="color: #ff6600;"> #BottomCell</span>. The div inside this web part does have class name:<span style="color: #ff6600;"> .srch-results</span>. All the search results are positioned inside that div. For every search result there is a <span style="color: #ff6600;">.srch-Icon</span>,<span style="color: #ff6600;"> .srch-Title</span>, .<span style="color: #ff6600;">srch-Descriptio</span>n and a <span style="color: #ff6600;">.srch-Metadata</span>, so every element can get its own styling.</p>
<pre><a rel="attachment wp-att-3317" href="http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-4/attachment/search11-2"></a><a rel="attachment wp-att-3622" href="http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-4/attachment/search111"><img class="alignnone size-full wp-image-3622" src="http://sharepointmagazine.net/wp-content/uploads/2009/06/search111.jpg" alt="search111" width="544" height="361" /></a></pre>
<p>All the elements inside a search result have a class name. It is, for example, possible to hide the icon of the document, or give the search title, description or url another color. I advise you to only style the colors and fonts and leave the position of the element as they are, which leaves as much space as possible for the search results.</p>
<h2>Paging</h2>
<p>Inside the <span style="color: #ff6600;">#MidLowerRightCell</span> is the upper paging positioned. The paging at the bottom of the screen is also positioned in the <span style="color: #ff6600;">#BottomCell</span>. Inside the paging div, the .srch-Page there is an &lt;a&gt;-tag for every link. The page that is being visited at the moment does not have a link, nor a classname. So when styling the numbers, first style every element inside the<span style="color: #ff6600;"> .srch-Page</span>, then restyle every &lt;a&gt;-tag inside the <span style="color: #ff6600;">.srch-Page</span>.</p>
<pre><a rel="attachment wp-att-3319" href="http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-4/attachment/search13"></a><a rel="attachment wp-att-3623" href="http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-4/attachment/search131"><img class="alignnone size-full wp-image-3623" src="http://sharepointmagazine.net/wp-content/uploads/2009/06/search131.jpg" alt="search131" width="543" height="371" /></a></pre>
<h1><span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;"><br />
</span>My Site</h1>
<p>The My Site is a bit different then the other sites of SharePoint. First of all it uses another master page, which is composed out of different files. If you want to make changes in the master page or page layout of the My Site, there&#8217;s no easy way to do it. How you can edit the master page will not be discussed in this article. Just stick to the existing layout and only change the style sheet. It is possible to make a beautiful my site.</p>
<p><a rel="attachment wp-att-3101" href="http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-4/attachment/mysite21"><img class="alignnone size-full wp-image-3101" src="http://sharepointmagazine.net/wp-content/uploads/2009/04/mysite21.jpg" alt="mysite21" width="922" height="575" /></a></p>
<p>Because the master page of the My Site is a bit different, it does not contain a reference to your style sheet you created. Ask a developer or architect to add the reference for you, or if that is not possible paste the css code underneath the rest of the styiling in the portal.css. This is not the best way to go, because you really want to separate the default styles from the new one&#8217;s. And you do not want to make changes in the style sheet twice (once in your custom stylesheet and once in the portal.css). So, it is better to make the master page of the My Site work with your style sheet by adding the reference to it.<br />
<a rel="attachment wp-att-3320" href="http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-4/attachment/search14"><img class="alignnone size-full wp-image-3320" src="http://sharepointmagazine.net/wp-content/uploads/2009/06/search14.jpg" alt="search14" width="702" height="410" /></a></p>
<p>If you apply the layout style sheet for the portal onto the<em> My Site, </em>you will see that your graphical design is implemented for about 90%. I advise to double check all the items and make sure every element is styled correctly. Pay special attention to the blog and wiki, the calendar and the colleague tracker.</p>
<h1>SIFR</h1>
<p>Scalable Inman Flash Replacement (SIFR) is ment to replace short pieces of text (for example a title or header) by any particular font. Users of the portal do not need to have the font installed on their machine. SIFR works with javascript, flash and css and replaces the particular piece of text in a split second.</p>
<p>In the configuration file of SIFR you can refer to a class name or ID, so that the text inside that element will be replaced by a SIFR object. It is very easy to use. There is one thing you need to consider before using SIFR on a portal.</p>
<p>SIFR replaces the text with a flash object, a swf. This object is placed on top of the text, while the text that is being replaced is made invisible. It is possible to edit some of the object styles, for example the color and the padding.</p>
<p>What if the text you are replacing with SIFR is a link? Like for example a news header? In the news overview page the header is a link. SIFR replaces the text by a swf-object, but the object does not copy the reference the link had. So be careful where to use SIFR on a SharePoint Portal, because, if what you are replacing  a link with SIFR, which has the same class name/ID as referred to in the configuration file, you cannot use SIFR. Make sure your Graphical Designer knows this, and prevent him from designing a fancy menu with spiffy fonts.</p>
<h1>Calendar and date picker</h1>
<p>The calendar has its own style sheet. Just like the date picker. When you style the calendar, you should also style the date  picker, because those two have the same table-like structure and use the same colors. I advise you to only style the colors and fonts of the calendar and use the layout default.</p>
<p>Because there already is a special calendar style sheet, the calendar.css, it is very easy to style the calendar.</p>
<p>1 First of all, find an element you would like to style.</p>
<p>2 Search in the style sheet for its color and/or background image or -color.</p>
<p>3 Copy all the class names and ID&#8217;s that have that particular color or background image.</p>
<p>4 Make a separate calendar section in the exsisting style sheet, for example after the last line, at the end of the other styling in the calendar.css.</p>
<p>5 Paste the class names and ID&#8217;s in there and give them the color and background images you would like to give them.</p>
<p>This way, you can end up by changing a handfull color codes, and it can be done pretty easy. You can work the same way for the date picker, and you can use the same colors as you did for the calendar.</p>
<p>Here are some examples:</p>
<pre><a rel="attachment wp-att-3098" href="http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-4/attachment/calendar11"></a><a rel="attachment wp-att-3321" href="http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-4/attachment/calendar1-2"><img class="alignnone size-full wp-image-3321" src="http://sharepointmagazine.net/wp-content/uploads/2009/06/calendar1.jpg" alt="calendar1" width="554" height="340" /></a>

<a rel="attachment wp-att-3099" href="http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-4/attachment/calendar21"><img class="alignnone size-full wp-image-3099" src="http://sharepointmagazine.net/wp-content/uploads/2009/04/calendar21.jpg" alt="calendar21" width="514" height="437" /></a></pre>
<p>Make sure you have checked the day, week and month view. Also check a short appointment, an appointment over a few days and an all day appoint.</p>
<h1>Summary</h1>
<p>Here&#8217;s a small overview with highlights of all four parts of the article &#8220;The art of SharePoint, how to make a graphical design work for SharePoint&#8221;.</p>
<ul>
<li>Styling elements will work best on elements that have a class name, ID or a combination of both.</li>
<li>Always double check if you haven&#8217;t forgotten to style any elements.</li>
<li>The calendar and the date picker have their own style sheet.</li>
<li>The look and feel is well manageable when making custom master pages and page layouts. This gives you the opportunity to find the boundaries and give it all a bit more exciting looking.</li>
<li>Most of the time, adjusting the height, width or colors of an element, text or image is not that hard. It is more difficult to style the position, the location of the page elements. Because you cannot change the order in which elements are rendered, you will need style sheets to edit the location on the page where the elements are shown.</li>
<li>Changing an elements position can cause some trouble on other pages on the portal, because class names and ID&#8217;s are used through the whole portal. Changing one of them will cause another element on another page to change also.</li>
</ul>
<h2>Resources</h2>
<p><a href="http://www.heathersolomon.com/content/sp07cssreference.htm" target="_blank">CSS Reference Chart for SharePoint 2007</a></p>
<p>By Heather Solomon</p>
<p><a href="http://www.mikeindustries.com/blog/sifr/" target="_blank">SIFR</a></p>
<p>By Mike Davidson<a href="http://www.sifrgenerator.com/" target="_blank"></a></p>
<p><a href="http://blogs.tamtam.nl/Diantha/" target="_blank">Tamtam blog Diantha van Marion</a></p>
<p>By Diantha van Marion</p>
<h1>Thank You Tam Tam !</h1>
<p>A big thank you to Diantha and Tam Tam from Arno at SharePoint Magazine. This post is from the SharePoint Magazine <a href="../announcements/sharepoint-magazine-partner-spotlight">Partner Spotlight</a> Week, where our featued partner was <a href="../companies/partner-spotlight-tam-tam">Tam Tam. </a></p>
<p>If you would like to be featured on the <a href="../announcements/sharepoint-magazine-partner-spotlight" target="_blank">SharePoint Magazine Partner Spotlight</a>, please <a href="../contactus.php" target="_blank">contact us</a></p>
]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-4/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<series:name><![CDATA[Partner Spotlight: Tam Tam]]></series:name>
	</item>
		<item>
		<title>SharePoint&#8217;s Branding Limitations, Part 3</title>
		<link>http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-3</link>
		<comments>http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-3#comments</comments>
		<pubDate>Thu, 23 Jul 2009 08:04:48 +0000</pubDate>
		<dc:creator>Diantha van Marion</dc:creator>
				<category><![CDATA[Customisation]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Customization]]></category>
		<category><![CDATA[Design Decisions]]></category>
		<category><![CDATA[Front-end]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[HTML-mark up]]></category>
		<category><![CDATA[lists]]></category>
		<category><![CDATA[MOSS]]></category>
		<category><![CDATA[News article]]></category>
		<category><![CDATA[Page layout]]></category>
		<category><![CDATA[Pagelayout]]></category>
		<category><![CDATA[Stylesheet]]></category>
		<category><![CDATA[Styling]]></category>
		<category><![CDATA[Tables]]></category>
		<category><![CDATA[web parts]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=2810</guid>
		<description><![CDATA[Not all graphical designs for a portal will work in a SharePoint environment. There are a couple of limitations the Graphical Designer must know. A Graphical designer needs to know the scope of the graphical design.
This article will give the graphical designers more insight into the effect of these design decisions.]]></description>
			<content:encoded><![CDATA[<h1>Introduction</h1>
<p>As a Front-end Developer with a background in designing I&#8217;ll show you how to make a graphical design that works for a default SharePoint-environment. If you want to take control over the front-end, don&#8217;t use any themes. Create your art by using style sheets!</p>
<p>Not all graphical designs for a portal will work in a SharePoint environment. There are a couple of limitations the Graphical Designer must know. A Graphical designer needs to know the scope of the graphical design. For example, if a Graphical Designer puts a border on an element like a table, that will take him about 3 minutes to design, but this simple border could take the Front-end Developer a few hours to implement.</p>
<p>It&#8217;s really important that the Graphical Designer and the Front-end Developer work together and have a clear communication about the graphical design. Making a graphical design specifically for a MOSS environment could save you days on the implementation! This article will give the Graphical Designers more insight into the effect of these design decisions.</p>
<p>This article assumes that the reader has SharePoint and basic HTML knowledge.</p>
<h1>Web parts</h1>
<p>This section is all about SharePoint&#8217;s web parts. First the display mode of the web parts will be the point of interest, then the Edit mode, and after that the Article page layouts will be discussed.</p>
<p>The &lt;td&gt; with class name <span style="color: #ff6600;">.ms-bodyareacell </span>is the overall container for the content. Inside this &lt;td&gt; is a table with class <span style="color: #ff6600;">.ms-propertysheet</span>, and a td<span style="color: #ff6600;">.ms-bodyareaframe</span> inside that there is another table. These  are the containers for the content on a page and are being defined in the page layout. Inside the <span style="color: #ff6600;">.ms-bodyareaframe</span> are a few nested tables and one of these tables is the table of a web part.</p>
<pre><img class="alignnone size-full wp-image-2811" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/wp-table.jpg" alt="wp-table" width="790" height="387" /></pre>
<h2>Web part ID&#8217;s</h2>
<p>If a web part is placed inside a web part zone, it will get an ID. Depending on the amount of already placed web parts on that page, and the order in which they are placed, the ID will get its tracking number. It does not change when you change the order of the web part zones. So therefore, the ID of the web part actually isn&#8217;t unique, it is just unique for that page.</p>
<pre><img class="alignnone size-full wp-image-2817" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/wp-id.jpg" alt="wp-id" width="445" height="211" /></pre>
<p>The web part in this example is the third web part of the page and as you can see, it carries number 3 in the ID. The search interface in the header is always the first web part of the page. In this case there were two web parts placed on the page, which together with the search makes three: the ID number of the last placed web part. If you want to style the web part in its entirety, you can only list all the web part ID&#8217;s and add styling to them. This nasty solution is the only solution to styling every web part on itself. A better solution would be for example to style the elements inside the web parts, such as the<span style="color: #ff6600;"> .ms-WPBody</span>.</p>
<pre>..
#MSOZoneCell_WebPartWPQ27,
#MSOZoneCell_WebPartWPQ28,
#MSOZoneCell_WebPartWPQ29,
#MSOZoneCell_WebPartWPQ30{
     Border:1px #f2f2f2 solid;
}</pre>
<p>Because every web part has a &lt;td&gt; and inside that a table as a container, it is possible to style the background of the web part with two background images, but it is very tricky an I advice you not to do so. Make sure every &lt;td&gt; with ID <span style="color: #ff6600;">#MSOZoneCell_WebPartWPQ2</span> (a web part ID of your choice) has a background image.  Then style every table inside the &lt;td&gt; with those ID&#8217;s with another background image. Secondly, hide every background image on every second or more nested table inside the &lt;td&gt; with the web part ID.</p>
<p>Here&#8217;s an example of how, just for web part ID 3:</p>
<pre>#MSOZoneCell_WebPartWPQ3{
     Background:transparent url(images/webparttop.jpg) repeat-x left top;
}
#MSOZoneCell_WebPartWPQ3 table{
     Background:transparent url(images/webpartbottom.jpg) repeat-x left top;
}
#MSOZoneCell_WebPartWPQ3 table table{
     Background:transparent none;
}</pre>
<p>Which means &#8220;only apply if table is the first element inside <span style="color: #ff6600;">#MSOZoneCell_</span><span style="color: #ff6600;">WebPart</span><span style="color: #ff6600;">WPQ3</span>&#8220;, because it is not supported in Internet Explorer 6 and older versions.</p>
<p>Unfortunately you cannot use</p>
<pre>#MSOZoneCell_WebPartWPQ3 &gt; table {
     ..
}</pre>
<p>Make sure the images you use are repeatable on the x-axis. If they are not, you will need to make a new page layout where the web part zones have a static width (set in the style sheet of course). This way you can control the width of the web parts in a particular web part zone, and make your background images as wide as the web parts.</p>
<pre><a rel="attachment wp-att-3146" href="http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-3/attachment/wp-bg"><img class="alignnone size-full wp-image-3146" src="http://sharepointmagazine.net/wp-content/uploads/2009/04/wp-bg.jpg" alt="wp-bg" width="281" height="148" /></a></pre>
<h2>Web part headers</h2>
<p>Inside the &lt;td&gt; with the web part ID is always a table with two &lt;tr&gt;&#8217;s. The first one is for the header of the web part, the second one is for the content of the web part.</p>
<pre><img class="alignnone size-full wp-image-2818" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/wp-2trs.jpg" alt="wp-2trs" width="540" height="387" /></pre>
<p>The first class you can use to style the header is the<span style="color: #ff6600;"> tr.ms-WPHeader</span>. This &lt;tr&gt; has two &lt;td&gt;&#8217;s, one for the title of the header, and another one for the little arrow on the right pointing down. Only the first &lt;td&gt; has an ID, which has the same ID-number as the web part-ID.  To style the background and the borders of the header, you can style every &lt;td&gt; inside the <span style="color: #ff6600;">.ms-WPHeader</span>.</p>
<pre><a rel="attachment wp-att-3147" href="http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-3/attachment/wp-header"><img class="alignnone size-full wp-image-3147" src="http://sharepointmagazine.net/wp-content/uploads/2009/04/wp-header.jpg" alt="wp-header" width="494" height="446" /></a></pre>
<pre>.ms-WPHeader td {
     border-bottom:1px solid #4E7CB7;
}</pre>
<p>To style the text of the header, style the<span style="color: #ff6600;"> .ms-WPTitle</span>. Be aware that some web part titles contain a hyperlink. The little arrow is also a link, and to style that you can style the &lt;a&gt;-tag inside the &lt;td&gt;, and then overrule the styling for the header text. Like this:</p>
<pre>/*This styles every link in the header*/
.ms-WPHeader td a{
	background-color:#000000;
}</pre>
<pre>/*This styles every textual link in the header*/
.ms-WPHeader .ms-WPTitle,
.ms-WPHeader .ms-WPTitle a:link,
.ms-WPHeader .ms-WPTitle a:visited{
	color:#4F3B2F;
}</pre>
<pre><img class="alignnone size-full wp-image-2813" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/wp-wph.jpg" alt="wp-wph" width="448" height="256" /></pre>
<p>It is possible to hide the header by changing the settings of the web part. Choose &#8220;appearance&#8221; and in the &#8220;chrome type&#8221; drop down and choose &#8220;none&#8221;. The &lt;tr&gt; with the header will not be rendered then.</p>
<pre><img class="alignnone size-full wp-image-2821" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/wp-chrome.jpg" alt="wp-chrome" width="127" height="107" /></pre>
<h2>Content Editor Web parts</h2>
<p>The &lt;td&gt; of the second &lt;tr&gt; of the<span style="color: #ff6600;"> </span><span style="color: #ff6600;">#MSOZoneCell_WebPartWPQ </span>contains a &lt;div&gt; with a web part ID that has the ID number related to the amount of web parts on the page, like <span style="color: #ff6600;">#WebPartWPQ3</span>. It also has a class called <span style="color: #ff6600;">.ms-WPBody</span>. The core.css uses this class to set the font family and size.</p>
<pre><img class="alignnone size-full wp-image-2822" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/wp-txt.jpg" alt="wp-txt" width="448" height="299" /></pre>
<p>When using a Content Editor Web part, text is placed directly in the <span style="color: #ff6600;">.ms-WPBody</span>. The color of the text is set by the styling in the core.css, on the<span style="color: #ff6600;"> .ms-propertysheet</span> and the body tag. The same goes for the hyper links in the text.</p>
<pre><img class="alignnone size-full wp-image-2823" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/wp-txthyperlink.jpg" alt="wp-txthyperlink" width="544" height="169" /></pre>
<h2>Lists</h2>
<p>In a list web part, there is a <span style="color: #ff6600;">table.ms-summarycustombody</span> class, in where all the links are positioned. Every &lt;td&gt; has a class.</p>
<pre><img class="alignnone size-full wp-image-2829" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/wp-list.jpg" alt="wp-list" width="817" height="488" /></pre>
<p>Depending on what list with hyper links you use, the &lt;td&gt;&#8217;s will have one of the following class:</p>
<pre>.ms-vh,
.ms-vh2,
.ms-vh-icon,
.ms-vh-icon-empty,
.ms-vhImage,
.ms-gb,
.ms-gb2,
.ms-gbload,
.ms-vb,
.ms-vb2,
.ms-vb-tall,
.ms-GRFont,
.ms-vb-user,
table.ms-disc td,
.ms-vh2-nofilter,
.ms-vh2-nograd,
.ms-vh3-nograd,
.ms-vh2-nograd-icon,
.ms-vh2-nofilter-icon,
.ms-pb,
.ms-pb-selected,
.ms-ph {
     font-family:tahoma,sans-serif;
     font-size:8pt;
}</pre>
<p>The first two of this list are for example also used for list headers. Most graphical designs will have the same styling for all hyper links on the portal, so you can add your styling to the above classes and their &lt;a&gt;-tags.  The &#8220;add new&#8221; (add new announcement, add new event, add new link, etc. ) hyper links can be styled with their own class, for example:<span style="color: #ff6600;"> a.ms-addnew</span>. Here&#8217;s an example of how you could style the lists.</p>
<pre><img class="alignnone size-full wp-image-2830" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/wp-linksintxt.jpg" alt="wp-linksintxt" width="262" height="263" /></pre>
<pre><img class="alignnone size-full wp-image-2831" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/wp-linklist.jpg" alt="wp-linklist" width="202" height="131" /></pre>
<h2>Data table</h2>
<p>SharePoint uses tables and lists to display its data. The Document Center is one of those &#8216;data tables&#8217;. The Document Center uses another page layout, because the purpose of the page is to show a big list with data and no text like articles. Therefore the Document Center has one web part zone that uses the whole width of the page.  When styling the web parts, make sure the lists of the Document Center (Documents, Announcements, Tasks) are styled correctly. Pay special attention to the list headers here and make sure the fly outs of the top navigation are positioned above the list headers. If they are, make sure you position the <span style="color: #ff6600;">.ms-vh div</span> and <span style="color: #ff6600;">.ms-vh2 div <span style="color: #000000;">s</span></span><span style="color: #000000;">tati</span>cally.</p>
<pre><img class="alignnone size-full wp-image-2832" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/wp-doccenter.jpg" alt="wp-doccenter" width="718" height="247" /></pre>
<h2>Width</h2>
<p>Sharepoint comes with a set of page layouts. These page layouts have middle and right zones, but they do not always have an ID or class name for those zones. If you want to control the width of the web parts in either the middle or the right column, you need to create new ones, based on the existing page layouts. Make sure every web part zone has an ID or class, so you can set the width of those in the style sheet.</p>
<p><img class="alignnone size-full wp-image-2833" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/wp-setwidth.jpg" alt="wp-setwidth" width="467" height="327" /></p>
<h1>Edit mode</h1>
<p>In edit mode the styling is usually  kept default. Most of the classes and ID&#8217;s of the content are different when in edit mode, so the styling of elements inside web parts is rather easy to separate, but the web parts themselves aren&#8217;t. When editing a page, some web part zones and web parts will get other class.</p>
<pre><img class="alignnone size-full wp-image-2834" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/wp-spzone.jpg" alt="wp-spzone" width="601" height="456" /></pre>
<p>System pages like the &#8220;site settings&#8221;-page and the &#8220;all site content&#8221;-page only contain the same header elements. The rest of the page has classes that are not used on the front-end. Therefore you can style those pages differently. I advise to only change the colors and fonts and leave the layout and the positioning the way it is by default. This way you won&#8217;t corrupt the usability of the system pages.</p>
<pre><img class="alignnone size-full wp-image-2835" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/wp-siteinstellingen.jpg" alt="wp-siteinstellingen" width="400" height="236" /></pre>
<h1>News articles</h1>
<p>When creating a news article, it is possible to choose between several news article layouts; the page layouts. The first page layout for an article page is the &#8220;article page with body only&#8221;. Other page layouts are the &#8220;article page with image on left&#8221;, &#8220;article page with image on right&#8221; and the &#8220;article page with summary links&#8221;.</p>
<h2>Article page with body only</h2>
<p>This page contains a page content zone and a roll up image. When publishing the page, all the content will be inside the <span style="color: #ff6600;">#MSO_ContentTable</span>. Inside that is the <span style="color: #ff6600;">d</span><span style="color: #ff6600;">iv.pageContent</span>.</p>
<pre><img class="alignnone size-full wp-image-2846" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/ap-1.jpg" alt="ap-1" width="669" height="275" /></pre>
<pre><img class="alignnone size-full wp-image-2849" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/ap-1a1.jpg" alt="ap-1a1" width="818" height="356" /></pre>
<p>Since the <span style="color: #ff6600;">d</span><span style="color: #ff6600;">iv.pageContent </span>is an element of every news article page layout, you cannot set the width of the element. Styling this element will cause other page layouts also to be adjusted.</p>
<pre><img class="alignnone size-full wp-image-2848" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/ap-vb1.jpg" alt="ap-vb1" width="329" height="116" /></pre>
<h2>Article page with image on left</h2>
<p>The second page layout is the &#8220;Article page with image on left&#8221;.</p>
<pre><img class="alignnone size-full wp-image-2850" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/ap-2.jpg" alt="ap-2" width="669" height="275" /></pre>
<p>This page layout has the following elements:</p>
<ul>
<li>Page image</li>
<li>Article date</li>
<li>Byline</li>
<li>Page content</li>
<li>Image caption</li>
<li>Roll up image</li>
</ul>
<p><strong>Page image</strong></p>
<p>The <span style="color: #ff6600;">.bodyareaframe</span> contains two tables and some &lt;div&gt;&#8217;s. The first table has the property<span style="color: #ff6600;"> float:left</span>. This makes the image positioned to the left of the text.</p>
<pre><img class="alignnone size-full wp-image-2851" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/ap-2a.jpg" alt="ap-2a" width="816" height="568" /></pre>
<p><strong>Article line and byline</strong></p>
<p><strong></strong>The second table of the <span style="color: #ff6600;">.bodyareaframe </span>is the header. It contains two cells, one for the article date (<span style="color: #ff6600;">.dateLine</span>) and one for the &#8220;byline&#8221;.</p>
<pre><img class="alignnone size-full wp-image-2852" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/ap-2b.jpg" alt="ap-2b" width="428" height="126" /></pre>
<p>Page content</p>
<p>The <span style="color: #ff6600;">di</span><span style="color: #ff6600;">v.pageContent</span> contains a<span style="color: #ff6600;"> div#ctl00_PlaceHolderMain_Content__ControlWrapper_RichHtmlField</span>, which contains the text. The ID is not unique for this piece of page content, it is only unique on this page.</p>
<p>Other page layouts use the same ID, so by styling this element, the text looks the same, no matter what article page layout is chosen.</p>
<pre><img class="alignnone size-full wp-image-2853" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/ap-vb2.jpg" alt="ap-vb2" width="352" height="138" /></pre>
<h2>Article page with image on right</h2>
<p>The &#8220;article page with image on right&#8221; has got the same fields and controls as the &#8220;Article page with image on left&#8221;. The only difference is the floating. Where in the &#8220;Article page with image on left&#8221; the table was floating left, here the table has no floating, but a &lt;div&gt; around it has a right floating. There&#8217;s an extra container div, the<span style="color: #ff6600;"> .articleLayout </span>that was not in the &#8220;Article page with image on left&#8221;.</p>
<pre><img class="alignnone size-full wp-image-2854" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/ap-3.jpg" alt="ap-3" width="669" height="275" /></pre>
<pre><img class="alignnone size-full wp-image-2855" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/ap3a.jpg" alt="ap3a" width="791" height="587" /></pre>
<pre><img class="alignnone size-full wp-image-2856" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/ap-vb3.jpg" alt="ap-vb3" width="396" height="201" /></pre>
<h2>Article page with summary links</h2>
<p>The &#8220;Article page with summary links&#8221; has, instead of the page image and image caption, a Summary Links control. These links are positioned inside a table that is floated to the right.</p>
<pre><img class="alignnone size-full wp-image-2859" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/ap-4.jpg" alt="ap-4" width="669" height="275" /></pre>
<pre><img class="alignnone size-full wp-image-2858" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/ap-4a.jpg" alt="ap-4a" width="655" height="355" /></pre>
<pre><img class="alignnone size-full wp-image-2857" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/ap-vb4.jpg" alt="ap-vb4" width="270" height="136" /></pre>
<h1>Next time in &#8220;SharePoint&#8217;s Branding Limitations&#8221;</h1>
<p>Next time in part four of &#8220;the Art of SharePoint, how to make a graphical design work for SharePoint&#8221;, I will discuss some design decisions for search pages and the My Site. Other points of interest are the styling of the calendar and date picker and the use of SIFR.</p>
]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-3/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<series:name><![CDATA[Partner Spotlight: Tam Tam]]></series:name>
	</item>
		<item>
		<title>SharePoint&#8217;s Branding Limitations, Part 2</title>
		<link>http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-2</link>
		<comments>http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-2#comments</comments>
		<pubDate>Wed, 22 Jul 2009 07:27:58 +0000</pubDate>
		<dc:creator>Diantha van Marion</dc:creator>
				<category><![CDATA[Customisation]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Customization]]></category>
		<category><![CDATA[Design Decisions]]></category>
		<category><![CDATA[Front-end]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[HTML-mark up]]></category>
		<category><![CDATA[Menu items]]></category>
		<category><![CDATA[MOSS]]></category>
		<category><![CDATA[Mysite]]></category>
		<category><![CDATA[Navigation]]></category>
		<category><![CDATA[Quicklaunch]]></category>
		<category><![CDATA[Stylesheet]]></category>
		<category><![CDATA[Styling]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=2534</guid>
		<description><![CDATA[Not all graphical designs for a portal will work in a SharePoint environment. There are a couple of limitations the Graphical Designer must know. A Graphical designer needs to know the scope of the graphical design.
This article will give the graphical designers more insight into the effect of these design decisions.]]></description>
			<content:encoded><![CDATA[<h1>Introduction</h1>
<p>As a Front-end Developer with a background in designing I&#8217;ll show you how to make a graphical design that works for a default SharePoint-environment. If you want to take control over the front-end, don&#8217;t use any themes. Create your art by using style sheets!</p>
<p>Not all graphical designs for a portal will work in a SharePoint environment. There are a couple of limitations the Graphical Designer must know. A Graphical designer needs to know the scope of the graphical design. For example, if a Graphical Designer puts a border on an element like a table, that will take him about 3 minutes to design, but this simple border could take the Front-end Developer a few hours to implement.</p>
<p>It&#8217;s really important that the Graphical Designer and the Front-end Developer work together and have a clear communication about the graphical design. Making a graphical design specifically for a MOSS environment could save you days on the implementation! This article will give the Graphical Designers more insight into the effect of these design decisions.</p>
<p>This article assumes that the reader has SharePoint and basic HTML knowledge.</p>
<h1>Navigation</h1>
<p>This section is all about SharePoint&#8217;s navigation elements. First the meta navigation is discussed, secondly the top navigation with a focus on it’s fly outs. Thirdly, the quick launch navigation is discussed and last but not least the site actions menu.</p>
<h2>Meta navigation</h2>
<p>The meta navigation contains a set of links: Sign In/Welcome, My Links, etc.  The meta navigation is positioned at the upper right top of the page.  It has three textual links and a help icon as you can see in the image below.</p>
<pre><a href="http://sharepointmagazine.net/wp-content/uploads/2009/02/meta-navigation.jpg"><img class="size-full wp-image-2535 alignnone" src="http://sharepointmagazine.net/wp-content/uploads/2009/02/meta-navigation.jpg" alt="" width="315" height="22" /></a></pre>
<p>The meta navigation begins with the <span style="color: #ff9900;">table.ms-globalright. </span>The table is floated to the right which causes the menu to be positioned at the right of the page.  This table has five &lt;td&gt;&#8217;s and they all contain the class name <span style="color: #ff9900;">.ms-globallinks</span>.</p>
<ol>
<li>The first &lt;td&gt; is empty.</li>
<li>The second &lt;td&gt; contains the welcome text and a fly out.</li>
<li>The third &lt;td&gt; contains the vertical line.</li>
<li>The fourth &lt;td&gt; contains a new table.This table contains the &#8220;My Site&#8221; link, separator, &#8220;My Links&#8221; link and separator.</li>
<li>The last &lt;td&gt; contains the help icon.</li>
</ol>
<p>Every &lt;td&gt; of the meta navigation has the class name<span style="color: #ff9900;"> .ms-globallinks</span>. Unfortunately you cannot give this class and every &lt;A&gt; inside a color to change the color of all the links in the meta navigation. The Welcome link doesn&#8217;t change after applying a color to the <span style="color: #ff9900;">.ms-globallinks</span> and it&#8217;s &lt;a&gt;-tags. Because this &lt;td&gt; contains a &lt;div&gt; <span style="color: #ff9900;">.<span style="color: #ff9900;">m</span></span><span style="color: #ff9900;">s-SPLink. </span>Every link inside that &lt;div&gt; has a different color specified in the core.css style sheet. An other link that won&#8217;t change color is the My Links link.</p>
<pre><a rel="attachment wp-att-3129" href="http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-2/attachment/meta-red"><img class="alignnone size-full wp-image-3129" src="http://sharepointmagazine.net/wp-content/uploads/2009/04/meta-red.jpg" alt="meta-red" width="967" height="411" /></a></pre>
<p>When coloring all the links of the meta navigation add the declaration to the &lt;a&gt;-tags in the class name <span style="color: #ff6600;">.ms-SPLink</span>, like this:</p>
<pre>.ms-SPLink a:link,
.ms-SPLink a:visited,
.ms-globallinks,
.ms-globallinks a{
    color:green;
}</pre>
<p>This will overrule the styles for the links in the<span style="color: #ff9900;"> .ms-SPLink</span>, as defined in the core.css, the master style sheet which takes care of the default styling on a SharePoint portal.</p>
<h3>Welcome &#8216;Your Name&#8217; and &#8216;My Links&#8217;</h3>
<p>The &lt;td&gt; of these links contains two spans. The first one, which is hidden, contains the fly out. The second span contains a &lt;div&gt; which contains the &lt;a&gt;-tag. Within the &lt;a&gt;-tag the little arrow pointing down is positioned as well, as seen in the next picture.</p>
<pre><a href="http://sharepointmagazine.net/wp-content/uploads/2009/02/meta-welcome.jpg"><img class="size-full wp-image-2536 alignnone" src="http://sharepointmagazine.net/wp-content/uploads/2009/02/meta-welcome.jpg" alt="" width="500" height="372" /></a></pre>
<p>The graphical behavior of the Welcome and &#8220;My Links&#8221; link is the same. When hovering the link, there&#8217;s a background-color and a border, suggesting it is a button. For consistent use of the graphical design you probably want to style the &#8220;My site&#8221; link the same as the other buttons.</p>
<pre><a href="http://sharepointmagazine.net/wp-content/uploads/2009/02/meta-rollover.jpg"><img class="alignnone size-full wp-image-2537" src="http://sharepointmagazine.net/wp-content/uploads/2009/02/meta-rollover.jpg" alt="" width="149" height="20" />
</a></pre>
<p>Here&#8217;s the code to remove the background-color and border. Add the underline on hovering, to make it look like a textual link instead of a button:</p>
<pre>.ms-HoverCellActive,
.ms-SpLinkButtonActive,
.ms-HoverCellActiveDark{
    background-image:none;
    border:0px none;
    background-color:transparent;
}
.ms-HoverCellActive a:hover,
.ms-SpLinkButtonActive a:hover,
.ms-HoverCellActiveDark a:hover{
    text-decoration:underline;
}</pre>
<h3>My site</h3>
<p>The <em>My Site</em> link is the only link (in the meta navigation) that does not contain a fly out. Therefore, this link will respond to any styling assigned to .ms-globallinks a. The hover state of the .ms-globallinks a is not defined in the core.css style sheet, and therefore overridden by .ms-globalbreadcrumb a:hover. Style the .ms-globallinks a:hover to change the hover state.</p>
<pre><a href="http://sharepointmagazine.net/wp-content/uploads/2009/02/meta-msml.jpg"><img class="alignnone size-full wp-image-2539" src="http://sharepointmagazine.net/wp-content/uploads/2009/02/meta-msml.jpg" alt="" width="500" height="372" /></a></pre>
<h3>Help icon</h3>
<p>The help icon is an image inside an &lt;a&gt;-tag. Because the image itself does not have a class name or ID, it is not specific enough to hide all the images inside the <span style="color: #ff9900;">.ms-globallinks</span>. That is because then the separators would also be effected. Therefor, you can use the &lt;a&gt;-tag (with an ID) in where the image is, to hide the help icon (by hiding the &lt;a&gt;-tag, the image will also be hidden). It is not recommended to hide the help icon because it&#8217;s function is to help the user. It is possible to show another image here. To do this you need to hide the image inside the &lt;a&gt;-tag and make the &lt;a&gt;-tag behave like a block. Then give it dimensions and place the new image of the icon as a background image.</p>
<pre><a href="http://sharepointmagazine.net/wp-content/uploads/2009/02/meta-help.jpg"><img class="alignnone size-full wp-image-2806" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/meta-help.jpg" alt="meta-help" width="496" height="394" />
</a></pre>
<p>An example:</p>
<pre>.ms-globallinks a#ctl00_PlaceHolderGlobalNavigation_TopHelpLink img{
    display:none;
}
.ms-globallinks a#ctl00_PlaceHolderGlobalNavigation_TopHelpLink{
    display:block;
    background:transparent url(/_layouts/images/new_help_icon.gif) no-repeat left center;
    width:10px;
    height:10px;
}</pre>
<h3>Separators</h3>
<p>It is possible to make the separators of the meta navigation hidden, because these are the only non-hyper links in the<span style="color: #ff9900;"> .ms-globallinks</span>. Because they don&#8217;t have any class names or ID&#8217;s that are unique within the meta navigation, you need to style it all. Afterwards you can style the links differently. Giving all the items in the <span style="color: #ff9900;">.ms-globallinks </span>a visibility:invisible or a display:none, and the links a visibility:visible or a display:block, will cause your links to disappear, but only in Internet Explorer. The only way to hide them for all browsers is by giving them the same color as the background color of the meta menu, which off course should have a solid background color.</p>
<pre><a href="http://sharepointmagazine.net/wp-content/uploads/2009/02/meta-separator.jpg"><img class="size-full wp-image-2541 alignnone" src="http://sharepointmagazine.net/wp-content/uploads/2009/02/meta-separator.jpg" alt="" width="500" height="372" /></a></pre>
<p>The steps are as follows: give the <span style="color: #ff6600;">.ms-globallinks</span> the same color as the background color (or any other color you wish), and give the links in the .ms-globallinks a of your choice. Like this:</p>
<pre>.ms-globallinks{
    color:#FFFFFF !important;
}
.ms-SPLink a:link,
.ms-SPLink a:visited,
.ms-globallinks,
.ms-globallinks a{
    color:green;
}</pre>
<p>You can remove some padding of the <span style="color: #ff6600;">.ms-globallinks</span> to make the spaces between the hyper links less wide.</p>
<pre><a href="http://sharepointmagazine.net/wp-content/uploads/2009/02/meta-noseparator.jpg"><img class="alignnone size-full wp-image-2543" src="http://sharepointmagazine.net/wp-content/uploads/2009/02/meta-noseparator.jpg" alt="" width="313" height="21" /></a></pre>
<p>It is not possible to style the links on multiple lines, because the &#8216;welcome&#8217;-link and the &#8216;my site&#8217;-link have the same class names, and will react the same.</p>
<h2>Top navigation with fly outs</h2>
<p>The top navigation is the horizontal navigation bar at the top of every page (inside the <span style="color: #ff6600;">bannercontainer</span>). The top navigation shows the sites or pages from the first level. This first level contains every page or site made from the homepage. The homepage is always level 0. SharePoint enables users to rename, remove or add a link.</p>
<p>The top navigation has a lot of nested tables. The table of the banner frame contains four &lt;td&gt;&#8217;s.</p>
<ol>
<li>The first is empty.</li>
<li>The second &lt;td&gt; contains the top navigation menu.</li>
<li>The third &lt;td&gt; is empty.</li>
<li>The fourth contains the site actions menu.</li>
</ol>
<p>The site actions will be discussed later. First I want to focus on the top navigation menu. In the ideal world and maybe in the future it will by default, the menu would look like this:</p>
<pre>&lt;ul class="ms-bannerframe"&gt;
	&lt;li&gt;&lt;/li&gt;
	&lt;li class="ms-banner"&gt;
		&lt;ul class="ms-topNavContainer"&gt;
			&lt;li&gt; .. &lt;/li&gt;
			&lt;li&gt; .. &lt;/li&gt;
			&lt;li&gt; .. &lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;&lt;/li&gt;
	&lt;li&gt;siteactions menu goes here &lt;/li&gt;
&lt;/ul&gt;</pre>
<p>The second &lt;td&gt; contains a table, the <span style="color: #ff6600;">.ms-topNavContainer</span>, which contains multiple &lt;td&gt;&#8217;s. The first &lt;td&gt; is the home menu item, the menu item of level 0. The rest of the &lt;td&gt;&#8217;s are empty or contain other items of the top navigation.</p>
<pre><img class="alignnone size-full wp-image-2765" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/topnav-container.jpg" alt="topnav-container" width="625" height="573" /></pre>
<h3>Home, the first menu item</h3>
<p>The home menu item is placed into another table, the <span style="color: #ff6600;">.ms-topnav</span>. Every menu item of the top navigation is placed inside a table with the same class name. When the menu item is active, it gets another class name added, the <span style="color: #ff6600;">.ms-topnavselected</span>. By using this class name in your style sheet, it is possible to style the active menu items different. Another element contains the class name <span style="color: #ff6600;">.ms-topnav</span> as well: the &lt;a&gt;-tagtable.ms-topnav or a.ms-topnav, or use just .ms-topnav for giving them both the sames styling. The same goes for the .ms-topnavselected. of the menu item. Be sure to style the right item by styling the</p>
<pre><img class="size-full wp-image-2768 alignnone" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/topnav-mstopnav.jpg" alt="topnav-mstopnav" width="597" height="324" /></pre>
<p>It is not possible to style the home menu-item differently then the other menu items, because they all have the same class names. If you want to do it anyway, you need to edit the HTML that is rendered for this menu.</p>
<h3>Other first level menu items</h3>
<p>The &lt;td&gt; with the other menu items, contains a table with two cells. The first cell is empty, the next cell contains a table, the .ms-topnav. If the menu item does not contain any pages or sites at second level, the &lt;td&gt; only contains the &lt;a&gt;-tag, just like the home button.</p>
<pre><img class="alignnone size-full wp-image-2769" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/topnav-no2ndlevel.jpg" alt="topnav-no2ndlevel" width="544" height="438" /></pre>
<h4>Background images</h4>
<p>To style the menu items, you can use the class <span style="color: #ff6600;">table.ms-topnav</span>. You can give it a background color or background image. Be aware that the image must be repeatable on the x-axis unless the menu items have a fixed width. You cannot use an image that is different on the left and right side when the images have variable widths. This is because items with no second level have only one &lt;td&gt;. So you cannot use an image for the left side and another image for the right side.</p>
<p>If the <span style="color: #ff6600;">table.ms-topnav</span> has a fixed width, you can use one background image on the table, but be aware that menu items with a long text can be bigger then the set width. The styling of the menu item will fail.</p>
<p>The first image shows a menu item that has no arrow on the right. The second image shows the menu item when it does have an arrow on the right.</p>
<pre><img class="size-full wp-image-2767 alignnone" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/topnav-firstlevel.jpg" alt="topnav-firstlevel" width="354" height="280" /></pre>
<p>An example of how you could style the first level of the top navigation:</p>
<pre>.ms-topnav {
     background-color:#70C8D4;
     background-image:none;
     border:0px none;
     color:#FFF;
}</pre>
<pre>.ms-topnavselected {
     background:#2B9AAE url(/_layout/images/topnavselected.gif) repeat-x fixed left bottom;
     border:0px none;
}</pre>
<p>Hide the little arrow pointing down by:</p>
<pre>table.ms-topnav td img{
     visibility:hidden;
}</pre>
<h3>Second level menu items (fly outs)</h3>
<p>The second level menu items are the sub menu items that will become visible when you hover a top navigation menu item. In the HTML, the sub menu items are positioned underneath the overall table that contains the first level menu items. The whole fly out is rendered as a &lt;div&gt;, that contains a lot of nested &lt;div&gt;&#8217;s and tables, for every sub menu item and sub sub menu item.</p>
<pre><img class="alignnone size-full wp-image-2794" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/topnav-flyoutcontainer.jpg" alt="topnav-flyoutcontainer" width="897" height="328" /></pre>
<p>Every sub menu item is rendered inside the table with class name<span style="color: #ff6600;"> .ms-topNavFlyOuts.</span> This table contains a &lt;td&gt; with the link to the concerning page. When there are sub sub menu items, there are two &lt;td&gt;&#8217;s. The first one contains the &lt;a&gt;-tag. Only when there is a third level in the menu, the second one contains the little arrow image, pointing to the right.</p>
<pre><img class="alignnone size-full wp-image-2793" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/topnav-flyout.jpg" alt="topnav-flyout" width="686" height="290" /></pre>
<pre><a rel="attachment wp-att-3134" href="http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-2/attachment/topnav-arrow-2"><img class="alignnone size-full wp-image-3134" src="http://sharepointmagazine.net/wp-content/uploads/2009/04/topnav-arrow.jpg" alt="topnav-arrow" width="202" height="126" /></a></pre>
<p>The top navigation fly outs can be styled by referring to the &lt;td&gt;&#8217;s of the <span style="color: #ff6600;">.</span><span style="color: #ff6600;">ms-topNavFlyOuts</span> table.  The arrows are not that easy to style, because the image is not on the file system, but it is generated by code. To alter this image, you need to change a property of the AspMenu in your master page. How to do this is not discussed in these articles.</p>
<p>Reset the styling of the rollover of the menu items:</p>
<pre>.ms-topNavFlyOutsHover,
.ms-topNavFlyOutsHover a{
     background-color:#000000;
}</pre>
<p>Reset the styling of the background of the flyout items:</p>
<pre>.ms-topNavFlyOuts{
     background-color:white;
}</pre>
<p>The border that comes around the whole fly out area still has a blue border. This is set on the class name of the <span style="color: #ff6600;">.zz1_TopNavigationMenu</span>. Every fly out menu has it&#8217;s own class name, with a number. The number is variable and depends on the number of menu items on that page. You will never know which numbers will be used, since you do not know how many menu items there are. This for example will only work on one of the fly outs:</p>
<pre>.zz1_TopNavigationMenu_8 {
     background-color:#F2F3F4;
     border:1px solid #A7B4CE;
}</pre>
<p>When you look closer, you see that besides this class name, every fly out area has the same class name: <span style="color: #ff6600;">zz1_TopNavigationMenu_0</span>. So, to style the border of the fly out menu, you can change the border of this class name, like this:</p>
<pre>div.zz1_TopNavigationMenu_0{
     border:1px #000000 solid;
}</pre>
<p>Do check the fly out menu on a listpage, and double check if the list header is not visible on top of the fly out menu. This could happen when the the list header (<span style="color: #ff6600;">.ms-vh </span>or <span style="color: #ff6600;">.ms-vh2</span>) is relatively positioned. The solution for this is to make it static, it will not influence the styling of the menu.</p>
<pre>.ms-vh div,
.ms-vh2 div{
     position:static !important;
}</pre>
<pre><img class="alignnone size-full wp-image-2795" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/topnav-flyoutunder.jpg" alt="topnav-flyoutunder" width="157" height="201" /></pre>
<pre><img class="alignnone size-full wp-image-2796" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/topnav-flyoutup.jpg" alt="topnav-flyoutup" width="154" height="196" /></pre>
<h2>Quick Launch navigation</h2>
<p>The quick launch navigation is also known as the left menu. The quick launch has three parts.</p>
<p>• Quick Launch header</p>
<p>• Menu items</p>
<p>• Recycle Bin</p>
<pre><img class="alignnone size-full wp-image-2780" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/ql-quicklaunch.jpg" alt="ql-quicklaunch" width="148" height="239" /></pre>
<p>The set of the three items together are rendered into two containers, the <span style="color: #ff6600;">div.ms-quickLaunchouter</span> and inside that is the <span style="color: #ff6600;">div.ms-quickLaunch</span>. Because the quick launch has two containers, it is possible to give the top of the menu another background image then the bottom, for example.</p>
<pre><img class="alignnone size-full wp-image-2781" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/ql-quicklaunchouter.jpg" alt="ql-quicklaunchouter" width="338" height="133" /></pre>
<h3>Hiding the quick launch menu</h3>
<p>Some customers like the portal homepage to be without the left menu. There are several ways to do this. I&#8217;ll discuss three of them.</p>
<p>1: The first is to make a special page layout for the homepage. Make sure the control for the quick launch menu is inside the page layout and not in the master page. For that you have to edit all the other page layouts. Now make sure the left menu on the page layout you made for the homepage isn&#8217;t showed or even isn&#8217;t rendered at all, by removing the menu control. This solution will cost you the most effort and time.</p>
<p>2: The second way is to give the homepage page layout an extra reference to a style sheet. That would be a style sheet you make specially for the homepage and in where you add styles to hide the left menu.</p>
<p>3: Another solution to hide the left menu on the homepage is by adding styles that will make the menu disappear. It can be done in the style sheet, so the left menu will be hidden in every page, or it can be done by adding a Content Editor Web part on the page you wouldn&#8217;t want the left menu on.</p>
<pre><img class="size-full wp-image-2773 alignnone" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/ql-cew.jpg" alt="ql-cew" width="317" height="79" /></pre>
<p>First, add a Content Editor Web part to the particular page. Open the tool pane, and add some source code that will hide the left menu:</p>
<pre>&lt;style type="text/css"&gt;
.ms-navframe{
     display:none;
}
&lt;/style&gt;</pre>
<p>This way the quick launch outer is hidden and the left area is also gone, so that the content in the middle will have more space. The <span style="color: #ff6600;">.ms-navframe</span> is responsible for the width of the area the menu is in.</p>
<pre><img class="alignnone size-full wp-image-2779" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/ql-noleftmenu.jpg" alt="ql-noleftmenu" width="741" height="338" /></pre>
<p>Next thing is to make sure the web part with the styling is not visible on the front end. For that, choose Chrome type &#8220;none&#8221;, in the Appearance menu and under the layout section check the check box for hiding the web part header.  The menu (and the web part that is hiding the menu) is now hidden on only this page.</p>
<pre><img class="alignnone size-full wp-image-2774" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/ql-chrome.jpg" alt="ql-chrome" width="127" height="107" /></pre>
<h3>Quick Launch header</h3>
<p>The header of the quick launch is a &lt;H3&gt; with a &lt;LABEL&gt; and a &lt;SPAN&gt;.</p>
<pre><img class="alignnone size-full wp-image-2775" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/ql-header.jpg" alt="ql-header" width="431" height="531" /></pre>
<p>The label contains the text &#8220;Quick Launch&#8221;, but is invisible because it is absolute positioned and placed out of sight by the core.css. The span contains a &lt;div&gt; with class name <span style="color: #ff6600;">.</span><span style="color: #ff6600;">ms-quickLaunchheader</span>. This &lt;div&gt; has a background image and background color. There&#8217;s also font-color defined here, but the text inside this &lt;div&gt; is always a link. So if you want to style that, it&#8217;s more efficient to style the &lt;a&gt;-tag.</p>
<pre><img class="alignnone size-full wp-image-2776" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/ql-headera.jpg" alt="ql-headera" width="920" height="76" /></pre>
<h3>Quick Launch menu items</h3>
<p>The second part in the quick launch is the &lt;div&gt; with ID <span style="color: #ff6600;">ctl00_PlaceHolderLeftNavBar_QuickLaunchNavigationManager</span>. Inside this is a table with class name <span style="color: #ff6600;">.ms-navSubMenu1</span>. The 1 indicates the level of the menu items, The first level menu items. For every menu item there&#8217;s a &lt;td&gt; in this table.</p>
<p>Every menu item is positioned inside it&#8217;s own table, the <span style="color: #ff6600;">.ms-navheader</span>. Only the menu items on the first level are called navheader. Besides that, the &lt;td&gt;inside the table has an &lt;a&gt;-tag containing a class name <span style="color: #ff6600;">.ms-navheader</span>. So when styling the whole area of the menu item, or just the link itself, make sure you use <span style="color: #ff6600;">table.ms-navheader</span> or <span style="color: #ff6600;">a.ms-navheader</span>.</p>
<h4>Sub menu items of the quick launch</h4>
<p>As there is a &lt;td&gt; for every first level menu item, there is also a &lt;td&gt; for a collection of second level menu items. Inside that &lt;td&gt; is another table, the <span style="color: #ff6600;">.ms-subNavMenu2 </span>and every sub menu item has it&#8217;s own &lt;td&gt; in there.</p>
<pre><img class="alignnone size-full wp-image-2785" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/ql-subnavmenu.jpg" alt="ql-subnavmenu" width="441" height="542" /></pre>
<p>Changing the background of the sub menu items can be done very easily, because of the<span style="color: #ff6600;"> .ms-navSubMenu2</span> class name. By default the &lt;td&gt; of this table has the bullet background image.</p>
<pre><img class="alignnone size-full wp-image-2778" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/ql-navitem.jpg" alt="ql-navitem" width="752" height="482" /></pre>
<p>Removing this bullet can be done like this:</p>
<pre>table.ms-navitem td, span.ms-navitem {
	Background-image:none;
	Padding-left:0px;
}</pre>
<p>Every sub menu item has it&#8217;s own table and only one &lt;td&gt;. Therefore it is possible to use two background images underneath the text of the &lt;a&gt;-tag of a second level menu item. One image for the left and one for the right side.</p>
<pre><img class="alignnone size-full wp-image-2786" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/ql-vb.jpg" alt="ql-vb" width="189" height="346" /></pre>
<h3>Recycle bin</h3>
<p>The recycle bin is the third item inside the quick launch. This table contains another table named <span style="color: #ff6600;">.ms-recyclebin</span>. Inside this table is the &lt;a&gt;-tag, containing the icon and the text &#8220;recycle bin&#8221;.</p>
<pre><img class="size-full wp-image-2783 alignnone" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/ql-recyclebinvb.jpg" alt="ql-recyclebinvb" width="116" height="23" /><img class="size-full wp-image-2784 alignnone" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/ql-recyslebinvb2.jpg" alt="ql-recyslebinvb2" width="140" height="34" /></pre>
<p>It is possible to hide the trash bin icon, because it is the only image inside the &lt;a&gt;-tag. There&#8217;s no padding on the &lt;a&gt;-tag, so by removing the image like this, the &lt;a&gt;-tag should automatically align with the other menu items.</p>
<pre>.ms-recyclebin a img{
	display:none;
}</pre>
<pre><img class="alignnone size-full wp-image-2782" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/ql-recyclebin.jpg" alt="ql-recyclebin" width="743" height="336" /></pre>
<h2>Site Actions navigation</h2>
<p>If you have at least editor rights, you will find the site actions button on the right top of your screen.</p>
<pre><a rel="attachment wp-att-3128" href="http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-2/attachment/sa-siteactions-2"><img class="alignnone size-full wp-image-3128" src="http://sharepointmagazine.net/wp-content/uploads/2009/04/sa-siteactions.jpg" alt="sa-siteactions" width="106" height="20" /></a></pre>
<p>The site actions button has a few nested tables and &lt;div&gt;&#8217;s. Only a few of them have ID&#8217;s or class names. From the outside to the inside:</p>
<ol>
<li>Table.ms-siteaction</li>
<li>Td#siteactiontd.ms-siteactionsmenu</li>
<li>Div</li>
<li>Div</li>
<li>Span</li>
<li>Div  (on hover it does have a class name:  .ms-siteactionsmenuhover)</li>
<li>a</li>
</ol>
<p>The &lt;a&gt;-tag for example does have an ID, but since it is an index number that points to the number of menu items, it is not wise to use this ID, because it could change per page or after a menu item was added.</p>
<p>When changing the background image of the button, refer to <span style="color: #ff6600;">.ms-siteactionsmenu div div div</span> and <span style="color: #ff6600;">.ms-siteactionsmenu div div div.ms-siteactionsmenuhover</span>.</p>
<p>Here&#8217;s some css to clear up the button and undo it from it&#8217;s (background-)colors, so that it looks like it is a textual link:</p>
<pre>.ms-siteactionsmenu div div div,
.ms-siteactionsmenu div div div.ms-siteactionsmenuhover{
    background-color:transparent;
    background-image:none;
    background-repeat:no-repeat;
    border:0px none;
}</pre>
<h3>The secret of the little arrow</h3>
<p>What is up with the little arrow in the site actions button? As you can see in the code, there is a blank.gif, which is not the image of the arrow. And there is no background image on it whatsoever. The arrow isn&#8217;t a background image of the &lt;a&gt;-tag either. So, where does this arrow come from then? It looks like it&#8217;s the &lt;a&gt;-tag&#8217;s parent &lt;div&gt;, but that one only has a background image that is responsible for the blue background.  The answer is closer than you think, because there is an image next to the &lt;a&gt;-tag, which is called whitearrow.gif. The question I cannot answer is why it is not inside the &lt;a&gt;-tag, since it should also be click-able, right? Well, it does explains why at first sight I couldn&#8217;t find the image. Mystery solved.</p>
<pre><img class="alignnone size-full wp-image-2788" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/sa-arrow.jpg" alt="sa-arrow" width="506" height="194" /></pre>
<h3>The site actions fly outs</h3>
<p>The site action button had also a fly out menu when you have clicked on it. This menu is hidden in the span by an in-line <span style="color: #ff6600;">display:none</span>.</p>
<pre><img class="alignnone size-full wp-image-2791" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/sa-span.jpg" alt="sa-span" width="391" height="213" /></pre>
<p>This menu is a bit different from the other menu&#8217;s. It has a &lt;menu&gt;tag and a &lt;ie:menuitem&gt; for each sub menu item. These objects cannot be styled in the style sheet.</p>
<pre><img class="alignnone size-full wp-image-2789" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/sa-flyout.jpg" alt="sa-flyout" width="250" height="150" /></pre>
<h1>Next time in &#8220;SharePoint&#8217;s Branding Limitations&#8221;</h1>
<p>Next part of this article will contain information about web parts with text zones, lists and tables. Other topics are the graphical possibility&#8217;s of the edit mode and the news articles. Stay tuned!</p>
]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-2/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
	
		<series:name><![CDATA[Partner Spotlight: Tam Tam]]></series:name>
	</item>
		<item>
		<title>SharePoint&#8217;s Branding Limitations, Part 1</title>
		<link>http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-1</link>
		<comments>http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-1#comments</comments>
		<pubDate>Tue, 21 Jul 2009 14:40:38 +0000</pubDate>
		<dc:creator>Diantha van Marion</dc:creator>
				<category><![CDATA[Customisation]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Customization]]></category>
		<category><![CDATA[Design Decisions]]></category>
		<category><![CDATA[Front-end]]></category>
		<category><![CDATA[Functional Designer]]></category>
		<category><![CDATA[Graphical Design]]></category>
		<category><![CDATA[Graphical Designer]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[HTML-mark up]]></category>
		<category><![CDATA[MOSS]]></category>
		<category><![CDATA[Stylesheet]]></category>
		<category><![CDATA[Styling]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=678</guid>
		<description><![CDATA[Not all graphical designs for a portal will work in a SharePoint environment. There are a couple of limitations the Graphical Designer must know. A Graphical designer needs to know the scope of the graphical design.
This article will give the graphical designers more insight into the effect of these design decisions.]]></description>
			<content:encoded><![CDATA[<h1>Introduction</h1>
<p>As a Front-end Developer with a background in designing I&#8217;ll show you how to make a graphical design that works for a default SharePoint-environment. If you want to take control over the front-end, don&#8217;t use any themes. Create your art by using style sheets!</p>
<p>Not all graphical designs for a portal will work in a SharePoint environment. There are a couple of limitations the Graphical Designer must know. A Graphical designer needs to know the scope of the graphical design. For example, if a Graphical Designer puts a border on an element like a table, that will take him about 3 minutes to design, but this simple border could take the Front-end Developer a few hours to implement.</p>
<p>It&#8217;s really important that the Graphical Designer and the Front-end Developer work together and have a clear communication about the graphical design. Making a graphical design specifically for a MOSS environment could save you days on the implementation! This article will give the Graphical Designers more insight into the effect of these design decisions.</p>
<p>This article assumes that the reader has SharePoint and basic HTML knowledge.</p>
<h2>Process description</h2>
<h3>Communication flows</h3>
<p>The communication between the Graphical Designer and the Front-end Developer is all about the graphical design for SharePoint and the ways to implement it.  The Graphical Designer discusses the design he wants to make with the Front-end Developer to check if his design ideas are implementable on a SharePoint environment. After the Graphical Designer has a first version of the graphical design, the Front-end Developer determines if it can be implemented in the available time. If the actual costs are higher than the estimated costs, the Graphical Designer and the Front-end Developer could look for another elaboration of the customers idea, one that is easier to implement, and more predictable.</p>
<p>The communication between the Graphical Designer and the Front-end Developer will continue like this until the graphical design is approved by the customer and the implementation can start. The communication between the Graphical DesignerGraphical Designer has in mind for its design. Decisions concerning the colors, fonts, margins, menu&#8217;s and links are transferred by a style guide. However, if there&#8217;s a lack of time frequently the style guide isn&#8217;t fully developed, so the Graphical Designer needs to explain the Front-end Developer about the styling guides. Disadvantage of this is that the Front-end Developer co and the Front-end Developer will change and will all be about the transfer of knowledge about what can be implemented and what can&#8217;t. It is important that the Front-end Developer knows exactly what the uld forget information or interpret it differently than the Graphical Designer has in mind, and the Front-end Developer cannot check it in the style guide. Therefore, be sure that there is always a style guide that is as extended as possible.</p>
<p>What can happen after the graphical design is implemented is that the customer decides to change a component in the graphical design. Depending on the change, the Graphical Designer must be consulted again, or the Front-end Developer can modify it, in consultation with the Graphical Designer. The ideal situation is to adapt the style guide too.</p>
<p>The style guide is made by the Graphical Designer. Since he has made the design and knows exactly how the design should look like and elements graphically should behave. Beside the style guide the Front-end Developer also needs the design files of the Graphical Designer to be able to implement the Graphical Designer, for example the PSD files.</p>
<div id="attachment_2061" class="wp-caption alignnone" style="width: 310px"><a href="http://sharepointmagazine.net/wp-content/uploads/2008/12/defaulthome.jpg"><img class="size-medium wp-image-2061" src="http://sharepointmagazine.net/wp-content/uploads/2008/12/defaulthome-300x142.jpg" alt="" width="300" height="142" /></a><p class="wp-caption-text">Image of default homepage</p></div>
<h3>Knowledge transfer</h3>
<p>The graphical design is based on the requirements of the customer and its company, depending on the browsers to use and its users, and of course the estimated capacity and the creative ideas of the Graphical Designer. Graphical Designers which design for MOSS must have knowledge of SharePoint. Most Graphical Designer&#8217;s will catch the default (blue) graphical design of a MOSS portal as a basis for the graphical design. They can take the default or frequently used elements of MOSS and use them for their graphical design. They keep the location of the elements approximately the same to what they see on the default portal, their example. This is the most common way to start a graphical design for MOSS.</p>
<p>The Graphical Designer also needs to have some knowledge about how the designed elements of the graphical design will be implemented. He needs to know how the Front-end Developer will implement a graphical design. Because the Graphical Designer does not know of every table, div and so, it is important that the Front-end Developer informs the Graphical Designer about the possibilities of implementation, however the Front-end Developer does need to have this knowledge of course. Even if the Graphical Designer used a default MOSS portal for making the graphical design, it is possible that there are elements in the graphical design that cannot be implemented on a default MOSS portal, because the default HTML won&#8217;t let you. That&#8217;s why it is very important to communicate a lot and involve the Front-end Developer at an early stage of the graphic design.</p>
<h2>Design decisions</h2>
<p>In this part I will evaluate some design decisions. I will comment on a number of standard components of a SharePoint publishing portal and indicate per component how the element&#8217; HTML has been rendered and the possibilities for implementing a design on that HTML.</p>
<h3>Scaling pages</h3>
<p>The Graphical Designer needs to know how the page will behave if the visitor of the portal gives another format to the browser window. In case of a portal the Graphical Designer will generally recommend to use the complete width of the browser window, because portals are all about displaying lots of information. It is desirable to be able to use the full width to place as much information on the page as needed/possible, and make it liquid. This is default by MOSS, when widening the browser window, the middle column will become wider and more space for content will be available. The left column with the menu will keep its width, just like the right column.</p>
<p>However it is possible that the customer chooses to let the scaling behave differently. For example by dividing the available space to the left and right column. In this case the fixed width of the right column is put on a certain percentage in the style sheet instead of a fixed number of pixels, mostly 20 or 30%. The middle column should also get a width in a certain percentage. For making another partitioning it is desirable to make a custom page layout.</p>
<div id="attachment_1173" class="wp-caption alignnone" style="width: 250px"><a href="http://sharepointmagazine.net/wp-content/uploads/2008/09/verdeling-31.jpg"><img class="size-medium wp-image-1173" src="http://sharepointmagazine.net/wp-content/uploads/2008/09/verdeling-31-300x180.jpg" alt="" width="240" height="144" /></a><p class="wp-caption-text">Example of page with variable width</p></div>
<div id="attachment_1172" class="wp-caption alignnone" style="width: 250px"><a href="http://sharepointmagazine.net/wp-content/uploads/2008/09/verdeling-31.jpg"><img class="size-medium wp-image-1172" src="http://sharepointmagazine.net/wp-content/uploads/2008/09/verdeling-21-300x180.jpg" alt="" width="240" height="144" /></a><p class="wp-caption-text">Example of page with variable width</p></div>
<div id="attachment_968" class="wp-caption alignnone" style="width: 250px"><a href="http://sharepointmagazine.net/wp-content/uploads/2008/09/verdeling-11.jpg"><img class="size-medium wp-image-968" src="http://sharepointmagazine.net/wp-content/uploads/2008/09/verdeling-11-300x180.jpg" alt="" width="240" height="144" /></a><p class="wp-caption-text">Example of page with variable width</p></div>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2008/09/verdeling-31.jpg"></a></p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2008/09/verdeling-31.jpg"></a></p>
<h3>Header</h3>
<p>The area positioning on a page consists out of several rows. First there is the header, then a content area and then the footer. All visual elements of SharePoint are in one of those zones. The elements of the edit console are underneath the header, they will be discussed later.</p>
<p>The header itself is also built out of rows, with in every row a few SharePoint elements. In the header every row has a class name or unique ID name. The header is built with tables, and nested tables, who together are responsible for the area positioning.</p>
<h4>Global breadcrumb</h4>
<p>The global breadcrumb, which is the first row of the header, contains two tables, each with its own class name. This aligns the text to the left and the meta menu to the right. Therefore the global links on the left side and the global links on the right side can be styled and positioned differently.</p>
<div id="attachment_1179" class="wp-caption alignnone" style="width: 613px"><a href="http://sharepointmagazine.net/wp-content/uploads/2008/09/globalbreadcrumb.jpg"><img class="size-full wp-image-1179" src="http://sharepointmagazine.net/wp-content/uploads/2008/09/globalbreadcrumb.jpg" alt="" width="603" height="142" /></a><p class="wp-caption-text">Global breadcrumb</p></div>
<p>The menu items of the meta menu can be styled separately. However, frequently it is desirable to style all meta menu items the same. The styling can be done by using the class name of the common parent element. This way the styling isn&#8217;t influenced by any nested tables or divs that may be in the menu table.</p>
<div id="attachment_1182" class="wp-caption alignnone" style="width: 157px"><a href="http://sharepointmagazine.net/wp-content/uploads/2008/09/help-icon.jpg"><img class="size-full wp-image-1182" src="http://sharepointmagazine.net/wp-content/uploads/2008/09/help-icon.jpg" alt="" width="147" height="28" /></a><p class="wp-caption-text">Customized metamenu</p></div>
<pre>.ms-SPLink a:link,
.ms-SPLink a:visited {
                color:green;
}</pre>
<p>The icon that is used for the help function can be styled too. Just keep the width and height of the new image the same as the original, so that a replacement can be done easily. Always keep a copy of the original image, for back-up.</p>
<h4>Global title area</h4>
<p>The global title area is the second row of the header. It contains a table with three cells, the global title area image, the site title and the search function.</p>
<div id="attachment_1180" class="wp-caption alignnone" style="width: 613px"><a href="http://sharepointmagazine.net/wp-content/uploads/2008/09/globaltitlearea.jpg"><img class="size-full wp-image-1180" src="http://sharepointmagazine.net/wp-content/uploads/2008/09/globaltitlearea.jpg" alt="" width="603" height="142" /></a><p class="wp-caption-text">Global title area </p></div>
<p>The global title area image can be used to display the logo, because this element has a link with a reference to home. Therefore it is important to hide the image, stretch the a-tag to the dimensions of the logo and make the logo disappear as the background image of the &lt;a&gt;-tag. Then, the text of the &lt;a&gt;-tag will be placed outside the view of the browser with a negative indent. This way the logo will still have a textual link for users that use screen readers.</p>
<div id="attachment_1181" class="wp-caption alignnone" style="width: 44px"><a href="http://sharepointmagazine.net/wp-content/uploads/2008/09/globaltitleareaimage.jpg"><img class="size-full wp-image-1181" src="http://sharepointmagazine.net/wp-content/uploads/2008/09/globaltitleareaimage.jpg" alt="" width="34" height="30" /></a><p class="wp-caption-text">Global Title Area Image</p></div>
<pre>.ms-globalTitleArea {
    background:blue url(/_layouts/images/logo.gif) no-repeat left top;
}</pre>
<pre> .ms-globalTitleArea #GlobalTitleAreaImage img{
    visibility:hidden;
}</pre>
<pre>.ms-sitetitle h1 a{
    display:block;
    height:30px;
    width:100px;
    text-indent:-2000px;
}</pre>
<p>The last cell with the search functionality doesn&#8217;t have a class name or ID. To style the search function you&#8217;ll need to dig deeper into the HTML-structure. It is possible to style the search function in the header differently than the other search functions that could appear on the portal, even if they are built the same way. That&#8217;s why you&#8217;ll need to find a unique class name combination or unique ID name or a combination of both. It is possible to style the search function in the header differently, but the other search functions, in the content zone will be styled the same, since they have the same structure. Do not style the search engine absolute, since the search engine needs to come down in the content zone when searching advanced.</p>
<pre>#SRSB{
	position:relative;
	top:100px;
}</pre>
<p>The icon that is used to start the search request can also be styled. Keep the width and height of the new image the same as the original, so that a replacement can be done easily. Always keep a copy of the original image, for back-up. The easiest way to style the icon is to replace the default one on the file server. A result of this is that all search icons will change, through the whole portal. As mentioned above, it is possible to style the search icon in the header differently, but the other search icons will be styled the same, since they have the same structure.</p>
<div id="attachment_1184" class="wp-caption alignnone" style="width: 399px"><a href="http://sharepointmagazine.net/wp-content/uploads/2008/09/search-icon.jpg"><img class="size-full wp-image-1184" src="http://sharepointmagazine.net/wp-content/uploads/2008/09/search-icon.jpg" alt="" width="389" height="28" /></a><p class="wp-caption-text">Customized search engine</p></div>
<h4>Banner Container</h4>
<p>The third row from above is the banner container or oneidtopnavbar container. In here is the banner frame wherein there is a section for the top navigation menu, the banner and the site actions menu.</p>
<h5>Top navigation menu</h5>
<p>The top navigation menu is built out of a table, whereof the first cell contains the first menu item and the second cell contains a set of other menu items. In each of these cells is a table with a class name that marks it as topnav and if selected, it marks it also as selected. In the first cell of this table is the a-tag, the link. If the menu item contains any child elements, there is a second cell in this table to place the little arrow pointing down. This arrow is an indicator for any child menu items available, the fly outs.</p>
<p>The &lt;td&gt;&#8217;s of this table do not have a unique class name combination or ID. This means the &lt;td&gt; of the text link cannot be styled differently than the &lt;td&gt; of the arrow. This could lead to difficulties when implementing background images on the menu items. A background image cannot be placed on the &lt;td&gt;, because this will cause it to disappear twice. Once for the text link &lt;td&gt; and once for the arrow td. The image must be placed as a background image on the table. This means the image will be visible underneath the text link all the way to the arrow on the right. So there can only be one background image on a menu item. It isn&#8217;t possible to use two images, like when the left side of the menu item has a different ending as the right side of the menu item, when the image isn&#8217;t repeatable on the x axis. It isn&#8217;t possible to make two images out of one, so make it a background image of the table. It is always unsure how wide the menu item will be, and so how wide the background image must be. The arrow is rendered by the code, so you cannot style the arrow or replace it with an image, though.</p>
<p>It is possible to give the first menu item a different styling then the others, because this menu item is considered as the top level menu item and is rendered a bit different then the other menu items. For this menu item also counts that you do not know how wide the menu item will be, so be cautious about it when making the graphical design.</p>
<p>If you need to use background images on the top navigation menu, use images that are repeatable on the x axis and have the same pattern at the outer left pixels and at the outer right pixels. This of course also counts for the hover states and active states of the menu items.</p>
<p>Next thing to style are the fly outs. These child menu items are inside a table, and there is one table, &lt;tr&gt; and &lt;td&gt; for every child menu item. Only the table has a class name, so all the &lt;td&gt;&#8217;s, that is all the child menu items will have the same styling. The menu item that has a mouse hover can be styled differently though. For the fly outs there is the same rule, you do not know how wide the content inside it will become. Use that information wisely when making the graphical design. You can use these class names to style the fly outs:</p>
<pre>.ms-topNavFlyOutsContainer{}
.ms-topNavFlyOuts{}
.ms-topNavFlyOuts a{}
.ms-topNavFlyOutsHover{}
.ms-topNavFlyOutsHover a{}
.zz1_TopNavigationMenu_8 {}</pre>
<h5>Banner</h5>
<p>The banner &lt;td&gt; is empty, and does not contain anything. Therefore, it will not be discussed here.</p>
<h5>Site actions menu</h5>
<p>The cell that contains the site action button has a table with a class name for its own. Inside that, there is one cell wherein there are different kinds of nested &lt;div&gt;&#8217;s. The a-tag inside does not have a class name or ID, just like the nested &lt;div&gt;&#8217;s. But it could be referenced using this declaration:</p>
<div id="attachment_2041" class="wp-caption alignnone" style="width: 104px"><a href="http://sharepointmagazine.net/wp-content/uploads/2008/12/siteactions.jpg"><img class="size-full wp-image-2041" src="http://sharepointmagazine.net/wp-content/uploads/2008/12/siteactions.jpg" alt="Default siteactions button" width="94" height="22" /></a><p class="wp-caption-text">Default siteactions button</p></div>
<pre>.ms-siteactionsmenu div div div a {...}</pre>
<p>The site action button usually isn&#8217;t restyled, but only made blank, by removing its colors and background image. Most of the time it is repositioned by giving the table a relative or absolute position. This button is only visible for users with editor rights, so only a select group of users will see the site actions button.</p>
<div id="attachment_2040" class="wp-caption alignnone" style="width: 104px"><a href="http://sharepointmagazine.net/wp-content/uploads/2008/12/siteactions1.jpg"><img class="size-full wp-image-2040" src="http://sharepointmagazine.net/wp-content/uploads/2008/12/siteactions1.jpg" alt="" width="94" height="30" /></a><p class="wp-caption-text">Customized site actions button</p></div>
<pre>.ms-siteactionsmenu div div div,
.ms-siteactionsmenu div div div.ms-siteactionsmenuhover{
    background-color:transparent;
    background-image:none;
    background-repeat:no-repeat;
    border:0px none;
}</pre>
<p>The fly out of the site actions button is a default SharePoint fly out, and usually isn&#8217;t styled. This fly out is reused throughout the whole portal, so styling it could give some unwanted results. In the next part, I&#8217;ll tell more about the menu&#8217;s and fly outs.</p>
<h3>Web part zones</h3>
<p>Underneath the header is the content part. In here are the left menu and the content container. The number of web part zones in the content container depends on which <span class="__mozilla-findbar-search" style="inherit;">page layout</span> is chosen when creating the page. Most of the <span class="__mozilla-findbar-search" style="inherit;">page layout</span>s contain two columns, a wide one in the middle and a smaller one on the right. Other <span class="__mozilla-findbar-search" style="inherit;">page layout</span>s do not contain a left or right column, just one big zone for the content.</p>
<h4>Page layout</h4>
<p>The partitioning of the web part zones depends on the <span class="__mozilla-findbar-search" style="inherit;">page layout</span> that is chosen. There are a few default <span class="__mozilla-findbar-search" style="inherit;">page layout</span>s in SharePoint, but these can easily be made custom.</p>
<p>Not all the default <span class="__mozilla-findbar-search" style="inherit;">page  layout</span>s have got a left and right separation; some <span class="__mozilla-findbar-search" style="inherit;">page layout</span>s use the whole width to show the content. The <span class="__mozilla-findbar-search" style="inherit;">page layout</span>s that do have a partitioning, not always do have a class name or ID on the &lt;td&gt; that separates the zones. The page is then partitioned by a table with two or more columns, were for example the first cell has a hard coded width of 70% and the second cell a hard coded width of 30%. If the cells do not contain a class name or ID, you cannot overrule the width and it makes it impossible to style them separately or give them another width.</p>
<div id="attachment_2048" class="wp-caption alignnone" style="width: 510px"><a href="http://sharepointmagazine.net/wp-content/uploads/2008/12/variable_width.jpg"><img class="size-full wp-image-2048" src="http://sharepointmagazine.net/wp-content/uploads/2008/12/variable_width.jpg" alt="" width="500" height="338" /></a><p class="wp-caption-text">Example of page layout with variable widths</p></div>
<p>Since these class names and ID&#8217;s are the hand dishes for the styling, it makes it difficult to style a particular column or web part zone. Not only the width but also the other styling like headers, links and content could need to be styled differently, dependent on which column or zone they are in. Creating a custom page layout has the advantage that you can style the columns or web part zones differently.</p>
<h4>Web part zone</h4>
<p>Except the fact that a columns separation can be made easily when creating custom <span class="__mozilla-findbar-search" style="inherit;">page layout</span>s, web part zones can be added if wished. It is possible to provide every web part zone width a class name or ID, which means that the web parts can be styled differently depending on the web part zone they are in. If web parts are dragged to another web part zone, they will adjust to the styling of that particular web part zone.</p>
<div id="attachment_2051" class="wp-caption alignnone" style="width: 280px"><img class="size-medium wp-image-2051" src="http://sharepointmagazine.net/wp-content/uploads/2008/12/top-bottom-separation-300x227.jpg" alt="" width="270" height="204" /><p class="wp-caption-text">Two column page with two web part zones in the right zone</p></div>
<p>This cannot be done with SharePoint&#8217;s default page layouts. So if there&#8217;s no budget for creating page layouts, the Graphical Designer should take notice of that and style all the web parts the same. By default there&#8217;s no way to separate styling for particular web parts or web parts in particular columns.</p>
<div id="attachment_2049" class="wp-caption alignnone" style="width: 280px"><img class="size-medium wp-image-2049" src="http://sharepointmagazine.net/wp-content/uploads/2008/12/tp-300x213.jpg" alt="" width="270" height="192" /><p class="wp-caption-text">Two column page with one web part zone in the right zone</p></div>
<h3>Footer</h3>
<p>The content container contains the columns with web part zones and the menu and is as wide as the whole page. Underneath this container is the footer. By default, SharePoint does not have a real footer. Actually there are a few table cells, which make the optical margin, just like the left and right margin of the page. These cells can be used to create a footer.</p>
<h4>Position of the footer</h4>
<p>The lower down cells of the page, the footer, always are down under on the page. Even if the page does not contain a lot of content and the content does not fill the page, the footer is always at the bottom of the page, against your browser window. It speaks for itself that the footer is also on the bottom of the page when there is a lot of content and the used needs to scroll.</p>
<div id="attachment_2052" class="wp-caption alignnone" style="width: 218px"><img class="size-medium wp-image-2052" src="http://sharepointmagazine.net/wp-content/uploads/2008/12/low-footer-300x150.jpg" alt="" width="208" height="104" /><p class="wp-caption-text">The footer sticks to the browser</p></div>
<p>The footer is built like this:</p>
<div id="attachment_2056" class="wp-caption alignnone" style="width: 510px"><a href="http://sharepointmagazine.net/wp-content/uploads/2008/12/pagebottommarginleft.jpg"><img class="size-full wp-image-2056" src="http://sharepointmagazine.net/wp-content/uploads/2008/12/pagebottommarginleft.jpg" alt="" width="500" height="149" /></a><p class="wp-caption-text">Page Bottom Margin Left</p></div>
<div id="attachment_2055" class="wp-caption alignnone" style="width: 510px"><a href="http://sharepointmagazine.net/wp-content/uploads/2008/12/pagebottommargin.jpg"><img class="size-full wp-image-2055" src="http://sharepointmagazine.net/wp-content/uploads/2008/12/pagebottommargin.jpg" alt="" width="500" height="149" /></a><p class="wp-caption-text">Page Bottom margin</p></div>
<div id="attachment_2054" class="wp-caption alignnone" style="width: 510px"><a href="http://sharepointmagazine.net/wp-content/uploads/2008/12/bodyareapagemargin.jpg"><img class="size-full wp-image-2054" src="http://sharepointmagazine.net/wp-content/uploads/2008/12/bodyareapagemargin.jpg" alt="" width="500" height="149" /></a><p class="wp-caption-text">Body Area Page Margin</p></div>
<div id="attachment_2057" class="wp-caption alignnone" style="width: 510px"><a href="http://sharepointmagazine.net/wp-content/uploads/2008/12/pagebottommarginright.jpg"><img class="size-full wp-image-2057" src="http://sharepointmagazine.net/wp-content/uploads/2008/12/pagebottommarginright.jpg" alt="" width="500" height="149" /></a><p class="wp-caption-text">Page Bottom Margin Right</p></div>
<p>When you remove the background color and image of these cells, you&#8217;ll keep an empty space, which is a nice margin for the bottom of the page. It is also possible to use these cells for a footer image.</p>
<div id="attachment_2059" class="wp-caption alignnone" style="width: 510px"><img class="size-full wp-image-2059" src="http://sharepointmagazine.net/wp-content/uploads/2008/12/footer-with-code.jpg" alt="" width="500" height="251" /><p class="wp-caption-text">Example of footer with rounded corners</p></div>
<p>Since every cell has its own class name, it is possible to make a colored bar for example with small rounded corners. Such a footer can be placed underneath the menu and content, or just underneath the content. The width of the image depends on the cells you use to display the image in, as a background image. The height of the footer is also adjustable. To place text in the footer, the master page must be edited. Making the master page custom allows you to make the custom footer instead of using the default margin cells at the bottom of the page.</p>
<h1><strong>Next time in &#8220;SharePoint&#8217;s Branding Limitations&#8221;</strong></h1>
<p>Part two of this article will contain information about the menus. The meta menu and the top navigation with fly outs in the header and the quick launch menu and site actions menu. What are the possibilities for styling this menu&#8217;s? And how is it implemented? Stay tuned!</p>
<p>This post is from the SharePoint Magazine <a href="http://sharepointmagazine.net/announcements/sharepoint-magazine-partner-spotlight">Partner Spotlight</a> Week, where our featued partner is <a href="http://sharepointmagazine.net/companies/partner-spotlight-tam-tam">Tam Tam</a></p>
]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/technical/development/sharepoints-branding-limitations-part-1/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<series:name><![CDATA[Partner Spotlight: Tam Tam]]></series:name>
	</item>
		<item>
		<title>Partner Spotlight : Tam Tam</title>
		<link>http://sharepointmagazine.net/companies/partner-spotlight-tam-tam</link>
		<comments>http://sharepointmagazine.net/companies/partner-spotlight-tam-tam#comments</comments>
		<pubDate>Mon, 20 Jul 2009 13:04:32 +0000</pubDate>
		<dc:creator>Arno Nel</dc:creator>
				<category><![CDATA[Companies]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Magazine Partners]]></category>
		<category><![CDATA[Microsoft Partners]]></category>
		<category><![CDATA[collaboration]]></category>
		<category><![CDATA[E-business]]></category>
		<category><![CDATA[Enterprise Search]]></category>
		<category><![CDATA[innovation lab]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Online Communications]]></category>
		<category><![CDATA[operational services]]></category>
		<category><![CDATA[search engine advertising]]></category>
		<category><![CDATA[Search Engine Optimization]]></category>
		<category><![CDATA[Selfservice]]></category>
		<category><![CDATA[sharepoint]]></category>
		<category><![CDATA[Smartsite]]></category>
		<category><![CDATA[Tam Tam]]></category>
		<category><![CDATA[Umbraco]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=3728</guid>
		<description><![CDATA[Tam Tam is a full-service internetbureau.We link concept, design and technique such way that online questions of our customers are filled in successfully. In this we are ambitious, but also simply complete Dutch. We are proud of our top position in the Netherlands, our employees AND customers.]]></description>
			<content:encoded><![CDATA[<p><img title="bullet green" src="../wp-content/uploads/2009/07/bullet-green.png" alt="bullet green" width="16" height="16" /> <strong>CompanyName</strong> : Tam Tam</p>
<p><img title="bullet green" src="../wp-content/uploads/2009/07/bullet-green.png" alt="bullet green" width="16" height="16" /> <strong>Company Website URL</strong>: <a href="http://www.tamtam.nl" target="_blank">http://www.tamtam.nl</a></p>
<p><img title="bullet green" src="../wp-content/uploads/2009/07/bullet-green.png" alt="bullet green" width="16" height="16" /><strong> Company Blog</strong>:  <a href="http://www.tamtam.nl/blogs.aspx" target="_blank">http://www.tamtam.nl/blogs.aspx</a></p>
<p><img title="bullet green" src="../wp-content/uploads/2009/07/bullet-green.png" alt="bullet green" width="16" height="16" /><strong> Public Email</strong>:      info@tamtam.nl</p>
<p><img title="bullet green" src="../wp-content/uploads/2009/07/bullet-green.png" alt="bullet green" width="16" height="16" /> <strong>Social Sphere</strong>: <a href="http://www.twitter.com/tamtamdelft" target="_blank"><img class="alignnone" title="twitter" src="http://sharepointmagazine.net/images/icons/twitter_32.png" alt="" width="32" height="32" /></a><a href="http://www.facebook.com/home.php#/pages/TamTam/97362236359" target="_blank"><img class="alignnone" title="facebook" src="http://sharepointmagazine.net/images/icons/facebook_32.png" alt="" width="32" height="32" /></a><a href="http://www.linkedin.com/groups?gid=61313&amp;trk=hb_side_g" target="_blank"><img class="alignnone" title="linkedin" src="http://sharepointmagazine.net/images/icons/linkedin_32.png" alt="" width="32" height="32" /></a></p>
<p><img title="bullet green" src="../wp-content/uploads/2009/07/bullet-green.png" alt="bullet green" width="16" height="16" /> <strong>Address</strong>:  Tam Tam Patrijsweg 80, Rijswijk, Zuid-Holland 2289 EX, Netherlands<br />
<img title="bullet green" src="../wp-content/uploads/2009/07/bullet-green.png" alt="bullet green" width="16" height="16" /><strong> Phone: </strong>+31 (0)15 750 2000<br />
<img title="bullet green" src="../wp-content/uploads/2009/07/bullet-green.png" alt="bullet green" width="16" height="16" /><strong> No. of employees</strong>: 50-250<br />
<img title="bullet green" src="../wp-content/uploads/2009/07/bullet-green.png" alt="bullet green" width="16" height="16" /><strong> Microsoft Partner Status: </strong>Gold<br />
<img title="bullet green" src="../wp-content/uploads/2009/07/bullet-green.png" alt="bullet green" width="16" height="16" /><strong> Capability </strong></p>
<ul>
<li> Communications and Collaboration</li>
<li> Enterprise Content Management</li>
<li> Enterprise Search</li>
<li> Unified Communications</li>
<li> Other</li>
</ul>
<p><img title="bullet green" src="../wp-content/uploads/2009/07/bullet-green.png" alt="bullet green" width="16" height="16" /> <strong>Company History</strong>:</p>
<p><img class="alignnone" title="comment" src="http://sharepointmagazine.net/images/icons/comment_48.png" alt="" width="48" height="48" />&#8220;<em>In 1996, Tam Tam has been set up by Paul and Bart Manuel. Paul and Bart are linked as partners to Tam Tam and have an important role in daily business. Ever since, Tam Tam has been establishment profitable with a solvency of 40%. (Mainly hours) 8.4 millions euro convert were in 2008. For customers and employees all figures are public. Financial statements can be find at the KvK under the next number: 27239483. General director at TamTam is: Arjan Nataraj (06-55888776, arjan.nataraj@tamtam.nl). You can contact him for general questions concerning Tam Tam.</em>&#8221;</p>
<p><img title="bullet green" src="../wp-content/uploads/2009/07/bullet-green.png" alt="bullet green" width="16" height="16" /> <strong>Company Description</strong>:</p>
<p>Tam Tam is a full-service internetbureau.We link concept, design and technique such way that online questions of our customers are filled in successfully. In this we are ambitious, but also simply complete Dutch. We are proud of our top position in the Netherlands, our employees AND customers.<br />
Questions about the next topic, which we gladly fill in: cooperate, communication and e-business. We also give these solutions beautiful user experience.<br />
With our online solutions we improve in connection with customers, employees and the world. With these we are able to improve and develop more rapidly than other organizations.<br />
Solutions or Services *</p>
<ul>
<li>Online communication: ranging from marketing sites, corporate sites, and visual identities, to social networking solutions.</li>
<li>Online marketing: search engine optimisation and marketing, email marketing, bannering, websurveys</li>
<li>Customer Selfservice: eBusiness and eCommerce solutions, Selfservice, Custom made solutions</li>
<li>Information Worker Solutions/collaboration: intranet portals, document management, knowledge sharing and customer specific applications</li>
<li>Website optimization and site management: website statistics and analysis, application management, hosting and support</li>
</ul>
<p><img title="bullet green" src="../wp-content/uploads/2009/07/bullet-green.png" alt="bullet green" width="16" height="16" /><strong>SharePoint Based Websites built</strong>:</p>
<ul>
<li><a href="http://www.amphia.nl" target="_blank">www.amphia.nl</a></li>
<li><a href="http://www.nucletron.com" target="_blank">www.nucletron.com</a></li>
<li><a href="http://www.grontmij.nl" target="_blank">www.grontmij.nl</a></li>
<li><a href="http://www.cnb.nl" target="_blank">www.cnb.nl</a></li>
<li><a href="http://www.loopbaantrajectbouw.nl" target="_blank">www.loopbaantrajectbouw.nl</a></li>
<li><a href="http://www.watdoejijmorgen.nl" target="_blank">www.watdoejijmorgen.nl</a></li>
<li><a href="http://www.evc-centra.nl" target="_blank">www.evc-centra.nl</a></li>
<li><a href="http://www.isala.nl" target="_blank">www.isala.nl</a></li>
<li><a href="http://www.bsn.eu" target="_blank">www.bsn.eu</a></li>
<li><a href="http://www.britishschool.nl" target="_blank">www.britishschool.nl</a></li>
<li><a href="http://www.caop.nl" target="_blank">www.caop.nl</a></li>
<li><a href="http://www.deltapsy.nl" target="_blank">www.deltapsy.nl</a></li>
<li><a href="http://www.tebodin.com" target="_blank">www.tebodin.com</a></li>
<li><a href="http://www.nibc.com" target="_blank">www.nibc.com</a></li>
<li><a href="http://www.gvb.nl" target="_blank">www.gvb.nl</a></li>
<li><a href="http://www.woonbron.nl" target="_blank">www.woonbron.nl</a></li>
<li><a href="http://www.triant.nl" target="_blank">www.triant.nl</a></li>
<li><a href="http://www.huiskopenmetkorting.nl" target="_blank">www.huiskopenmetkorting.nl</a></li>
</ul>
<p><img title="bullet green" src="../wp-content/uploads/2009/07/bullet-green.png" alt="bullet green" width="16" height="16" /> <strong>Tags (Keywords) :</strong><br />
Tam Tam, full-service internetbureau, SharePoint, Online Communications, Selfservice, Search Engine Optimization, search engine advertising, collaboration, enterprise search, E-business, operational services, innovation lab, Microsoft, Smartsite, Umbraco</p>
<p><img title="bullet green" src="../wp-content/uploads/2009/07/bullet-green.png" alt="bullet green" width="16" height="16" /> <strong>SharePoint Magazine Articles :</strong></p>
<ul>
<li>
<h4><a title="Permalink to: SharePoint’s Branding Limitations, Part 1" href="../technical/development/sharepoints-branding-limitations-part-1">SharePoint’s Branding Limitations, Part 1</a></h4>
</li>
<li>
<h4><a title="Permalink to: SharePoint’s Branding Limitations, Part 2" href="../technical/development/sharepoints-branding-limitations-part-2">SharePoint’s Branding Limitations, Part 2</a></h4>
</li>
<li>
<h4><a title="Permalink to: SharePoint’s Branding Limitations, Part 3" href="../technical/development/sharepoints-branding-limitations-part-3">SharePoint’s Branding Limitations, Part 3</a></h4>
</li>
<h4><a title="Permalink to: SharePoint’s Branding Limitations, Part 4" href="../technical/development/sharepoints-branding-limitations-part-4">SharePoint’s Branding Limitations, Part 4</a></h4>
</ul>
<p><a title="Permalink to: SharePoint’s Branding Limitations, Part 1" href="../technical/development/sharepoints-branding-limitations-part-1"></a></p>
<p>If you would like to be featured on the <a href="http://sharepointmagazine.net/announcements/sharepoint-magazine-partner-spotlight" target="_blank">SharePoint Magazine Partner Spotlight</a>, please <a href="http://sharepointmagazine.net/contactus.php" target="_blank">contact us</a></p>
]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/companies/partner-spotlight-tam-tam/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[Partner Spotlight: Tam Tam]]></series:name>
	</item>
		<item>
		<title>SharePoint Magazine Partner Spotlight</title>
		<link>http://sharepointmagazine.net/announcements/sharepoint-magazine-partner-spotlight</link>
		<comments>http://sharepointmagazine.net/announcements/sharepoint-magazine-partner-spotlight#comments</comments>
		<pubDate>Fri, 17 Jul 2009 11:30:41 +0000</pubDate>
		<dc:creator>Arno Nel</dc:creator>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[SharePoint Magazine]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=3719</guid>
		<description><![CDATA[SharePoint Magazine is excited to introduce a new program for Microsoft Partners]]></description>
			<content:encoded><![CDATA[<p>SharePoint Magazine is excited to introduce a new program for Microsoft Partners. The idea is simple:</p>
<p><img class="alignnone" title="Tick" src="http://sharepointmagazine.net/images/icons/tick.png" alt="" width="16" height="16" /> Full focus on the magazine for 1 week, Monday to Friday.</p>
<p><img title="Tick" src="../images/icons/tick.png" alt="" width="16" height="16" /> Free advertising on the magazine for 1 week</p>
<p><img title="Tick" src="../images/icons/tick.png" alt="" width="16" height="16" /> Monday = Full Partner Profile and Biography</p>
<p><img title="Tick" src="../images/icons/tick.png" alt="" width="16" height="16" /> Tuesday to Friday = 4 part article series on a SharePoint topic</p>
<p>I dont want to say more than that at this point. Why not tune in on Monday to view our first Partner:</p>
<p><a href="http://www.tamtam.nl/" target="_blank"><img class="alignnone size-full wp-image-3724" title="TamTam Logo" src="http://sharepointmagazine.net/wp-content/uploads/2009/07/TamTamLogo.jpg" alt="TamTam Logo" width="170" height="170" /></a></p>
<p><img class="alignnone" title="Comment" src="http://sharepointmagazine.net/images/icons/comment.png" alt="" width="44" height="44" /><em>&#8220;Tam Tam is a full-service internetbureau.We link concept, design and technique such way that online questions of our customers are filled in successfully. In this we are ambitious, but also simply complete Dutch. We are proud of our top position in the Netherlands, our employees AND customers.<br />
Questions about the next topic, which we gladly fill in: cooperate, communication and e-business. We also give these solutions beautiful user experience.<br />
With our online solutions we improve in connection with customers, employees and the world. With these we are able to improve and develop more rapidly than other organizations.&#8221;</em></p>
<p>If you are a partner and want to be on the spotlight, please <a href="http://sharepointmagazine.net/contactus.php">contact us</a></p>
]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/announcements/sharepoint-magazine-partner-spotlight/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Dissecting Dashboards (Part 4 of 6)</title>
		<link>http://sharepointmagazine.net/technical/administration/dissecting-dashboards-part-4-of-6</link>
		<comments>http://sharepointmagazine.net/technical/administration/dissecting-dashboards-part-4-of-6#comments</comments>
		<pubDate>Fri, 10 Jul 2009 05:20:43 +0000</pubDate>
		<dc:creator>Kristen Hodges</dc:creator>
				<category><![CDATA[Administration]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[BI]]></category>
		<category><![CDATA[Business Intelligence]]></category>
		<category><![CDATA[Dashboards]]></category>
		<category><![CDATA[PerformancePoint]]></category>
		<category><![CDATA[plan]]></category>
		<category><![CDATA[report]]></category>
		<category><![CDATA[reporting]]></category>
		<category><![CDATA[Scorecards]]></category>
		<category><![CDATA[strategy]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=3675</guid>
		<description><![CDATA[We've talked about scorecards and KPIs, now it's time to put it all together and build a dashboard. I will be using PerformancePoint as my tool of choice because as of Office 14, it will be included with MOSS.]]></description>
			<content:encoded><![CDATA[<p>We&#8217;ve talked about scorecards and KPIs, now it&#8217;s time to put it all together and build a dashboard.  I will be using PerformancePoint as my tool of choice because as of Office 14, it will be included with MOSS and, as I&#8217;ve mentioned before, I kinda like it!  Our plan of attack will be as follows:</p>
<ol style="margin-left: 54pt">
<li><a>Create  a datawarehouse </a></li>
<li><a>Create a data source </a></li>
<li><a>Create a Time dimension </a></li>
<li><a>Add Indicators (the pretty bits) </a></li>
<li><a>Create KPIs </a></li>
<li><a>Create a scorecard </a></li>
<li><a>Define how KPIs rollup </a></li>
<li><a>Add a report </a></li>
<li><a>Create a dashboard </a></li>
<li><a>Publish the dashboard </a></li>
</ol>
<p><a>Sounds so simple doesn&#8217;t it?  Well, I guess, if you have planned your KPIs properly as we discussed in the </a><a href="http://sharepointmagazine.net/?p=2569">previous</a> article, it really is.</p>
<h1>1. Create a datawarehouse</h1>
<p>Why can&#8217;t I just get it directly from my transactional system or my existing datawarehouse, you ask?  Sure you can.  But let&#8217;s be realistic for a second.  A scorecard is made up of Actuals and Targets and it compares unrelated data.  Do you see where I&#8217;m going with this?  Let me speak plainly.   The data is coming from different places so it will have different, keys and structures and so on.  Plus somehow, it all must relate – even when it isn&#8217;t related.  What I mean by that is that you need a single Time dimension and probably a single Business Hierarchy dimension.  Oh and don&#8217;t forget Scenario.  By all means, if all that information already resides in an existing datawarehouse go for it, but chances are it doesn&#8217;t.  And we will be building a scorecard; which is all about aggregation. So what tool does aggregation the best?  A cube baby!</p>
<h1>2. Create a data source</h1>
<p>In PerformancePoint, you can have datasources that are multidimensional, relational (ODBC) or tabular lists (Excel Services, Excel Spreadsheet, SharePoint List or SQL table).</p>
<p style="text-align: center"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/07/071009-0519-dissectingd15.png" alt="" /></p>
<p>Obviously, the most used option is Analysis Services – and so it should be.  Multidimensional sources have all that handy stuff like aggregation, optimisation and encapsulated business logic.  Obviously there are circumstances where other sources are necessary, such as displaying lists or real time data but generally speaking, it&#8217;s wise to take advantage of the speed of cubes wherever possible, as I so zealously advocated in the previous step.</p>
<h1>3. Time.  It&#8217;s all relative right?</h1>
<p>Every scorecard, pretty much, needs a time dimension.  One of the joys of PerformancePoint is that a lot of the hard work is baked in for you.  Bless their cotton socks!  You&#8217;ve got a Time dimension in your cube (and it contains an appropriately structured hierarchy right?) so PerformancePoint just needs to know what it&#8217;s called and, as at today, which member represents &#8220;Now&#8221;.  I don&#8217;t mean you need a &#8220;Current&#8221; member, I mean literally, today is 1<sup>st</sup> July so select the member for 1<sup>st</sup> July.   Oh yeah, and it&#8217;s a &#8220;Day&#8221; (as opposed to say, a month).</p>
<p style="text-align: center"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/07/071009-0519-dissectingd22.jpg" alt="" /></p>
<p style="text-align: center"><span style="font-size:9pt">* ok yeah, this shows 2002 but that&#8217;s because my sample database doesn&#8217;t contain 2009 <span style="font-family:Wingdings">J</span> So you&#8217;ll just have to imagine. You can do that right?<br />
</span></p>
<p>While you&#8217;re at it, tell me which level of the hierarchy refers to a year, which a month and so on.</p>
<p style="text-align: center"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/07/071009-0519-dissectingd31.png" alt="" /></p>
<p>PerformancePoint will work out &#8220;CurrentPeriod&#8221; from here on in.  Handy!</p>
<h1>4. Indicators. The Pretty Bits</h1>
<p>Dashboards are ALL about the pretty.  If you think otherwise, well, you&#8217;re kidding your-table-loving-self.  Dashboards aren&#8217;t for you.  They&#8217;re for marketing people, business analysts, general managers and business development managers et al… you know the types… they just want to see things at a glance and they&#8217;ll gush and kiss you inappropriately if it looks real purdy.  Lucky you.  I&#8217;m generalising sure – I&#8217;ve created dashboards for financey people and other more-data-centric types but the majority of the audience is not.  If they were, they&#8217;d be using ProClarity or Excel to do analysis not a dashboard.  I will say though, the finance people claim to be data-oriented but show them a pretty graph (which links out to some data) and they&#8217;re putty. FTW!</p>
<p>Indicators are your stoplights, and smiley faces (why? Why? I ask you!) and gauges.  The heart and soul of the scorecard.  It&#8217;s what people look at before they look at anything else.  PerformancePoint comes with a tonne of them.</p>
<p style="text-align: center"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/07/071009-0519-dissectingd41.jpg" alt="" /></p>
<p>The screen shot above shows the categories you have to choose from – and each category contains umpteen indicators.  Plus you can add your own custom ones.  Nice.</p>
<h1>5. Create KPIs – both Actuals and Targets</h1>
<p>As discussed in the <a href="http://sharepointmagazine.net/%3Fp=2569">previous article</a> in this series, planning your KPIs is critical.  There are a few planning tips I would suggest:</p>
<ul>
<li>For your initial deployment, limit the number of KPIs to no more than 10</li>
<li>Automate as much as is humanly possible; including Targets</li>
<li>Don&#8217;t try to be too clever – measure things that are easily understood by the reader</li>
<li>Don&#8217;t forget Targets under the weight of ETL&#8217;ing your Actuals – it ain&#8217;t a KPI without a Target and Targets are not as easy to design</li>
<li>Make sure that the readers have agreed with each other on what the measurement or business rule is to be</li>
</ul>
<p>So you have a list of KPIs, you&#8217;ve loaded the Actuals and Targets into your datasource and now we need to create them in Dashboard Designer.  It&#8217;s as simple as hitting New KPI.  The designer presumes you want an Actual and a Target and it will add your previously select set of indicators to the Target.</p>
<p style="text-align: center"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/07/071009-0519-dissectingd51.png" alt="" /></p>
<p>See how under Data Mappings, it says Fixed Values. That&#8217;s what it defaults to.  A fixed value.  Unlikely that you want to use a fixed value and luckily it&#8217;s as easily as clicking on it to map it to your data source. You then hit change source, select your cube and map it to a measure enter some MDX if you prefer – particularly handy if you were too lazy to get your Target values into your datawarehouse and you just want to calculate them on the fly.</p>
<p>You can also specify how you want the KPI to be displayed on the scorecard using the Number Format column eg with commas, to 2 decimal places etc or you can let PerformancePoint work it out based on the format of your measure in the cube.</p>
<p>Thresholds is where we define what&#8217;s good, what&#8217;s bad, what&#8217;s ok and what&#8217;s a disaster!</p>
<p style="text-align: center"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/07/071009-0519-dissectingd61.png" alt="" /></p>
<p>Calculation is where we define how our KPIs aggregate.  Sum is the default.</p>
<p style="text-align: center"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/07/071009-0519-dissectingd71.png" alt="" /></p>
<p>We probably also want to group our KPIs into objectives such as Financial, People, Environment etc so we will need to create those as well. It&#8217;s the same process as creating a KPI.</p>
<p style="text-align: center"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/07/071009-0519-dissectingd81.jpg" alt="" /></p>
<p>When creating a KPI or objective, on the first page of the wizard, you&#8217;ll also notice a little check box &#8220;Grant Read to All Authenticated Users&#8221;.  KPIs can be used by any number of scorecards or dashboards.  That&#8217;s part of the beauty of them.  Say you&#8217;re developing a dashboard for a particular department and the finance team already has a dashboard which is a global view, you can re-use their KPIs and just filter it to your particular team or department on your dashboard.  If however, the data in the KPI is sensitive you may never want anyone else to see it so in that case, you would untick the option.   Remember that PerformancePoint is intended for development by business analysts or other technically minded super-users so the idea is that everything can be shared and re-used as needed.</p>
<h1>6. Create a scorecard</h1>
<p>Now we have the core elements for our scorecard so we can build it.  Like everything in PerformancePoint, right-click and Add New will do the trick.  There are a few templates available to you, which just sets it up with a default layout and data source mapping.  The options available are:</p>
<ul>
<li>Microsoft Analysis Services</li>
<li>
<div>Standard</div>
<ul>
<li>Blank</li>
<li>Fixed Values<br />
Handy for creating mockups for showing customers, managers etc</li>
</ul>
</li>
<li>
<div>Tabular</div>
<ul>
<li>Excel 2007</li>
<li>Excel Services</li>
<li>SharePoint List</li>
<li>
<div>SQL Tabular</div>
</li>
</ul>
</li>
</ul>
<p>The option you pick really comes down to what type of data source you created way back in the beginning.  Mostly, I find myself choosing Blank just because it&#8217;s easier to fiddle around with exactly what I want.  A browser appears on the right hand side, which shows all the objects that are available to the scorecard and you can drag &amp; drop them onto the scorecard.  With KPIs, guides appear showing you where to drop the object in order to make it a parent, a child or a sibling.  KPIs can be children of other KPIs or of Objectives or they can sit by themselves – it&#8217;s up to you.</p>
<p style="text-align: center"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/07/071009-0519-dissectingd91.png" alt="" /></p>
<p>You can also add dimensions to the scorecard (presuming they exist in your cube of course)!</p>
<h1>7. Define how KPIs Rollup</h1>
<p>Once our scorecard has been created, we need to decide how our KPIs aggregate. There are 3 types of rollup:</p>
<ul>
<li>Average weighted rollup<br />
Displays an indicator that reflects a calculated score, combined with the weighting that is assigned to each child.</li>
<li>Indicator count Rollup<br />
Displays a count of the indicator images that are used in individual KPIs;, or child KPIs of each objective KPI eg  <img src="http://sharepointmagazine.net/wp-content/uploads/2009/07/071009-0519-dissectingd101.png" alt="" /></li>
<li>Worst child rollup<br />
Displays an indicator that reflects the child KPI that has the worst score.</li>
</ul>
<h1>8. Create a Report</h1>
<p>Dashboards are more than just scorecards. We can also add reports of varying types.</p>
<p style="text-align: center"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/07/071009-0519-dissectingd111.png" alt="" /></p>
<p>In most examples the report will need to already exist somewhere eg on our SSRS portal or in an Excel Services document library in SharePoint however Analytic Chart and Analytic Graph can be created wholly within PerformancePoint.  A simple drag &amp; drop interface is used to build these on-the-fly reports.</p>
<p style="text-align: center"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/07/071009-0519-dissectingd121.png" alt="" /></p>
<p style="text-align: left;">Note:  I will be discussing reports in much greater detail in the next article in the series.</p>
<h1>9. Create a dashboard</h1>
<p>We have reports, we have a scorecard so now we can build a dashboard.  PerformancePoint gives us a few default layouts to start with.</p>
<p style="text-align: center"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/07/071009-0519-dissectingd131.png" alt="" /></p>
<p>Most often, I find the Header, 2 Columns is the one I go for so I can stick my Page filters in the top row, a scorecard on the left and a report on the right.  Once the empty dashboard is created,  the browser pane on the left will show you a list of objects that can be dragged &amp; dropped onto the drop zones.</p>
<p style="text-align: center"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/07/071009-0519-dissectingd141.png" alt="" /></p>
<p>Drag the scorecard to the left column, the analytic report to the right zone and oh, now we need some Page Filters.</p>
<p style="text-align: center"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/07/071009-0519-dissectingd151.jpg" alt="" /></p>
<p>Time is the most obvious one, so start there.  Time Intelligence will respect and understand your &#8220;CurrentPeriod&#8221; selections made earlier.  You can add more filters (from other dimensions) using Member Selection or MDX query etc.  These Filters will now appear in the object browser pane for you to drop onto the dashboard.  In the example given, they&#8217;d go into the Header zone.</p>
<p>Of course it doesn&#8217;t end there, somehow the Page Filters have to be linked to the scorecard and the report in the other zones.  Simply drag the filter onto the &#8220;Drop Fields to Create Links&#8221; drop zone within each object that you want to link.</p>
<p style="text-align: center"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/07/071009-0519-dissectingd161.png" alt="" /></p>
<p>Each object has an &#8220;endpoint&#8221;.  A popup will appear that allows you to define how the filter and the object should be mapped to each other.  It could be from a unique member or it could be a formula – this would be mapped to the endpoint for the object you dragged it to.</p>
<p style="text-align: center"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/07/071009-0519-dissectingd171.png" alt="" /></p>
<h1>10. Publish the Dashboard</h1>
<p>Yep that&#8217;s actually it.  Dashboard done. From here it gets published to a SharePoint document library.  You will be prompted to enter the SharePoint URL and select the appropriate library.  What does that mean?  Well, you need the library to exist, you need write access to it and your SharePoint installation needs the PerformancePoint web parts installed.</p>
<p>That dear friends, is the whole shebang!</p>
<div>
<table style="border-collapse:collapse" border="0">
<col></col>
<col></col>
<tbody>
<tr>
<td style="padding-top: 1px; padding-left: 1px; padding-bottom: 1px; padding-right: 1px" valign="middle"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/07/071009-0519-dissectingd181.jpg" alt="" /></td>
<td style="padding-top: 1px; padding-left: 1px; padding-bottom: 1px; padding-right: 1px" valign="middle"><a href="http://sharepointmagazine.net/?p=875">Part 1 – Getting to Know You &#8211; Intro to SharePoint BI</a></td>
</tr>
<tr>
<td style="padding-top: 1px; padding-left: 1px; padding-bottom: 1px; padding-right: 1px" valign="middle"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/07/071009-0519-dissectingd191.jpg" alt="" /></td>
<td style="padding-top: 1px; padding-left: 1px; padding-bottom: 1px; padding-right: 1px" valign="middle"><a href="http://sharepointmagazine.net/?p=1342">Part 2 – Sell! Sell! Sell! Why Build a Dashboard Anyway?</a></td>
</tr>
<tr>
<td style="padding-top: 1px; padding-left: 1px; padding-bottom: 1px; padding-right: 1px" valign="middle"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/07/071009-0519-dissectingd201.jpg" alt="" /></td>
<td style="padding-top: 1px; padding-left: 1px; padding-bottom: 1px; padding-right: 1px" valign="middle"><a href="http://sharepointmagazine.net/?p=2569">Part 3 – KPIs – Where do I Come From?</a></td>
</tr>
<tr>
<td style="padding-top: 1px; padding-left: 1px; padding-bottom: 1px; padding-right: 1px" valign="middle"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/07/071009-0519-dissectingd211.jpg" alt="" /></td>
<td style="padding-top: 1px; padding-left: 1px; padding-bottom: 1px; padding-right: 1px" valign="middle"><a href="http://sharepointmagazine.net/?p=3675">Part 4 – Dissecting Dashboards</a></td>
</tr>
<tr>
<td style="padding-top: 1px; padding-left: 1px; padding-bottom: 1px; padding-right: 1px" valign="middle"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/07/071009-0519-dissectingd221.gif" alt="" /></td>
<td style="padding-top: 1px; padding-left: 1px; padding-bottom: 1px; padding-right: 1px" valign="middle">Part 5 – We Really Need to Talk – Scorecards &amp; Reports</td>
</tr>
<tr>
<td style="padding-top: 1px; padding-left: 1px; padding-bottom: 1px; padding-right: 1px" valign="middle"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/07/071009-0519-dissectingd231.jpg" alt="" /></td>
<td style="padding-top: 1px; padding-left: 1px; padding-bottom: 1px; padding-right: 1px" valign="middle">Part 6 – Beware the Bogeyman – Securing Dashboards</td>
</tr>
</tbody>
</table>
</div>
<p>Siyonara amigos!  Till next time.</p>
<p>Kristen Hodges, MCTS, MCITP<br />
<a href="http://www.bi-tch.blogspot.com">http://www.bi-tch.blogspot.com</a></p>
<p>http://b-iq.org</p>
<p><strong>References<br />
</strong></p>
<p><a href="http://office.microsoft.com/en-us/performancepoint/HA102711891033.aspx">http://office.microsoft.com/en-us/performancepoint/HA102711891033.aspx</a></p>
]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/technical/administration/dissecting-dashboards-part-4-of-6/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>SharePoint Farm configuring and deployment Part 6 &#8211; Post Deployment</title>
		<link>http://sharepointmagazine.net/technical/administration/sharepoint-farm-configuring-and-deployment-part-6-post-deployment</link>
		<comments>http://sharepointmagazine.net/technical/administration/sharepoint-farm-configuring-and-deployment-part-6-post-deployment#comments</comments>
		<pubDate>Thu, 25 Jun 2009 09:14:29 +0000</pubDate>
		<dc:creator>Michael Nemtsev</dc:creator>
				<category><![CDATA[Administration]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[ghost]]></category>
		<category><![CDATA[index]]></category>
		<category><![CDATA[ports]]></category>
		<category><![CDATA[sharepoint]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[tempdb]]></category>
		<category><![CDATA[trust]]></category>
		<category><![CDATA[zone]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=3203</guid>
		<description><![CDATA[This series of articles provide an overview of how to plan, build and configure the common SharePoint farm across your organization.]]></description>
			<content:encoded><![CDATA[<p>This series of articles provide an overview of how to plan, build and configure the common SharePoint farm across your organization.</p>
<ul>
<li><a href="http://sharepointmagazine.net/technical/administration/best-practices-of-sharepoint-farm-configuring-and-deployment-part-1-architectural-and-logical-planning" target="_self">Part 1 &#8211; Architecture and Logical Planning</a></li>
<li><a href="http://sharepointmagazine.net/technical/administration/sharepoint-farm-configuring-and-deployment-part-2-installation-configuration" target="_self">Part 2 &#8211; Installation</a></li>
<li><a href="http://sharepointmagazine.net/technical/administration/best-practices-of-sharepoint-farm-configuring-and-deployment-part-3-development-environment" target="_self">Part 3 &#8211; Development Environment</a></li>
<li><a href="http://sharepointmagazine.net/technical/administration/best-practices-of-sharepoint-farm-configuring-and-deployment-part-4-backup-and-recovery-strategy" target="_blank">Part 4 &#8211; Backup and Recovery Strategy</a></li>
<li><a href="http://sharepointmagazine.net/technical/administration/sharepoint-farm-configuring-and-deployment-part-5-virtualization">Part 5 &#8211; Virtualization</a></li>
<li><strong>Part 6 &#8211; Post Deployment (final)</strong></li>
</ul>
<h2>Post Deployment</h2>
<p><strong>Manage all SharePoint ports </strong></p>
<p style="padding-left: 30px;">There are about 20 different ports SharePoint use and they need to be open across firewalls. Refer to &#8220;<a href="http://technet.microsoft.com/en-us/library/cc262400.aspx" target="_blank">Planning an Extranet Environment for Office SharePoint Server</a>&#8221; document for more details. It can be easier to have firewall disabled when configuring SharePoint, and then close all non-SharePoint ports when configuration is done.</p>
<p><strong>Monitor how SharePoint operates</strong></p>
<p style="padding-left: 30px;">After finishing deployment the actual work for administrators and infrastructure guys starts.  They need to monitor the health of SharePoint servers, status of web application and statistic of web sites usage, the growth of content database.</p>
<p style="padding-left: 30px;">Microsoft recommends using &#8220;System Center Operations Manager 2007&#8243; with SharePoint Monitoring Toolkit <a href="http://technet.microsoft.com/en-us/library/bb975149.aspx" target="_blank">http://technet.microsoft.com/en-us/library/bb975149.aspx</a> to monitor SharePoint farms. The only drawback is that it&#8217;s enterprise level tool and might not be an ideal solution for small SharePoint farms.</p>
<p style="padding-left: 30px;">On the other hand &#8220;SharePoint Diagnostic Tool&#8221; is suitable for small farms that simplify the process of analyzing logs for troubleshooting, and helps significantly reduce the time to diagnose issues.</p>
<p style="padding-left: 30px;">The commercial sector of 3rd party management tools for SharePoint is represented by Quest Manager, DocAve and others.  Quest Manager is one of the best tools that provide detailed information about how SharePoint operates, visual statistic across web application and sites (see screenshot):</p>
<p style="padding-left: 30px;"><img class="alignnone size-full wp-image-3309" src="http://sharepointmagazine.net/wp-content/uploads/2009/06/questmanager.jpg" alt="questmanager" width="435" height="322" /></p>
<p style="padding-left: 30px;">There are several free tools to manage large and small SharePoint farms with the review published on SharePointReview site: <a href="http://tinyurl.com/9p6j7e" target="_blank">http://tinyurl.com/9p6j7e</a>. One of the good tools is SharePoint Analyzer from Bamboo solution which provides flexibility to monitor status and diagnose errors.</p>
<p style="padding-left: 30px;">To diagnose ULS logs the &#8220;SharePoint ULS Viewer&#8221; provides the most powerful features to sort, filter and search across ULS logs in different categories.</p>
<p style="padding-left: 30px;"><img class="alignnone size-full wp-image-3375" src="http://sharepointmagazine.net/wp-content/uploads/2009/06/ulslogviewer.jpg" alt="ulslogviewer" width="503" height="263" /></p>
<p><strong>Add Central Administration to Trust/Local Zone</strong></p>
<p style="padding-left: 30px;">Windows 2008 enhances the security of the internet sites and in result Central Administration site does not play nice with the default internet settings &#8211; some links of Central Administration sections are hidden. The same behaviour exists when Central Administration site is opened under non-administrative account.<br />
To fix this, navigate to the Internet Explorer Options -&gt; Security Tab and &#8220;Central Administration&#8221; site to Trust zone (or Intranet Sites).</p>
<p><strong>Manage size of Content DB</strong></p>
<p style="padding-left: 30px;">SharePoint performs the best on the content databases below 100GB. This is not a true limitation but rather a recommendation.  SQL Server databases have been scaling far beyond 100GB for years now.  Practically speaking, the recommendation is based primarily on two significant factors:<br />
1)	Service Level Agreement (SLA) requirements for a given organization may dictate that backup operations for the SharePoint databases must be executable in a limited amount of time.  The size of the content databases will have a direct impact on how long it takes to execute that backup.<br />
2)	The storage subsystem must be robust enough to handle the disk I/O requirements of the SharePoint solution that it serves.<br />
So, monitor how much database grows and create new database content after such threshold. The best way to achieve this is setting alerts via DBA.</p>
<p><strong>Set SQL TempDB Data Files</strong></p>
<p style="padding-left: 30px;">It is a product team-recommended practice that the number and size of data files allocated for the SQL TempDB Data Files should be equal to the number and size of core CPUs presented on the SQL Server machine. Each data file should be equal in size. Optimal TempDB data file sizes can be calculated using the following formula:</p>
<p style="padding-left: 30px;">[MAX DB SIZE (KB)] X [.25] / [# CORES] = DATA FILE SIZE (KB)</p>
<p style="padding-left: 30px;">So, for the server with two quad-core CPUs and the 500 GB content DB there will be 8 files with 15 GB size per temp data file.</p>
<p style="padding-left: 30px;">If possible, separate each data file to separate logical unit consisting of unique physical disk spindles</p>
<p><strong>Maintain SQL Database</strong></p>
<p style="padding-left: 30px;">SharePoint databases are usually big, very big, so maintaining databases in primary task to provide the good performance (<a href="http://technet.microsoft.com/en-us/library/cc262731.aspx">http://technet.microsoft.com/en-us/library/cc262731.aspx</a>) Consider the following tasks:</p>
<p style="padding-left: 30px;">•	Checking database integrity.<br />
•	Defragmenting indexes by either reorganizing them or rebuilding them.<br />
•	Setting the fill factor for a server.<br />
•	Shrinking databases to recover unused disk space.</p>
<p style="padding-left: 30px;">Create SQL Maintenance plan to schedule those operation being run automatically.</p>
<p><strong>Manage security and permissions</strong></p>
<p style="padding-left: 30px;">For each site collection, there is a limited number of security principals (users and groups) that can be applied &#8211; 2000 per Web site (limitation of ACL). Use Active Directory security groups and SharePoint groups to manage access, instead of adding users individually. The more fine-grained permissions are applied, the more difficult to track who has access to what. Moreover, fine-grained permissions can affect performance because additional security checks must be performed for each item to which they are applied.</p>
<p><strong>Remove unused and &#8220;ghost&#8221; users</strong></p>
<p style="padding-left: 30px;">During farm installation, configuring or migrating, SharePoint farm is usually end up with number of test users or permissions that were used for test reasons, or &#8220;zombifies&#8221; users &#8211; which survived migration and not assigned to nobody. It&#8217;s important to remove all these users and check  the permissions to lower the chance of security breach.<br />
There are several tools that address current task &#8211; Access Checker, SharePoint SUSHI and &#8220;Deliver Point&#8221; which provide the best functionality to find &#8220;dead&#8221; users easily and check permissions hierarchy across all site collections and sites.</p>
<p><strong>Plan windows updates</strong></p>
<p style="padding-left: 30px;">In a server farm environment software updates are not installed automatically, even if the Automatic Updates feature is enabled on Web servers. Windows Update Web site or the Microsoft Update Web site can&#8217;t be used for software update installation (<a href="http://technet.microsoft.com/en-us/library/cc263467.aspx">http://technet.microsoft.com/en-us/library/cc263467.aspx</a>). In this case planning of updates across SharePoint farm boxes is required. Recommendation is to test all updates properly on testing/staging environment with existed applications before propagating updates to production environment.</p>
<p><strong>Adopt farm to number of users</strong></p>
<p style="padding-left: 30px;">If the environment serves approximately 5000 or more users, consider deploying a minimum of three front-end Web servers, or the number of front-end Web servers that are required to provide appropriate capacity plus one more. That way, when one front-end Web server is experiencing occasional high load, load balancers can route the traffic to other servers. In the case when there is only one remaining front-end Web server, this can cause a cascading outage in which the extra traffic that affected the first front-end Web server is transferred to the second front-end Web server, which brings it down too. Having an extra front-end Web server helps the farm to consume such loads and provide more performance and stability in the farm during such situations. Additionally, consider dedicating front-end Web servers to be configured for crawling reasons only. There front-end Web servers should be physical servers, not virtual.</p>
<p><strong>Optimize index server</strong></p>
<p style="padding-left: 30px;">SharePoint crawls data incrementally, and index is provisioned the same way &#8211; by small portions. Usually new crawled data become available in 3-30 second. If new added file is not discoverable in such timeframe, it means that Index Server suffers from performance issues. Use USL logs and performance counters to investigate what is wrong. In virtualized environment use physical HDD or move Index Role to physical box.</p>
<h2>Summary</h2>
<p>Installing and configuring SharePoint farms never been a trivial task and usually characterized with number of different issues, which could lead to the reinstalling the farms from the scratch several times. Having proper plan and recommendation for the major milestones in the configuration provides benefits to have work done from the first attempt, and end up with the scalable and reliable environment prepared for the further extensibility.</p>
<p><strong>Post Scriptum</strong></p>
<p><strong></strong>I&#8217;d like to thank Darren Neimke, Jeremy Thake, Alex Meleta for their notes and recommendation regarding several chapters, and especially to Eric Shupps for noticing several errors and constructive criticism.  Special thanks to Neville Mehta for the inspiration to create and finish this whitepaper.</p>
]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/technical/administration/sharepoint-farm-configuring-and-deployment-part-6-post-deployment/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SharePoint Farm configuring and deployment. Part 5 &#8211; Virtualization</title>
		<link>http://sharepointmagazine.net/technical/administration/sharepoint-farm-configuring-and-deployment-part-5-virtualization</link>
		<comments>http://sharepointmagazine.net/technical/administration/sharepoint-farm-configuring-and-deployment-part-5-virtualization#comments</comments>
		<pubDate>Mon, 22 Jun 2009 08:37:43 +0000</pubDate>
		<dc:creator>Michael Nemtsev</dc:creator>
				<category><![CDATA[Administration]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[cpu]]></category>
		<category><![CDATA[hyper-v]]></category>
		<category><![CDATA[ram]]></category>
		<category><![CDATA[sharepoint]]></category>
		<category><![CDATA[virtual]]></category>
		<category><![CDATA[virtualisation]]></category>
		<category><![CDATA[vmware]]></category>
		<category><![CDATA[VPC]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=3198</guid>
		<description><![CDATA[Virtualization in SharePoint farm is one of the key design factors that simplify server availability by providing number of additional servers that might not be available over physical server models.]]></description>
			<content:encoded><![CDATA[<p>This series of articles provide an overview of how to plan, build and configure the common SharePoint farm across your organization.</p>
<ul>
<li><a href="http://sharepointmagazine.net/technical/administration/best-practices-of-sharepoint-farm-configuring-and-deployment-part-1-architectural-and-logical-planning" target="_self">Part 1 &#8211; Architecture and Logical Planning</a></li>
<li><a href="http://sharepointmagazine.net/technical/administration/sharepoint-farm-configuring-and-deployment-part-2-installation-configuration" target="_self">Part 2 &#8211; Installation</a></li>
<li><a href="http://sharepointmagazine.net/technical/administration/best-practices-of-sharepoint-farm-configuring-and-deployment-part-3-development-environment" target="_self">Part 3 &#8211; Development Environment</a></li>
<li><a href="http://sharepointmagazine.net/technical/administration/best-practices-of-sharepoint-farm-configuring-and-deployment-part-4-backup-and-recovery-strategy" target="_blank">Part 4 &#8211; Backup and Recovery Strategy</a></li>
<li><strong>Part 5 &#8211; Virtualization</strong></li>
<li>Part 6 &#8211; Post Deployment (final)</li>
</ul>
<h2>Virtualization</h2>
<p>Virtualization in SharePoint farm is one of the key design factors that simplify server availability by providing number of additional servers that might not be available over physical server models, or solution become very expensive. Microsoft officially supports SharePoint farm in virtualized environment since mid 2007. The following virtualizations technologies are supported:  Hyper-V, Virtual PC, Virtual Server and 3rd party providers like VMware.</p>
<p>One of the key factors for virtualization is that performance of virtualized farm is competitive to the physical farm. Microsoft tests shows:<br />
-	7.2% less throughput on virtual Web roles with 8GB of RAM than a physical Web role server with 32GB of RAM;<br />
-	4.4% slower in the page response time on the Hyper-V Web front-end than the physical server;</p>
<p><strong>Virtualize SharePoint Web Role</strong></p>
<p style="padding-left: 30px;">Web front-end servers are responsible for the content rendering and have comparatively lower memory requirements and disk activity than other roles, what makes them is an ideal candidate for virtualization.</p>
<p><strong>Choose disk type for Query Role</strong></p>
<p style="padding-left: 30px;">The query role is responsible for a search performed by users is a good candidate for virtualization.  The disk type choice for this role depends on the size of propagated index and the rate of index propagation.<br />
The recommendation for the large indexes and the farm with the high rate of the updated information to use a physical disk volume that is dedicated for the individual query server, rather than a virtual disk file.</p>
<p><strong>Consider using Index Role on physical server</strong></p>
<p style="padding-left: 30px;">The Index server role in a SharePoint farm is often the most memory-intensive role, what makes it less ideal candidate for virtualization.  Virtualized Index server role might be appropriate for development environment, small farm or farm with small content usage.<br />
Take into account, that index can vary from 10% to 30% of the total size of the documents being indexed. For the large indexes (above 200 GB) consider using physical disk volume that is dedicated to the individual query server, rather than virtual disk.<br />
For large farms with big amount of crawled data use physical Index server role due to large memory requirements and high disk I/O activity.</p>
<p><strong>Do not virtualize Database role</strong></p>
<p style="padding-left: 30px;">SharePoint database role is the least appropriate role for virtualization in production scenarios, mainly due to the highest amount of disk I/O activity and very high memory and processor requirements. However, it is very common to see the SQL Server virtualized in test farms, quality assurance (QA) farms, and smaller SharePoint environments.</p>
<p><strong>Do I need to virtualize Application role?</strong></p>
<p style="padding-left: 30px;">The decision of virtualizations the application roles, such Excel Services and InfoPath Services, depends on the roles usage. Those roles can be easily virtualized, because they are similar to Web Roles and mostly CPU intensive. When necessary, those servers can be easily moved to dedicated physical servers.</p>
<p><strong>Virtualized scenario sample</strong></p>
<p style="padding-left: 30px;">The following picture demonstrates the common virtualized scenario of SharePoint Farm.</p>
<p style="padding-left: 30px;"><img class="alignnone size-full wp-image-3369" src="http://sharepointmagazine.net/wp-content/uploads/2009/06/virtualization.jpg" alt="virtualization" width="532" height="400" /></p>
<p style="padding-left: 30px;">Common deployment scenarios for the SQL role in a SharePoint farm may have multiple farms, both physical and virtual, use a single database server or database cluster, further increasing the amount of resources consumed by the role. For example, in the picture above, the sample SharePoint environment illustrated maintains a two-server SQL cluster that is used by several virtual farms and one production farm.</p>
<p><strong>Use proper number of CPU</strong></p>
<p style="padding-left: 30px;">Do not use more virtual CPUs than physical CPUs on the virtual host computer &#8211; this will cause performance issues, because the hypervisor software has to swap out CPU contexts.<br />
The best performance can be realized if the number of virtual processors allocated to running guests does not exceed the number of logical processors (physical processors multiplied by the number of cores) on the host. For example, a four processor quad-core server will be able to allocate up to 16 virtual processors across its running sessions without any significant performance impact. Note that this only applies to sessions that are physically running simultaneously.</p>
<p><strong>Use proper amount of RAM</strong></p>
<p style="padding-left: 30px;">Plan to allocate the memory on virtual sessions according the next rule &#8211; divide the total amount of RAM in the server by the number of logical processors (physical processors multiplied by number of cores) in the host server. This will align allocated memory along with NUMA sessions. Otherwise it will provide performance issues.<br />
In some testing, a virtual SharePoint Web server role with an allocation of 32GB of RAM actually performed worse than a virtual server with an allocation of 8GB of RAM.</p>
<p><strong>Plan to use physical drives</strong></p>
<p style="padding-left: 30px;">In virtual scenarios front-end Web servers or Query servers disk performance is not as important as it would be physicals servers of the Index role or a SQL Server database. A fixed-size virtual disk typical provides better performance than a dynamically-sized disk.<br />
If disk speed is a high priority, consider adding physical drives to the host computer. Add new virtual hard drive and map it to an unused physical drive on the host. This configuration, called a &#8220;pass-through disk&#8221;, is likely to give the best overall disk throughput.</p>
<p><strong>Consider using hardware load balancing</strong></p>
<p style="padding-left: 30px;">Hardware load balancing provides the best performance, comparing with the software load balancing. It offloads CPU and I/O pressure from the WFE&#8217;s to hardware layer thereby improving availability of resources to SharePoint.   Examples of Hardware: F5 BIG IP, Citrix Netscaler, Cisco Content Switch. Software load balancing examples are Windows Network load balancing, Round Robin load balancing with DNS. It is a trade-off between cost and performance.  (Additional details are <a href="http://blogs.msdn.com/uksharepoint/archive/2009/03/08/virtualizing-sharepoint-series-recommendations-for-each-server-role-in-the-virtualized-sharepoint-environment.aspx" target="_blank">here</a>)</p>
<p><strong>Be careful with snapshot feature on virtual servers</strong></p>
<p style="padding-left: 30px;">Using snapshots for the backup might cause you troubles, because SharePoint timer service might be  unsynchronized during the snapshot process, and once the snapshot is finished, errors or inconsistencies can arise. So, consider backups over the snapshots for the production environments.</p>
<p><strong>Measure virtualized environment performance</strong></p>
<p style="padding-left: 30px;">After you complete your virtualized environment installation and configuration measure how fast you environment operates and optimize it to the best performance. Measure the following parameters:<br />
1)	Processor performance &#8211; &#8220;<em>\Hyper-V Hypervisor Logical Processor(_Total)\% Total Run Time&#8221;</em> performance monitor counter.<br />
Results: &lt;60% Utilization is fine, 60%-89% &#8211; caution, &gt; 90% significant performance degradation<br />
2)	Memory performance &#8211; <em>&#8220;\Memory\Available Mbytes&#8221;</em> of the physical memory available to processes running on the computer, as a percentage of physical memory installed on the computer.<br />
Results: 50% is fine, 10% and below 	is critical<br />
3)	Disk performance &#8211; <em>&#8220;\Logical Disk(*)\Avg. Disk sec/Read&#8221;</em> or <em>&#8220;\Logical Disk(*)\Avg. Disk sec/Write&#8221;</em> disk latency on the Hyper-V host operating system.<br />
Results: up to 15ms is fine, 15ms-25ms is warning, &gt;26ms critical</p>
<p style="padding-left: 30px;">Mode details about virtualized performance counters can be found in this <a href="http://blogs.msdn.com/uksharepoint/archive/2009/03/11/virtualizing-sharepoint-series-recommendations-for-monitoring-and-managing-a-virtualized-sharepoint-environments.aspx" target="_blank">post</a></p>
<p style="padding-left: 30px;">
<p>Refer to the following document for more details regarding virtualization: <a href="http://technet.microsoft.com/en-us/library/cc816955.aspx" target="_blank">http://technet.microsoft.com/en-us/library/cc816955.aspx</a></p>
<hr />In the next, final part we will describe the post deployment steps, which should be done to clear farm from temporary stuff and make your farm ready for production.</p>
]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/technical/administration/sharepoint-farm-configuring-and-deployment-part-5-virtualization/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Everything You Need to Know about BDC: Part 7 of 8</title>
		<link>http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-7-of-8</link>
		<comments>http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-7-of-8#comments</comments>
		<pubDate>Wed, 17 Jun 2009 00:00:44 +0000</pubDate>
		<dc:creator>Wen He</dc:creator>
				<category><![CDATA[Administration]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[applications]]></category>
		<category><![CDATA[BDC]]></category>
		<category><![CDATA[custom]]></category>
		<category><![CDATA[integration]]></category>
		<category><![CDATA[lob]]></category>
		<category><![CDATA[model]]></category>
		<category><![CDATA[object]]></category>
		<category><![CDATA[sharepoint]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=3328</guid>
		<description><![CDATA[Welcome back to Part 7 of our 8 Business Data Catalog (BDC) series. In this article, we will be focusing on the BDC Object Model.]]></description>
			<content:encoded><![CDATA[<p>Welcome back to Part 7 of our 8 Business Data Catalog (BDC) series. In this article, we will be focusing on the BDC Object Model. We start off by explaining why we would need the BDC Object Model and what it can do for us. From there we will look at some examples. Then we’ll step into the code and develop our own data access layer and custom applications to read from and write back to the LOB (line of business) systems. Finally we’ll conclude with best practices.</p>
<p>For your reference, these are our previous six articles:</p>
<ol>
<li><a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-1-of-8">Part 1</a>, BDC Purpose and technical architecture</li>
<li><a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-2-of-8">Part 2</a>, Application Definition File (ADF) and its Development</li>
<li><a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-3-of-8">Part 3</a>, Developing an ADF to Connect to Web Services</li>
<li><a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-4-of-8">Part 4</a>, Consuming Business Data through Web Parts and SharePoint Lists</li>
<li><a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-5-of-8">Part 5</a>, Implementing Enterprise Search with Business Data</li>
<li><a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-6-of-8">Part 6</a>, Integrating User Profiles with Business Data</li>
</ol>
<p>Until now, we have been working strictly with the out-of-the-box features and capabilities of BDC. MOSS Enterprise has also provided us another powerful approach for working with BDC, which is to employ the BDC Object Model and programmatically interact with a LOB system. This gives us as developers the power and control over BDC to further meet growing business needs.</p>
<p>You might be wondering why we use the BDC Object Model when you can just use ADO.NET. The reason is two-fold: 1) you already have BDC in place that has already abstracted the complexity of the business data and you want to maximize your investments, and 2) BDC takes care of authentication, authorization, and other security requirements, which is extremely helpful if you are writing a custom application that calls into a back-end system. So this makes the BDC Object Model a compelling API for us.</p>
<p>Using the BDC Object Model, we can accomplish many things such as the following examples:</p>
<ol>
<li>Auto-populate a SharePoint list that has a Business Data Column</li>
<li>Directly edit a customer in SAP</li>
<li>Synchronize content between SharePoint and an LOB system</li>
<li>Update and manipulate the ADF schema</li>
</ol>
<p>We now know what the Object Model can do so let’s first exam where the BDC Object Model fits in BDC architecturally.</p>
<h4>The BDC Object Model Overview</h4>
<p>To see where the BDC Object Model fits in the BDC world, let’s revisit the BDC architecture from <a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-1-of-8">Part 1</a> with <strong>Custom Applications</strong> highlighted in <strong>Figure 1</strong>.</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/06/image1.png"><img style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://sharepointmagazine.net/wp-content/uploads/2009/06/image-thumb1.png" border="0" alt="image" width="640" height="449" /></a><br />
<strong>Figure 1 The BDC Object Model Creates Custom Applications.</strong></p>
<p>As you can see from the figure above, BDC allows developers to connect to disparate LOB systems and these systems are exposed as data sources to various MOSS features such as Web Parts, list columns, enterprise search, user profiles, and custom applications that can be developed to interface with SharePoint.</p>
<p>Custom applications can be also developed to customize and extend the existing capabilities of BDC. That’s where the BDC Object Model fits in the picture and becomes the focus of this article. The BDC Object Model provides us with new namespaces and classes (methods and properties) we can use in Visual Studio the same way we use a standard set of .NET classes and interfaces. The OOB Web Parts such as Business Data List Web Part goes through this same API that we are going to learn about. You can also create your custom Applications using the same API.</p>
<p>As we have learned already, BDC abstracts the business logic in an XML-based ADF file and stores it in a shared service provider (SSP) database. This file contains all the necessary configuration data that determines how the BDC will connect to the remote systems and which requested data to make available through the BDC Object Model. The following figure shows the interaction between the ADF and the Object Model.</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/06/image3.png"><img style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://sharepointmagazine.net/wp-content/uploads/2009/06/image-thumb3.png" border="0" alt="image" width="300" height="406" /></a><br />
<strong>Figure 2 The BDC Object Model and How It Works</strong></p>
<p>As you can see, BDC Object Model consists of <strong>Runtime</strong> and <strong>Administration</strong> object models. Each of these performs different tasks:</p>
<p>1. Runtime object model</p>
<ul>
<li>Browse metadata, execute methods, retrieve instances, traverse relationships</li>
<li>Used to build custom applications</li>
</ul>
<p>2. Administration object model</p>
<ul>
<li>Create, read, update, and delete metadata and manage permissions</li>
<li>Used to edit the metadata internally or to build metadata management tools</li>
</ul>
<h4><strong>Using the BDC Object Model</strong></h4>
<p>In order to connect to the BDC from our code, we will use the root namespace within the BDC Object model <strong>Microsoft.Office.Server.ApplicationRegistry</strong>. If you’re curious as to the term Application Registry, just know that it was the original name for BDC. It’s defined in the assembly <strong>Microsoft.sharepoint.portal.dll. </strong>Through the root namespace we have access to the child namespaces and its classes that we are going to use later in the article. Here they are listed in this table:</p>
<table class="MsoTableGrid" style="border-style: none; width: 7.65in; border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0" width="734">
<tbody>
<tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes">
<td style="border: 1pt solid black; padding: 0in 5.4pt; width: 81.7pt;" width="109" valign="top">
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><strong><span style="font-size: 8pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">Category</span></strong></p>
</td>
<td style="border-color: black; border-width: 1pt; border-top: 1pt solid black; border-right: 1pt solid black; border-bottom: 1pt solid black; padding: 0in 5.4pt; width: 88.75pt;" width="118" valign="top">
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><strong><span style="font-size: 8pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">Namespace</span></strong></p>
</td>
<td style="border-color: black; border-width: 1pt; border-top: 1pt solid black; border-right: 1pt solid black; border-bottom: 1pt solid black; padding: 0in 5.4pt; width: 201.85pt;" width="269" valign="top">
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><strong><span style="font-size: 8pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">Main Classes</span></strong></p>
</td>
<td style="border-color: black; border-width: 1pt; border-top: 1pt solid black; border-right: 1pt solid black; border-bottom: 1pt solid black; padding: 0in 5.4pt; width: 178.5pt;" width="238" valign="top">
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><strong><span style="font-size: 8pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">Tasks</span></strong></p>
</td>
</tr>
<tr style="mso-yfti-irow: 1">
<td style="border-color: black; border-width: 1pt; border-left: 1pt solid black; border-right: 1pt solid black; border-bottom: 1pt solid black; padding: 0in 5.4pt; width: 81.7pt;" rowspan="2" width="109" valign="top">
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><strong><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">Runtime Object Model</span></strong></p>
</td>
<td style="border-style: none solid solid none; border-right: 1pt solid black; border-bottom: 1pt solid black; padding: 0in 5.4pt; width: 88.75pt;" width="118" valign="top">
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">MetadataModel</span></p>
</td>
<td style="border-style: none solid solid none; border-right: 1pt solid black; border-bottom: 1pt solid black; padding: 0in 5.4pt; width: 201.85pt;" width="269" valign="top">
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">LobSystem</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">LobSystemInstance</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">Entity</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">MethodInstance</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">Association</span></p>
</td>
<td style="border-style: none solid solid none; border-right: 1pt solid black; border-bottom: 1pt solid black; padding: 0in 5.4pt; width: 178.5pt;" width="238" valign="top">
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">Use it to read (and only read) the BDC objects and execute queries</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 2">
<td style="border-style: none solid solid none; border-right: 1pt solid black; border-bottom: 1pt solid black; padding: 0in 5.4pt; width: 88.75pt;" width="118" valign="top">
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">Runtime</span></p>
</td>
<td style="border-style: none solid solid none; border-right: 1pt solid black; border-bottom: 1pt solid black; padding: 0in 5.4pt; width: 201.85pt;" width="269" valign="top">
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">IEntityInstanceEnumerator</span></p>
</td>
<td style="border-style: none solid solid none; border-right: 1pt solid black; border-bottom: 1pt solid black; padding: 0in 5.4pt; width: 178.5pt;" width="238" valign="top">
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">Used to manage results like a DataReader</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 3">
<td style="border-color: black; border-width: 1pt; border-left: 1pt solid black; border-right: 1pt solid black; border-bottom: 1pt solid black; padding: 0in 5.4pt; width: 81.7pt;" width="109" valign="top">
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><strong><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">Administration Object Model</span></strong></p>
</td>
<td style="border-style: none solid solid none; border-right: 1pt solid black; border-bottom: 1pt solid black; padding: 0in 5.4pt; width: 88.75pt;" width="118" valign="top">
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">Administration</span></p>
</td>
<td style="border-style: none solid solid none; border-right: 1pt solid black; border-bottom: 1pt solid black; padding: 0in 5.4pt; width: 201.85pt;" width="269" valign="top">
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">LobSystem</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">LobSystemInstance</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">Entity</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">Method</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">MethodInstance</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">Association</span></p>
</td>
<td style="border-style: none solid solid none; border-right: 1pt solid black; border-bottom: 1pt solid black; padding: 0in 5.4pt; width: 178.5pt;" width="238" valign="top">
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">Use to create and edit the BDC objects (LOB system, entity, and method) and access control lists (ACLs) </span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 4">
<td style="border-color: black; border-width: 1pt; border-left: 1pt solid black; border-right: 1pt solid black; border-bottom: 1pt solid black; padding: 0in 5.4pt; width: 81.7pt;" rowspan="3" width="109" valign="top">
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><strong><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">Shared (Supporting) Classes</span></strong></p>
</td>
<td style="border-style: none solid solid none; border-right: 1pt solid black; border-bottom: 1pt solid black; padding: 0in 5.4pt; width: 88.75pt;" width="118" valign="top">
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">Infrastructure</span></p>
</td>
<td style="border-style: none solid solid none; border-right: 1pt solid black; border-bottom: 1pt solid black; padding: 0in 5.4pt; width: 201.85pt;" width="269" valign="top">
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">SqlSessionProvider</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">EntityInstanceIdEncoder</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">BdcAccessControlList</span></p>
</td>
<td style="border-style: none solid solid none; border-right: 1pt solid black; border-bottom: 1pt solid black; padding: 0in 5.4pt; width: 178.5pt;" width="238" valign="top">
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">Use it to manage security and connections to the database</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 5">
<td style="border-style: none solid solid none; border-right: 1pt solid black; border-bottom: 1pt solid black; padding: 0in 5.4pt; width: 88.75pt;" width="118" valign="top">
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">SystemSpecific.Db</span></p>
</td>
<td style="border-style: none solid solid none; border-right: 1pt solid black; border-bottom: 1pt solid black; padding: 0in 5.4pt; width: 201.85pt;" width="269" valign="top">
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">DbEntityInstanceEnumerator</span></p>
</td>
<td style="border-style: none solid solid none; border-right: 1pt solid black; border-bottom: 1pt solid black; padding: 0in 5.4pt; width: 178.5pt;" width="238" valign="top">
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">Use to manipulate entityinstances</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 6; mso-yfti-lastrow: yes">
<td style="border-style: none solid solid none; border-right: 1pt solid black; border-bottom: 1pt solid black; padding: 0in 5.4pt; width: 88.75pt;" width="118" valign="top">
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><em><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">WebService*</span></em></p>
</td>
<td style="border-style: none solid solid none; border-right: 1pt solid black; border-bottom: 1pt solid black; padding: 0in 5.4pt; width: 201.85pt;" width="269" valign="top">
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">Web services are part of the BDC API and layer on top of the object model and can be called remotely via the URL </span><a href="http://webapp/_vti_bin/businessdatacatalog.asmx"><span style="font-size: 7.5pt; color: #0000cc; font-family: 'Verdana','sans-serif'; text-decoration: none; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; text-underline: none">http://webapp/_vti_bin/businessdatacatalog.asmx</span></a></p>
</td>
<td style="border-style: none solid solid none; border-right: 1pt solid black; border-bottom: 1pt solid black; padding: 0in 5.4pt; width: 178.5pt;" width="238" valign="top">
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal"><span style="font-size: 7.5pt; color: black; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">Use to remotely get LOB system instances, entities, and methods</span></p>
</td>
</tr>
</tbody>
</table>
<p><strong>Table 1: Namespaces and Classes</strong></p>
<p><strong>Tip</strong>: <strong>MetadataModel</strong> and <strong>Administration</strong> use some of the same class names such as LobSystem and Entity so one way to avoid conflict when using them together is to use an alias as follows:</p>
<p>using BDCAdmin = Microsoft.Office.Server.ApplicationRegistry.Administration;</p>
<p>MSDN already has a code sample linked <a href="http://msdn.microsoft.com/en-us/library/ms492509.aspx">here</a> on how to use the <strong>Administration</strong> object model to create and import an ADF. Since it’s more practical to us, we will use the <strong>Runtime</strong> object model primarily throughout this article.</p>
<p>Now we have the basic understanding of the BDC Object Model. Let’s make use of it by applying it to the following three scenarios:</p>
<ol>
<li>Auto-populate a SharePoint list that has a Business Data Column</li>
<li>Create a BDC Utility Class that can be used in custom Applications and Web services</li>
<li>Create a custom application to update the LOB systems</li>
</ol>
<p>Since all three of these will use the Runtime object model, we can initialize our code examples by first referencing the assembly <strong>Microsoft.sharepoint.portal.dll</strong> and then import the namespaces accordingly depending on the tasks:</p>
<p>Now that namespaces have been imported, the next line of code designates the Shared Service Provider (SSP) that provides the ADF. This is accomplished using the following call to the SqlSessionProvider singleton Instance property:</p>
<p class="MsoNormal"><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">using</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"> Microsoft.SharePoint;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">using</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"> Microsoft.Office.Server.ApplicationRegistry.Runtime;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">using</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"> Microsoft.Office.Server.ApplicationRegistry.Infrastructure;<br />
</span><span style="font-size: 10pt; color: blue; line-height: 115%; font-family: 'Courier New'; mso-no-proof: yes">using</span><span style="font-size: 10pt; line-height: 115%; font-family: 'Courier New'; mso-no-proof: yes"> Microsoft.Office.Server.ApplicationRegistry.MetadataModel;</span></p>
<p class="MsoNormal">SqlSessionProvider.Instance().SetSharedResourceProviderToUse(sspName);</p>
<p>The next set of code is the actual connection to the appropriate BDC and system instance. The connection is established by indicating the LobSystemInstance and Entity objects with the following statements:</p>
<p>LobSystemInstance lobInstance = ApplicationRegistry.GetLobSystemInstanceByName(&#8220;SynergyData&#8221;);</p>
<p>//Connect to the customers entity</p>
<p>Entity customers = lobInstance.GetEntities()["Customers"];</p>
<p>Following are the top steps we perform to call into the BDC and retrieve the data:</p>
<ol>
<li>Connect to the named SSP</li>
<li>Connect to LOB Instance</li>
<li>Connect to entity</li>
<li>Connect to method for the entity</li>
<li>Execute the method</li>
<li>Parse the results</li>
</ol>
<p>Now that you understand how to initialize your projects that use the Runtime API, let’s now examine each scenario:</p>
<h5><strong>1. Auto-populate a SharePoint list with Business Data Column</strong></h5>
<p>This application automatically populates a SharePoint list that has a Business Data Column storing customer records. First we create a SharePoint teamsite named <strong>teamsite</strong> and a SharePoint list called <strong>Customers</strong>. Then we reference both the SharePoint assembly <strong>Microsoft.SharePoint.dll</strong> and BDC assembly <strong>Microsoft.SharePoint.Portal.dll</strong>. Then code the using clauses to import the namespaces and code against the BDC Object Model by connecting to BDC and execute the method instance which will return all customers.</p>
<p>As my colleague <a href="http://www.synergyonline.com/about/professionalprofiles/Pages/RandyWilliams.aspx">Randy Williams</a> has already demoed in his <a href="http://www.synergyonline.com/blog/blog-moss/Lists/Posts/Post.aspx?ID=50">blog</a>, here’s the complete code:</p>
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: green">//Get SPList handle </span></span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">SPSite</span> site = <span style="color: blue">new</span> <span style="color: #2b91af">SPSite</span>(<a href="http://MOSS">http:<span style="color: green">//MOSS</span></a>);<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">SPWeb</span> web = site.OpenWeb(<span style="color: #a31515">&#8220;teamsite&#8221;</span>);<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">SPList</span> customerList = web.Lists[<span style="color: #a31515">"Customers"</span>];</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"> </span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: green">//Connected named SSP using the following call to the SqlSessionProvider singleton instance property<br />
</span></span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">SqlSessionProvider</span>.Instance().SetSharedResourceProviderToUse(<span style="color: #a31515">&#8220;SSP&#8221;</span>);</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: green">//Connect to the LOBSystemInstance<br />
</span></span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">LobSystemInstance</span> lobInstance = <span style="color: #2b91af">ApplicationRegistry</span>.GetLobSystemInstanceByName(<span style="color: #a31515">&#8220;SynergyData&#8221;</span>);</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"> </span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: green">//Connect to the customers entity<br />
</span></span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">Entity</span> customers = lobInstance.GetEntities()[<span style="color: #a31515">"Customers"</span>];</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"> </span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: green">//Connect to our finder method for customers<br />
</span></span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">MethodInstance</span> getCustomers = customers.GetFinderMethodInstance();</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"> </span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: green">//Execute finder method<br />
</span></span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">IEntityInstanceEnumerator</span> results = (<span style="color: #2b91af">IEntityInstanceEnumerator</span> ) customers.Execute(getCustomers, lobInstance);</span></p>
<p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: green">//iterate through each row returned and add a new item<br />
</span></span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: blue">while</span> (results.MoveNext())<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>{<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">SPListItem</span> item = customerList.Items.Add();<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>item[<span style="color: #a31515">"Customers_ID"</span>] = <span style="color: #2b91af">EntityInstanceIdEncoder</span>.EncodeEntityInstanceId(<span style="color: blue">new</span> <span style="color: blue">object</span>[] { results.Current[<span style="color: #a31515">"CustomerID"</span>].ToString() });<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>item.Update();<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>}</span></p>
<h5><strong>2. Create a BDC Utility Class</strong></h5>
<p>We’re going to create a custom library that uses the BDC Object Model to connect to an ADF.  We treat the BDC source simply as a data reader and to build our create/update/delete logic in an assembly. The BDC object model provides the means to retrieve collections, list items and enumerators, and we do the rest. In this class, we are going to create the following three static methods:</p>
<ol>
<li>ExecuteFinder()</li>
<li>ExecuteSpecificFinder()</li>
<li>ExecuteGenericInvoker()</li>
</ol>
<p>Let’s go through the code one by one. Here’s the first static method named <strong>ExecuteFinder</strong> that returns all of the entity records.</p>
<p class="MsoNormal"><span style="font-size: 10pt; color: #4c4c4c; font-family: 'Courier New'; mso-fareast-font-family: 'Times New Roman'">namespace SharePointMag<br />
{<br />
public class BDCUtil<br />
{<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: blue">public</span> <span style="color: blue">static</span> <span style="color: #2b91af">DataSet</span> ExecuteFinder(<span style="color: blue">string</span> SSPName, <span style="color: blue">string</span> LobSystemInstance, <span style="color: blue">string</span> Entity)<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>{<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">DataSet</span> ds = <span style="color: blue">new</span> <span style="color: #2b91af">DataSet</span>(Entity);</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"> </span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: green">//Connect to named SSP<br />
</span></span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: blue">if</span> (SSPName != <span style="color: blue">null</span>)<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">SqlSessionProvider</span>.Instance().SetSharedResourceProviderToUse(SSPName);</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: green">//Connect to LOB Instance<br />
</span></span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">LobSystemInstance</span> lobInstance = <span style="color: #2b91af">ApplicationRegistry</span>.GetLobSystemInstanceByName(LobSystemInstance);</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: green">//Connect to customers entity<br />
</span></span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">Entity</span> entity = lobInstance.GetEntities()[Entity];</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: green">//Connect to Finder method for customers<br />
</span></span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">MethodInstance</span> finder = entity.GetFinderMethodInstance();</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: green">//Execute Finder method<br />
</span></span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">DbEntityInstanceEnumerator</span> records = (<span style="color: #2b91af">DbEntityInstanceEnumerator</span>)entity.Execute(finder, lobInstance);</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: green">//Load matching entities into a DataTable<br />
</span></span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">DataTable</span> entitiesTable = <span style="color: blue">new</span> <span style="color: #2b91af">DataTable</span>();<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: blue">while</span> (records.MoveNext())<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>{<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: green">//Load each entity and include the Action URL<br />
</span></span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">DbEntityInstance</span> record = (<span style="color: #2b91af">DbEntityInstance</span>)records.Current;<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">DataTable</span> entityTable = record.EntityAsDataTable;<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>entityTable.AcceptChanges();<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>entitiesTable.Merge(entityTable);<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>}</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: green">//DataTable ordersTable = customerOrders.Tables.Add(&#8220;Orders&#8221;);<br />
</span></span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>ds.Tables.Add(entitiesTable);<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: blue">return</span> ds;<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>}<br />
</span><span style="font-size: 8pt; color: #4c4c4c; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"> }<br />
</span><span style="font-size: 8pt; color: #4c4c4c; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">}</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; color: #4c4c4c; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">The following code calls </span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">ExecuteFinder of</span><span style="font-size: 8pt; color: #4c4c4c; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"> BDCUtil class to return the customers records:</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: blue">public</span> <span style="color: blue">static</span> DataSet GetEntity()<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>{<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: blue">return</span> <span style="color: #2b91af">BDCUtil</span>. ExecuteFinder(<span style="color: #a31515">&#8220;SSP&#8221;</span>, <span style="color: #a31515">&#8220;SynergyDataInstance&#8221;</span>, <span style="color: #a31515">&#8220;Customers&#8221;</span>);<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>}</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; color: #4c4c4c; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">The following is a Web service example to call the BDCUtil class to return all the customer records:</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>[<span style="color: #2b91af">WebMethod</span>]<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: blue">public</span> <span style="color: #2b91af">DataSet</span> GetCustomers()<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>{<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: blue">string</span> SSPName=<span style="color: #a31515">&#8220;SSPPS&#8221;</span>;<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: blue">string</span> strLOBInstance=<span style="color: #a31515">&#8220;SynergyDataInstance&#8221;</span>;<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: blue">string</span> Entity=<span style="color: #a31515">&#8220;Customers&#8221;</span>;<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">DataSet</span> ds = <span style="color: blue">new</span> <span style="color: #2b91af">DataSet</span>(Entity);<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>ds = <span style="color: #2b91af">BDCUtil</span>. ExecuteFinder(SSPName, strLOBInstance, Entity);<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: blue">return</span> ds;<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>}</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: 'Verdana','sans-serif'; mso-bidi-font-family: 'Courier New'; mso-no-proof: yes">Note: For simplicity, we explicitly pass in the name of LOB Instance and Entity in our examples. They could also be “discovered” if you desire. Please check out this </span><a href="http://msdn.microsoft.com/en-us/library/ms568510.aspx"><span style="font-size: 8pt; font-family: 'Verdana','sans-serif'; mso-bidi-font-family: 'Courier New'; mso-no-proof: yes">MSDN</span></a><span style="font-size: 8pt; font-family: 'Verdana','sans-serif'; mso-bidi-font-family: 'Courier New'; mso-no-proof: yes"> article titled <em>How to: Get Started with Using the Runtime Object Model</em>.</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: 'Verdana','sans-serif'; mso-bidi-font-family: 'Courier New'; mso-no-proof: yes">The second method named </span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">ExecuteSpecificFinder returns a single row of record identified by its ID.</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: blue">public</span> <span style="color: blue">static</span> <span style="color: #2b91af">DataSet</span> ExecuteSpecificFinder(<span style="color: blue">string</span> SSPName, <span style="color: blue">string</span> LobSystemInstance, <span style="color: blue">string</span> Entity, <span style="color: blue">object</span>[] parameters)<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>{<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">DataSet</span> ds = <span style="color: blue">new</span> <span style="color: #2b91af">DataSet</span>(Entity);</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: green">//Connect to named SSP<br />
</span></span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: blue">if</span> (SSPName != <span style="color: blue">null</span>)<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">SqlSessionProvider</span>.Instance().SetSharedResourceProviderToUse(SSPName);<span style="mso-spacerun: yes"> </span></span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: blue">try<br />
</span></span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>{<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: green">//Connect to LOB Instance<br />
</span></span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">NamedLobSystemInstanceDictionary</span> lobInstances = <span style="color: #2b91af">ApplicationRegistry</span>.GetLobSystemInstances();<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">LobSystemInstance</span> lobInstance = lobInstances[LobSystemInstance];<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">Entity</span> entity = lobInstance.GetEntities()[Entity];</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: green">//Get the specific mathcing record<br />
</span></span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">DbEntityInstance</span> record = (<span style="color: #2b91af">DbEntityInstance</span>)entity.FindSpecific(parameters, lobInstance);</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: green">//Loading matching entity into DataTable<br />
</span></span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">DataTable</span> entityTable = record.EntityAsDataTable;</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: green">//Return the results as a dataset</span></span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: green">//DataSet ds = new DataSet(Entity);<br />
</span></span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>ds.Tables.Add(entityTable);<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: blue">return</span> ds;<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>}<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>}</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: 'Verdana','sans-serif'; mso-bidi-font-family: 'Courier New'; mso-no-proof: yes">The following code calls the ExecuteSpecificFinder of BDCUtil class to return one row of employee record.</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">public</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"> <span style="color: blue">static</span> <span style="color: #2b91af">DataSet</span> ExecuteSpecificFinder()<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>{<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: blue">object</span>[] parameters = <span style="color: blue">new</span> <span style="color: blue">object</span>[1];<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>parameters[0] = 1; <span style="color: green">//Employee ID;<br />
</span></span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: blue">return</span> <span style="color: #2b91af">BDCUtil</span>.ExecuteSpecificFinder(<span style="color: #a31515">&#8220;SSP&#8221;</span>, <span style="color: #a31515">&#8220;SynergyDataInstance&#8221;</span>, <span style="color: #a31515">&#8220;Employees&#8221;</span>, parameters);<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>}</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"> </span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">This is the returned employee record that’s displayed in XML format:</span></p>
<p class="MsoNormal"><span style="font-size: 9.5pt; color: blue; font-family: consolas">&lt;</span><span style="font-size: 9.5pt; color: #a31515; font-family: consolas">Employees</span><span style="font-size: 9.5pt; color: blue; font-family: consolas">&gt;<br />
</span><span style="font-size: 9.5pt; color: blue; font-family: consolas"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 9.5pt; color: #a31515; font-family: consolas">Employees</span><span style="font-size: 9.5pt; color: blue; font-family: consolas">&gt;<br />
</span><span style="font-size: 9.5pt; color: blue; font-family: consolas"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 9.5pt; color: #a31515; font-family: consolas">EmployeeID</span><span style="font-size: 9.5pt; color: blue; font-family: consolas">&gt;</span><span style="font-size: 9.5pt; font-family: consolas">1<span style="color: blue">&lt;/</span><span style="color: #a31515">EmployeeID</span><span style="color: blue">&gt;<br />
</span></span><span style="font-size: 9.5pt; color: blue; font-family: consolas"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 9.5pt; color: #a31515; font-family: consolas">LastName</span><span style="font-size: 9.5pt; color: blue; font-family: consolas">&gt;</span><span style="font-size: 9.5pt; font-family: consolas">Davolio<span style="color: blue">&lt;/</span><span style="color: #a31515">LastName</span><span style="color: blue">&gt;<br />
</span></span><span style="font-size: 9.5pt; color: blue; font-family: consolas"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 9.5pt; color: #a31515; font-family: consolas">FirstName</span><span style="font-size: 9.5pt; color: blue; font-family: consolas">&gt;</span><span style="font-size: 9.5pt; font-family: consolas">Nancy<span style="color: blue">&lt;/</span><span style="color: #a31515">FirstName</span><span style="color: blue">&gt;<br />
</span></span><span style="font-size: 9.5pt; color: blue; font-family: consolas"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 9.5pt; color: #a31515; font-family: consolas">Title</span><span style="font-size: 9.5pt; color: blue; font-family: consolas">&gt;</span><span style="font-size: 9.5pt; font-family: consolas">Sales Representative<span style="color: blue">&lt;/</span><span style="color: #a31515">Title</span><span style="color: blue">&gt;<br />
</span></span><span style="font-size: 9.5pt; color: blue; font-family: consolas"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 9.5pt; color: #a31515; font-family: consolas">TitleOfCourtesy</span><span style="font-size: 9.5pt; color: blue; font-family: consolas">&gt;</span><span style="font-size: 9.5pt; font-family: consolas">Ms.<span style="color: blue">&lt;/</span><span style="color: #a31515">TitleOfCourtesy</span><span style="color: blue">&gt;<br />
</span></span><span style="font-size: 9.5pt; color: blue; font-family: consolas"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 9.5pt; color: #a31515; font-family: consolas">BirthDate</span><span style="font-size: 9.5pt; color: blue; font-family: consolas">&gt;</span><span style="font-size: 9.5pt; font-family: consolas">12/8/1948 12:00:00 AM<span style="color: blue">&lt;/</span><span style="color: #a31515">BirthDate</span><span style="color: blue">&gt;<br />
</span></span><span style="font-size: 9.5pt; color: blue; font-family: consolas"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 9.5pt; color: #a31515; font-family: consolas">HireDate</span><span style="font-size: 9.5pt; color: blue; font-family: consolas">&gt;</span><span style="font-size: 9.5pt; font-family: consolas">5/1/1992 12:00:00 AM<span style="color: blue">&lt;/</span><span style="color: #a31515">HireDate</span><span style="color: blue">&gt;<br />
</span></span><span style="font-size: 9.5pt; color: blue; font-family: consolas"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 9.5pt; color: #a31515; font-family: consolas">Address</span><span style="font-size: 9.5pt; color: blue; font-family: consolas">&gt;</span><span style="font-size: 9.5pt; font-family: consolas">507 &#8211; 20th Ave. E.</span><span style="font-size: 9.5pt; font-family: consolas">Apt. 2A<span style="color: blue">&lt;/</span><span style="color: #a31515">Address</span><span style="color: blue">&gt;<br />
</span></span><span style="font-size: 9.5pt; color: blue; font-family: consolas"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 9.5pt; color: #a31515; font-family: consolas">City</span><span style="font-size: 9.5pt; color: blue; font-family: consolas">&gt;</span><span style="font-size: 9.5pt; font-family: consolas">Seattle<span style="color: blue">&lt;/</span><span style="color: #a31515">City</span><span style="color: blue">&gt;<br />
</span></span><span style="font-size: 9.5pt; color: blue; font-family: consolas"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 9.5pt; color: #a31515; font-family: consolas">Region</span><span style="font-size: 9.5pt; color: blue; font-family: consolas">&gt;</span><span style="font-size: 9.5pt; font-family: consolas">WA<span style="color: blue">&lt;/</span><span style="color: #a31515">Region</span><span style="color: blue">&gt;<br />
</span></span><span style="font-size: 9.5pt; color: blue; font-family: consolas"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 9.5pt; color: #a31515; font-family: consolas">PostalCode</span><span style="font-size: 9.5pt; color: blue; font-family: consolas">&gt;</span><span style="font-size: 9.5pt; font-family: consolas">98122<span style="color: blue">&lt;/</span><span style="color: #a31515">PostalCode</span><span style="color: blue">&gt;<br />
</span></span><span style="font-size: 9.5pt; color: blue; font-family: consolas"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 9.5pt; color: #a31515; font-family: consolas">Country</span><span style="font-size: 9.5pt; color: blue; font-family: consolas">&gt;</span><span style="font-size: 9.5pt; font-family: consolas">USA<span style="color: blue">&lt;/</span><span style="color: #a31515">Country</span><span style="color: blue">&gt;<br />
</span></span><span style="font-size: 9.5pt; color: blue; font-family: consolas"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 9.5pt; color: #a31515; font-family: consolas">HomePhone</span><span style="font-size: 9.5pt; color: blue; font-family: consolas">&gt;</span><span style="font-size: 9.5pt; font-family: consolas">(206) 555-9857<span style="color: blue">&lt;/</span><span style="color: #a31515">HomePhone</span><span style="color: blue">&gt;<br />
</span></span><span style="font-size: 9.5pt; color: blue; font-family: consolas"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 9.5pt; color: #a31515; font-family: consolas">Extension</span><span style="font-size: 9.5pt; color: blue; font-family: consolas">&gt;</span><span style="font-size: 9.5pt; font-family: consolas">5467<span style="color: blue">&lt;/</span><span style="color: #a31515">Extension</span><span style="color: blue">&gt;<br />
</span></span><span style="font-size: 9.5pt; color: blue; font-family: consolas"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 9.5pt; color: #a31515; font-family: consolas">Photo</span><span style="font-size: 9.5pt; color: blue; font-family: consolas">&gt;</span><span style="font-size: 9.5pt; font-family: consolas">FRwvAAIAAAA…truncated…&lt;/<span style="color: #a31515">Photo</span><span style="color: blue">&gt;<br />
</span></span><span style="font-size: 9.5pt; color: blue; font-family: consolas"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 9.5pt; color: #a31515; font-family: consolas">Notes</span><span style="font-size: 9.5pt; color: blue; font-family: consolas">&gt;</span><span style="font-size: 9.5pt; font-family: consolas">Education includes a BA in psychology from Colorado State University in 1970.<span style="mso-spacerun: yes"> </span>She also completed &#8220;The Art of the Cold Call.&#8221;<span style="mso-spacerun: yes"> </span>Nancy is a member of Toastmasters International.<span style="color: blue">&lt;/</span><span style="color: #a31515">Notes</span><span style="color: blue">&gt;<br />
</span></span><span style="font-size: 9.5pt; color: blue; font-family: consolas"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 9.5pt; color: #a31515; font-family: consolas">ReportsTo</span><span style="font-size: 9.5pt; color: blue; font-family: consolas">&gt;</span><span style="font-size: 9.5pt; font-family: consolas">2<span style="color: blue">&lt;/</span><span style="color: #a31515">ReportsTo</span><span style="color: blue">&gt;<br />
</span></span><span style="font-size: 9.5pt; color: blue; font-family: consolas"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 9.5pt; color: #a31515; font-family: consolas">PhotoPath</span><span style="font-size: 9.5pt; color: blue; font-family: consolas">&gt;</span><span style="font-size: 9.5pt; font-family: consolas">http://portal.synergy.com/hr/employeephotos/ndavolio.jpg<span style="color: blue">&lt;/</span><span style="color: #a31515">PhotoPath</span><span style="color: blue">&gt;<br />
</span></span><span style="font-size: 9.5pt; color: blue; font-family: consolas"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 9.5pt; color: #a31515; font-family: consolas">LoginAccount</span><span style="font-size: 9.5pt; color: blue; font-family: consolas">&gt;</span><span style="font-size: 9.5pt; font-family: consolas">synergy\ndavolio<span style="color: blue">&lt;/</span><span style="color: #a31515">LoginAccount</span><span style="color: blue">&gt;<br />
</span></span><span style="font-size: 9.5pt; color: blue; font-family: consolas"><span style="mso-spacerun: yes"> </span>&lt;/</span><span style="font-size: 9.5pt; color: #a31515; font-family: consolas">Employees</span><span style="font-size: 9.5pt; color: blue; font-family: consolas">&gt;</span><span style="font-size: 9.5pt; color: blue; font-family: consolas"> </span></p>
<p class="MsoNormal"><span style="font-size: 9.5pt; font-family: consolas">Note: The &lt;Photo&gt; element has been truncated to save space here.</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; font-family: 'Verdana','sans-serif'; mso-bidi-font-family: 'Courier New'; mso-no-proof: yes">Now let’s move on to <strong>GenericInvoker </strong>by </span><span style="font-size: 8pt; color: #4c4c4c; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">adding <strong>ExecuteGenericInvoker </strong>method in our BDCUtili class</span><strong><span style="font-size: 8pt; font-family: 'Verdana','sans-serif'; mso-bidi-font-family: 'Courier New'; mso-no-proof: yes">.</span></strong><span style="font-size: 8pt; font-family: 'Verdana','sans-serif'; mso-bidi-font-family: 'Courier New'; mso-no-proof: yes"> The <a><strong>ExecuteGenericInvoker</strong> method calls the GenericInvoker method instance to write back to LOB systems.</a></span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: blue">public</span> <span style="color: blue">static</span> <span style="color: blue">void</span> ExecuteGenericInvoker(<span style="color: blue">string</span> SSPName, <span style="color: blue">string</span> lobSystemInstance, <span style="color: blue">string</span> entityName, <span style="color: blue">string</span> methodInstance, <span style="color: blue">object</span>[] parameters)</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">{</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: green">//Connect to named SSP<br />
</span></span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: blue">if</span> (SSPName != <span style="color: blue">null</span>)<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">SqlSessionProvider</span>.Instance().SetSharedResourceProviderToUse(SSPName);</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">NamedLobSystemInstanceDictionary</span> instances = <span style="color: #2b91af">ApplicationRegistry</span>.GetLobSystemInstances();<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">LobSystemInstance</span> instance = instances[lobSystemInstance];<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">Entity</span> entity = instance.GetEntities()[entityName];<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">MethodInstance</span> methInst = entity.GetMethodInstances()[methodInstance];<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>entity.Execute(methInst, instance, <span style="color: blue">ref</span> parameters);<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>}</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; color: #4c4c4c; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">In our third example,</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif'; mso-bidi-font-family: 'Courier New'; mso-no-proof: yes"> we look at </span><strong><span style="font-size: 8pt; font-family: 'Verdana','sans-serif'; mso-bidi-font-family: 'Courier New'; mso-no-proof: yes">GenericInvoker </span></strong><span style="font-size: 8pt; font-family: 'Verdana','sans-serif'; mso-bidi-font-family: 'Courier New'; mso-no-proof: yes">and then call the</span><strong><span style="font-size: 8pt; color: #4c4c4c; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"> ExecuteGenericInvoker </span></strong><span style="font-size: 8pt; color: #4c4c4c; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">method we’ve just added.</span></p>
<h4><strong><span style="font-size: 12pt; color: #4c4c4c; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">3. Create a Custom Application to Update the LOB systems</span></strong></h4>
<p class="MsoNormal"><span style="font-size: 8pt; color: #4c4c4c; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">BDC is very well known as read-only tool. <span style="mso-spacerun: yes"> </span>It’s read-only because the OOB functionality does not make use of <strong>GenericInvoker</strong> methods. However, the object model and ADF support this type of method instance that we invoke just as we would invoke any other method. If you think of this as a stored procedure call and if I can call a stored procedure that runs a select statement, I should be able to call a stored procedure that inserts or updates as long as the underlining data repository supports them. In other words, the <strong>GenericInvoker</strong> method allows us to call other SQL commands. For our situation, we’ll use it to write back to our back-end system.<span style="mso-spacerun: yes"> </span></span></p>
<p class="MsoNormal"><span style="font-size: 8pt; color: #4c4c4c; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">So let’s first add the <strong>GenericInvoker</strong> method in our ADF file and then call the <strong>ExecuteGenericInvoker </strong>method in our BDCUtil class . (Note: I’ve used </span><a href="http://www.lightningtools.com/bdc-meta-man/default.aspx"><span style="font-size: 8pt; color: #0000cc; font-family: 'Verdana','sans-serif'; text-decoration: none; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; text-underline: none">BDC Meta Man</span></a><span style="font-size: 8pt; color: #4c4c4c; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"> to help generate the ADF and create ExecuteGenericInvoker. Thanks Lightning Tools! If you use BDC Definition Editor, you cannot select byte array <em>byte[]</em> as the return type of the field. You can instead select <em>byte</em> and edit the ADF by hand by changing <em>byte</em> to <em>byte[].</em>)  The following is the ADF and for the purpose of this example, only a single entity called Employees has been defined. </span></p>
<p class="MsoNormal"><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> &lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Entity</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">EstimatedInstanceCount</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">0</span>&#8220;<span style="color: blue"> </span><span style="color: red">Name</span><span style="color: blue">=</span>&#8220;<span style="color: blue">Employees</span>&#8220;<span style="color: blue">&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Identifiers</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Identifier</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">TypeName</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">System.Int32</span>&#8220;<span style="color: blue"> </span><span style="color: red">Name</span><span style="color: blue">=</span>&#8220;<span style="color: blue">EmployeeID</span>&#8220;<span style="color: blue"> /&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;/</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Identifiers</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Methods</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;/</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Methods</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;/</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Entity</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Method</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">Name</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">insertEmployees</span>&#8220;<span style="color: blue">&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Properties</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Property</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">Name</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">RdbCommandText</span>&#8220;<span style="color: blue"> </span><span style="color: red">Type</span><span style="color: blue">=</span>&#8220;<span style="color: blue">System.String</span>&#8220;<span style="color: blue">&gt;<br />
</span></span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>Insert into Employees(LastName,FirstName,Title) Values(@LastName,@FirstName,@Title);select NewEmployeeID = SCOPE_IDENTITY()<span style="color: blue">&lt;/</span><span style="color: #a31515">Property</span><span style="color: blue">&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Property</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">Name</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">RdbCommandType</span>&#8220;<span style="color: blue"> </span><span style="color: red">Type</span><span style="color: blue">=</span>&#8220;<span style="color: blue">System.String</span>&#8220;<span style="color: blue">&gt;</span>Text<span style="color: blue">&lt;/</span><span style="color: #a31515">Property</span><span style="color: blue">&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;/</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Properties</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Parameters</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Parameter</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">Direction</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">In</span>&#8220;<span style="color: blue"> </span><span style="color: red">Name</span><span style="color: blue">=</span>&#8220;<span style="color: blue">@LastName</span>&#8220;<span style="color: blue">&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">TypeDescriptor</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">TypeName</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">System.String</span>&#8220;<span style="color: blue"> </span><span style="color: red">Name</span><span style="color: blue">=</span>&#8220;<span style="color: blue">LastName</span>&#8220;<span style="color: blue"> /&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;/</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Parameter</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Parameter</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">Direction</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">In</span>&#8220;<span style="color: blue"> </span><span style="color: red">Name</span><span style="color: blue">=</span>&#8220;<span style="color: blue">@FirstName</span>&#8220;<span style="color: blue">&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">TypeDescriptor</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">TypeName</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">System.String</span>&#8220;<span style="color: blue"> </span><span style="color: red">Name</span><span style="color: blue">=</span>&#8220;<span style="color: blue">FirstName</span>&#8220;<span style="color: blue"> /&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;/</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Parameter</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Parameter</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">Direction</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">In</span>&#8220;<span style="color: blue"> </span><span style="color: red">Name</span><span style="color: blue">=</span>&#8220;<span style="color: blue">@Title</span>&#8220;<span style="color: blue">&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">TypeDescriptor</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">TypeName</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">System.String</span>&#8220;<span style="color: blue"> </span><span style="color: red">Name</span><span style="color: blue">=</span>&#8220;<span style="color: blue">Title</span>&#8220;<span style="color: blue"> /&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;/</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Parameter</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Parameter</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">Direction</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">Return</span>&#8220;<span style="color: blue"> </span><span style="color: red">Name</span><span style="color: blue">=</span>&#8220;<span style="color: blue">Employees</span>&#8220;<span style="color: blue">&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">TypeDescriptor</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">TypeName</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">System.Int32</span>&#8220;<span style="color: blue"> </span><span style="color: red">Name</span><span style="color: blue">=</span>&#8220;<span style="color: blue">NewEmployeeID</span>&#8220;<span style="color: blue"> /&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;/</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Parameter</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;/</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Parameters</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">MethodInstances</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">MethodInstance</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">Name</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">EmployeesInserter</span>&#8220;<span style="color: blue"> </span><span style="color: red">Type</span><span style="color: blue">=</span>&#8220;<span style="color: blue">GenericInvoker</span>&#8220;<span style="color: blue"> </span><span style="color: red">ReturnParameterName</span><span style="color: blue">=</span>&#8220;<span style="color: blue">Employees</span>&#8220;<span style="color: blue"> /&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;/</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">MethodInstances</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;/</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Method</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Method</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">Name</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">updateEmployees</span>&#8220;<span style="color: blue">&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Properties</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Property</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">Name</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">RdbCommandText</span>&#8220;<span style="color: blue"> </span><span style="color: red">Type</span><span style="color: blue">=</span>&#8220;<span style="color: blue">System.String</span>&#8220;<span style="color: blue">&gt;</span>Update Employees SET LastName=@LastName,FirstName=@FirstName,Title=@Title WHERE(EmployeeID=@EmployeeID)<span style="color: blue">&lt;/</span><span style="color: #a31515">Property</span><span style="color: blue">&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Property</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">Name</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">RdbCommandType</span>&#8220;<span style="color: blue"> </span><span style="color: red">Type</span><span style="color: blue">=</span>&#8220;<span style="color: blue">System.String</span>&#8220;<span style="color: blue">&gt;</span>Text<span style="color: blue">&lt;/</span><span style="color: #a31515">Property</span><span style="color: blue">&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;/</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Properties</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Parameters</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Parameter</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">Direction</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">In</span>&#8220;<span style="color: blue"> </span><span style="color: red">Name</span><span style="color: blue">=</span>&#8220;<span style="color: blue">@EmployeeID</span>&#8220;<span style="color: blue">&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">TypeDescriptor</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">TypeName</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">System.Int32</span>&#8220;<span style="color: blue"> </span><span style="color: red">Name</span><span style="color: blue">=</span>&#8220;<span style="color: blue">EmployeeID</span>&#8220;<span style="color: blue"> /&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;/</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Parameter</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Parameter</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">Direction</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">In</span>&#8220;<span style="color: blue"> </span><span style="color: red">Name</span><span style="color: blue">=</span>&#8220;<span style="color: blue">@LastName</span>&#8220;<span style="color: blue">&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">TypeDescriptor</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">TypeName</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">System.String</span>&#8220;<span style="color: blue"> </span><span style="color: red">Name</span><span style="color: blue">=</span>&#8220;<span style="color: blue">LastName</span>&#8220;<span style="color: blue"> /&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;/</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Parameter</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Parameter</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">Direction</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">In</span>&#8220;<span style="color: blue"> </span><span style="color: red">Name</span><span style="color: blue">=</span>&#8220;<span style="color: blue">@FirstName</span>&#8220;<span style="color: blue">&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">TypeDescriptor</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">TypeName</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">System.String</span>&#8220;<span style="color: blue"> </span><span style="color: red">Name</span><span style="color: blue">=</span>&#8220;<span style="color: blue">FirstName</span>&#8220;<span style="color: blue"> /&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;/</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Parameter</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Parameter</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">Direction</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">In</span>&#8220;<span style="color: blue"> </span><span style="color: red">Name</span><span style="color: blue">=</span>&#8220;<span style="color: blue">@Title</span>&#8220;<span style="color: blue">&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">TypeDescriptor</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">TypeName</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">System.String</span>&#8220;<span style="color: blue"> </span><span style="color: red">Name</span><span style="color: blue">=</span>&#8220;<span style="color: blue">Title</span>&#8220;<span style="color: blue"> /&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;/</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Parameter</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Parameter</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">Direction</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">Return</span>&#8220;<span style="color: blue"> </span><span style="color: red">Name</span><span style="color: blue">=</span>&#8220;<span style="color: blue">Employees</span>&#8220;<span style="color: blue">&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">TypeDescriptor</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">TypeName</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">System.Int32</span>&#8220;<span style="color: blue"> </span><span style="color: red">Name</span><span style="color: blue">=</span>&#8220;<span style="color: blue">EmployeeID</span>&#8220;<span style="color: blue"> /&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;/</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Parameter</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;/</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Parameters</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">MethodInstances</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">MethodInstance</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">Name</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">EmployeesUpdater</span>&#8220;<span style="color: blue"> </span><span style="color: red">Type</span><span style="color: blue">=</span>&#8220;<span style="color: blue">GenericInvoker</span>&#8220;<span style="color: blue"> </span><span style="color: red">ReturnParameterName</span><span style="color: blue">=</span>&#8220;<span style="color: blue">Employees</span>&#8220;<span style="color: blue"> /&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;/</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">MethodInstances</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;/</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Method</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Method</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">Name</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">deleteEmployees</span>&#8220;<span style="color: blue">&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Properties</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Property</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">Name</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">RdbCommandText</span>&#8220;<span style="color: blue"> </span><span style="color: red">Type</span><span style="color: blue">=</span>&#8220;<span style="color: blue">System.String</span>&#8220;<span style="color: blue">&gt;</span>Delete Employees WHERE(EmployeeID=@EmployeeID)<span style="color: blue">&lt;/</span><span style="color: #a31515">Property</span><span style="color: blue">&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Property</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">Name</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">RdbCommandType</span>&#8220;<span style="color: blue"> </span><span style="color: red">Type</span><span style="color: blue">=</span>&#8220;<span style="color: blue">System.String</span>&#8220;<span style="color: blue">&gt;</span>Text<span style="color: blue">&lt;/</span><span style="color: #a31515">Property</span><span style="color: blue">&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;/</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Properties</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Parameters</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Parameter</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">Direction</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">In</span>&#8220;<span style="color: blue"> </span><span style="color: red">Name</span><span style="color: blue">=</span>&#8220;<span style="color: blue">@EmployeeID</span>&#8220;<span style="color: blue">&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">TypeDescriptor</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">TypeName</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">System.Int32</span>&#8220;<span style="color: blue"> </span><span style="color: red">Name</span><span style="color: blue">=</span>&#8220;<span style="color: blue">EmployeeID</span>&#8220;<span style="color: blue"> /&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;/</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Parameter</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Parameter</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">Direction</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">Return</span>&#8220;<span style="color: blue"> </span><span style="color: red">Name</span><span style="color: blue">=</span>&#8220;<span style="color: blue">Employees</span>&#8220;<span style="color: blue">&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">TypeDescriptor</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">TypeName</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">System.Int32</span>&#8220;<span style="color: blue"> </span><span style="color: red">Name</span><span style="color: blue">=</span>&#8220;<span style="color: blue">EmployeeID</span>&#8220;<span style="color: blue"> /&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;/</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Parameter</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;/</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Parameters</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">MethodInstances</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">MethodInstance</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"> </span><span style="font-size: 10pt; color: red; font-family: 'Courier New'; mso-no-proof: yes">Name</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">=</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">&#8220;<span style="color: blue">EmployeesDeleter</span>&#8220;<span style="color: blue"> </span><span style="color: red">Type</span><span style="color: blue">=</span>&#8220;<span style="color: blue">GenericInvoker</span>&#8220;<span style="color: blue"> </span><span style="color: red">ReturnParameterName</span><span style="color: blue">=</span>&#8220;<span style="color: blue">Employees</span>&#8220;<span style="color: blue"> /&gt;<br />
</span></span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;/</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">MethodInstances</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>&lt;/</span><span style="font-size: 10pt; color: #a31515; font-family: 'Courier New'; mso-no-proof: yes">Method</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">&gt;</span></p>
<p class="MsoNormal"><span style="font-size: 8pt; color: #4c4c4c; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">I’ve created three GenericInvoker MethodInstances and they are </span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">EmployeesInserter,EmployeesUpdater</span><span style="font-size: 8pt; color: #4c4c4c; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">, and </span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes">EmployeesDeleter.</span><span style="font-size: 8pt; color: #4c4c4c; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"> When a method instance is executed, it will eventually call the appropriate SQL command as shown here:</span></p>
<ul>
<li>
<div class="MsoNormal"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">Insert into Employees(LastName,FirstName,Title) Values(@LastName,@FirstName,@Title);select NewEmployeeID = SCOPE_IDENTITY()</span></div>
</li>
<li>
<div class="MsoNormal"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">Update Employees SET LastName=@LastName,FirstName=@FirstName,Title=@Title WHERE(<a href="mailto:EmployeeID=@EmployeeID">EmployeeID=@EmployeeID</a>)</span></div>
</li>
<li>
<div class="MsoNormal"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes">Delete Employees WHERE(EmployeeID=@EmployeeID)</span></div>
</li>
</ul>
<p class="MsoNormal"><span style="font-size: 8pt; color: #4c4c4c; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">The following method ExecuteGenericInvoker is to call the GenericInvoker method:</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: blue">public</span> <span style="color: blue">static</span> <span style="color: blue">void</span> InsertEmployee()</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>{<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: blue">object</span>[] parameters = <span style="color: blue">new</span> <span style="color: blue">object</span>[3];<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>parameters[0] = <span style="color: #a31515">&#8220;He&#8221;</span>; <span style="color: green">//Last Name;<br />
</span></span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>parameters[1] = <span style="color: #a31515">&#8220;Wen&#8221;</span>; <span style="color: green">//First Name;<br />
</span></span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>parameters[2] = <span style="color: #a31515">&#8220;SharePoint Architect&#8221;</span>; <span style="color: green">//Title;</span></span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: blue">try<br />
</span></span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>{<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">BDCUtil</span>.ExecuteGenericInvoker(<span style="color: #a31515">&#8220;SSP&#8221;</span>, <span style="color: #a31515">&#8220;SynergyDataInstance&#8221;</span>, <span style="color: #a31515">&#8220;Employees&#8221;</span>, <span style="color: #a31515">&#8220;EmployeesInserter&#8221;</span>, parameters);<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>}</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: blue">catch</span> (<span style="color: #2b91af">Exception</span> exception)<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>{<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">Console</span>.WriteLine(exception.ToString());<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>}<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>}</span></p>
<p>The result is as you can see here highlighted:</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/06/clip-image002.jpg"><img style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://sharepointmagazine.net/wp-content/uploads/2009/06/clip-image002-thumb.jpg" border="0" alt="clip_image002" width="640" height="189" /></a></p>
<p>In the same token, the following code will update the employee record:</p>
<p class="MsoNormal"><span style="font-size: 8pt; color: #4c4c4c; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">In the same token, the following code will update the employee record:</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: blue">public</span> <span style="color: blue">static</span> <span style="color: blue">void</span> UpdateEmployee()<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>{<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: blue">object</span>[] parameters = <span style="color: blue">new</span> <span style="color: blue">object</span>[4];<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: green">//The parameters must match the parameters defined in ADF<br />
</span></span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>parameters[0] = <span style="color: #a31515">&#8220;10&#8243;</span>; <span style="color: green">//Employee ID;<br />
</span></span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>parameters[1] = <span style="color: #a31515">&#8220;He&#8221;</span>; <span style="color: green">//Last Name;<br />
</span></span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>parameters[2] = <span style="color: #a31515">&#8220;Wen&#8221;</span>; <span style="color: green">//First Name;<br />
</span></span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>parameters[3] = <span style="color: #a31515">&#8220;MOSS Architect&#8221;</span>; <span style="color: green">//Title;<br />
</span></span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: blue">try<br />
</span></span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>{<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">BDCUtil</span>.ExecuteGenericInvoker(<span style="color: #a31515">&#8220;SSP&#8221;</span>, <span style="color: #a31515">&#8220;SynergyDataInstance&#8221;</span>, <span style="color: #a31515">&#8220;Employees&#8221;</span>, <span style="color: #a31515">&#8220;EmployeesUpdater&#8221;</span>, parameters);<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>}</span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: blue">catch</span> (<span style="color: #2b91af">Exception</span> exception)<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>{<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span><span style="color: #2b91af">Console</span>.WriteLine(exception.ToString());<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>}<br />
</span><span style="font-size: 10pt; font-family: 'Courier New'; mso-no-proof: yes"><span style="mso-spacerun: yes"> </span>}</span></p>
<p>Result is as follows:</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/06/clip-image004.jpg"><img style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://sharepointmagazine.net/wp-content/uploads/2009/06/clip-image004-thumb.jpg" border="0" alt="clip_image004" width="640" height="191" /></a></p>
<p>Note: the order of the parameters must match that of the parameters defined in the updateEmployees method in the ADF. The ReturnParameterName (ReturnParameterName=&#8221;Employees&#8221;) is required in the EmployeeUpdater and EmployeeDeleter MethodInstance, even though they have no parameters to return.</p>
<p>As we have just learned, the <strong>GenericInvoker </strong>method is extremely useful because it takes care of authentication and authorization while enabling our custom applications to call in and execute business logic stored in the back-end to insert/update/delete LOB systems.</p>
<h5><strong>Write-back Best Practice</strong></h5>
<p>Even though BDC can update the LOB systems, it’s not suited for all scenarios. I strongly recommend you to take it into consideration governance and change management that your organization might require. Here are some additional best practices:</p>
<ol>
<li>Understand the vendor support implications for changes that you make. For example, directly querying SharePoint databases is not Microsoft supported because the risk involved in damaging it.</li>
<li>Understand data integrity rules before using GenericInvoker method to make direct changes.</li>
<li>Have error handling in place.</li>
<li>When full inserts and updates are needed, consider using the LOB vendor’s own API that provides transactional write-back capabilities from the client to the underlying LOB application. Another way this can be done is using custom actions which will be covered in detail in Part 8.</li>
</ol>
<h4><strong>Conclusion</strong></h4>
<p>BDC Object Model provides a new and exciting solution by allowing direct integration with LOB systems. In this article we have explored the BDC Object Model and exploited the capabilities of the BDC from code. BDC encapsulates the business logic of the back-end systems and developers can just work with the BDC objects to interact with those systems. We’ve demonstrated how to retrieve customer records to populate a SharePoint list that has a BDC data column, and then created a BDC utility class to act as a data layer, finally called the utility class to update the back-end system. With this you can now develop custom applications to interface with SharePoint using the BDC Object Model.  And for organizations that have invested in BDC, you are on your way to leveraging the real power of BDC!</p>
]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-7-of-8/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Go Green with SharePoint</title>
		<link>http://sharepointmagazine.net/news/go-green-with-sharepoint</link>
		<comments>http://sharepointmagazine.net/news/go-green-with-sharepoint#comments</comments>
		<pubDate>Tue, 16 Jun 2009 08:12:17 +0000</pubDate>
		<dc:creator>Anand</dc:creator>
				<category><![CDATA[Analysis]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[carbon]]></category>
		<category><![CDATA[green]]></category>
		<category><![CDATA[sharepoint]]></category>
		<category><![CDATA[Workflow]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=3520</guid>
		<description><![CDATA[Organizations are constantly looking for ways to cut costs, but don’t realize that those cost cutting measures may also have positive environmental effects that can increase goodwill and shareholder value.]]></description>
			<content:encoded><![CDATA[<p><strong>Go Green with Office SharePoint Server</strong></p>
<p>1. Introduction<br />
2. Benefits of going green with SharePoint<br />
3. Knowledge Management – Going green<br />
4. Go Green – Green Benefits of Content Management<br />
<strong></strong></p>
<p><span style="text-decoration: underline;"><strong>Introduction</strong></span><br />
Organizations are constantly looking for ways to cut costs, but don’t realize that those cost cutting measures may also have positive environmental effects that can increase goodwill and shareholder value.</p>
<p>Microsoft SharePoint solutions provide tremendous return on investment, but also make your organization more environmentally conscious or “green” by cutting the consumption of paper. Many organizations around the world are utilizing IT solutions to realize their green initiatives. One such technology is Microsoft Office SharePoint 2007</p>
<p>For example: There are government-sponsored green initiatives currently underway. In 2003, the United Nations Economic Commission for Europe enacted a strategy to form a “Roadmap for Paperless Trade”.<br />
(http://www.unece.org/cefact/publica/ece_trd_371e.pdf)</p>
<p>The commission discovered that by moving from paper document processes to electronic technologies, they increased security and transparency in supply chains (Trading industry) and provided both the business sector with higher revenues and costs savings.</p>
<p><span style="text-decoration: underline;"><strong>Benefits of going green with SharePoint</strong></span><br />
Information and Communications Technologies are transforming our world on a daily basis. SharePoint enables organizations to control the creation, routing, approval, and publishing of documents. Many organizations use documents in paper format such as invoices, patient records, insurance forms, and corporate policies. These documents are typically copied and dispersed to wherever they are needed—often too many disparate locations. By converting these paper based documents and processes to electronic procedures, a single copy can be accessed electronically from any location without it being printed, shipped and then later archived or discarded.</p>
<p>Here is how you can calculate how much of environmental impact you have contributed and thereby saving how many trees?<br />
By using SharePoint Content management solution, the savings realized by the company can be translated into positive effects on the environment.</p>
<p><strong>How do you calculate?</strong><br />
1 tree makes 16.67 reams of copy paper or 8,333.3 sheets<br />
1 ream (500 sheets) uses 6% of a tree</p>
<p>http://www.conservatree.com/learn/EnviroIssues/TreeStats.shtml</p>
<p>For the a Company which uses 2,000,000 pages, the number of trees saved are calculated as below:<br />
<strong><em>Calculating Paper Saving’s</em></strong><br />
Total Pages 2,000,000<br />
Reams of Paper (500 sheets/ream) 4,000<br />
Number of Trees Saved (17 reams/tree) 235</p>
<p><strong>Other benefits Using SharePoint</strong></p>
<p><span style="text-decoration: underline;">Real Estate</span><br />
Not storing paper has two benefits regarding real estate – paper storage space and office space. This is space that would require energy consumption for heating, lighting, and humidity control. Beyond that there is also the impact on the environment of using the physical space as a warehouse as opposed to, say, a reserve forest or wetland.</p>
<p>Another example of the real estate impact of storing physical documents is the fact that a paper document is only available at a single location. By storing documents electronically, they can be access in multiple locations, even simultaneously.</p>
<p><span style="text-decoration: underline;">Lifestyle Benefits</span><br />
Putting documents online reduces the number of employees who are commuting to an office. This has tremendous impact on the environment, but also on employee lifestyle. Some organizations are beginning to assign lifestyle scores to projects. While analyzing return on investment and other facets of a project, organizations can assess the impact on employee lifestyle. Raising lifestyle benefits makes a company a more attractive employer and helps organizations with recruiting.</p>
<p><span style="text-decoration: underline;">Technology Benefits</span><br />
Organizations which use SharePoint solutions are also well-positioned to meet their business challenges as they now have a scalable and manageable technology platform which is hot-pluggable and that it can be integrated with other standards-based applications and tools. Since .Net Framework is compatible with SharePoint, SharePoint also gives you an opportunity to customize application which will help the user community to accept the cultural change.</p>
<p><span style="text-decoration: underline;"><strong>Knowledge Management – Going green</strong></span><br />
&#8220;Going green&#8221; has become a topic of increased attention, but it’s nothing new to knowledge management. By its nature, knowledge management promotes efficiency and optimal use of resources, which often reduces the amount of energy required to achieve a given goal.</p>
<p>Knowledge Management (KM) awareness is creating new interest in KM solutions that can improve business performance while reducing environmental effects. Knowledge management using SharePoint plays an important role improving their energy management to optimize the use of office equipment and energy in buildings. SharePoint knowledge management solutions, including records management (RM) and enterprise content management (ECM), reduce the use of paper. In addition, online collaboration and online meeting solutions can greatly cut down on the need for travel to meetings.</p>
<p>In the past, larger companies were well positioned to make use of knowledge management solutions that transformed paper-based information into digital information because they could justify and afford the investment. Now, the small and medium-sized business (SMB) market has more choices, with the lower entry costs for software as a service (SaaS) products. SharePoint provides an option for SharePoint online hosting KM solutions.</p>
<p><span style="text-decoration: underline;"><strong>Go Green – Green Benefits of Content Management</strong></span><br />
SharePoint offers so many opportunities to go Green, Top six ways to go Green with SharePoint:<br />
1. Save money on paper – and reduce your environmental footprint at the same time.</p>
<p>2. Increase the effectiveness of core processes.<br />
Think about the benefits of SharePoint technologies in just a single core process – finance. Driving paper from financial processes allows an accounts payable group to pay invoices faster, taking advantage of discounts for early payment. It allows an accounts receivable group to improve cash flows and reduce the number of days that sales are outstanding. The cost of processing an invoice can typically be cut by a factor of 10, creating savings that drop directly to the bottom line. These kinds of savings can usually be replicated in other paper intensive processes, yielding BOTH bottom line AND Green benefits.</p>
<p>3. Truly integrate your field operations.<br />
The application of distributed capture technologies – using a scanner in a field office to process locally created paper and electronically store it in a central location within SharePoint. These scanned documents can be accessed from any location over the internet for immediate review. Distributed capture solutions often pay for themselves just through savings in courier and shipping costs. But taking courier and overnight services off the road also translates into significant direct environmental benefits.</p>
<p>4. By using SharePoint we can reduce real estate costs. Less paper means fewer filing cabinets means less real estate – which reduces cost, but also significantly reduces your environmental footprint.</p>
<p>5. SharePoint helps in improving employee productivity.<br />
As a content management tool, SharePoint proves to be the best in the industry for the following:</p>
<p><img class="alignnone" title="SharePoint Tick" src="http://sharepointmagazine.net/images/icons/tick.png" alt="SharePoint Tick" width="16" height="16" /> Collaboration<br />
<img class="alignnone" title="SharePoint Tick" src="http://sharepointmagazine.net/images/icons/tick.png" alt="SharePoint Tick" width="16" height="16" /> Portal<br />
<img class="alignnone" title="SharePoint Tick" src="http://sharepointmagazine.net/images/icons/tick.png" alt="SharePoint Tick" width="16" height="16" /> Enterprise Search<br />
<img class="alignnone" title="SharePoint Tick" src="http://sharepointmagazine.net/images/icons/tick.png" alt="SharePoint Tick" width="16" height="16" /> Enterprise Content Management<br />
<img class="alignnone" title="SharePoint Tick" src="http://sharepointmagazine.net/images/icons/tick.png" alt="SharePoint Tick" width="16" height="16" /> Forms Driven Business Process<br />
<img class="alignnone" title="SharePoint Tick" src="http://sharepointmagazine.net/images/icons/tick.png" alt="SharePoint Tick" width="16" height="16" /> Business Intelligence</p>
<p>6. Reduce off-site storage costs. Off-site storage of paper is expensive, often requiring rental and maintenance fees as well as significant transportation costs to the facility. SharePoint provides a SaaS option for hosting the portlet.</p>
]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/news/go-green-with-sharepoint/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>SharePoint Farm configuring and deployment. Part 4 &#8211; Backup and Recovery Strategy</title>
		<link>http://sharepointmagazine.net/technical/administration/best-practices-of-sharepoint-farm-configuring-and-deployment-part-4-backup-and-recovery-strategy</link>
		<comments>http://sharepointmagazine.net/technical/administration/best-practices-of-sharepoint-farm-configuring-and-deployment-part-4-backup-and-recovery-strategy#comments</comments>
		<pubDate>Fri, 12 Jun 2009 14:16:40 +0000</pubDate>
		<dc:creator>Michael Nemtsev</dc:creator>
				<category><![CDATA[Administration]]></category>
		<category><![CDATA[Customisation]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[availability]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[data protection manager]]></category>
		<category><![CDATA[Data Recovery]]></category>
		<category><![CDATA[mirroring]]></category>
		<category><![CDATA[redundancy]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=3193</guid>
		<description><![CDATA[This series of articles provide an overview of how to plan, build and configure the common SharePoint farm across your organization.]]></description>
			<content:encoded><![CDATA[<ul>
<li>Part 1 &#8211; <a href="http://sharepointmagazine.net/technical/administration/best-practices-of-sharepoint-farm-configuring-and-deployment-part-1-architectural-and-logical-planning">Architecture and Logical Planning</a></li>
<li>Part 2 &#8211; <a href="http://sharepointmagazine.net/technical/administration/best-practices-of-sharepoint-farm-configuring-and-deployment-part-2-installation-configuration">Installation</a></li>
<li>Part 3 &#8211; <a href="http://sharepointmagazine.net/technical/administration/best-practices-of-sharepoint-farm-configuring-and-deployment-part-3-development-environment">Development Environment</a></li>
<li><strong>Part 4 &#8211; Backup and Recovery Strategy</strong></li>
<li>Part 5 &#8211; Virtualization</li>
<li>Part 6 &#8211; Post Deployment (final)</li>
</ul>
<hr />
<h2>Backup and Recovery Strategy</h2>
<p><strong>Use separate server for Disaster Recovery (DR)</strong></p>
<p style="padding-left: 30px; ">Use additional server with installed SharePoint for DR. Do not connect this server to the existing SharePoint farm &#8211; it should be isolated environment with single SharePoint installation, or &#8220;3 servers farm&#8221;. Disaster Recovery servers must locate outside corporate networks, and ideally, outside corporation premises. Usually, it locates in different data centre. The reason for this to provide data availability in case of the network or data centre outage.</p>
<p><strong>Configure mirroring</strong></p>
<p style="padding-left: 30px; ">Configure SQL mirroring of content databases to provide data reliability. It should be done in the early stages, when content databases are very small, not for the hundreds gigs of content. The reason is that network bandwidth to DR is usually limited due to distant location of the servers, and setting mirroring for large databases became slow process.<br />
Refer to the following document for more details about configuring SQL mirroring <a href="http://go.microsoft.com/fwlink/?LinkId=83725&amp;clcid=0x409" target="_blank">http://go.microsoft.com/fwlink/?LinkId=83725&amp;clcid=0&#215;409</a></p>
<p><strong>Recovery data immediately</strong></p>
<p style="padding-left: 30px; ">Highly available farms imply reliable strategy of data recovery. SQL Mirroring is only part of this strategy. Data restore in reasonable time is one of the factor of DR strategy</p>
<p style="padding-left: 30px; ">Consider several scenarios for backup/recovery:</p>
<p style="padding-left: 30px; ">1. <strong><em>OOTB backup/restore</em></strong>. SharePoint does not provide reliable mechanism of automatic backups. Backup/Restore feature available via Central Administration or via STSADM command. The only way to schedule this task is to use STSADM and windows scheduler to configure backups/restore.<br />
Disadvantages:</p>
<ul>
<li>not reliable approach due to dependency of singe instance of scheduler;</li>
<li>scheduler location on the single server, no multiple instances;</li>
<li>no granularity of restored items;</li>
</ul>
<p style="padding-left: 30px; ">2)	<strong><em>SQL snapshots of content database</em></strong> (<a href="http://tinyurl.com/d2auns" target="_blank">http://tinyurl.com/d2auns</a>)<br />
Disadvantage - lack of granularity in backup/restore</p>
<p style="padding-left: 30px; ">3)	<strong><em>Data Protection Manager (DPM)</em></strong> &#8211; is one of the recommended solutions for data recovery strategy in large SharePoint farms.</p>
<p style="padding-left: 60px;">a.	DPM provides reliable and flexible functionality to backup, search and restore items.<br />
b.	Supports backup/restore of different servers in network &#8211; SQL Server, Exchange, file shares backups, and etc.<br />
c.	Adapts to the changes in Farm dynamically &#8211; add, delete or relocate servers.<br />
d.	Monitors and records all changes in SharePoint content DB by integrating into SharePoint VSS Writer.<br />
e.	Provides search functionality for any deleted items across content DB and restore data from content db.<br />
f.	Granularity in restoration of documents, sites, and applications.</p>
<p style="padding-left: 30px;">One disadvantage of DPM is that it requires additional, clean, SharePoint instance to be used as temporary location of restored items to merge them with production content DB.</p>
<p style="padding-left: 30px; ">Some recommendation of DPM usage:</p>
<p style="padding-left: 60px;">-	Do not use existed SharePoint farm servers disconnected from the SharePoint farm &#8211; this approach has many bugs, and restoration fails in most cases.<br />
- Iinstall SP1 for DPM &#8211; it provides significant performance increase for indexes and catalogue (<a href="http://technet.microsoft.com/en-us/library/dd347836.aspx" target="_blank">http://technet.microsoft.com/en-us/library/dd347836.aspx</a>)</p>
<p style="padding-left: 30px;">4)	<strong><em>Third party tools &#8211; </em><em><span style="font-weight: normal;"><a href="http://www.quest.com/recovery-manager-for-sharepoint/" target="_blank">Quest Recovery Manager</a>, <a href="http://au.avepoint.com/sharepoint-backup-and-recovery-docave/" target="_blank">DocAve</a> and <a href="http://au.avepoint.com/sharepoint-backup-and-recovery-docave/" target="_blank">Idera Backup</a></span></em></strong>. They provide the similar functionality of the DPM, but in some cases address SharePoint behaviour only, and might not provide enterprise level of backup strategy.</p>
<p style="padding-left: 30px; ">Quest Recovery Manager is the preferable tool for data restoration &#8211; lightweight application that does not require additional servers to restore deleted items.</p>
<p style="padding-left: 30px; "><img class="alignnone size-full wp-image-3367" src="http://sharepointmagazine.net/wp-content/uploads/2009/06/questmanager1.jpg" alt="questmanager1" width="410" height="301" /></p>
<p style="padding-left: 30px; ">
<hr />In the next part we will describe virtualization and how to design SharePoint properly for virtualized environment.</p>
]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/technical/administration/best-practices-of-sharepoint-farm-configuring-and-deployment-part-4-backup-and-recovery-strategy/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
