<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>SharePoint Magazine</title>
	
	<link>http://sharepointmagazine.net</link>
	<description>SharePoint Magazine is an online Magazine dedicated to the world of SharePoint</description>
	<pubDate>Thu, 25 Jun 2009 10:28:23 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/SharepointMagazine" type="application/rss+xml" /><feedburner:emailServiceId>SharepointMagazine</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>SharePoint Farm configuring and deployment Part 6 - Post Deployment</title>
		<link>http://feedproxy.google.com/~r/SharepointMagazine/~3/unT5beqMd_I/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.<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/administration/sharepoint-farm-configuring-and-deployment-part-6-post-deployment">SharePoint Farm configuring and deployment Part 6 - Post Deployment</a></p>
]]></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 - 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 - 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 - 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 - Backup and Recovery Strategy</a></li>
<li><a href="http://sharepointmagazine.net/technical/administration/sharepoint-farm-configuring-and-deployment-part-5-virtualization">Part 5 - Virtualization</a></li>
<li><strong>Part 6 - 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 - 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 - 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 - 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 - 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 - 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>
<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/administration/sharepoint-farm-configuring-and-deployment-part-6-post-deployment">SharePoint Farm configuring and deployment Part 6 - Post Deployment</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/VT8MPLWfnoHxLGeKYly0F1CrWLo/0/da"><img src="http://feedads.g.doubleclick.net/~a/VT8MPLWfnoHxLGeKYly0F1CrWLo/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/VT8MPLWfnoHxLGeKYly0F1CrWLo/1/da"><img src="http://feedads.g.doubleclick.net/~a/VT8MPLWfnoHxLGeKYly0F1CrWLo/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SharepointMagazine?a=unT5beqMd_I:-CdFt1X6SuQ:kmCBgzMKvIA"><img src="http://feeds.feedburner.com/~ff/SharepointMagazine?i=unT5beqMd_I:-CdFt1X6SuQ:kmCBgzMKvIA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SharepointMagazine/~4/unT5beqMd_I" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/technical/administration/sharepoint-farm-configuring-and-deployment-part-6-post-deployment/feed</wfw:commentRss>
		<feedburner:origLink>http://sharepointmagazine.net/technical/administration/sharepoint-farm-configuring-and-deployment-part-6-post-deployment</feedburner:origLink></item>
		<item>
		<title>SharePoint Farm configuring and deployment. Part 5 - Virtualization</title>
		<link>http://feedproxy.google.com/~r/SharepointMagazine/~3/ZbrJhhih5oI/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.<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/administration/sharepoint-farm-configuring-and-deployment-part-5-virtualization">SharePoint Farm configuring and deployment. Part 5 - Virtualization</a></p>
]]></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 - 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 - 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 - 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 - Backup and Recovery Strategy</a></li>
<li><strong>Part 5 - Virtualization</strong></li>
<li>Part 6 - 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 - 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 - 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 - &#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% - caution, &gt; 90% significant performance degradation<br />
2)	Memory performance - <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 - <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>
<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/administration/sharepoint-farm-configuring-and-deployment-part-5-virtualization">SharePoint Farm configuring and deployment. Part 5 - Virtualization</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/oXUCRABlg3PrSwrV1e72Z3NhciY/0/da"><img src="http://feedads.g.doubleclick.net/~a/oXUCRABlg3PrSwrV1e72Z3NhciY/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/oXUCRABlg3PrSwrV1e72Z3NhciY/1/da"><img src="http://feedads.g.doubleclick.net/~a/oXUCRABlg3PrSwrV1e72Z3NhciY/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SharepointMagazine?a=ZbrJhhih5oI:Q1hWqT2qsf8:kmCBgzMKvIA"><img src="http://feeds.feedburner.com/~ff/SharepointMagazine?i=ZbrJhhih5oI:Q1hWqT2qsf8:kmCBgzMKvIA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SharepointMagazine/~4/ZbrJhhih5oI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/technical/administration/sharepoint-farm-configuring-and-deployment-part-5-virtualization/feed</wfw:commentRss>
		<feedburner:origLink>http://sharepointmagazine.net/technical/administration/sharepoint-farm-configuring-and-deployment-part-5-virtualization</feedburner:origLink></item>
		<item>
		<title>Everything You Need to Know about BDC: Part 7 of 8</title>
		<link>http://feedproxy.google.com/~r/SharepointMagazine/~3/aHmX93cbYQI/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.<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-7-of-8">Everything You Need to Know about BDC: Part 7 of 8</a></p>
]]></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(&#8221;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(&#8221;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 - 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>
<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-7-of-8">Everything You Need to Know about BDC: Part 7 of 8</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/enc3K2VwcGRasenQ1x9cBZxreT4/0/da"><img src="http://feedads.g.doubleclick.net/~a/enc3K2VwcGRasenQ1x9cBZxreT4/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/enc3K2VwcGRasenQ1x9cBZxreT4/1/da"><img src="http://feedads.g.doubleclick.net/~a/enc3K2VwcGRasenQ1x9cBZxreT4/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SharepointMagazine?a=aHmX93cbYQI:bP_ZLZ-2pEo:kmCBgzMKvIA"><img src="http://feeds.feedburner.com/~ff/SharepointMagazine?i=aHmX93cbYQI:bP_ZLZ-2pEo:kmCBgzMKvIA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SharepointMagazine/~4/aHmX93cbYQI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-7-of-8/feed</wfw:commentRss>
		<feedburner:origLink>http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-7-of-8</feedburner:origLink></item>
		<item>
		<title>Go Green with SharePoint</title>
		<link>http://feedproxy.google.com/~r/SharepointMagazine/~3/4O7NHvJUqa4/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.<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/news/go-green-with-sharepoint">Go Green with SharePoint</a></p>
]]></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<br />
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>
<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/news/go-green-with-sharepoint">Go Green with SharePoint</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/3HS7D31gqtK493cH2Z8ver4h3gg/0/da"><img src="http://feedads.g.doubleclick.net/~a/3HS7D31gqtK493cH2Z8ver4h3gg/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/3HS7D31gqtK493cH2Z8ver4h3gg/1/da"><img src="http://feedads.g.doubleclick.net/~a/3HS7D31gqtK493cH2Z8ver4h3gg/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SharepointMagazine?a=4O7NHvJUqa4:2g0azDvbNT4:kmCBgzMKvIA"><img src="http://feeds.feedburner.com/~ff/SharepointMagazine?i=4O7NHvJUqa4:2g0azDvbNT4:kmCBgzMKvIA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SharepointMagazine/~4/4O7NHvJUqa4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/news/go-green-with-sharepoint/feed</wfw:commentRss>
		<feedburner:origLink>http://sharepointmagazine.net/news/go-green-with-sharepoint</feedburner:origLink></item>
		<item>
		<title>SharePoint Farm configuring and deployment. Part 4 - Backup and Recovery Strategy</title>
		<link>http://feedproxy.google.com/~r/SharepointMagazine/~3/vOFZtEZpgGQ/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.<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/administration/best-practices-of-sharepoint-farm-configuring-and-deployment-part-4-backup-and-recovery-strategy">SharePoint Farm configuring and deployment. Part 4 - Backup and Recovery Strategy</a></p>
]]></description>
			<content:encoded><![CDATA[<ul>
<li>Part 1 - <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 - <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 - <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 - Backup and Recovery Strategy</strong></li>
<li>Part 5 - Virtualization</li>
<li>Part 6 - 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 - 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> - 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 - SQL Server, Exchange, file shares backups, and etc.<br />
c.	Adapts to the changes in Farm dynamically - 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 - this approach has many bugs, and restoration fails in most cases.<br />
- Iinstall SP1 for DPM - 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 - </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 - 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>
<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/administration/best-practices-of-sharepoint-farm-configuring-and-deployment-part-4-backup-and-recovery-strategy">SharePoint Farm configuring and deployment. Part 4 - Backup and Recovery Strategy</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/hgU_xXSpVF332ZRI8GPJGmCe2Ow/0/da"><img src="http://feedads.g.doubleclick.net/~a/hgU_xXSpVF332ZRI8GPJGmCe2Ow/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/hgU_xXSpVF332ZRI8GPJGmCe2Ow/1/da"><img src="http://feedads.g.doubleclick.net/~a/hgU_xXSpVF332ZRI8GPJGmCe2Ow/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SharepointMagazine?a=vOFZtEZpgGQ:TPEA35AZQOo:kmCBgzMKvIA"><img src="http://feeds.feedburner.com/~ff/SharepointMagazine?i=vOFZtEZpgGQ:TPEA35AZQOo:kmCBgzMKvIA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SharepointMagazine/~4/vOFZtEZpgGQ" height="1" width="1"/>]]></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>
		<feedburner:origLink>http://sharepointmagazine.net/technical/administration/best-practices-of-sharepoint-farm-configuring-and-deployment-part-4-backup-and-recovery-strategy</feedburner:origLink></item>
		<item>
		<title>SharePoint Farm configuring and deployment Part 3 - Development Environment</title>
		<link>http://feedproxy.google.com/~r/SharepointMagazine/~3/d5dyyYJ88v8/best-practices-of-sharepoint-farm-configuring-and-deployment-part-3-development-environment</link>
		<comments>http://sharepointmagazine.net/technical/administration/best-practices-of-sharepoint-farm-configuring-and-deployment-part-3-development-environment#comments</comments>
		<pubDate>Wed, 10 Jun 2009 09:23:04 +0000</pubDate>
		<dc:creator>Michael Nemtsev</dc:creator>
		
		<category><![CDATA[Administration]]></category>

		<category><![CDATA[Customisation]]></category>

		<category><![CDATA[Technical]]></category>

		<category><![CDATA[best]]></category>

		<category><![CDATA[build]]></category>

		<category><![CDATA[configure]]></category>

		<category><![CDATA[design]]></category>

		<category><![CDATA[farm]]></category>

		<category><![CDATA[practice]]></category>

		<category><![CDATA[sharepoint]]></category>

		<category><![CDATA[Topology]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=3183</guid>
		<description><![CDATA[This series of articles provide an overview of how to plan, build and configure the common SharePoint farm across your organization.<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/administration/best-practices-of-sharepoint-farm-configuring-and-deployment-part-3-development-environment">SharePoint Farm configuring and deployment Part 3 - Development Environment</a></p>
]]></description>
			<content:encoded><![CDATA[<ul>
<li>Part 1 - <a href="http://sharepointmagazine.net/technical/administration/best-practices-of-sharepoint-farm-configuring-and-deployment-part-1-architectural-and-logical-planning" target="_blank">Architecture and Logical Planning</a></li>
<li>Part 2 - <a href="http://sharepointmagazine.net/technical/administration/best-practices-of-sharepoint-farm-configuring-and-deployment-part-2-installation-configuration" target="_blank">Installation</a></li>
<li><strong>Part 3 - Development Environment</strong></li>
<li>Part 4 - Backup and Recovery Strategy</li>
<li>Part 5 - Virtualization</li>
<li>Part 6 - Post Deployment (final)</li>
</ul>
<hr />
<h2>Development Environment</h2>
<p>SharePoint development environment configuration depends on the processes, type of engagements and type of work. The most popular solution that addresses the development scenarios is using local SharePoint farm, separated from the production servers, with the single installations of the SharePoint server on the development boxes. This provides isolation for builds, tests, and debugging across different teams, projects and production environments. The local environment is mostly isolated by development box and is installed on the host server or on virtual server. The following procedure is an overview of the steps that are required to create a typical SharePoint development environment.</p>
<p><strong>Development Box installation</strong></p>
<ul>
<li>Use Windows Server, Visual Studio, and SQL Server. Windows Server 2008, VS 2008 and .NET 3.5, SQL 2008, with TFS 2008 is officially supported environment for SharePoint development. Advantage of Windows 2008 is that it is fast in virtualized environments.</li>
<li>Install SharePoint on development boxes and prefer not to connect to existed farm instances used on other stages. Development environment should stay apart, to develop and tests in isolated environment.</li>
</ul>
<p><strong>Chose development tools</strong></p>
<p style="padding-left: 30px;">There are varieties of tools that can make development fast and easy - from commercial to open source and Microsoft products.</p>
<p style="padding-left: 30px;">Microsoft recommends to use &#8220;<a href="http://www.microsoft.com/downloads/details.aspx?familyid=7BF65B28-06E2-4E87-9BAD-086E32185E68&amp;displaylang=en" target="_blank">Visual Studio extensions for Windows SharePoint Services</a>&#8221; (VSeWSS), which simplify code-up solutions for SharePoint (e.g. Web Parts, List Definitions, Site Definitions, etc) via UI and allows reverse-engineering existed site to extract definitions for SharePoint entities.</p>
<p style="padding-left: 30px;">The disadvantages of VSeWSS are:</p>
<p style="padding-left: 60px;">1)	not intuitive for beginners;<br />
2)	doesn&#8217;t provide usability to change all properties of the features, and other SharePoint items easily<br />
3)	Cannot use VSeWSS projects without VSeWSS extension.</p>
<p style="padding-left: 30px;">Others 3-rd party tools, which simplify development, are:</p>
<p style="padding-left: 30px; ">1. Management Tools</p>
<p style="padding-left: 60px; ">•	SharePoint Spy (<a href="http://www.echotechnology.com" target="_blank">http://www.echotechnology.com</a>)<br />
•	SharePoint Manager (<a href="http://www.codeplex.com/spm" target="_blank">http://www.codeplex.com/spm</a>)<br />
•	SharePoint Analyser (<a href="http://community.bamboosolutions.com" target="_blank">http://community.bamboosolutions.com</a>)</p>
<p style="padding-left: 60px; ">These tools help to manage services of SharePoint farm and get detailed information about configuration settings.</p>
<p style="padding-left: 60px; ">For example, screenshots of SharePoint Analyzer (left) and SharePointSpy (right)</p>
<p style="padding-left: 60px; "><img class="alignnone size-full wp-image-3313" src="http://sharepointmagazine.net/wp-content/uploads/2009/06/sharepointmanagementtools.jpg" alt="sharepointmanagementtools" width="669" height="279" /></p>
<p style="padding-left: 60px; ">
<p style="padding-left: 30px; ">2.	Visual Studio Tools</p>
<p style="padding-left: 60px; ">•	STSDev to create project files (<a href="http://www.codeplex.com/stsdev" target="_blank">http://www.codeplex.com/stsdev</a>)<br />
•	SPSource to get site sources (<a href="http://www.codeplex.com/spsource" target="_blank">http://www.codeplex.com/spsource</a>)</p>
<p style="padding-left: 60px; ">These tools create Visual Studio projects with the SharePoint 12-hive structure, and provide build settings to build/deploy/retract WSP packages directly from IDE. STSDev is the best tools to create a variety of projects - from simple features and Web Parts to Custom Workflow projects:</p>
<p style="padding-left: 60px; "><img class="alignnone size-full wp-image-3361" src="http://sharepointmagazine.net/wp-content/uploads/2009/06/stsdevscreenshot.jpg" alt="stsdevscreenshot" width="358" height="220" /></p>
<p style="padding-left: 60px; ">
<p style="padding-left: 30px; ">3.	Development Tools</p>
<ul>
<li> TypeMock Isolator - Writing test for the SharePoint is a hard task for the developers, due to number of internal, sealed and private classes that are used across all SharePoint objects. &#8221;TypeMock Isolator&#8221; is the only unit-testing and mocking framework for SharePoint, which provide ability to fake recursively, and simulate collection easily.</li>
<li>SPDisposeCheck - tool to check assemblies that use the SharePoint API to build the better code. It provides assistance in correctly disposing of certain SharePoint objects to help following the best practice.</li>
</ul>
<p style="padding-left: 30px; ">4.	Other Tools</p>
<p style="padding-left: 60px;">•	U2U CAML Builder - editor for CAML queries (<a href="http://www.u2u.net" target="_blank">http://www.u2u.net</a>)<br />
•	SharePoint Feature - set of different development and debugging plugins (<a href="http://www.codeplex.com/features" target="_blank">http://www.codeplex.com/features</a>)</p>
<p style="padding-left: 60px;">Such tools give your additional flexibility in everyday development stuff, providing different editors, log viewers and analysers to make SharePoint development easier and faster.</p>
<p><strong>Setup Deployment environment</strong></p>
<p style="padding-left: 30px; ">Configure Continuous Integration (CI) system to build SharePoint solution, compile output to WSP packages, prepare deployment scripts and deploy WSP to Test Environment.  Team Foundation Server (TFS) is one of the recommended tool for this task. There are several articles describing how to adopt SharePoint solution for CI, setup builds and configure TFS Deployer to deploy SharePoint packages across different environments:<br />
<a href="http://www.azsharepointpros.com/ShareAndEnjoy/Lists/Posts/Post.aspx?ID=10" target="_blank">http://www.azsharepointpros.com/ShareAndEnjoy/Lists/Posts/Post.aspx?ID=10</a></p>
<p style="padding-left: 30px; ">As to SharePoint Visual Studio Templates, CodePlex has a &#8220;<a href="http://www.codeplex.com/sptemplateland/" target="_blank">SPTemplateLand</a>&#8221; project that provides &#8220;12-hive&#8221; structure for SharePoint projects and deployments.<br />
This solution was slightly modified by Microsoft SharePoint Consulting Services guys to have single deployment package for multiple projects and support packaging additional SharePoint Artefacts (site definitions, root files). This project is published there <a href="http://blogs.msdn.com/gderun/archive/2008/01/11/sharepoint-visual-studio-project-and-deployment-templates.aspx" target="_blank">http://blogs.msdn.com/gderun/archive/2008/01/11/sharepoint-visual-studio-project-and-deployment-templates.aspx</a></p>
<p><strong>Configure testing environment</strong></p>
<p style="padding-left: 30px; ">The following diagram depicts the most common development environment, which is recommended by &#8220;SharePoint Guidance patterns &amp; practices&#8221; team.</p>
<p style="padding-left: 30px; "><img class="alignnone size-full wp-image-3365" src="http://sharepointmagazine.net/wp-content/uploads/2009/06/testingenv.jpg" alt="testingenv" width="550" height="219" /></p>
<ol>
<li>Stand-alone SharePoint environment for development, unit testing and debugging of SharePoint project. Runs continuous integration and builds verification tests before deploying the SharePoint solutions to the test environment.</li>
<li>Source Control/Build Server to build SharePoint packages (WSP) and to deploy solution to test environment.</li>
<li>The test environment performs user acceptance testing, manual functional testing, automated functional testing, system testing, security testing, and performance testing. After the solution meets production requirements, the SharePoint solutions are deployed to the staging environment.</li>
<li>The Staging server uses to test the &#8220;production-ready&#8221; solution in an environment that closely resembles the production environment. The purpose of this environment is to identify any potential deployment issues. Although the Staging environment is optional for smaller applications where deployment failures are not critical</li>
</ol>
<p style="padding-left: 30px; ">The staging environment represents the target production environment as closely as possible from the perspective of topology (for example, the server farm and database structure) and components (for example, the inclusion of the Microsoft Active Directory service and load balancing, where applicable).</p>
<p style="padding-left: 30px; ">
<hr />In the next part we will describe the backup strategy to provide disaster recovery for SharePoint Farm</p>
<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/administration/best-practices-of-sharepoint-farm-configuring-and-deployment-part-3-development-environment">SharePoint Farm configuring and deployment Part 3 - Development Environment</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/Xa3yfgEqZWPzO03tGjhjS5hwY2U/0/da"><img src="http://feedads.g.doubleclick.net/~a/Xa3yfgEqZWPzO03tGjhjS5hwY2U/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/Xa3yfgEqZWPzO03tGjhjS5hwY2U/1/da"><img src="http://feedads.g.doubleclick.net/~a/Xa3yfgEqZWPzO03tGjhjS5hwY2U/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SharepointMagazine?a=d5dyyYJ88v8:NB--Cm-16vI:kmCBgzMKvIA"><img src="http://feeds.feedburner.com/~ff/SharepointMagazine?i=d5dyyYJ88v8:NB--Cm-16vI:kmCBgzMKvIA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SharepointMagazine/~4/d5dyyYJ88v8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/technical/administration/best-practices-of-sharepoint-farm-configuring-and-deployment-part-3-development-environment/feed</wfw:commentRss>
		<feedburner:origLink>http://sharepointmagazine.net/technical/administration/best-practices-of-sharepoint-farm-configuring-and-deployment-part-3-development-environment</feedburner:origLink></item>
		<item>
		<title>SharePoint Farm configuring and deployment Part 2 - Installation &amp; Configuration</title>
		<link>http://feedproxy.google.com/~r/SharepointMagazine/~3/sNu9yGwplvE/sharepoint-farm-configuring-and-deployment-part-2-installation-configuration</link>
		<comments>http://sharepointmagazine.net/technical/administration/sharepoint-farm-configuring-and-deployment-part-2-installation-configuration#comments</comments>
		<pubDate>Sun, 07 Jun 2009 00:00:02 +0000</pubDate>
		<dc:creator>Michael Nemtsev</dc:creator>
		
		<category><![CDATA[Administration]]></category>

		<category><![CDATA[Technical]]></category>

		<category><![CDATA[best]]></category>

		<category><![CDATA[Configuration]]></category>

		<category><![CDATA[deployment]]></category>

		<category><![CDATA[farm]]></category>

		<category><![CDATA[Installation]]></category>

		<category><![CDATA[practice]]></category>

		<category><![CDATA[sharepoint]]></category>

		<category><![CDATA[SharePoint Farm]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=3001</guid>
		<description><![CDATA[This series of articles provide an overview of how to plan, build and configure the common SharePoint farm across your organization.<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/administration/sharepoint-farm-configuring-and-deployment-part-2-installation-configuration">SharePoint Farm configuring and deployment Part 2 - Installation &#038; Configuration</a></p>
]]></description>
			<content:encoded><![CDATA[<ul>
<li>Part 1 - <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><strong>Part 2 - Installation</strong></li>
<li>Part 3 - Development Environment</li>
<li>Part 4 - Backup and Recovery Strategy</li>
<li>Part 5 - Virtualization</li>
<li>Part 6 - Post Deployment (final)</li>
</ul>
<hr />
<h2>Installation</h2>
<p>The recommended Windows environment that offers the best performance for SharePoint is to have 64-bit servers. Such an environment provides significantly larger address space than 32-bit one; more room for SharePoint assemblies, CLR/Native APIs, Network Stack, IIS/ASP.NET and other components hosted in their respective tiers.</p>
<p><strong>Windows Server 2008 and SQL Server </strong></p>
<p style="padding-left: 30px; text-align: justify;">SharePoint install on the Windows Server 2003 and 2008. The recommendation is to use Windows 2008 because it has the outmost security. For the Windows 2008 you need to activate the following roles: Web Server role and the Microsoft .NET Framework 3.5.</p>
<p style="padding-left: 30px; text-align: justify;">Take into account that Windows 2008 Web Edition is not supported for farm roles, except WFE boxes, due to restrictions of non-Web editions of SQL Server on Windows 2008 Web Edition. The release of “SQL Server 2008 Web Edition” extends usage of Windows 2008 Web Edition for SharePoint. Refer to licence regulations and SQL Server 2008 Web Edition info for more details: <a href="http://tinyurl.com/b8nype" target="_blank">http://tinyurl.com/b8nype</a></p>
<p style="padding-left: 30px; text-align: justify;"><strong>Do not install SharePoint on Domain Controller box</strong> in virtualized environment. DC role of Windows 2008 limits performance of hard drive by turning off caching to provide AD consistency. Any installations on virtualized DC might not work properly.</p>
<p style="padding-left: 30px; text-align: justify;"><a href="http://tinyurl.com/b8nype" target="_blank"></a>SharePoint installation supports  SQL 2005 and 2008 Servers (even SQL Server 2000 is supported, but there are not much advantages of its usage). SQL Exress edition is supported as well, but for basic MOSS installation, however basic install of WSS 3.0 will use <a href="http://en.wikipedia.org/wiki/Windows_Internal_Database" target="_blank">Windows Internal Database</a> (WID doesn&#8217;t have size limitation). SharePoint installs only on SQL Server, but you can use BDC use content from 3-rd party databases.</p>
<p style="padding-left: 30px; text-align: justify;">A few advantages of SQL 2008 over SQL 2005 are in performance, encryption, clustering, mirroring and etc. Moreover, it provides updated SharePoint Web Parts for Reporting Services and KPI. Detailed information about SQL 2008 and SharePoint can be found in the following post <a href="http://tinyurl.com/cdkcyw" target="_blank">http://tinyurl.com/cdkcyw</a>.</p>
<p><strong>User SQL Aliases</strong></p>
<p style="padding-left: 30px; text-align: justify;">When provisioning a new SharePoint farm, it is highly recommended to use an alias to connect to the Microsoft SQL Server, as this provides for greater flexibility to move the SharePoint databases to a new server. For example, using an alias during the installation will simplify the migration process of SQL database server from small environment to larger physical cluster during scaling out process.</p>
<p><strong>Install Microsoft Office 2007 on farm premises (optional)</strong></p>
<p style="padding-left: 30px;">Office 2007 is not required on SharePoint server, but it might be  good to have it somewhere in you farm premises (not server box) for administrators, especially when you outsource your support or/and admins connect  remotely. In this case they might  need client apps installed somewhere to have access to</p>
<ul>
<li>Word and Excel for documents in Document Library</li>
<li>PowerPoint for Slides in Document Library</li>
<li>Access for &#8220;Edit in Datasheet&#8221; support in Document Library</li>
</ul>
<p style="padding-left: 30px;">Consider the same for Office SharePoint Designer(SPD), which is necessary for customisation purposes. (SPD is a  free product with is distributed as separate product that is not include into Office)</p>
<p><strong>Install all Windows Updates</strong></p>
<p style="padding-left: 30px;">Make sure that all servers have the latest service packs and updates for Windows, SQL and Office prior installing SharePoint.</p>
<p><strong>Choose the right edition of SharePoint</strong></p>
<p style="padding-left: 30px;">Be careful when use Enterprise edition of SharePoint, because Microsoft <a href="http://blogs.msdn.com/sharepoint/archive/2006/11/15/moss-enterprise-to-standard-not-recommended.aspx" target="_blank">doesn&#8217;t provide the support</a> if you decided to downgrade to Standard version, due to loss in features and functionalities. If you need Standard edition then consider a fresh installation.</p>
<p><strong>Install SharePoint</strong></p>
<p style="padding-left: 30px; text-align: justify;">Install SharePoint across all servers in farm. Start with WSS/MOSS slipstream package (with integrated latest Service Pack) rather then using basic WSS/MOSS installation and applying Service Pack later.</p>
<p style="padding-left: 30px; text-align: justify;">Follow the next order of installation:</p>
<ul class="unIndentedList" style="padding-left: 30px; text-align: justify;">
<li> Application server where Central Administration site will be hosted</li>
<li> All front-end Web servers</li>
<li> The index server (if using a separate server for search queries and indexing)</li>
<li> The query servers, if separate from the WFE servers</li>
<li> Other application servers (optional)</li>
</ul>
<p style="padding-left: 30px; text-align: justify;">Consider using scripts to automate SharePoint installation and configuration for the large farm deployment. SharePoint provides several configuration files and console commands that will do all deployment un-attendant. This will speed up installation and brings consistency of building and rebuilding servers in farm.</p>
<p style="padding-left: 30px; text-align: justify;">There are three commands to automate SharePoint installation:</p>
<ul class="unIndentedList" style="padding-left: 30px; text-align: justify;">
<li> SharePoint Setup.exe + Config.xml - to script the setup questions</li>
<li> PSconfig.exe - to script configuration wizard</li>
<li> STSADM.exe - to script central admin UI for creating web apps and site collections</li>
</ul>
<p style="padding-left: 30px; text-align: justify;">Alternative solution is to use already preconfigured Power Shell scripts. &#8220;<a href="http://www.codeplex.com/sharepointpdeploy">SharePoint Deploy</a>&#8221; tool on CodePlex provides the configured scripts for the standard installation, which can be adapted to any environments.</p>
<p style="padding-left: 30px; text-align: justify;">Refer to the following documentation for details about unattended installation <a href="http://go.microsoft.com/fwlink/?LinkID=135694&amp;clcid=0x409">http://go.microsoft.com/fwlink/?LinkID=135694&amp;clcid=0&#215;409</a>, and info about installations scripting <a href="http://technet.microsoft.com/en-us/library/dd335964.aspx">http://technet.microsoft.com/en-us/library/dd335964.aspx</a>.</p>
<p style="padding-left: 30px; text-align: justify;">Take into account that SharePoint does not uninstall properly and additional steps are required to clean remaining files and remove database tables, which are kept for the security reasons (<a href="http://nehasinha.wordpress.com/2008/02/01/uninstalling-moss-2007-manually/" target="_blank">http://nehasinha.wordpress.com/2008/02/01/uninstalling-moss-2007-manually</a>). It might be better to reinstall everything from the scratch if something went wrong, including Windows Server - because it will save a lot of time trying to fix potential issues that might be caused by files from the previous installation. In this scenario, using virtualization and snapshots feature saves a lot of time.</p>
<p style="padding-left: 30px; text-align: justify;">Detailed information about SharePoint installation guidelines are published on TechNet <a href="http://go.microsoft.com/fwlink/?LinkId=106632" target="_blank">http://go.microsoft.com/fwlink/?LinkId=106632</a></p>
<p><strong>Check Office Web Service availability </strong></p>
<p style="text-align: justify; padding-left: 30px;">Sometimes, SSL protocol of Office SharePoint Web Service is broken.  To test it, go to IIS Management Console and open SharePoint Office Web Service in browser via https://. If it doesn&#8217;t work - don&#8217;t process further till fix it. This is <em>very critical stuff</em>, because SharePoint roles cannot be assigned on other services in farm. <em>(I&#8217;ve seen such issues across several clients, when you can&#8217;t use other boxes in farm and only Application boxes are available for Index and Query roles, because SSL was broken)</em>.</p>
<p style="text-align: justify; padding-left: 30px;">No known fix at this moment, except reinstalling SharePoint.</p>
<p><strong>Install SharePoint updates</strong></p>
<p style="text-align: justify; padding-left: 30px;">Install all SharePoint updates (Infrastructure Updates and/or Cumulative Patches) after farm is deployed. Check the release notes of the latest cumulative patch if it includes all previous patches and updates. Sometimes you need to install previous updates manually. Cumulative patch releases each 2 months. Follow the official documentation &#8220;<a href="http://technet.microsoft.com/en-us/library/cc263467.aspx">Deploy software updates for Office SharePoint Server 2007</a>&#8221; for the processes of how to deploy infrastructure update (WSS Upgrade needs to be installed first and only then MOSS upgrade).</p>
<p style="text-align: justify;"><strong>Be careful with SharePoint hot fixes</strong></p>
<p style="padding-left: 30px;">There are several hot fixes, for example &#8220;<a href="http://tinyurl.com/d98992">Coreserver.msp</a>&#8221; package, which are released after Cumulative Patch.  However, be careful with these fixes, because they are temporary solution before the next official update, and they are not properly tested. Install hot fixes for specific problems only.</p>
<p><em></em><br />
<em></em></p>
<h2>Configuration</h2>
<p><em></em><br />
<strong>Enable SharePoint Features<br />
</strong><strong></strong></p>
<p style="padding-left: 30px;">Navigate to the Central Administration site and enable Enterprise SharePoint features, if necessary. The default settings is Standard features.</p>
<p><strong>Assign roles to servers</strong></p>
<p style="padding-left: 30px;">Navigate to the Central Administration site and assign SharePoint roles across all farms servers, according the infrastructure design and topology.</p>
<p><strong>Configure administrative tasks</strong></p>
<p style="padding-left: 30px;">Configure administrative tasks across servers, like email settings, blocked type, logging and etc. Setup SharePoint Shared Services and configure all related services like Search, Query, Application Services, Profiles and etc.</p>
<p><strong>Disable &#8220;Central Administration&#8221; role<br />
</strong></p>
<p style="padding-left: 30px; ">Navigate to the Central Administration site and disable &#8220;Central Administration&#8221; role for all servers in farm, except application servers. This action will disable &#8220;Central Administration&#8221; site and IIS won&#8217;t use additional resources to host this application.</p>
<p><strong>Configure Warm-Up scripts</strong><strong></strong></p>
<p style="padding-left: 30px; ">Install site &#8220;warm-up&#8221; scripts. Those scrips will compile each page of SharePoint site collections when box restarts or after IIS poor restarts. This script improves the response time when users request pages first time.</p>
<p style="padding-left: 30px; ">Those warm-up scrips use STADM command to &#8220;warm-up&#8221; the administrative interfaces and hit each page in the portal to force their JIT. The collection &#8220;warm-up&#8221; scripts available there <a href="http://blogs.msdn.com/joelo/archive/2006/08/13/697044.aspx">http://blogs.msdn.com/joelo/archive/2006/08/13/697044.aspx</a></p>
<p><strong>Recycle IIS application pool at different time</strong></p>
<p style="padding-left: 30px; ">Make sure that the application pools are set to recycle at different times on different Web servers, in case of multiple Web servers in the farm.</p>
<p style="padding-left: 30px; ">Recycle different IIS Web sites at different times to avoid peaks on the Web servers. When recycling more than one application pool on a specific Web server at the same time, temporarily remove that Web server from the load balancer to avoid bad user experience.</p>
<p style="padding-left: 30px; "><strong></strong></p>
<p><em></em><em></em><br />
Following these steps helps to install SharePoint and configure basis settings with the minimum amount of time and avoid most common pitfalls, which usually happens when SharePoint installs in the wrong order</p>
<hr />In the next part we will describe the configuration of development environment for the SharePoint stuff.</p>
<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/administration/sharepoint-farm-configuring-and-deployment-part-2-installation-configuration">SharePoint Farm configuring and deployment Part 2 - Installation &#038; Configuration</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/haYdB00BbypAXj7t4-HJnZjq45A/0/da"><img src="http://feedads.g.doubleclick.net/~a/haYdB00BbypAXj7t4-HJnZjq45A/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/haYdB00BbypAXj7t4-HJnZjq45A/1/da"><img src="http://feedads.g.doubleclick.net/~a/haYdB00BbypAXj7t4-HJnZjq45A/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SharepointMagazine?a=sNu9yGwplvE:sLIrvuQJn6I:kmCBgzMKvIA"><img src="http://feeds.feedburner.com/~ff/SharepointMagazine?i=sNu9yGwplvE:sLIrvuQJn6I:kmCBgzMKvIA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SharepointMagazine/~4/sNu9yGwplvE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/technical/administration/sharepoint-farm-configuring-and-deployment-part-2-installation-configuration/feed</wfw:commentRss>
		<feedburner:origLink>http://sharepointmagazine.net/technical/administration/sharepoint-farm-configuring-and-deployment-part-2-installation-configuration</feedburner:origLink></item>
		<item>
		<title>SharePoint Farm configuring and deployment. Part 1 - Architectural and Logical Planning</title>
		<link>http://feedproxy.google.com/~r/SharepointMagazine/~3/oKLqPn0CnDo/best-practices-of-sharepoint-farm-configuring-and-deployment-part-1-architectural-and-logical-planning</link>
		<comments>http://sharepointmagazine.net/technical/administration/best-practices-of-sharepoint-farm-configuring-and-deployment-part-1-architectural-and-logical-planning#comments</comments>
		<pubDate>Thu, 04 Jun 2009 01:00:17 +0000</pubDate>
		<dc:creator>Michael Nemtsev</dc:creator>
		
		<category><![CDATA[Administration]]></category>

		<category><![CDATA[Technical]]></category>

		<category><![CDATA[Architecture]]></category>

		<category><![CDATA[best practice]]></category>

		<category><![CDATA[Farm Design]]></category>

		<category><![CDATA[Performance]]></category>

		<category><![CDATA[SharePoint Farm]]></category>

		<category><![CDATA[Topology]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=2931</guid>
		<description><![CDATA[This series of articles provide an overview of how to plan, build and configure the common SharePoint farm across your organization.<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/administration/best-practices-of-sharepoint-farm-configuring-and-deployment-part-1-architectural-and-logical-planning">SharePoint Farm configuring and deployment. Part 1 - Architectural and Logical Planning</a></p>
]]></description>
			<content:encoded><![CDATA[<ul>
<li><strong>Part 1 - Architecture and Logical Planning</strong></li>
<li>Part 2 - Installation</li>
<li>Part 3 - Development Environment</li>
<li>Part 4 - Backup and Recovery Strategy</li>
<li>Part 5 - Virtualization</li>
<li>Part 6 - Post Deployment (final)</li>
</ul>
<hr />
<h2>Overview</h2>
<p style="text-align: justify; ">Planning and installing SharePoint Farm across enterprise network is not a trivial task. SharePoint is rarely installed in an isolated environment, and usually it interferes with the organization strategy and existing infrastructure. Many factors may affect farm design, performance, scalability and redundancy - from hardware devices in organization network, to network topology. As a result, leveraging and finding compromises among those factors helps to build consistent, reliable and flexible environment.<br />
There are several <a href="http://technet.microsoft.com/en-us/library/cc262733.aspx" target="_blank">whitepapers on the Microsoft TechNet portal</a> describing requirements for SharePoint Farm, but most of them are either written without taking into account infrastructure scope or filled with irrelevant information that navigate the reader away from the problem scope.</p>
<p style="text-align: justify; ">In this document you will find the configuration recommendations regarding different SharePoint areas. All information is represented in the set of recommendations about different actions you need to undertake or pay additional attention when you install and configure your SharePoint environment. We tried to structure all section to follow the natural flow of SharePoint installation from the scratch - from pre-installing analysis requirements to post deployment actions.</p>
<p>We plan several whitepapers in our &#8220;Best Practices&#8221; series, and we are interested which topis you would like to see in our next SharePoint publications. Please send us your comments and suggestions via this <a href="http://msmvps.com/blogs/laflour/contact.aspx" target="_blank">form</a>.</p>
<h2>Introduction</h2>
<p style="text-align: justify; ">Organizations adopting SharePoint face a variety of tasks - from planning, strategy, infrastructure and architecture design, UI Design, migration, and to development. All these tasks imply flexible infrastructural baseline before actual work starts. However, in reality we face the outdated environment and misconfigured farms that are not ready to implement new requirements. In such cases, baseline architecture becomes foundation stone of all SharePoint projects.<br />
Why would we care about infrastructure and not about something else, for example development? Fixing infrastructure errors is very expensive task and leads into significant changes across SharePoint farm. For example, Index Role assigned to the wrong server and incorrectly configured Search can lead to performance and redundancy issues that might require up to 3 days fix. Development errors are not so expensive and can be fixed relatively quickly, but sometime such errors, eventually become infrastructure errors that lead to changes in infrastructure design.</p>
<p style="text-align: justify; ">
<p style="text-align: justify; "><img class="size-full wp-image-3381 alignleft" style="margin-left: 0px; margin-right: 25px;" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/article1-planning.jpg" alt="article1-planning" width="449" height="278" /></p>
<h2>&#8220;Architectural Planning&#8221;</h2>
<p style="text-align: justify; ">Plan your farm and network communications before starting actual installation. The first thing to start is designing SharePoint architecture across corporate network. This includes understanding network structure, examining network devices and choosing the right SharePoint topology to fit the existing infrastructure and new requirements.</p>
<p style="text-align: justify; "><strong>Examine corporate network</strong></p>
<p style="padding-left: 30px; text-align: justify; ">Start from description of the existing network design, location of all applications and system servers. Microsoft Visio 2007 and &#8220;Network Diagram&#8221; template is a good instrument for this task.</p>
<p style="padding-left: 30px; text-align: justify; ">Record the location and information of corporate system servers, like Domain Controllers, File Servers, Mail Servers, Application and others. Dont&#8217; forget about network services - firewalls, proxies, and etc. For example, locations of ISA Servers across corporate network - IP address, list of open ports and the administrative user.</p>
<p style="padding-left: 30px; text-align: justify; ">The best way to maintain &#8220;Network Diagram&#8221; document is to update the single diagram that covers topology of all domains and how they are connected. The following diagram demonstrates the Visio document descibing the servers and devices across organization.</p>
<p style="padding-left: 30px; text-align: justify; "><img class="alignnone size-full wp-image-3033" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/serverslocation.jpg" alt="serverslocation" width="557" height="403" /></p>
<p style="padding-left: 30px; text-align: justify; ">This diagram will give a holistic view of the existing topology and ensure quick access to information across different domains.</p>
<p style="text-align: justify; "><strong>Examine network devices</strong></p>
<p style="padding-left: 30px; text-align: justify; ">All network devices in the topology play a vital role of how SharePoint performs and interacts among different servers. Information about locations and settings of all routers, switches, and accelerators become very important in planning server locations. For example, location of different WAN and XML accelerators across network affects SharePoint server organization and configuration.</p>
<p style="padding-left: 30px; text-align: justify; ">Presence of different network devices affects the connection bandwidth and latency between farm&#8217;s servers, and thereby, affects the choice of appropriate SharePoint Farm topology. Network Load Balancers (NLB), routers and switches will affect how fast network response, therefore the farm should be designed with the least impact of these devices.</p>
<p style="padding-left: 30px; text-align: justify; ">Refer to the following links for the detailed information about WAN accelerators, NLB and other network devices across SharePoint farms:</p>
<ol>
<li><a href="http://technet.microsoft.com/en-us/library/cc263099.aspx">http://technet.microsoft.com/en-us/library/cc263099.aspx</a></li>
<li><a href="http://blogs.msdn.com/joelo/archive/2008/01/17/global-sharepoint-deployment-partner-solutions.aspx">http://blogs.msdn.com/joelo/archive/2008/01/17/global-sharepoint-deployment-partner-solutions.aspx</a></li>
<li><a href="http://blogs.msdn.com/joelo/archive/2007/01/05/nlb-network-load-balancing-and-sharepoint-troubleshooting-and-configuration-tips.aspx">http://blogs.msdn.com/joelo/archive/2007/01/05/nlb-network-load-balancing-and-sharepoint-troubleshooting-and-configuration-tips.aspx</a></li>
</ol>
<p style="text-align: justify; "><strong>Network administrator is a friend</strong></p>
<p style="padding-left: 30px; text-align: justify; ">The IT administrator is the person who should participate in farm configuration from the very beginning. This person will be responsible for the configuration of all network servers and devices across corporate network.</p>
<p style="padding-left: 30px; text-align: justify; ">Most of the SharePoint Farm topologies cross the bounds of domains and from the very beginning specific protocols and ports must be open. The best way to maintain current situation is to have a separate document, shared with administrator, with the description of protocols and ports to open across network services.</p>
<p style="padding-left: 30px; text-align: justify; ">Detailed information about system accounts and list of ports is available in the following articles:</p>
<ul>
<li>Plan for administrative and service accounts (Office SharePoint Server) <a href="http://technet.microsoft.com/en-us/library/cc263445.aspx">http://technet.microsoft.com/en-us/library/cc263445.aspx</a></li>
<li>Office SharePoint Server security account requirements <a href="http://go.microsoft.com/fwlink/?LinkID=92883&amp;clcid=0x409">http://go.microsoft.com/fwlink/?LinkID=92883&amp;clcid=0&#215;409</a></li>
</ul>
<p style="text-align: justify; "><strong>Measure network latency</strong></p>
<p style="padding-left: 30px; text-align: justify; ">Network response time is one of the important factors that can affect SharePoint farm design. Ideally, you need to measure the latency between SharePoint servers and users in order to reorganize servers according the smallest response time.</p>
<p style="padding-left: 30px; text-align: justify; ">Network latency is the key point to determine which of the proposed scenarios to implement in the current SharePoint deployment. (<em>Latency is the time required for a packet to travel from one point on a network to another</em>).</p>
<p style="padding-left: 30px; text-align: justify; ">Use the Ping tool (ping.exe) to measure latency for:</p>
<ul style="text-align: justify; ">
<li>users - from the client computer to the Web server on the server farm;</li>
<li>data centres that host servers of the same farm - from a Web server in the remote data centre to the database server in the primary data centre</li>
</ul>
<p style="padding-left: 30px; text-align: justify; ">Do not forget to divide the round-trip result by two, because all measures are one way only, not round-trip.</p>
<p style="padding-left: 30px; text-align: justify; ">Compare results to the data below, and adopt environment to have latency lower those values.</p>
<p style="padding-left: 30px;">
<table style="border-width: 1px" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="12%" valign="top"><strong>Number of users </strong></td>
<td width="13%" valign="top"><strong>Concurrent users (10%) </strong></td>
<td width="41%" valign="top"><strong>Central Solution </strong></td>
<td width="32%" valign="top"><strong>Distributed solution </strong></td>
</tr>
<tr>
<td width="12%" valign="top">100-5,000</td>
<td width="13%" valign="top">10-500</td>
<td width="41%" valign="top">Bandwidth:   3+ Mbps   (dual T1)Latency:   &lt; 100 ms</td>
<td width="32%" valign="top">Bandwidth:   1.5   Mbps (T1)Latency:   &lt;100   ms</td>
</tr>
<tr>
<td width="12%" valign="top">10,000</td>
<td width="13%" valign="top">1,000</td>
<td width="41%" valign="top">Bandwidth:       3+ Mbps (dual T1)Latency:   &lt;250   ms</td>
<td width="32%" valign="top">Bandwidth:   1.5   Mbps (T1)Latency:   &lt;500   ms</td>
</tr>
<tr>
<td width="12%" valign="top">100,000</td>
<td width="13%" valign="top">10,000</td>
<td width="41%" valign="top">Bandwidth:     3+ Mbps (dual T1)Latency:   &lt; 250   ms</td>
<td width="32%" valign="top"><span style="font-family: mceinline;"><em><strong><span style="font-family: mceinline;">Bandwidth:     1.5 Mbps (T1)</span></strong></em></span><span style="font-family: mceinline;"><em><strong><span style="font-family: mceinline;">Latency:     &lt;500 ms</span></strong></em></span></td>
</tr>
</tbody>
</table>
<p style="padding-left: 30px; text-align: justify; ">
<p style="padding-left: 30px; text-align: justify; ">The critical bandwidth for any SharePoint farms is 1.5 Mbps (T1) with 500ms latency. Overstepping these values will increase the page-load times dramatically, in 4 times at least. Refer to the diagrams in the &#8220;<a href="http://technet.microsoft.com/en-us/library/cc262952.aspx">Plan for bandwidth Requirements</a>&#8221; document, for more details about the bandwidth and latency results under different conditions.</p>
<p style="padding-left: 30px; text-align: justify; ">Available network bandwidth and latency influences geographic deployments significantly. Data transfers across WAN links that span multiple cities, states, provinces, countries, or continents requires really fast lines to provide adequate response time, so design such topologies thoroughly.</p>
<p style="padding-left: 30px;">More details for bandwidth requirements available in the following article <a href="http://technet.microsoft.com/en-us/library/cc262952.aspx">http://technet.microsoft.com/en-us/library/cc262952.aspx</a></p>
<p style="text-align: justify; "><strong>Become familiar with SharePoint farm communications</strong></p>
<p style="padding-left: 30px; text-align: justify; ">Before discussing servers&#8217; redundancy and farm topologies let us review farm servers and how they communicate with each other. The following picture from from &#8220;<a href="http://technet.microsoft.com/en-us/library/cc262400.aspx">Planning an Extranet Environment for Office SharePoint Server</a>&#8221; TechNet article illustrates the communication channels within a server farm and which servers handle client&#8217;s request.</p>
<p style="padding-left: 30px; text-align: center;"><img class="size-full wp-image-2975 aligncenter" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/serverscommunications.jpg" alt="serverscommunications" width="350" height="229" /></p>
<p style="padding-left: 30px; text-align: justify; ">When a user issues a query, the query is sent to a Web server. The Web server communicates with the query server to build a list of results, and then communicates with the computer running Microsoft SQL Server to extend the list of results with summarization text, URLs, and security trimming. In parallel, the Web Server gets page data from SQL Server and renders them on fly. This diagram will help in understanding which roles to use on farm servers.</p>
<p style="text-align: justify; "><strong>Plan a baseline topology</strong></p>
<p style="padding-left: 30px; text-align: justify; ">Analyse the existing infrastructure and plan a SharePoint topology for redundancy. The term redundancy is often misinterpreted to be synonymous with availability.</p>
<p style="padding-left: 30px; text-align: justify;"><strong>Redundancy </strong>refers to the use of multiple servers in a load-balanced environment for any of several purposes, such as to improve farm performance, to scale out to accommodate additional users, and to improve availability.<br />
<strong>Availability</strong> is a more specialized concept that refers to a multiple-server environment that is designed to accept connections and operate normally even when one or more of the servers in the farm are not operational. Therefore, availability implies redundancy.</p>
<p style="padding-left: 30px; text-align: justify; ">There are several different topologies - from three to six servers in farm, which can be used as a baseline. Which one to choose depends on the level of redundancy and available hardware. Not all clients can afford topology with six or ten servers in farm due to budget limitation or data centre capabilities. Finding the compromise between numbers of servers, type of hosting and servers&#8217; roles become critical task, because this choice will affect performance and extensibility of the SharePoint farm for several years ahead.</p>
<p style="padding-left: 30px; text-align: justify; "><strong><em>Three Servers Farm</em></strong></p>
<p style="padding-left: 30px; text-align: justify; ">The minimum availability for the farm with few servers can be achieved with &#8220;3-servers farm&#8221; topology. In the current topology Web and Application Servers locate together on the one box and the database is on another box. The remaining, third, server gives a choice of which server role make redundant - Web server role or the database server role.</p>
<p style="padding-left: 30px; text-align: center;"><img class="size-full wp-image-2984 aligncenter" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/threeserversfarm.jpg" alt="threeserversfarm" width="350" height="180" /></p>
<p style="padding-left: 30px; text-align: justify; ">The farm with the two Web Servers provides redundancy of the Web and Application roles, improving the overall performance. A drawback of this design is that your data is not redundant (left farm). In other case, farm with two Database Servers (cluster) provides data redundancy, increasing availability of critical data, but users might suffer from temporary loss of access, when Web Server unavailable (right farm).</p>
<p style="padding-left: 30px; text-align: justify; ">The &#8220;3-servers farm&#8221; is one of the most questionable farms in terms of redundancy and performance. This limitation in the number of servers cannot provide redundancy of Query Server and high performance at the same time.</p>
<p style="padding-left: 30px; text-align: justify; ">Redundancy can be achieved with Query Roles on both Web App servers. In this case, Database Server is the only place for Index Role, but this will hinder the overall performance. The Index Role is very CPU and HDD consuming role and that is why database servers are not very optimal place for this role. Alternative solution is to assign Index Role to the Web Server with the Query Role, but this will not work effectively, because in this case, index will not be propagated to another Query Server in farm.</p>
<p style="padding-left: 30px; text-align: justify; ">If performance is one of the priorities then consider using Query Server and Index Server Roles on different Web Application Servers. This is flexible design in terms of extensibility, because with the new servers in farm changing roles of Index and Query servers is not required.</p>
<p style="padding-left: 30px; text-align: justify; ">Interestingly, a TechNet article (<a href="http://is.gd/8QbS">http://is.gd/8QbS</a>, page 26) explains, that a Query Server can&#8217;t be used with Web Applications server for 3-servers farm. The reality is that, Web App and Query Role together are super common, more common than not (one of the reasons is that Query Server doesn&#8217;t use Network-Load Balancer - it uses its own algorithm).  What they actually mean in the TechNet article is that having the  Index on database server is not at all a recommended solution.</p>
<p style="padding-left: 30px; text-align: justify; "><em><strong>Four Servers Farm</strong></em></p>
<p style="padding-left: 30px; text-align: justify; ">Additional, forth server will add redundancy either for Data Server or for Web Server. However, it does not help much with performance. Current topology suffers from the same &#8220;3-servers farm&#8221; drawbacks - no place for Index Server with Query Role redundancy.</p>
<p style="padding-left: 30px; text-align: justify; "><em><strong>Five+ Servers Farm</strong></em></p>
<p style="padding-left: 30px; text-align: justify; ">The most common and highly available server farm topology is &#8220;5+ servers farm&#8221;, the farm with the middle tier server.</p>
<p style="padding-left: 30px; text-align: center;"><img class="size-full wp-image-2990 aligncenter" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/fiveserversfarm.jpg" alt="fiveserversfarm" width="125" height="180" /></p>
<p style="padding-left: 30px; text-align: justify; ">
<p style="padding-left: 30px; text-align: justify; ">This middle tier server solves all issues of three and four servers topology by providing the dedicated tier for Index and Application roles. Additional servers in farm will extend middle tier, by assigning new roles to those servers - Excel Calculation Services Role, and Microsoft Office Project Server 2007 Role.</p>
<p style="padding-left: 30px; text-align: justify; ">The following table summarize farm topology:</p>
<table style="text-align: justify; border-width: 1px;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="13%" valign="top">
<p align="center"><strong><em>Farm Servers</em></strong><em></em></p>
</td>
<td width="44%" valign="top">
<p align="center"><strong>Performance</strong></p>
</td>
<td width="42%" valign="top">
<p align="center"><strong>Redundancy</strong></p>
</td>
</tr>
<tr>
<td width="13%" valign="top">
<p align="center"><em>3 - 4</em><em></em></p>
</td>
<td width="44%" valign="top">Index on WFE with Query   on another box<em>App Roles   on WFE</em></td>
<td width="42%" valign="top">Index on Database, with   Query on WFE<em>App Roles   on WFE</em></td>
</tr>
<tr>
<td width="13%" valign="top">
<p align="center"><em>5</em><em></em></p>
</td>
<td width="44%" valign="top">App Roles on Middle Tier<em>Dedicated   Index Server on Middle Tier</em></td>
<td width="42%" valign="top">App Roles on WFE<em>Dedicated   Index Server on Middle Tier</em></td>
</tr>
<tr>
<td width="13%" valign="top">
<p align="center"><em>6</em><em></em></p>
</td>
<td width="44%" valign="top">Dedicated Web Server for   Crawling, outside NLB<em>Dedicated   Index Server on Middle Tier</em></td>
<td width="42%" valign="top">App Roles on Middle Tier   in NLB<em>Dedicated   Index Server on Middle Tier</em></td>
</tr>
</tbody>
</table>
<p style="padding-left: 30px; text-align: justify; ">
<p style="padding-left: 30px; text-align: justify; ">To optimize the overall performance of five and more servers SharePoint Farm, configure a dedicated Web Server for crawling content, especially when crawling a server farm that contains more than 500 gigabytes (GB) of content or crawling content over the WAN. To ensure that user requests are not affected by content crawling, remove the dedicated Web server from the network load balancing rotation. This is especially important in global environments in which the off-peak hours of a regional farm (when crawl jobs are likely to be schedule) coincide with the peak hours of the central farm.</p>
<p style="text-align: justify; "><strong>Plan extranet topology</strong></p>
<p style="padding-left: 30px; text-align: justify; ">Choose the topology based on requirements for external users. This topology will provide a basis of network extensibility for applications servers and communications between them.</p>
<p style="padding-left: 30px; text-align: justify; ">The simplest topology is &#8220;Edge firewall topology&#8221;, which is represented by following diagram, from TechNet article.</p>
<p style="padding-left: 30px; text-align: center; "><img class="size-full wp-image-2996 aligncenter" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/edgetopology.jpg" alt="edgetopology" width="250" height="95" /></p>
<p style="padding-left: 30px; text-align: justify; ">This topology applicable for the small farms, when there is no need to separate internal services from corporate network and secure communications between server farms. All remote users are separated from farm by ISA server which plays a role of remote proxy.</p>
<p style="padding-left: 30px; text-align: justify; ">For the big farms, when security of communications is a priority, the recommended topology is &#8220;Back-to-back perimeter topology&#8221;. This is very flexible and adaptable topology for network changes.</p>
<p style="padding-left: 30px; text-align: center;"><img class="size-full wp-image-2997 aligncenter" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/backendtopology.jpg" alt="backendtopology" width="400" height="255" /></p>
<p style="padding-left: 30px; text-align: justify; ">The main advantage of this topology is that it isolates the server farm in a separate perimeter network. Layers logically separate all servers and communications are under control - any security damages affect only specific layer, not the entire farm. External user access is isolated to the perimeter network and users can be isolated in different AD for remote and corporate access.</p>
<p style="padding-left: 30px; text-align: justify; ">There are some other extranet topology variations, but mostly all of them are based on &#8220;Back-to-back perimeter topology&#8221; with some modification.</p>
<p style="padding-left: 30px; text-align: justify; ">
<p style="padding-left: 30px; text-align: justify; ">Detailed information about farm topologies can be found in the following documents:</p>
<ol>
<li>Best practices for My Sites: <a href="http://technet.microsoft.com/en-us/library/cc262706.aspx">http://technet.microsoft.com/en-us/library/cc262706.aspx</a></li>
<li>Best practices for team collaboration sites: <a href="http://technet.microsoft.com/en-us/library/cc850694.aspx">http://technet.microsoft.com/en-us/library/cc850694.aspx</a></li>
<li>Planning an Extranet Environment for Office SharePoint Server: <a href="http://technet.microsoft.com/en-us/library/cc262400.aspx">http://technet.microsoft.com/en-us/library/cc262400.aspx</a></li>
</ol>
<h2>&#8220;Logical Planning&#8221;</h2>
<p><strong>Plan site collections</strong></p>
<p style="padding-left: 30px; ">Plan number of site collections and sub sites in advance - content, location, security.  Start with the single site collections and several sub sites rather then creating several site collections, and try to avoid new site collection if there are no requirements for this. The reason of such structure is that each new site collection works as a new application, with isolated scope to features, templates and search. Maintaining such structure is much easier than several site collections.</p>
<p><strong>Organize site collection across several content databases</strong></p>
<p style="padding-left: 30px;">Do not end up with one big content database, because data optimisation will cause troubles in this case. For the small and development environments, single content database might be a preferable choice. However, for the large farms create several content databases and organize site collections among them. Having several content databases with sites helps to address the following:</p>
<ul style="padding-left: 30px;">
<li>Keep content database size &lt;100 GB, otherwise it could hinder performance (MS recommendation)</li>
<li>Data usage optimization.</li>
<li>Simplify farm backup and restoration.</li>
<li>Flexibility for Disaster Recovery (DR) strategies.</li>
</ul>
<p style="padding-left: 30px;">More details about site collections in several content databases available in the following blog post: <a href="http://msmvps.com/blogs/laflour/archive/2008/10/14/tips-to-create-a-site-collection-in-new-content-database.aspx" target="_blank">http://msmvps.com/blogs/laflour/archive/2008/10/14/tips-to-create-a-site-collection-in-new-content-database.aspx</a></p>
<p><strong>Script actions</strong></p>
<p style="padding-left: 30px;">Prefer to script installation and SharePoint Farm configuration actions:  setting roles, creating web sites and site collections, etc. Configuring successful farm from the first attempt has a change to fail due to complexity of SharePoint. Running scripts to repeat all actions will save time when something went wrong and new server installation is required.</p>
<hr />In the next part we will review the actual SharePoint installation and the basic farm configuration.</p>
<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/administration/best-practices-of-sharepoint-farm-configuring-and-deployment-part-1-architectural-and-logical-planning">SharePoint Farm configuring and deployment. Part 1 - Architectural and Logical Planning</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/8GSbqIXk3b5DuEy7jq9JSQwQGZc/0/da"><img src="http://feedads.g.doubleclick.net/~a/8GSbqIXk3b5DuEy7jq9JSQwQGZc/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/8GSbqIXk3b5DuEy7jq9JSQwQGZc/1/da"><img src="http://feedads.g.doubleclick.net/~a/8GSbqIXk3b5DuEy7jq9JSQwQGZc/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SharepointMagazine?a=oKLqPn0CnDo:Pl0LfaHL17c:kmCBgzMKvIA"><img src="http://feeds.feedburner.com/~ff/SharepointMagazine?i=oKLqPn0CnDo:Pl0LfaHL17c:kmCBgzMKvIA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SharepointMagazine/~4/oKLqPn0CnDo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/technical/administration/best-practices-of-sharepoint-farm-configuring-and-deployment-part-1-architectural-and-logical-planning/feed</wfw:commentRss>
		<feedburner:origLink>http://sharepointmagazine.net/technical/administration/best-practices-of-sharepoint-farm-configuring-and-deployment-part-1-architectural-and-logical-planning</feedburner:origLink></item>
		<item>
		<title>Review: Workflows with Nintex Workflow 2007</title>
		<link>http://feedproxy.google.com/~r/SharepointMagazine/~3/XQZOw3Kkm-4/review-workflows-with-nintex-workflow-2007</link>
		<comments>http://sharepointmagazine.net/products/review-workflows-with-nintex-workflow-2007#comments</comments>
		<pubDate>Wed, 03 Jun 2009 03:46:18 +0000</pubDate>
		<dc:creator>furuknap</dc:creator>
		
		<category><![CDATA[Products]]></category>

		<category><![CDATA[Furuknap]]></category>

		<category><![CDATA[journal]]></category>

		<category><![CDATA[nintex]]></category>

		<category><![CDATA[product]]></category>

		<category><![CDATA[review]]></category>

		<category><![CDATA[usp]]></category>

		<category><![CDATA[Workflow]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=3437</guid>
		<description><![CDATA[For the last couple of months, I have been working with Nintex Workflow 2007 while researching a new issue of the Understanding SharePoint Journal. That research lead to the recently released special issue of USP Journal, titled Using Nintex Workflow 2007. You can get that issue for free now, and I’ll tell you how at the end of this article.<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/products/review-workflows-with-nintex-workflow-2007">Review: Workflows with Nintex Workflow 2007</a></p>
]]></description>
			<content:encoded><![CDATA[<p>For the last couple of months, I have been working with Nintex Workflow 2007 while researching a new issue of the Understanding SharePoint Journal. That research lead to the recently released special issue of USP Journal, titled Using Nintex Workflow 2007. You can get that issue for free now, and I’ll tell you how at the end of this article.</p>
<p>In this article, I’m am going to introduce you to some of the features of Nintex Workflow 2007 (NW), and show you why I think this is a really cool product. I&#8217;ll also tell you about some of the annoyances I found.</p>
<p><strong>Full Disclosure:</strong> Now, I’m trying to be as unbiased as I can and give you my honest opinion, but you should know that I was paid by Nintex for creating the USP Journal issue. No, they didn&#8217;t get any editorial control, but I was still paid. As such, feel free to hold a salt shaker ready and take what I say with an appropriate grain of salt.</p>
<h1>Nintex Workflow in a Nutshell</h1>
<p>Basically, Nintex is an easy to use workflow add-on to SharePoint. If you have worked with workflow in SharePoint before, chances are you have either worked with SharePoint Designer or Visual Studio. Both of these options are well suited for their intended use, but there is a big gap between SPD and VS that NW fills really well.</p>
<p>On one side, SharePoint Designer offers an incredibly easy and free way of adding simple workflows to a SharePoint site. Using a bit of creativity you can even create fairly complex solutions, using only the built-in actions and features. However, SharePoint Designer lacks scalability and flexibility, and re-use is at best very cumbersome.</p>
<p>On the other side is Visual Studio, which is like having your own thermo nuclear device. It’s incredibly powerful and you can more or less control at least parts of the world, but you had better know exactly what you are doing, or you risk your solution blowing up in your face. Where Visual Studio offers immense power, its learning curve is so steep, it can scare the most die-hard mountaineer.</p>
<p>Nintex Workflow bridges the gap between these two solutions, by giving end users some of the power of a Visual Studio solution while maintaining the ease of use and gentle learning curve of SharePoint Designer. In addition, NW includes some truly unique features, such as the ability to combine sequential and state-machine workflows and user interaction with tasks through email in a feature that deserves mention for its name alone: LazyApproval.</p>
<h1>Authoring Workflows in Nintex</h1>
<p>What initially sparked my interest for NW was the interface for designing workflows. The interface resembles the workflow designer in Visual Studio in that you get a visual overview of the ‘flow’ part of your workflow. Branching, loops, and state machines are presented in what I think is a really intuitive interface that makes it easy for end users to understand what is going on.</p>
<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" src="http://sharepointmagazine.net/wp-content/uploads/2009/06/figure54.png" border="0" alt="Figure 54" width="576" height="551" /></p>
<p>What makes this workflow designer especially friendly to end users is that it resides inside SharePoint itself. Using scripting and more fancy scripting than I’d dare to undertake, you are actually designing your entire workflow right inside SharePoint with no client software to install or learn at all. You simply drag-and-drop actions from the action menu onto the designer surface and configure each action using dialog boxes.</p>
<p>True, the interface of the Visual Studio workflow designer offers more options and allows for a greater degree of flexibility, but Visual Studio is still an all-or-nothing package; if you want the added flexibility, you also need to deal with the added complexity. That complexity is probably far more than any end users are prepared to handle.</p>
<h1>Templates and Snippets</h1>
<p>Another nice feature is the ability to easily create templates of existing workflows. You can create the generic templates for common tasks such as approval or customer follow-up and then re-use the templates when creating new workflows. This saves a lot of time if you are creating similar workflows or have common tasks used by several units in an organization.</p>
<p>Another option for workflow re-use is snippets. A snippet is basically a set of workflow actions stored as a single action. You create these snippets in the workflow designer, and they become part of your available actions for use in any workflow. For example, you might create a snippet to notify an item or document owner about changes to that item or document. Whenever you want to include that functionality in your workflow, you simply drag the entire snippet onto the workflow designer, and you get that functionality added without having to re-create all the individual actions.</p>
<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" src="http://sharepointmagazine.net/wp-content/uploads/2009/06/figure38.png" border="0" alt="Figure 38" width="216" height="247" /></p>
<h1>Go with the Flow</h1>
<p>If there is one thing I really miss, especially in SharePoint Designer workflows, it is better debugging and tracking of what is going on. A common approach is to add a lot of history logging to track what the workflow is doing. In Visual Studio, you can attach the debugger and step through the entire workflow, which is really nice and gives developers extreme control.</p>
<p>While NW lacks the stepping option, it does offer a very nice workflow information page far superior to the default workflow status page of SharePoint. On that workflow information page, you get a visual representation of your workflow, including which actions and branches are currently executing.</p>
<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" src="http://sharepointmagazine.net/wp-content/uploads/2009/06/figure56.png" border="0" alt="Figure 56" width="824" height="633" /></p>
<p>This workflow information page can also give you a detailed view where you can get a whole boatload of more information about the workflow execution, including how long each action takes, the outcome of conditions, who approves or disapproves which actions, and a range of other information.</p>
<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" src="http://sharepointmagazine.net/wp-content/uploads/2009/06/figure58.png" border="0" alt="Figure 58" width="824" height="617" /></p>
<p>The workflow information provided by NW goes a long way towards providing the debugging information you need to figure out workflow bottlenecks, logical errors, and other problems you may encounter.</p>
<h1>State of the Machine</h1>
<p>The final thing I want to point out as truly unique in NW is the support for state machines. You may wonder what is so special about supporting state machines, after all, most workflow products support state machines in some fashion.</p>
<p>What is really nice in NW, though, is that a state machine is simply an action, just like any other multi-branch action. This means you can combine state machines with sequential workflows inside the same workflow. For example, you may have a long running customer follow-up process, in which one part of the workflow consists of contract negotiations. That contract negotiation may move back and forth between different states, but is still only part of a longer workflow in which the ultimate goal is to make the customer happy.</p>
<p>In NW, you can simply add a state machine action and configure that action as you would if you had developed a stand-alone state machine workflow. Then, after that part of the workflow completes, you can continue in a sequential workflow, or even transition into a new state machine inside the same workflow.</p>
<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" src="http://sharepointmagazine.net/wp-content/uploads/2009/06/figure79.png" border="0" alt="Figure 79" width="905" height="525" /></p>
<h1>OK, So What’s the Catch?</h1>
<p>Alright, I’ve said enough about the cool things, so it makes sense to point out some of the weaknesses as well. Note that most of these issues are annoyances at worst.</p>
<p>First, the interface for controlling configuration scopes leave a lot to be desired. Basically, you can configure settings for sites and site collections, and the scopes control inheritance and all that, but the way that Nintex has solved the interface is not good. You need to pay attention to small pieces of texts on the page to know whether you are configuring for a site or for the entire site collection.</p>
<p>Second, NW supports setting up holidays to avoid workflow activities while no one is available to respond to tasks or interact with the workflow. However, the way the holidays are configured could have been done so much better. You can only add one day at a time, so if you are closing the office for two weeks during summer you need to add each day of those weeks individually. Really sad for schools with months of vacation at a time.</p>
<p>Third, the workflow designer can become cluttered when you are creating complex workflows, especially when using multiple branches. The branches keep expanding horizontally and will eventually fill any screen size if you have enough branches. And frankly, ‘enough’ branches is too low a number for example in state machines with many states. The same applies to the workflow information; to get an overview, you need to do a lot of scrolling. A “zoom out” function would be useful.</p>
<p>None of these issues are deal-breakers, though. It feels to me like they have gone 95% of the way towards making a perfect workflow solution, but with a product like this, the last 5% can be annoying.</p>
<p>And still, their 95% are still light-years ahead of anything else I have seen in this niche.</p>
<h1>Want to Learn More?</h1>
<p>The state machine image above is an example from the USP Journal I mentioned in the beginning of this article. In that issue, you’ll learn how to develop workflows in Nintex Workflow. The image shows part of a “get well card” that you’ll develop during the exercises in the issue. I’ll show you how to install and configure NW, familiarize you with the Workflow Designer, teach you at least some of the actions available, as well as explain the logic of how various tasks are done, such as the above example of inline state machines.</p>
<p>You can get the 128-page issue from the <a href="http://www.understandingsharepoint.com/url/30104" target="_blank">issue download page</a>, and as I said, it’s free, as in beer.</p>
<p>.b</p>
<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/products/review-workflows-with-nintex-workflow-2007">Review: Workflows with Nintex Workflow 2007</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/TOOZnJkDrTPCbvjBPR9Q_rdADaA/0/da"><img src="http://feedads.g.doubleclick.net/~a/TOOZnJkDrTPCbvjBPR9Q_rdADaA/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/TOOZnJkDrTPCbvjBPR9Q_rdADaA/1/da"><img src="http://feedads.g.doubleclick.net/~a/TOOZnJkDrTPCbvjBPR9Q_rdADaA/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SharepointMagazine?a=XQZOw3Kkm-4:tVJZnphyZDw:kmCBgzMKvIA"><img src="http://feeds.feedburner.com/~ff/SharepointMagazine?i=XQZOw3Kkm-4:tVJZnphyZDw:kmCBgzMKvIA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SharepointMagazine/~4/XQZOw3Kkm-4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/products/review-workflows-with-nintex-workflow-2007/feed</wfw:commentRss>
		<feedburner:origLink>http://sharepointmagazine.net/products/review-workflows-with-nintex-workflow-2007</feedburner:origLink></item>
		<item>
		<title>KPIs – Who Am I and Where do I Come From? (Part 3 of 6)</title>
		<link>http://feedproxy.google.com/~r/SharepointMagazine/~3/JFXpJcWr8jQ/kpis-%e2%80%93-who-am-i-and-where-do-i-come-from-part-3-of-6</link>
		<comments>http://sharepointmagazine.net/technical/administration/kpis-%e2%80%93-who-am-i-and-where-do-i-come-from-part-3-of-6#comments</comments>
		<pubDate>Mon, 01 Jun 2009 01:11: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=2569</guid>
		<description><![CDATA[Well, back again.  It has been a while.  Today I'd like to move onto the subject of KPIs.  What is a KPI you say?  A Key Performance Indicator is a measure of how well (or poorly) targets were met.<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/administration/kpis-%e2%80%93-who-am-i-and-where-do-i-come-from-part-3-of-6">KPIs – Who Am I and Where do I Come From? (Part 3 of 6)</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Well, back again.  It has been a while.  Today I&#8217;d like to move onto the subject of KPIs.  What is a KPI you say?  A Key Performance Indicator is a measure of how well (or poorly) targets were met, for example, a KPI might be Profit Variance -if we have $92,000 profit for the year and we had a target of $100,000 we have a variance of -$8000.  Not good.  So on our dashboard, our Profit Variance might have a red stoplight to graphically show our performance.</p>
<p>Or would it?   It may be that we allow for 10% leeway before we say that our variance was bad.  So in our example, we would actually have a green light, or maybe orange.  We would only get a red light if our variance was greater than -$10,000.  Let&#8217;s face it; we&#8217;re still making money, just not as much as we had hoped.</p>
<p>Did you notice that I didn&#8217;t say &#8220;Revenue&#8221; was the KPI?  In fact, I said that the performance of Actual Revenue to a target is the KPI i.e. the variance.  This is important.  KPIs measure PER-FOR-MANCE.</p>
<p>So, a KPI measures how well we performed against a given target.</p>
<p>That makes sense right?  So what&#8217;s the fuss about scorecards and KPIs and all that?  Well&#8230; balanced scorecards are designed to show overall performance of the organisation.  Not just easily quantifiable things like Profit Margin.  And how do you compare, equate and aggregate information such as Employee Satisfaction, Customer Satisfaction, Operational Effectiveness, Environmental Sustainability and Profit Margin altogether?</p>
<div>
<p> </p>
<table style="collapse" border="0"><col></col><col></col><col></col></p>
<tbody></tbody>
<tbody>
<tr style="37px">
<td style="7px" colspan="3">
<h1>Where do I Come From?</h1>
</td>
</tr>
<tr style="241px">
<td style="7px" valign="top"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/02/021709-0258-kpiswhoami15.png" alt="" /></td>
<td style="7px" colspan="2">Now we get down to the meat of it.  And what this has to do with SharePoint.  Someone, somewhere has to actually physically build our KPIs, store them, access them and use them. </p>
<p><strong>What are My Options?<br />
</strong></p>
<ol>
<li>PerformancePoint Monitoring &amp; Analysing<br />
PerformancePoint delivers excellent reusability and sharing of KPIs, customisable indictors.<br />
Coming from the Office suite of tools, it is a UI* which doesn&#8217;t require IT involvement – it is aimed at BAs and super-users.<br />
Integrates with existing technologies, SQL and SharePoint.</li>
<li>SharePoint<br />
PerformancePoint still uses SharePoint as it&#8217;s UI but here I&#8217;m talking about building KPIs themselves.  As of Office 14, PerformancePoint M&amp;A will be entirely bundled into MOSS.  Which I guess means that SharePoint&#8217;s existing rudimentary KPI building functionality will disappear.  Yes, it&#8217;s rudimentary and simple - it&#8217;s ok for really small stuff but if you&#8217;re from an IT department, my advice is, don&#8217;t waste your time.</li>
<li>
<div>SSAS<br />
Get your MDX skills going because you&#8217;re gonna be writing a lot of MDX queries.  That&#8217;s not a bad thing.  I&#8217;m just saying that&#8217;s what you will be doing.  Also, all information relating to a single KPI must be contained within that cube where the KPI sits.  And you&#8217;re gonna have to create the interface using Excel or suchlike yourself.</div>
</li>
<li>
<div>Numerous Other Software Vendors<br />
It all comes down to cost doesn&#8217;t it?  And integration.  And user familiarity with the UI*.</div>
</li>
</ol>
<p>I know I&#8217;m biased.  I like PerformancePoint. It integrates nicely with technologies that I&#8217;m already using (SQL and SharePoint).  And I like that it&#8217;s gonna be bundled with MOSS.  So sue me (no, don&#8217;t really)&#8230;</p>
<p style="18pt">* user interface</p>
</td>
</tr>
<tr style="37px">
<td style="7px" colspan="3">
<h1>Who Am I?</h1>
</td>
</tr>
<tr style="241px">
<td style="7px" valign="top"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/02/021709-0258-kpiswhoami25.png" alt="" /></td>
<td style="7px" colspan="2"><strong>Profit - What Else is There?<br />
</strong> </p>
<p>I could give you a massive list of KPIs, but I ain&#8217;t gonna.  Check out the <a href="http://www.epmreview.com/KPI-Library.html">EPM Review</a>.  They have an EXHAUSTIVE list of common KPIs.    It&#8217;ll knock your socks off&#8230; or provide just the impetus you&#8217;ve been needing to clean out your garage.  Who am I to judge?</p>
<p>Just remember this&#8230; you want to measure performance in all areas that are important to you.   While there is some commonality across organisations, there is by no means uniformity.  This means, the very first thing you&#8217;ve got to do, is consider your organisations values, mission and strategic plan.  This will guide you on what&#8217;s important FOR YOUR ORGANISATION.</p>
<p>Once you know what you want to achieve, then you need to identify what data <span style="underline">you already have</span> that can be used to quantify those areas.  Then consider, what data you <span style="underline">could</span> capture but don&#8217;t already have.  Finally, don&#8217;t forget to think through and identify what data you can&#8217;t capture.  It may be just as important to know what&#8217;s missing.</p>
<p><strong>How Long is a Piece of String<br />
</strong></p>
<p>Defining targets is not as simple as it seems initially.  Again, this is something you need to think through at the outset.  Targets could be manually entered values, but based on what?  It could be as simple as Revenue Last Year + 4%.  But someone somewhere has to decide how many percent, and whether that base revenue number should include Revenue from discontinuing entities, or interest  or a number of other factors.  The fact is, you need to think this through separately for each and every KPI.</td>
</tr>
<tr style="37px">
<td style="7px" colspan="3">
<h1>Getting on the Merry-Go-Round</h1>
</td>
</tr>
<tr style="241px">
<td style="7px" valign="top"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/02/021709-0258-kpiswhoami35.png" alt="" /></td>
<td style="7px" colspan="2">Common issues you will face when designing your KPIs&#8230; </p>
<p><strong>Defining the KPI</strong><br />
What&#8217;s the formula?  Each segment of the organisation defines things in slightly different ways.  In order to measure them effectively, a corporate view needs to be taken.  This can be tricky.  If you want the data used to derive the results to be meaningful then you either have to (a) ensure it&#8217;s 100% automated and requires no business unit level input or (b) find a way to get everyone to agree on a common definition.  Good luck with that!</p>
<p><strong>Weighting the KPI</strong></p>
<p>Some KPIs are more important than others.  Well, maybe not more important but certainly the impact on the organisation of poor performance, or conversely good performance, is more greatly felt.  So we need to identify what matters.  Again, getting everyone to agree can be challenging.  But this is an important thought process and should be well considered before jumping in the deep end.  It helps to look at your strategic plan and that may point you in an appropriate direction.</p>
<p><strong>Too Many KPIs</strong></p>
<p>I see this time and time again.  How do you hit the bullseye when you&#8217;re aiming everywhere?  It&#8217;s got to be achievable, not the KPI targets but the project itself.  Getting a scorecard up and running is  challenge, no doubt about it. But getting people to use it, now that&#8217;s the real challenge.  So start small.  I&#8217;ll say it again.  Start SMALL.  Did you miss it?   START SMALL!!</p>
<p>Get users comfortable with a few key areas before you throw a thousand or a hundred or even 50 KPIs at them.  They just won&#8217;t read it.  They won&#8217;t understand what they are looking at.  My suggestion, seriously, start with 10 <span style="underline">at the most</span>.  I know there are BAs and scorecard developers out there looking at me in stunned silence (well, reading at me in stunned silence&#8230; or perhaps not, perhaps you are yelling at the screen (if so, ask yourself why because I can&#8217;t actually hear you).  Of course, you can revisit it later&#8230; just don&#8217;t start with information overload.  That&#8217;s all I&#8217;m saying.</td>
</tr>
<tr style="241px">
<td style="7px" colspan="2"> </td>
<td style="7px"> </td>
</tr>
<tr>
<td style="1px" valign="middle"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/02/021709-0258-kpiswhoami45.jpg" alt="" /></td>
<td style="1px" colspan="2" valign="middle"><a href="http://sharepointmagazine.net/?p=875">Part 1 – Getting to Know You - Intro to SharePoint BI</a></td>
</tr>
<tr>
<td style="1px" valign="middle"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/02/021709-0258-kpiswhoami55.jpg" alt="" /></td>
<td style="1px" colspan="2" 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="1px" valign="middle"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/02/021709-0258-kpiswhoami65.jpg" alt="" /></td>
<td style="1px" colspan="2" valign="middle"><a href="http://sharepointmagazine.net/?p=2569">Part 3 – KPIs – Where do I Come From?</a></td>
</tr>
<tr>
<td style="1px" valign="middle"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/02/021709-0258-kpiswhoami75.jpg" alt="" /></td>
<td style="1px" colspan="2" valign="middle">Part 4 – Dissecting Dashboards</td>
</tr>
<tr>
<td style="1px" valign="middle"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/02/021709-0258-kpiswhoami85.gif" alt="" /></td>
<td style="1px" colspan="2" valign="middle">Part 5 – We Really Need to Talk – Scorecards &amp; Reports</td>
</tr>
<tr>
<td style="1px" valign="middle"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/02/021709-0258-kpiswhoami95.jpg" alt="" /></td>
<td style="1px" colspan="2" 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><br />
http://b-iq.org</p>
<p><strong>References<br />
</strong></p>
<p><a href="http://www.epmreview.com/KPI-Library.html">http://www.epmreview.com/KPI-Library.html</a><br />
<a href="http://nickbarclay.blogspot.com/search?updated-max=2008-01-09T15%3A44%3A00-05%3A00&amp;max-results=20">http://nickbarclay.blogspot.com/search?updated-max=2008-01-09T15%3A44%3A00-05%3A00&amp;max-results=20</a></p>
<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/administration/kpis-%e2%80%93-who-am-i-and-where-do-i-come-from-part-3-of-6">KPIs – Who Am I and Where do I Come From? (Part 3 of 6)</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/9LbSe51f0D3rGYq5kesxHUeU1xw/0/da"><img src="http://feedads.g.doubleclick.net/~a/9LbSe51f0D3rGYq5kesxHUeU1xw/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/9LbSe51f0D3rGYq5kesxHUeU1xw/1/da"><img src="http://feedads.g.doubleclick.net/~a/9LbSe51f0D3rGYq5kesxHUeU1xw/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SharepointMagazine?a=JFXpJcWr8jQ:BrcopZAgHqg:kmCBgzMKvIA"><img src="http://feeds.feedburner.com/~ff/SharepointMagazine?i=JFXpJcWr8jQ:BrcopZAgHqg:kmCBgzMKvIA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SharepointMagazine/~4/JFXpJcWr8jQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/technical/administration/kpis-%e2%80%93-who-am-i-and-where-do-i-come-from-part-3-of-6/feed</wfw:commentRss>
		<feedburner:origLink>http://sharepointmagazine.net/technical/administration/kpis-%e2%80%93-who-am-i-and-where-do-i-come-from-part-3-of-6</feedburner:origLink></item>
		<item>
		<title>SharePoint –Black Hole or Star of Your Business Universe?</title>
		<link>http://feedproxy.google.com/~r/SharepointMagazine/~3/dbFeOTMeidA/sharepoint-%e2%80%93black-hole-or-star-of-your-business-universe</link>
		<comments>http://sharepointmagazine.net/news/sharepoint-%e2%80%93black-hole-or-star-of-your-business-universe#comments</comments>
		<pubDate>Mon, 27 Apr 2009 11:49:37 +0000</pubDate>
		<dc:creator>Julian Warne</dc:creator>
		
		<category><![CDATA[Analysis]]></category>

		<category><![CDATA[News]]></category>

		<category><![CDATA[benefits]]></category>

		<category><![CDATA[black]]></category>

		<category><![CDATA[governance]]></category>

		<category><![CDATA[hole]]></category>

		<category><![CDATA[licensing]]></category>

		<category><![CDATA[sharepoint]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=2862</guid>
		<description><![CDATA[As a CFO and senior business executive would life be better if all your commercial information, everything from files and documents to LOB systems were all accountable and controllable from one platform or portal?<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/news/sharepoint-%e2%80%93black-hole-or-star-of-your-business-universe">SharePoint –Black Hole or Star of Your Business Universe?</a></p>
]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;"><strong>SharePoint -Black Hole or Star of Your Business Universe?</strong></p>
<p>As a CFO and senior business executive would life be better if all your commercial information, everything from files and documents to LOB systems, were all accountable and controllable from one platform or portal?</p>
<p>Imagine definitive decision support, comprehensive implementable governance, anything and everything at your finger tips via a dashboard and &#8216;best bet&#8217; query.</p>
<p>In recent times, and with its ubiquitous commercial acceptance showing no sign of abating, SharePoint has been moving to take this kind of &#8216;center stage&#8217; in the information management universe.</p>
<p>But in many cases SharePoint is filling this role by default, due to its momentum within IT and other business areas, without a comprehensive assessment as to its suitability for this pivotal role.</p>
<p><img class="alignleft size-full wp-image-2872" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/blackhole1.jpg" alt="blackhole1" width="450" height="164" /></p>
<p><em>Could SharePoint be a black hole for your business, drawing in information and content without providing an adequate foundation for information management?</em></p>
<p>Let&#8217;s look at the typical benefits SharePoint delivers then consider some of the strategic implications these benefits portend.</p>
<p><strong>Typical SharePoint Benefits<br />
</strong>There is no doubt that SharePoint delivers extensive business benefit in the information worker and general office productivity area:</p>
<ul>
<li><strong>Document Libraries</strong> - Business content such as documents, spreadsheets, graphics, presentations, media files, even emails and their attachments, can be housed and &#8216;managed&#8217; in SharePoint libraries easily accessible by anyone, anywhere, anytime, via intranet, Extranet or Internet</li>
</ul>
<ul>
<li> <strong>Roles &amp; Controls</strong> - Library controls, and permissions across SharePoint, enforce author, editor, publisher roles and structured responsibilities along with fail-safe versioning, garbage, archival repository and other content controls</li>
</ul>
<ul>
<li> <strong>Search &amp; Surfacing</strong> - Search promises that nothing will ever be &#8216;lost&#8217; again. Anything in your Enterprise in SharePoint, and beyond, can be found or &#8217;surfaced&#8217;</li>
</ul>
<ul>
<li> <strong>Security</strong> - Security is leveraged from your existing Active Directory investment or other authentication system integrating seamlessly with content roles and controls. Single sign-on can make any LOB system, such as financials, ERP or CRM, directly accessible or integrated with your portal</li>
</ul>
<ul>
<li> <strong>Information Management</strong> - Metadata can be tailored to your business and assigned to assist with search, categorization, and information processing</li>
</ul>
<ul>
<li> <strong>Customisation</strong> -SharePoint is extensible with features and functionality that can be exposed and customized, or created for example as Web Parts and seamlessly integrated</li>
</ul>
<p><strong>Implications<br />
</strong>But what are the implications behind these SharePoint benefits and how do they impact your business?</p>
<p>Let&#8217;s consider three basic SharePoint issues that span the business technology &#8217;sophistication&#8217; spectrum from: the basics of content library storage; to custom development; to business intelligence</p>
<p><strong>SharePoint&#8217;s Storage Paradigm Shift<br />
</strong>While the concept of computer storage might be considered somewhat boring and &#8217;something for the Techs&#8217;, it is important to note that SharePoint involves a massive paradigm shift in this area.</p>
<p>In the past, Fileshares have been the most common method of general storage. But their time has passed and it is now almost universally considered a good idea to have all your content in record management systems, document libraries and workspaces.</p>
<p><em></em>But where does all that content actually live once it is in SharePoint in a document library?</p>
<p><img class="alignleft size-full wp-image-2878" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/fileshare1.jpg" alt="fileshare1" width="500" height="182" /><em><br />
Fileshares in Windows, and folders in SharePoint, while functionally similar are very different entities from a storage perspective</em></p>
<p>Doesn&#8217;t SharePoint store content in its own folders and &#8216;fileshares&#8217;, the way it appears on screen?</p>
<p>No. SharePoint stores all its content in a Microsoft SQL Server database.</p>
<p>SQL Server is not a new technology and your business likely already has SQL Server running, but consider the implications of this change:</p>
<ul>
<li><strong>Licensing Cost</strong> - SQL Server involves its own licensing costs both for the purchase of the software and CALS (client access licenses). This is in addition to the SharePoint costs. By contrast storing and sharing files in folders is essentially &#8216;free&#8217;</li>
</ul>
<ul>
<li><strong>Infrastructure</strong> &amp; <strong>Performance</strong> - SQL Server is a sophisticated platform that necessitates specialised infrastructure including servers, storage devices, and staff, in addition to SharePoint. The cost for the use of this infrastructure may be spread over other applications that are already using SQL, but if your business is looking at putting all its content into SharePoint+SQL then this infrastructure will have to scale both in terms of its size and mission critical support.</li>
</ul>
<ul>
<li>If<strong> </strong>you require the SharePoint content to be available on an operational basis special attention will need to be given to SQL I/O performance along with addressing problematic performance issues with SharePoint itself, such as the performance penalty when returning more than 2,000 records in a list. Performance limitations might make certain types of enterprise-wide solutions untenable. Capacity planning is essential. Here is a useful link on <a href="http://technet.microsoft.com/en-us/library/bb961988.aspx">SharePoint capacity planning</a>.</li>
</ul>
<ul>
<li><strong>Migration</strong> - While there are tools that allow the migration of content into SharePoint from earlier versions of SharePoint and other information sources such as Lotus Notes, this is typically not an easy or &#8216;lossless&#8217; exercise. Looking to the future, will there be tools to migrate your content out of SharePoint+SQL if needed? What about all the feature rich content attributes you might build into your SharePoint information management solution - will you be able to take them with you?</li>
</ul>
<p><strong>Custom Development Dilemma<br />
</strong>SharePoint is a great OOTB, &#8216;out of the box&#8217;, productivity tool. But OOTB functionality is never enough! Customization is always demanded to support specific business processes and applications.</p>
<p>However, while SharePoint has a wealth of inbuilt functionality waiting to be tapped, commensurate with the richness of features there is a high degree of complexity that is largely underrated. Development in SharePoint brings its own challenges:</p>
<ul>
<li><strong>Business Coverage</strong>- SharePoint covers many different business areas including content management, business intelligence, document and records management, workflow, portals, etc. Ideal SharePoint solutions should leverage as much of the existing platform functionality as possible without reinventing the wheel.</li>
</ul>
<ul>
<li>For best results a developer should have a <em>holistic functional</em> <em>understanding</em> of SharePoint across all its <strong>business</strong> applications</li>
</ul>
<ul>
<li><strong>Complex Technology</strong> - SharePoint is a complex technology in its own right that spans from web front ends to SQL Server database processes. The right approach, expertise and understanding are required to fully leverage it. Good .Net developers are not automatically good SharePoint developers. Experience, lots of experience, is needed to bring about <em>holistic development understanding. </em>Experience also assists in coping with SharePoint&#8217;s many &#8216;undocumented features&#8217;.</li>
</ul>
<ul>
<li>Because many SharePoint options can be configured without development, and initial development appears easy, overconfidence is often engendered in in-house developers, and overly ambitious development projects can be undertaken with disastrous results</li>
</ul>
<ul>
<li><strong>Duplicitous Paths</strong> -With Microsoft technologies there are often several development paths to achieve a solution and SharePoint is no exception. But despite the seeming logical and extensible nature of a path, a satisfactory result may not be achieved. As this stage of SharePoint&#8217;s maturity, many likely development paths often come to a dead-end through no fault of the logic of the developer or their approach, but because of a SharePoint bug, anomaly or undocumented feature.</li>
</ul>
<ul>
<li>SharePoint is only early into SPK release lifecycle and the many CUs (cumulative updates) are a must</li>
</ul>
<ul>
<li><strong>Development Environment</strong> - a suitable development environment is required which ideally should replicate Production conditions which may involve topologies of web farms, index servers and SQL clusters, Active Directory and Exchange servers. Few environments provide that level of development platform support, although virtualization is closing the gap. This means that SharePoint development projects do not always travel well to the Production environment, even with Solutions and Packages, delivering unforeseen results</li>
</ul>
<ul>
<div class="mceTemp"><img class="alignleft size-full wp-image-2888" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/topology1.jpg" alt="topology1" width="500" height="318" /><br />
<em>SharePoint Production environment topologies can be complex, and are not often replicated in development, with the result that SharePoint solutions do not always travel well when deployed</em></div>
</ul>
<p><strong>Metadata Intelligence</strong><br />
The leveraging of metadata is one of the most underrated areas in SharePoint yet it is invaluable to your business and information management strategy.</p>
<p>For example the implementation of an information management system, incorporating governance and compliance built on SharePoint&#8217;s <em>metadata</em> and <em>workflows </em>functionalality<em>, </em>is a logical application for the platform.</p>
<p>Metadata support allows you to attach keywords that can be used to provide meaning about the content that is loaded, assisting in categorization, search and aggregation. It is also a key to ensuring the alignment of content and business processes to your governance, compliance and information management plans, by being linked back to your associated business goals and objectives.</p>
<p>SharePoint OOTB can leverage the Properties page in all Office documents where metadata for author, title, subject, status, keywords, etc., can be entered. In addition SharePoint has a whole metadata infrastructure that allows you to create, customize and manage your own metadata infrastructure.</p>
<p>This SharePoint metadata, called content types, have particular value in that they can also be used to trigger actions and workflows. For example when a document is loaded into a library, special processes can be triggered based on its metadata.</p>
<p>Let&#8217;s consider some of the implications of even a basic implementation of SharePoint&#8217;s metadata on a large scale. (For ease of discussion I will use the term metadata rather than content type.)</p>
<p><img class="alignleft size-full wp-image-2905" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/propertiescheckin1.jpg" alt="propertiescheckin1" width="500" height="170" /><br />
<em>Note the message &#8216;You MUST fill out any required properties&#8217;</em></p>
<ul>
<li><strong>Mandated Metadata - </strong>It seems like a good idea to allocate metadata to all your SharePoint content because of the associated benefits. So the next obvious step is to <em>mandate</em> metadata i.e. ensure every piece of content that is loaded into SharePoint must be assigned relevant metadata.</li>
</ul>
<ul>
<li>To add metadata to a single document may only take a minute but scale that out across your business to every staff member and to every piece of content, and a sizeable amount of time will be taken up assigning metadata that will erode overall business productivity</li>
</ul>
<ul>
<li><strong>Dirty Metadata - </strong>One way to overcome this &#8216;mandated metadata productivity hit&#8217; is to make the metadata faster and more intuitive to allocate. This can be done by providing metadata in the form of dynamic lists, as opposed to free text fields.</li>
</ul>
<ul>
<li>But even when presented with an easy or &#8217;smart&#8217; pick list, staff may not know what metadata value to assign, or be confronted with too many choices. For example combinations of departments, business units, and projects could produce an overwhelming list of options.</li>
</ul>
<ul>
<li>&#8216;Time poor&#8217; information workers don&#8217;t want to stop their task to find out what metadata should be allocated or go through the process to create a new category. This can lead to erroneous values being assigned just to expedite content loading.</li>
</ul>
<ul>
<li>In some cases there may be purposeful erroneous metadata provided, to obscure business activities such as fraud</li>
</ul>
<ul>
<li><strong>Legacy Metadata - </strong>Most discussions of SharePoint benefits focus on &#8216;greenfields&#8217; SharePoint implementations but all businesses have legacy fileshares, content and systems that can be essential to migrate into SharePoint.</li>
</ul>
<ul>
<li>While it is possible to programmatically assign metadata during migration, in reality it is not worthwhile to do so on any scale unless a metadata or similar policy has previously been in place.</li>
</ul>
<ul>
<li>Consider trying to allocate even simple metadata such as author, document title and version if these are not already associated with the content: fileshare locations by nature provide multi-author storage so authors are not differentiated from PAs, etc.; duplicates and drafts with the same or entirely different titles are common confounding categorization and titling; latest date may not reflect a file master version. These are just some of the issues.</li>
</ul>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="319" valign="top"><img class="alignleft size-full wp-image-2867" src="http://sharepointmagazine.net/wp-content/uploads/2009/03/pileofpapers2.jpg" alt="pileofpapers2" width="270" height="243" /></td>
<td width="319" valign="top"><em><em></em> <em>This much used image helps demonstrate the typical nature of the information and content in most businesses fileshares.</em></em> <em><em>Determining, on any scale, the author, title, keywords of this information is in reality an impossible task.</em></em><em></em><em></em><em>Thus much legacy information comes into SharePoint</em> sans <em>the metadata that could be vital to an understanding of the material, and assist with the information management of the business</em></td>
</tr>
</tbody>
</table>
<ul>
<li><strong>Metadata Meaning</strong> -Metadata seeks to give meaning to content beyond that given by a file name.</li>
</ul>
<ul>
<li>How many metadata properties might be needed to adequately indicate the meaning of a document that spans many diverse areas and topics? Free text metadata would allow more comprehensive explanation but we are back to the &#8216;productivity hit&#8217; issue of the time taken to enter all the metadata.</li>
</ul>
<ul>
<li>Meaning may also differ from different perspectives. How would the allocation of &#8216;<em>definitive</em> meaning&#8217; to files and content be achieved? How would different perspectives and synonyms be handled where different metadata words and terms are used for similar concepts?</li>
</ul>
<ul>
<li>Consider the issue of trying to assign comprehensive metadata to all the images, video, audio and VoIP content in your business. How much resource would be required? Would the metadata be accurate and definitive using any current methods?</li>
</ul>
<ul>
<li>In terms of scale, how would the process of allocating metadata relating to every email be handled?</li>
</ul>
<ul>
<li>What about metadata relationships between content, such as between documents and documents, images, emails, projects, departments, people, roles? Would this type of meaning and understanding gained provide any useful insight into your business and be of value?</li>
</ul>
<p>These are issues that may currently seem most poignant to the legal profession and e-Discovery but are increasing in import for all businesses.</p>
<p>Metadata that provides meaning as described above, including that for unstructured content, can provide valuable insight into business operations providing a basis for <em>real</em> business intelligence, way beyond that of the traditional BI with just numbers and charts in a spreadsheet.</p>
<p><strong>Conclusion<br />
</strong>SharePoint is a good information management and general office productivity platform. However it has its issues that are best to be aware of and managed, rather than just &#8216;let loose&#8217; in your business, preventing it from becoming a &#8216;black hole&#8217;.</p>
<p>In the context of the issues discussed above:</p>
<p><strong>The Good</strong> is that SharePoint will, in line with the Pareto principle, OOTB meet roughly 80% of your general information management needs and in the process provide a stable scalable platform.</p>
<p><strong>Good</strong> <strong>also</strong> is that assistance with SharePoint development, both in terms of available tools and developer experience, is increasing at a rapid rate. At the time of writing this article, a quick search of <a href="http://www.codeplex.com/">www.CodePlex.com</a> returned nearly 700 &#8216;open source&#8217; projects providing explanation and assistance on SharePoint development. Countless blog articles by SharePoint gurus likewise provide commentary on numerous SharePoint solutions.</p>
<p><strong>The Bad</strong> is that if you want SharePoint, then SQL Server and its associated overheads are unavoidable.</p>
<p><strong>Bad also</strong> is that with regard to going beyond the metadata basics, there is no solution available within SharePoint that address the issues discussed. However this is not so bad as it seems as there is <em>no</em> solution available within any of the current generation of similar platforms.</p>
<p>How to get more meaning from business information and unstructured content is the next major conundrum facing business managers today. However I believe this type of metadata support and analysis is one of the most exciting challenges, and will be the basis for the next level of <em>real</em> business intelligence and competitive business advantage.</p>
<p>Next generation tools, providing <em>definitive</em> meaning to structured and unstructured information and a full understanding of information relationships, are just starting to enter the mainstream and gain more attention. These tools can work with SharePoint as well as hundreds of other information sources and hold the promise of providing an incredibly comprehensive understanding and powerful information management tool for your business.</p>
<p>I will be looking at this next-generation solution in more detail shortly.</p>
<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/news/sharepoint-%e2%80%93black-hole-or-star-of-your-business-universe">SharePoint –Black Hole or Star of Your Business Universe?</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/SHDV1lINOZwR7N72qgW8ksxH1Gg/0/da"><img src="http://feedads.g.doubleclick.net/~a/SHDV1lINOZwR7N72qgW8ksxH1Gg/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/SHDV1lINOZwR7N72qgW8ksxH1Gg/1/da"><img src="http://feedads.g.doubleclick.net/~a/SHDV1lINOZwR7N72qgW8ksxH1Gg/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SharepointMagazine?a=dbFeOTMeidA:kJ_hO70StlA:kmCBgzMKvIA"><img src="http://feeds.feedburner.com/~ff/SharepointMagazine?i=dbFeOTMeidA:kJ_hO70StlA:kmCBgzMKvIA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SharepointMagazine/~4/dbFeOTMeidA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/news/sharepoint-%e2%80%93black-hole-or-star-of-your-business-universe/feed</wfw:commentRss>
		<feedburner:origLink>http://sharepointmagazine.net/news/sharepoint-%e2%80%93black-hole-or-star-of-your-business-universe</feedburner:origLink></item>
		<item>
		<title>Part 6 - Lessons learnt from Leveraging the SharePoint Platform</title>
		<link>http://feedproxy.google.com/~r/SharepointMagazine/~3/Xbcx6J2HMmc/part-6-lessons-learnt-from-leveraging-the-sharepoint-platform</link>
		<comments>http://sharepointmagazine.net/technical/development/part-6-lessons-learnt-from-leveraging-the-sharepoint-platform#comments</comments>
		<pubDate>Thu, 23 Apr 2009 14:30:14 +0000</pubDate>
		<dc:creator>Jeremy Thake</dc:creator>
		
		<category><![CDATA[Customisation]]></category>

		<category><![CDATA[Development]]></category>

		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=3115</guid>
		<description><![CDATA[There are plenty of people trying to take the SharePoint Development approach and using Solution Packages to deploy to the farm.<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/development/part-6-lessons-learnt-from-leveraging-the-sharepoint-platform">Part 6 - Lessons learnt from Leveraging the SharePoint Platform</a></p>
]]></description>
			<content:encoded><![CDATA[<p><a href="../technical/news/technical/development/leveraging-the-sharepoint-platform-part-1">Part  1 - What is the SharePoint Platform</a><br />
<a href="../technical/news/news/analysis/leveraging-the-sharepoint-platform-part-2">Part  2 - What capabilities to start with</a><br />
<a href="../technical/news/analysis/leveraging-the-sharepoint-platform-part-3">Part  3 - How to start with the SharePoint Platform</a><br />
<a href="../technical/news/analysis/leveraging-the-sharepoint-platform-part-4">Part  4 - Levels of leveraging the SharePoint Platform</a><br />
<a href="http://sharepointmagazine.net/technical/development/leveraging-the-sharepoint-platform-part-5-why-use-sharepoint-as-a-development-platform">Part 5 - Why use  SharePoint as a Development Platform</a><br />
Part 6 - Lessons learnt from Leveraging  the SharePoint Platform</p>
<p style="margin: 0in 0in 0in 0in;">
<p style="margin: 0in 0in 0in 0in;">There are quite a lot of people in the SharePoint community flying the SharePoint Development flag high<span> </span>and proudly. The SharePointDevWiki.com is growing steadily each week and I&#8217;m extremely pleased that<span> </span>there are more and more community members submitting content on there.</p>
<p>There are plenty of people <span style="font-weight: bold;">trying</span> to take the SharePoint Development approach and using Solution<span> </span>Packages to deploy to the farm. But more and more I am seeing this scenarios below.</p>
<p style="margin: 0in; font-weight: bold;">
<p style="margin: 0in; font-weight: bold;">Scenario One</p>
<ul>
<li><span>The development team sit down      with the client and get the requirements for their new      &#8220;Intranet&#8221;</span></li>
<li>Start off with a Solution Package and buildingSite Fields, Content Types, Lists, Pages, Web Parts androlling this into a UAT environment (or worse Production)</li>
<li><span>The &#8220;Intranet&#8221; in      UAT then gets a review from the client</span></li>
<li><span>Changes are requested by the      client, but the client also wants to have a &#8220;play&#8221; with the UAT      environment</span></li>
<li><span>Developers start off on the      right foot and add a few extra Site Fields, amend the List Templates and      have<span> </span>tested it in their Development      environment</span></li>
<li><span>The Dev team are then ready      to deploy this to UAT&#8230;but the client has done more than &#8220;play&#8221;      in this<span> </span>environment and wants this      content in there when the Developers release the changes.</span></li>
</ul>
<p><span style="font-weight: bold;">FIRST TIP</span>: ensure they are aware that anything they do in UAT is not making it to production! UAT is<span> </span>very different from content STAGING<span> </span>environments.</p>
<ul>
<li><span>So the Dev team release the      new .wsp solution package to the farm and then run a script to delete      the<span> </span>current site collection and      create a new one using the new templates and scripts&#8230;this obviously      deletes<span> </span>any content that was in      there.</span></li>
<li><span>This gets a tick in the box      and the site goes into Production</span></li>
<li><span>Content is authored in the      new production site and they want to add a new Site Field to a list that      is<span> </span>commonly used across multiple      department sites within the Intranet</span></li>
<li><span>Changing the List Template in      the Solution Package and redeploying to the farm will not amend the<span> </span>instances of the List already created.      So the Dev manually makes these changes and so the spiral of pain<span> </span>starts&#8230;</span></li>
</ul>
<p>Take this scenario 6 months down the line, the Dev no longer bothers updating the solution package as<span> </span>he is doing it all manually in production anyway and no need to go back and change it in source<span> </span>control&#8230;&#8221;that&#8217;s not used anymore anyway&#8221;.</p>
<h2>Scenario Two</h2>
<p>Scenario two steps in where Devs originally deployed style sheets to the Style Sheets library using<span> </span>Solution Packages and then someone gets hold of SharePoint Designer and ignores the warnings and<span> </span>modifies the style sheet here. Lots of changes are made&#8230;but not put back into the source style sheet in<span> </span>the solution package.<br />
<span> </span>Later that month a web part C# file changes and a new style is added to the style sheet in the Solution<span> </span>package. The new package is redeployed&#8230;guess what, it&#8217;s going to redeploy the style sheet but not<span> </span>overwrite the one in the site because it&#8217;s broken its ties with the original source! So the web part will not<span> </span>find that style and not render properly.</p>
<p><img class="alignnone size-full wp-image-3116" src="http://sharepointmagazine.net/wp-content/uploads/2009/04/update.png" alt="update" width="778" height="391" /></p>
<p><span style="font-weight: bold;">TIP 2</span>: lock down files deployed with solution packages so that they can only be changed via<span> </span>deployment. Do this via &#8217;sealing&#8217; elements and also via permissions on items.</p>
<p><span style="font-weight: bold;">TIP 3</span>: don&#8217;t let developers near the production and UAT boxes. Don&#8217;t let their dirty fingers anywhere<span> </span>near the 12 hive directly! Get administrators to deploy to UAT and Production using WSPs and change<span> </span>scripts.</p>
<p style="margin: 0in; font-weight: bold;">
<p style="margin: 0in; font-weight: bold;">
<h2>Why does all this happen?</h2>
<p>The biggest problem is that developers want to be able to automate the entire setup process especially in<span> </span>a build server scenario and this is why everything initially ends up being deployed via a Solution Package.</p>
<p><span style="font-weight: bold;">TIP 4</span>: draw a line between what is development and what is customisation.</p>
<p>Either do everything in Development or do everything in customisation for an element e.g. don&#8217;t build<span> </span>your event receivers in a dll and package with a WSP, and have a List Template in the wsp, but then<span> </span>manually use a tool like Event Receiver Manager to add the event receiver! On creating the list via a Site<span> </span>Definition or via a Feature, use a Feature Receiver to attach the event receiver there and then! It&#8217;s self<span> </span>documenting that way!</p>
<p>Whatever you do, document where each type of element sits and where it will be found: in a WSP, update script, command line up, manual steps etc.</p>
<p>Below is an example table that shows the boundaries between elements. Note this is by no means complete, but just to give you an idea&#8230;plenty of things in Development may sit in Customisation for a lot of teams. You can also give this to external integrators your team may use for implementations to make sure EVERYONE works the same way.</p>
<div style="direction: ltr;">
<table style="border: 1pt solid #a3a3a3; direction: ltr; border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.3326in;">
<p style="margin: 0in; font-weight: bold;">DEVELOPMENT</p>
</td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.6034in;">
<p style="margin: 0in; font-weight: bold;">CUSTOMISATION</p>
</td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 1.9708in;">
<p style="margin: 0in; font-weight: bold;">CONTENT</p>
</td>
</tr>
<tr>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.3326in;">Web Parts with   code</td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.6034in;">Site Instances</td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 1.9708in;">Page Instances</td>
</tr>
<tr>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.3326in;">Stylesheets</td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.6034in;">List Instances</td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 1.9708in;">List Item   Instances</td>
</tr>
<tr>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.3326in;">Content Types</td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.6034in;">Initial Page   Instances e.g. Default.aspx</td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 1.9708in;">Workflow Instances</td>
</tr>
<tr>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.3326in;">Site Fields</td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.6034in;"></td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 1.9708in;"></td>
</tr>
<tr>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.3326in;">List Templates   (for fixed lists)</td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.6034in;"></td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 1.9708in;"></td>
</tr>
<tr>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.3326in;">Master Pages</td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.6034in;"></td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 1.9708in;"></td>
</tr>
<tr>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.3326in;">Page Layouts</td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.6034in;"></td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 1.9708in;"></td>
</tr>
<tr>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.3326in;">Style Sheets</td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.6034in;"></td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 1.9708in;"></td>
</tr>
<tr>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.3326in;">Master Page/Page   Layout/Style sheets Images</td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.6034in;"></td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 1.9708in;"></td>
</tr>
<tr>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.3326in;">Site Templates</td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.6034in;"></td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 1.9708in;"></td>
</tr>
<tr>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.3326in;">Webtemp files</td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.6034in;"></td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 1.9708in;"></td>
</tr>
<tr>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.3326in;">Custom Controls</td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.6034in;"></td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 1.9708in;"></td>
</tr>
<tr>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.3326in;">JavaScript files</td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.6034in;"></td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 1.9708in;"></td>
</tr>
<tr>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.3326in;">Web.config changes</td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.6034in;"></td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 1.9708in;"></td>
</tr>
<tr>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.3326in;">Event Receivers</td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.6034in;"></td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 1.9708in;"></td>
</tr>
<tr>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.3326in;">Feature Receivers</td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.6034in;"></td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 1.9708in;"></td>
</tr>
<tr>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.3326in;">Features</td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.6034in;"></td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 1.9708in;"></td>
</tr>
<tr>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.3326in;">Workflow</td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.6034in;"></td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 1.9708in;"></td>
</tr>
<tr>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.3326in;">InfoPath   (Administrative Templates)</td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 2.6034in;"></td>
<td style="border: 1pt solid #a3a3a3; padding: 4pt; vertical-align: top; width: 1.9708in;"></td>
</tr>
</tbody>
</table>
</div>
<p><span style="font-weight: bold;">TIP 6</span>: Remember that changing elements won&#8217;t affect their instances e.g. List Templates, Site Templates,<span> </span>Workflow Instances. All the other elements are referenced and linked and will be automatically updated<span> </span>once pushed out into the Farm.</p>
<p>To modify existing instances you will need to provide update scripts using the object model either as<span> </span>custom window console application or powershell script.</p>
<p><span style="font-weight: bold;">TIP 7</span>: Get your dev team to first off create a script that deletes the site collection and recreates the<span> </span>site collection (using custom Site Defintion if approach taken) and then run the scripts to populate<span> </span>content required. Use this script when in own Dev Virtual Machine AND Shared Development<span> </span>Environment AND Build Server.</p>
<p><span style="font-weight: bold;">TIP 8</span>: Always keep UAT and Production one change step away from each other. Always deploy to<span> </span>UAT and Prod using WSPs, but also use update scripts rather than deleting Site collection and creating it<span> </span>again! Have the ability to take the approach of Updating in Shared Dev environment (by taking snapshot<span> </span>of UAT/Prod) to test update scripts before going to UAT.</p>
<p><strong>Conclusion</strong></p>
<p>Well this is the end of this 6 part series on Leveraging the Platform. Hopefully it&#8217;s been useful to you. Very shortly I will be placing some more ideas up on the <a href="http://www.sharepointdevwiki.com">SharePointDevWiki.com</a> around these change control processes to help SharePoint Server teams with these tasks!</p>
<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/development/part-6-lessons-learnt-from-leveraging-the-sharepoint-platform">Part 6 - Lessons learnt from Leveraging the SharePoint Platform</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/MXPFEWcBhpm7zFOmxorhdcIN0gE/0/da"><img src="http://feedads.g.doubleclick.net/~a/MXPFEWcBhpm7zFOmxorhdcIN0gE/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/MXPFEWcBhpm7zFOmxorhdcIN0gE/1/da"><img src="http://feedads.g.doubleclick.net/~a/MXPFEWcBhpm7zFOmxorhdcIN0gE/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SharepointMagazine?a=Xbcx6J2HMmc:04d5qpol40k:kmCBgzMKvIA"><img src="http://feeds.feedburner.com/~ff/SharepointMagazine?i=Xbcx6J2HMmc:04d5qpol40k:kmCBgzMKvIA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SharepointMagazine/~4/Xbcx6J2HMmc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/technical/development/part-6-lessons-learnt-from-leveraging-the-sharepoint-platform/feed</wfw:commentRss>
		<feedburner:origLink>http://sharepointmagazine.net/technical/development/part-6-lessons-learnt-from-leveraging-the-sharepoint-platform</feedburner:origLink></item>
		<item>
		<title>Everything You Need to Know about BDC: Part 6 of 8</title>
		<link>http://feedproxy.google.com/~r/SharepointMagazine/~3/fZxaubt_EJo/everything-you-need-to-know-about-bdc-part-6-of-8</link>
		<comments>http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-6-of-8#comments</comments>
		<pubDate>Sun, 19 Apr 2009 20:44:53 +0000</pubDate>
		<dc:creator>Randy Williams</dc:creator>
		
		<category><![CDATA[Administration]]></category>

		<category><![CDATA[Customisation]]></category>

		<category><![CDATA[Technical]]></category>

		<category><![CDATA[Active Directory]]></category>

		<category><![CDATA[BDC]]></category>

		<category><![CDATA[Business Data Catalog]]></category>

		<category><![CDATA[sharepoint]]></category>

		<category><![CDATA[User Profiles]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=2466</guid>
		<description><![CDATA[In this article, the focus will be on configuring User Profiles to import properties from external systems via the BDC.<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-6-of-8">Everything You Need to Know about BDC: Part 6 of 8</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Greetings and welcome to Part 6 of our Business Data Catalog (BDC) Series.  In this article, the focus will be on configuring User Profiles to import properties from external systems via the BDC.  I’ll start off by giving you a good grounding in the overview section.  I’ll then jump into creating the two different types of import connections, 1:1 and 1:many, and then show you in detail how to map your profile properties.   Finally, I’ll wrap up with some troubleshooting tips.  By the end, you’ll have a solid understanding of how to configure your ADFs and User Profiles to import and map your properties.</p>
<p>In case you’re just joining us in the series, here are our previous five articles:</p>
<p><a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-1-of-8" target="_blank">Part 1</a>.  BDC Purpose and technical architecture</p>
<p><a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-2-of-8" target="_blank">Part 2</a>.  Detailed overview of the Application Definition File (ADF) and how to develop one to connect to a back-end database</p>
<p><a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-3-of-8" target="_blank">Part 3</a>.  Developing an ADF to connect to Web Services</p>
<p><a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-4-of-8" target="_blank">Part 4</a>.  Consuming Business Data through Web Parts and SharePoint lists</p>
<p><a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-5-of-8" target="_blank">Part 5</a>.  Implementing Enterprise Search with Business Data</p>
<h4>Overview</h4>
<p>User Profiles within MOSS are a great way to store key information about SharePoint users.  This information, stored within individual profile properties, contains useful content such as first name, last name, date of hire, the user’s manager, and numerous personal details such as interests and skills.  This user metadata can be used when executing workflow, searching for people, utilizing social networking aspects such as my sites, defining audiences, any many other SharePoint capabilities.  SharePoint contains dozens of built-in properties, and you can add any custom properties as needed.</p>
<p>While all of this a great benefit to enhancing SharePoint’s knowledge of these people, there may be a drawback to this.  Here is yet another database of information that needs to be populated!  In most organizations some of this information lives within Active Directory (AD) and perhaps other details can be found in repositories such as HR systems, so you can say that SharePoint is really just duplicating what already exists elsewhere.  The primary goal of this article is to show you how you can eliminate this redundant data entry by pulling this authoritative information from your external systems through the BDC.</p>
<p>User Profiles and the profile properties are all maintained within your Shared Services Provider (SSP).  User profiles can be created manually, or you can create import connections which allows you to automatically synchronize these values from external systems.  Supported external systems are AD, LDAP (such as Lotus Notes), and BDC.</p>
<p>An important detail you must understand is that only AD or LDAP can be set up as a primary (or master) connection.  A BDC connection cannot be.  A primary connection means that a SharePoint profile with an account name (e.g. domain\username) can be created from this source.  BDC can only be a secondary connection, meaning that it is only able to fill in additional properties for an existing profile—in other words, it cannot create a profile.</p>
<p>To better explain, see Figure 1 below which shows the profile being created (based on the Account name) from AD and additional properties coming from an HR System (click image to enlarge):</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/01/image24.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/01/image-thumb24.png" border="0" alt="image" width="404" height="294" /></a></p>
<p><strong>Figure 1: Mapping profile properties between SharePoint and external systems</strong></p>
<p>The arrows reflect the mapping between SharePoint profile properties and columns in external systems.  You can see that some information (such as first and last name) may be duplicated in external systems.  When defining mapping for a profile property, you can only specify a single source for the data.  Based on the arrows, the decision was made to pull the first and last name from AD.</p>
<p>For many organizations, this is a common scenario.  AD, maintained by the IT group, typically contains only a minimal amount of accurate user meta data.  Other systems, often maintained by the HR group, contains additional values.  SharePoint allows you to set up multiple primary and secondary connections to ensure all your profiles can be created and populated as needed.</p>
<p>Now that you have a basic understanding, the rest of the article will focus on how to create and configure these secondary BDC import connections.</p>
<h4>Creating BDC Import Connections</h4>
<p>Prior to creating a BDC Import Connection, I recommend you configure and ensure that your AD or LDAP primary connection is functioning.  Once this is working, you can then focus on your secondary BDC connection.  For my upcoming demos that I’ll walk you through, I am pulling accounts from a single domain inside AD.</p>
<p>To create a BDC Import connection, first access your User Profile and Properties screen within your SSP (Central Administration –&gt; SSP –&gt; User profiles and properties).  On this screen, click on the View Import Connections link.  Then click on the Create New Connection toolbar button.  Finally, choose Business Data Catalog type in the drop down list.  This will yield the following screen:</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/01/image7.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/01/image-thumb7.png" border="0" alt="image" width="504" height="356" /></a><br />
<strong>Figure 2: Creating a BDC Import Connection </strong></p>
<p>In Figure 2 above, you’ll notice that you have two mapping options (depicted by the radio buttons),  1:1 and 1:many.  Let’s look at each option in detail:</p>
<h4>1:1 Import Connection Type</h4>
<p>A 1:1 connection is the most common type of connection that is used.  This means that a single profile in SharePoint will map to a single entity record that is returned from BDC.  For example, if we have a user profile for synergy\afuller as shown in Figure 1 above, this user will also exist in an external system.  For a 1:1 mapping, a Specific Finder method will be called based on the selected entity.  This shouldn’t surprise you as a Specific Finder method returns a single record from the external system.  A good question you might be thinking is how does it know which record to pull?  I’ll answer this question as I show you how to configure the connection.</p>
<p>To configure the 1:1 mapping as shown in Figure 2, we need to first start off by creating or identifying an existing profile property that can be used to uniquely identify the user in the external system.  This property must also match the identifier that is defined for your entity in your ADF.  In my example, I will be using EmployeeID which is the primary key for an Employees table in a SQL Server database.  Employees represents a table usually found in HR or ERP systems.  Here is the Identifier as reflected in the ADF:</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/01/image8.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/01/image-thumb8.png" border="0" alt="image" width="404" height="61" /></a><br />
<strong>Figure 3: EmployeeID as the Identifier for Employees Entity</strong></p>
<p>And here is the Specific Finder:</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/01/image9.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/01/image-thumb9.png" border="0" alt="image" width="534" height="103" /></a><br />
<strong>Figure 4: Specific Finder for Employees Entity</strong></p>
<p>As you can see, I have selected EmployeeID to be the unique identifier.  Since I don’t have a built-in profile property in SharePoint that stores EmployeeID, I’ll create one.  This is necessary for the 1:1 mapping to work.  Here is how it looks after I’ve created it:</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/01/image10.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/01/image-thumb10.png" border="0" alt="image" width="346" height="60" /></a><br />
<strong>Figure 5: Newly Created EmployeeID Profile Property</strong></p>
<p>I chose the integer type because the property’s type must be compatible with the type defined in the Identifier (which was defined as System.Int32 as shown in Figure 3).</p>
<p>Now that this is done, I can create my BDC Import connection.  (Note: Even though you are only creating a 1:1 mapping that will use a Specific Finder, this screen also expects a Finder method.  Even though the Finder method is only used when creating 1:Many connections as discussed below, you must still have one or you will get an error when you select the entity from the catalog in this screen.)</p>
<p>Going back from Figure 2 above, after selecting Business Data Catalog as the type, you must enter a connection name.  I recommend a friendly name that you’ll easily recognize. For my demo, since I’m pulling employee information from an HR system, I’ll call the connection HREmployee.  Here is how it looks just prior to saving:</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/01/image11.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/01/image-thumb11.png" border="0" alt="image" width="334" height="306" /></a><br />
<strong>Figure 6: Creating a 1:1 Import Connection</strong></p>
<p>You’ll notice that I selected the EmployeeID profile property that was just created.  For this to work, I now need to go into my current SharePoint profiles and manually enter in a values for EmployeeID.  This is necessary in my example since SharePoint must know what value to pass to the Specific Finder.  If you’re using a built-in profile property that is already populated (such as the Account name), you don’t need to do this.</p>
<p>Now that the 1:1 relationship between the User Profile and the external system is set up, it’s time to figure out which profile properties you want to import.  If you refer back to Figure 1 above, you’ll see that I illustrate the importing of Title and About me properties from the external system.</p>
<p>For the demo here, I’ll map two existing properties, Hire Date and About me.  You do this by editing the profile property (SSP –&gt; User profile and properties –&gt; View profile properties –&gt; Choose a property and edit).  There’s no reason why I can’t create new properties and map these; the process is the same.  Here is how to map the Hire date profile property to the HireDate column from the HREmployees import connection:</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/01/clip-image001.gif"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/01/clip-image001-thumb.gif" border="0" alt="clip_image001" width="525" height="345" /></a><strong><br />
Figure 7: Mapping Hire Date</strong></p>
<p>Figure 7 above shows the upper and lower portion of the same screen.  When choosing a column in the Data source field to map drop down list, you’ll be presented with a list of all the columns returned from the Specific Finder.  So, the rule of thumb is the ensure that you are returning all columns you want to map from your Specific Finder.  As with creating the import connection, when mapping properties this way, you must ensure the data types are compatible.  If they are not, you’ll be given an error message like this: <em>Cannot map to this data source field. This property is of type &#8216;date&#8217; and the data source field you are mapping to is of type &#8216;System.String&#8217;</em>.</p>
<p>I have also mapped the About me property to the Notes column defined in the Specific Finder.  At this point, the mapping configuration is in place.  We’re not quite done yet, however.</p>
<p>Another important step is to ensure that your Default Content Access Account has permissions to update these profile properties through the BDC.  The Default Content Access Account is configured when setting up Enterprise Search (SSP –&gt; Search settings –&gt; Default content access account).  If you prefer, you can also set a specific account when configuring the User Profile Import.  Just go to SSP –&gt; User profile and properties –&gt; Default access account.  Now that you know what your access account is, you must grant this account two sets of permissions:  1) Permissions to update your profile properties and 2) permissions to call into these BDC methods.</p>
<p>To grant permissions to update profile properties, go to SSP –&gt; Personalization services permissions.  On this screen, grant your access account the Manage User Profiles permission as shown here:</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/01/image13.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/01/image-thumb13.png" border="0" alt="image" width="384" height="236" /></a><br />
<strong>Figure 8: Granting Content Access Account Manage User Profiles Permissions</strong></p>
<p>If you’ve worked much with profile properties, you’ve probably noticed that each property can be individually secured by adjusting its privacy setting.  The Manage User Profiles permission grants my access account (SYNERGY\MOSS.Search) write permissions to all profile properties.  Without this, you’ll need to set the privacy level of each mapped property to Everyone, which may not be the best security level.</p>
<p>The second permission is to grant this access account permissions to the BDC entity.  If you’ve been following our series, we covered BDC permissions in <a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-2-of-8" target="_blank">Part 2</a>.  The minimum permission you need to grant is Execute as shown below.  You access this screen from SSP –&gt; View Applications –&gt; &lt;Select ADF&gt; –&gt; &lt;Select entity&gt; –&gt; Manage Permissions.  In this screen shot, I grant MOSS.Search execute permissions to the Employees entity:</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/01/image14.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/01/image-thumb14.png" border="0" alt="image" width="464" height="165" /></a><br />
<strong>Figure 9: Granting Access Account Entity Permissions in BDC</strong></p>
<p>Finally, we are now done and ready to import.  Let’s quickly recap to make sure we have these steps down.  Again, we’re talking about a 1:1 mapping.</p>
<p>1.  Ensure ADF is prepared with a Specific Finder returning the columns you want to map.</p>
<p>2.  Create a new or choose an existing profile property that contains values to match the entity identifier.  In my example above, I used EmployeeID.</p>
<p>3.  Create a 1:1 import connection.</p>
<p>4.  Map your desired profile properties to columns returned from Specific Finder.</p>
<p>5.  Grant your content access account permissions</p>
<p>To start the import, return to the main User Profiles screen and click Start full import.  This will first do a full import from your primary import connection.  The status here is reflected next to Profile import status shown below.  Once that is done (and sometimes with a brief minute or two delay after it finishes), the secondary imports from BDC will begin.  This is reflected next to Membership &amp; BDC import status.  Both are shown highlighted here:</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/01/image15.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/01/image-thumb15.png" border="0" alt="image" width="524" height="262" /></a><br />
<strong>Figure 10: User Profile import status</strong></p>
<p>Once the profile imports complete (and it may take from several minutes to possibly an hour for thousands of users), you’ll want to check the import log to get a sense on whether it succeeded.  To do so, click the View import log link.  When reading the log, you should know that a PEOPLE_IMPORT content source refers to individual person crawls through your primary import connection, whereas PEOPLE_DL_IMPORT refers to group (i.e. distribution list) crawls.  PEOPLE_DL_IMPORT is also where your secondary import connections through BDC are logged, so it’s relevant to us in the scope of this article.  Here is a part of the log showing both content sources for one user, Andrew Fuller.</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/01/image16.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/01/image-thumb16.png" border="0" alt="image" width="604" height="76" /></a><br />
<strong>Figure 11: User Profile Import Log</strong></p>
<p>Even though the logs may look fine, you’ll certainly want to verify some of the mapped values come over.  To view one, simply click on View user profiles and select a user.  In Figure 11 below, here are the two mapped properties for synergy\afuller:</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/01/clip-image00191.gif"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/01/clip-image0019-thumb1.gif" border="0" alt="clip_image001[9]" width="500" height="221" /></a><strong><br />
Figure 12: About me and Hire date values pulled in by profile import</strong></p>
<p>Since I mapped the About me property, you can also see this within the user’s My Profile found in their My site.  Here is Andrew Fuller’s:</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/01/image18.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/01/image-thumb18.png" border="0" alt="image" width="504" height="166" /></a><br />
<strong>Figure 13: Andrew Fuller’s My Profile page</strong></p>
<p>Now that you have a solid overview of 1:1 mappings, let’s turn our attention to 1:many.</p>
<h4>1:Many Import Connection Type</h4>
<p>While less common than 1:1 connections, a 1:many is handy in a few situations.  Let me give you one example.  As mentioned in the overview section above, the IT group typically manages basic user attributes in AD.  In all my years of consulting, I’ve encountered very few organizations that actually keep these attributes up to date.  The problem is that IT is usually busy handing a myriad of critical problems, and they don’t usually bother updating less important attributes such as someone’s manager.  As long as the permissions are right, that’s what is important to them.</p>
<p>This can cause problems, however.  One of the useful SharePoint profile properties is Manager which gives SharePoint knowledge of the organizational hierarchy.  This was shown in Figure 13 above when looking at Andrew Fuller’s My Profile page.  By default, this property is mapped to the manager setting for the user in AD.  However, if this value is not set or out of date, SharePoint won’t have an accurate picture of the organization.</p>
<p>To correct this problem, we will pull the manager from a Departments table that is stored in our external HR system.  Here is where the 1:many comes in.  Recognize that many users will have the same department.  The idea is that we want to use the department profile property in SharePoint, which is correctly set, and use that to look up into the Departments table (in the external system) to pull the manager for that department.  So, you can think of the 1:many to be for each department there will be many user profiles with that value.</p>
<p>Let me show you how I configure the mapping to pull the Manager property from our HR System.  I start off by adding another Import connection.  Yes, you can have multiple import connections coming from BDC.  I call this one HREmployeesGetManager and here is how it is configured:</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/01/image19.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/01/image-thumb19.png" border="0" alt="image" width="354" height="323" /></a><br />
<strong>Figure 14: Creating a 1:many import connection</strong></p>
<p>When choosing the 1:many mapping radio button, you have two drop downs to fill in.  You first need to select the filter.  The choices you have will be the filter descriptors that have been made available for the entity’s Finder method.  Hence, to use 1:many mapping, you must have a finder method and at least one filter descriptor.  (Note: if you cannot select 1:many mapping, it is probably because you don’t have filter descriptors defined in your ADF.)</p>
<p>For my demo, here is the Finder method and filter descriptor for the Departments entity:</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/01/image20.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/01/image-thumb20.png" border="0" alt="image" width="524" height="130" /></a><br />
<strong>Figure 15: Finder method for Departments entity</strong></p>
<p>In the SQL select query, you can see that I am selecting the DepartmentID, DepartmentName and Manager columns based on a certain department name.  The next step is to change the default mapping for the Managers property.  Here is how I have changed it:</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/01/image21.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/01/image-thumb21.png" border="0" alt="image" width="344" height="97" /></a><br />
<strong>Figure 16: New mapping for Managers profile property</strong></p>
<p>For the Data source field to map, I have pointed this to the Manager column.  Other column choices are the other columns returned from the Finder method.  For the last text box (Manager field string format in AD), you can leave this unchanged.</p>
<p>That’s it.  Run another import, and you should now have your manager property coming from your external HR system.  For this to work, you will need to ensure your Department property is populated for your user profiles.  In my case, this value was still coming from AD.  That’s right, you can use a value that is imported from AD and pass that as a parameter to your BDC connection.  Pretty cool.</p>
<p>Let me make one last point on 1:Many import connections:  Be careful if your Finder method returns more than one record, and your mapped property does not allow multi-values.  For example, perhaps the HR system had two department records with the same name.  And for each record, a different manager is set.  When the import runs and it tries to pull the manager based on the name, two records will be returned. When this happens, the import process will take the first record it finds, and this may not be the one you want.  If you are using a multi-valued property, however, it works nicely and will store the values for all records that are found.</p>
<h4>Troubleshooting Tips</h4>
<p>When troubleshooting import problems, you’ll definitely want to go to the SharePoint logs (by default C:\Program Files\Common Files\microsoft shared\Web Server Extensions\12\LOGS).</p>
<p>When mapping, a profile property can be mapped to only one source (primary or secondary).  Similarly, a column from the Specific Finder (1:1 connection) or Finder (1:many connection), can only be mapped once.  For example, if you map the HireDate column to one profile property, you cannot also map it to another.</p>
<p>Remember that you can only map compatible data types.  Fortunately, you will get this error when you try to save your profile property.</p>
<p>When mapping strings, be careful about the column length.  If your profile property only supports 25 characters, and you try to store 50 characters that is the returned value from BDC, you will get an import error for that profile. You would only know this is a problem by seeing this error in the SharePoint logs.  (Note: you cannot change the length of any of the out-of-the-box profile properties.  In this case, you would need to create a new property.)</p>
<p>When creating BDC import connections using the UI, the entity selected from the catalog must expose both Finder and Specific Finder methods.  This is necessary, even if you plan on using only 1:1 or 1:Many connection types.</p>
<h4>Conclusion</h4>
<p>In this article, we covered everything you need to know about importing User Profiles from BDC.  And you now know as much about this as I do. <a href="http://sharepointmagazine.net/wp-content/uploads/2009/01/image25.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/01/image-thumb25.png" border="0" alt="image" width="16" height="14" /></a></p>
<p>Coming up in Article 7, we will cover the BDC API.  This will allow you to call into the BDC programmatically from your custom applications, web parts, or any other .NET code you need to write.</p>
<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-6-of-8">Everything You Need to Know about BDC: Part 6 of 8</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/8kDgvOw02VdzpkbAbbZdkHPJrWE/0/da"><img src="http://feedads.g.doubleclick.net/~a/8kDgvOw02VdzpkbAbbZdkHPJrWE/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/8kDgvOw02VdzpkbAbbZdkHPJrWE/1/da"><img src="http://feedads.g.doubleclick.net/~a/8kDgvOw02VdzpkbAbbZdkHPJrWE/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SharepointMagazine?a=fZxaubt_EJo:js-0AoSzhk8:kmCBgzMKvIA"><img src="http://feeds.feedburner.com/~ff/SharepointMagazine?i=fZxaubt_EJo:js-0AoSzhk8:kmCBgzMKvIA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SharepointMagazine/~4/fZxaubt_EJo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-6-of-8/feed</wfw:commentRss>
		<feedburner:origLink>http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-6-of-8</feedburner:origLink></item>
		<item>
		<title>Using third party tools in SharePoint</title>
		<link>http://feedproxy.google.com/~r/SharepointMagazine/~3/SPy3hoSWql0/using-third-party-tools-in-sharepoint</link>
		<comments>http://sharepointmagazine.net/news/using-third-party-tools-in-sharepoint#comments</comments>
		<pubDate>Fri, 20 Mar 2009 09:51:58 +0000</pubDate>
		<dc:creator>Andrew Walmsley</dc:creator>
		
		<category><![CDATA[News]]></category>

		<category><![CDATA[3rd]]></category>

		<category><![CDATA[part]]></category>

		<category><![CDATA[party]]></category>

		<category><![CDATA[sharepoint]]></category>

		<category><![CDATA[tools]]></category>

		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=2398</guid>
		<description><![CDATA[There has been a steady growth in 3rd Party tools to provide either enhancements to weak functionality provided by out of the box WSS/MOSS or new functionality to complement existing functionality.<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/news/using-third-party-tools-in-sharepoint">Using third party tools in SharePoint</a></p>
]]></description>
			<content:encoded><![CDATA[<p><strong>Growth in third party tools</strong></p>
<p>I have worked with SharePoint as a framework since its first full scale release in 2001. Since then I have witnessed the steady growth in third party tools to provide either enhancements to weaker functionality provided ‘out of the box&#8217; (OOTB) by SharePoint, or new features to complement existing core functionality.</p>
<p>Most third party utilities or web parts started to come out with the previous release of SharePoint (SharePoint 2003 &amp; WSS V2). But with the release of Microsoft Office SharePoint Server (MOSS) 2007 (and WSS V3), there has been an exponential growth in a whole variety of end user or administrative focused tools.</p>
<p>Entire businesses have in fact emerged over the last few years with their sole business model aimed at meeting the clear demand for list aggregators, backup &amp; migration utilities or reporting enhancements, to name but a few. Not forgetting the MVPs, Open Source efforts over at Codeplex and the work by specific individuals, often referred to in posts and blogs within the SharePoint community.</p>
<p><strong>Growing pains</strong></p>
<p>The growth in third party tools and expanding SharePoint community, whom also provide a vast array of often ‘free&#8217; downloadable utilities, means businesses deploying SharePoint have never been better served and can arguably gain even more out of their investment in by using the latest Microsoft SharePoint technology.</p>
<p>However, my experience over the last few years with third party utilities, in particular with the very nature of new and often immature utilities and add-ons, has led me to believe that these tools can be fraught with issues for the unwary.</p>
<p>Issues encountered include:</p>
<ul class="unIndentedList">
<li>Code developed and tested in a MOSS environment, not specifically WSS (but released for both types of platform anyway, causing key functions purported to be available, that fail to work as they are not supported or available in WSS)</li>
<li>Tools and utilities often unsupported and provided for download on an ‘as is&#8217; basis</li>
<li>Poor documentation to allow for effective and safe configuration and setup</li>
<li>Little or no testing prior to release, hence tools are ‘buggy&#8217; and unstable</li>
<li>Unproven usability and functionality across load balanced environments</li>
<li>Poor or non-existent end user support.</li>
</ul>
<p>Even some of the better known third party tools on the market have, in my experience, been quite poorly developed, therefore the development companies are unable to respond to even basic support related queries or product bugs. The tools and utilities often have been clearly developed on and for MOSS environments, but advertised for WSS as well, with the originating developers knowing very well there will be problems with its lesser feature set. I suspect these are just growing pains of small businesses and hopefully their development processes and support services will improve over time.</p>
<p><strong>Is your selected third party product really the right choice?</strong><strong></strong></p>
<p>It is clear many of the tools available are extremely useful, otherwise they wouldn&#8217;t have been created to fill a gap in the first place, or sold so well. I do think however that businesses, or rather inexperienced individuals, often forget (or just don&#8217;t know) to consider fully the issues involved in deploying 3rd party products that have been developed outside of certified Microsoft and other core platform environments.</p>
<p>What was once your relatively clean, core and stable environment has now been ‘dirtied&#8217; by dlls&#8217;, web .config changes and registry settings. This provides you with the risk of a potential level of instability that is unacceptable, resulting in endless hours trying to troubleshoot and resolve issues that could have been avoided in the first place. Hence embark on deploying such tools without the proper due diligence at your peril!</p>
<p>Questions regarding third party tools I would suggest you consider are as follows:</p>
<ul class="unIndentedList">
<li>Supportability - Does the organisation provide timely updates and bug fixes to the components? Will it be supported in 64 bit platform? Does it need to and actually work across different browsers? What do others say about the product in the community? Who will pay for supporting it internally? What if the person whom installed it leaves?</li>
<li>Code updates - Do you need and hence have access to the source control for your developers to make and support changes in-house? What is the roadmap for product updates following service pack updates issued from Microsoft? Will the product be affected by service pack updates from Microsoft?</li>
<li>Robustness/Stability - What type of testing has been carried out prior to release? Was the code developed on both MOSS and WSS platforms? Has the product been tested on load balanced farms? Does it work across multiple farms? Are there any performance issues on lists or indexing? Does it impact on existing OOTB features or other third party tools deployed? Will it affect existing pages and data? How is it installed, WSP, STP and or DLLs?</li>
<li>Scalability/Security - What level and type of security access does it need in your farm? Will it scale as your deployment grows from single to multiple servers?</li>
<li>Cost - What are the overall costs for deploying third party tools on your live, pre-production and development environments? What is the true annual cost of support?</li>
</ul>
<p>Ultimately then, organisations can and do gain a tremendous amount of value for money from their investments as long as they invest wisely. However, I think a sizeable amount of businesses will have had numerous issues to do with performance, functionality, reliability or stability when using third party tools.</p>
<p><strong>Due diligence</strong></p>
<p>To reduce your exposure to such issues when purchasing third party SharePoint tools and utilities, you should carry out an appropriate review and justification process with these products.</p>
<p>I recommend the following as a guide:</p>
<ul class="unIndentedList">
<li>Understand in detail what it will take to provide an evaluation &amp; test of the third party tool(s) assuming you will set up an separate environment to do it</li>
<li>Document a list of business and or technical requirements you need to fulfil, matched by a list of product features stated. Compare &amp; evaluate</li>
<li>Review if possible on ‘pre-production&#8217; evaluation environments in as close to a ‘like for like&#8217; scenario as you can afford (UAT preferred)</li>
<li>Read the specialist SharePoint forums and appropriate feedback from others who have used a particular product before deploying and essentially gauge a view on others experience of using the product</li>
<li>Ensure you have a backup/restore approach that works (and has actually been tested), if you need to rollback following a tool/product deployment due to issues or other constraints</li>
<li>Ensure you have considered your pre-production and disaster recovery environments in your planning, testing and budgets</li>
<li>Consider documentation needed to not only install, but to provide support to your helpdesk team responsible for support and overall governance</li>
<li>Before you embark on the process of introducing 3rd party tools really do look at the feature set provided out of the box and understand if minor changes to existing requirements can be made to avoid introducing such products or bespoke changes</li>
<li>Where a third party tool is to be made available to end users, ensure the appropriate business testing and training is planned and made available in advance of any trial or pilot deployment.</li>
</ul>
<p><strong>Conclusion</strong></p>
<p>The simple reason for this post is to make you aware of the dangers of introducing third party tools into your SharePoint environments and to recommend a series of steps to take to help you understand and decide if a third party tool is right for you. Third party tools can and do add real value, but be sure that these tools do not interrupt your core SharePoint environment.</p>
<p>In summary, you must ensure that you have some factual assurances that deploying any third party component is truly going to save you money or provide some other worthy and tangible benefit.</p>
<p>Measures must also be taken by you to ensure that uncertified tools are not going to damage your existing core SharePoint environment and that they are manageable and acceptable costs in terms of support longer term.</p>
<p>Finally, as I posted in the <a href="http://sharepointmagazine.net/news/successful-sharepoint-projects-myth-or-reality">SharePoint Magazine</a> recently, you potentially ‘pay&#8217; for your bespoke changes and arguably 3rd party tools, to some degree, several times over. Consequently, do your homework before you download that evaluation web part and press setup.exe!</p>
<p>Regards,</p>
<p>Andrew</p>
<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/news/using-third-party-tools-in-sharepoint">Using third party tools in SharePoint</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/vsYzxQIp_mhfZV1CaI622owjKEU/0/da"><img src="http://feedads.g.doubleclick.net/~a/vsYzxQIp_mhfZV1CaI622owjKEU/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/vsYzxQIp_mhfZV1CaI622owjKEU/1/da"><img src="http://feedads.g.doubleclick.net/~a/vsYzxQIp_mhfZV1CaI622owjKEU/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SharepointMagazine?a=SPy3hoSWql0:6X02sv5v_Wk:kmCBgzMKvIA"><img src="http://feeds.feedburner.com/~ff/SharepointMagazine?i=SPy3hoSWql0:6X02sv5v_Wk:kmCBgzMKvIA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SharepointMagazine/~4/SPy3hoSWql0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/news/using-third-party-tools-in-sharepoint/feed</wfw:commentRss>
		<feedburner:origLink>http://sharepointmagazine.net/news/using-third-party-tools-in-sharepoint</feedburner:origLink></item>
		<item>
		<title>Simplifying SharePoint debugging by creating the troubleshooting toolbox</title>
		<link>http://feedproxy.google.com/~r/SharepointMagazine/~3/ne6ILjmYeMU/getting-started-with-sharepoint-programming-simplifying-sharepoint-debugging-by-creating-the-troubleshooting-toolbox</link>
		<comments>http://sharepointmagazine.net/technical/development/getting-started-with-sharepoint-programming-simplifying-sharepoint-debugging-by-creating-the-troubleshooting-toolbox#comments</comments>
		<pubDate>Wed, 18 Mar 2009 13:55:11 +0000</pubDate>
		<dc:creator>Ayman El-Hattab</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Debugging]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[sharepoint]]></category>

		<category><![CDATA[Troubleshooting]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=2631</guid>
		<description><![CDATA[This series of articles is intended to help you getting ramped up with SharePoint programming. It's about writing, troubleshooting and debugging SharePoint code. <p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/development/getting-started-with-sharepoint-programming-simplifying-sharepoint-debugging-by-creating-the-troubleshooting-toolbox">Simplifying SharePoint debugging by creating the troubleshooting toolbox</a></p>
]]></description>
			<content:encoded><![CDATA[<p>This series of articles is intended to help you getting ramped up with SharePoint programming. It&#8217;s about writing, troubleshooting and debugging SharePoint code. First you need to have prerequisite skills in .NET Development and in particular ASP.NET Development, you should also have basic understanding of SharePoint and how to use it from the User Interface , you must be able to create and deploy features and you should have some experience in working with content types and site columns.</p>
<p>Ready? Let&#8217;s get started!</p>
<p>The terms &#8220;Bug&#8221; and &#8220;Debugging&#8221; are facts of a programmer&#8217;s life. Debugging in general is a lengthy and tiresome task.   In my mind, for you to be a good SharePoint developer, you must know how to troubleshoot your applications. The trick is SharePoint debugging can be quite complex for those who are new to the platform, that&#8217;s why I decided to kick off my series of articles with how to simplify Debugging SharePoint code before we dive deep into the world of SharePoint programming. At the end of the article we&#8217;ll create the &#8220;<strong>SharePoint troubleshooting toolbox</strong>&#8221; that we&#8217;ll frequently use in our series <strong>&#8220;Getting Started to SharePoint Programming</strong>&#8220;.</p>
<h2>Simplifying SharePoint Debugging By Creating The Troubleshooting Toolbox</h2>
<p>Debugging in WSS or MOSS is similar to debugging an ASP.NET application but unfortunately debugging custom code in SharePoint isn&#8217;t as easy as just pressing F5 from inside Visual studio. While SharePoint provides an excellent platform for developing Web applications, debugging them can be a bit of a pain. In this article I will give you some debugging tips that could make your life easier and will help you deal with the silly &#8220;An unexpected error has occurred&#8221; screens. Also I will shed the light on some tools provided by the SharePoint community that facilitate the troubleshooting of SharePoint applications and error isolation and accordingly increasing your productivity.</p>
<p>Five main resources are available for you when you experience a problem:</p>
<p>1. Detailed Error Messages<br />
2. Attaching the Visual Studio Debugger to W3WP.EXE<br />
3. SharePoint Trace Logs<br />
4. Windows Event Logs<br />
5. Debug And Trace</p>
<p><strong>1. </strong><strong>Detailed Error Messages Vs. The Annoying Page!</strong></p>
<p>Usually, an error message will be your first indication that something went wrong. Unfortunately, SharePoint uses a user friendly (Yellow &amp; Blue) error page to show that a problem occurred. Yeah, they call it the user friendly page, but we, as developers, call it the <strong>Annoying Page</strong>. The first time I wrote SharePoint code, I received a screen like the one shown in the figure below:</p>
<p style="center;"><a href="http://sharepointmagazine.net/wp-content/uploads/2009/02/spmag13.jpg"><img class="size-full wp-image-2644 aligncenter" src="http://sharepointmagazine.net/wp-content/uploads/2009/02/spmag13.jpg" alt="" width="404" height="156" /></a></p>
<p style="center;" align="center"><a href="http://sharepointmagazine.net/wp-content/uploads/2009/02/spmag1.jpg"></a></p>
<p>This error page points out that an assembly has thrown an unhandled System.Exception. Sometimes, the user-friendly error page will specify the nature of the error if the code that threw the exception used something more specific than System.Exception or if it included a message in the Exception class constructor.</p>
<p>We need to get a more detailed Error Message than the annoying &#8220;Unexpected error has occurred &#8220;. This can be achieved by doing three modifications to the Web.Config file from the virtual directory containing your SharePoint application. These modifications are listed in the next table.</p>
<table style="center;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="132" valign="top">
<p align="center">Tag</p>
</td>
<td width="142" valign="top">
<p align="center">Attribute</p>
</td>
<td width="124" valign="top">Default Value</td>
<td width="100" valign="top">
<p align="center">New Value</p>
</td>
</tr>
<tr>
<td width="132" valign="top">
<p align="center">customErrors</p>
</td>
<td width="142" valign="top">
<p align="center">Mode</p>
</td>
<td width="124" valign="top">
<p align="center">On</p>
</td>
<td width="100" valign="top">
<p align="center">Off or Remote Only</p>
</td>
</tr>
<tr>
<td width="132" valign="top">
<p align="center">SafeMode</p>
</td>
<td width="142" valign="top">
<p align="center">CallStack</p>
</td>
<td width="124" valign="top">
<p align="center">False</p>
</td>
<td width="100" valign="top">
<p align="center">True</p>
</td>
</tr>
<tr>
<td width="132" valign="top">
<p align="center">SafeMode</p>
</td>
<td width="142" valign="top">
<p align="center">AllowPageLevelTrace</p>
</td>
<td width="124" valign="top">
<p align="center">False</p>
</td>
<td width="100" valign="top">
<p align="center">True</p>
</td>
</tr>
</tbody>
</table>
<p>No Custom Errors shows the full error to every client, every time. This is typically used Development environment, since there are no clients using it.</p>
<p>I recommend using the <a href="http://www.codeplex.com/features">Debug Config feature</a> to automate this process. This is just a feature that when you activate on a web application, it automatically tweaks the Web.Config of the specified web application across the farm.</p>
<p><strong>2. </strong><strong>Attaching the Visual Studio Debugger to W3WP.EXE</strong></p>
<p>Now you have the standard ASP.NET error page with a stack trace , OK this is very helpful but you don&#8217;t want to guess what the problem might be and randomly change your code to fix it.</p>
<p>First thing you need to do to avoid the old fashioned trial and error technique is to enable debugging. This could be achieved by setting the compilation element debug attribute to true in Web.Config from the virtual directory containing your SharePoint application, otherwise, breakpoints inside Visual Studio will be shown but will never be used.</p>
<p>Once you&#8217;ve done that, there is one more thing you need to do in order to be able to debug your SharePoint code in Visual studio which is attaching a debugger to W3WP.EXE, Attaching a debugger in Visual Studio will allow you to step through the code and find exactly where the error occurs.</p>
<p style="center;"><img class="aligncenter" src="http://sharepointmagazine.net/wp-content/uploads/2009/02/spmag2.jpg" alt="" width="228" height="148" /><img class="aligncenter" src="http://sharepointmagazine.net/wp-content/uploads/2009/02/spmag3.jpg" alt="" width="499" height="347" /></p>
<p align="center"><a href="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/eb0f5b1dcb22_12A25/image_7.png"></a></p>
<p><a href="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/eb0f5b1dcb22_12A25/VSDebugger_2.png" target="_blank"></a></p>
<p>It&#8217;s really handy but there are three questions that I always receive from my colleagues when they get started to SharePoint programming, so I decided to share the answers with you.</p>
<p>The first one is: <em>Sometimes, I set breakpoints and attach to the process but Visual Studio skips loading the symbols if I&#8217;m debugging a deployed assembly to the GAC and I fail to debug the code</em></p>
<p>Easy, Open Tools -&gt; Options -&gt;  Debugging.</p>
<p style="center;"><img class="aligncenter" src="http://sharepointmagazine.net/wp-content/uploads/2009/02/spmag10.jpg" alt="" width="500" height="297" /></p>
<p>You&#8217;ll find an option labeled <strong>Enable Just My Code (Managed Only)</strong> as shown in the figure which is checked by default. Uncheck this option to be able to debug the assemblies located in the GAC. There is a common myth among .NET developers in general and especially SharePoint ones, that in order to debug assemblies that have been deployed to the GAC, you need to copy the debug symbols (PDB File) to the GAC as well. This was true in the early days of .NET but this is no longer true.</p>
<p>The second one is: <em>When I try to attach the debugger to the W3WP.exe process to debug, I always see multiple instances of it. Which one should I attach to?</em></p>
<p>Ok, this is easy too. Just follow the following steps.</p>
<ul>
<li>Open the command prompt window, run IISAPP to get a list of the current instances of W3WP.exe.</li>
</ul>
<p align="center"><a href="http://sharepointmagazine.net/wp-content/uploads/2009/02/spmag2.jpg"></a><a href="http://sharepointmagazine.net/wp-content/uploads/2009/02/spmag3.jpg"></a><a href="http://sharepointmagazine.net/wp-content/uploads/2009/02/spmag10.jpg"></a><a href="http://sharepointmagazine.net/wp-content/uploads/2009/02/spmag5.jpg"><img class="aligncenter size-full wp-image-2636" src="http://sharepointmagazine.net/wp-content/uploads/2009/02/spmag5.jpg" alt="" width="486" height="107" /></a></p>
<ul>
<li>Note the PID of the instance that corresponds to your web application.</li>
<li>Now return to VS, select Debug -&gt; Attach to process and attach to the W3wp.exe instance with an ID equivalent to the PID you got in step 2 -&gt; click Attach.</li>
<li>Now you can trace through the code and find the error causes easily.</li>
</ul>
<p>But the question still remains, why sometimes are they more than one w3wp.exe instance? This is because the SharePoint Administration Site Collection and the SSP Administration site always have their own Application pools for error isolation purposes.</p>
<p>And the third question is : <em>Is it possible to debug Inline code blocks ?</em></p>
<p>Actually, I hate Inline Code Blocks and it&#8217;s really a good practice to avoid it due to the performance issues when the JIT compiler compiles them but YES, you can do that.</p>
<p>So now you knew the process of debugging? Very boring and repetitive huh? Hmm, Can&#8217;t that be automated?<br />
Fortunately Jonathan Dibble, a brilliant developer, created a very handy &#8220;<a href="http://blogs.msdn.com/sharepoint/archive/2007/04/10/debugger-feature-for-sharepoint.aspx">Debugger Feature</a>&#8221; that can be installed and activated on a SharePoint site to automate this process. Once activated, the <a href="http://blogs.msdn.com/sharepoint/archive/2007/04/10/debugger-feature-for-sharepoint.aspx">Debugger Feature</a> adds an &#8220;Attach Debugger&#8221; menu item to the Site Actions menu.  Extremely helpful and faster than doing that from visual studio.</p>
<p align="center"><a href="http://sharepointmagazine.net/wp-content/uploads/2009/02/spmag6.jpg"><img class="aligncenter size-full wp-image-2637" src="http://sharepointmagazine.net/wp-content/uploads/2009/02/spmag6.jpg" alt="" width="257" height="195" /></a></p>
<p><strong> </strong></p>
<p><strong>3. </strong><strong>Unified Logging Services ( SharePoint Trace Logs )</strong></p>
<p>Sometimes you receive error screens while activating a feature or creating a Site Collection or during deploying packages.  For instance, a couple of months ago I got an annoying error &#8220;File not found&#8221; when creating a site collection from a custom template!</p>
<p>SharePoint trace logs are at your disposal when you need to troubleshoot errors occurring before and after custom code; they are very useful in the deployment and provisioning operations as they are the main sources of information about everything happening inside SharePoint.</p>
<p>Most of SharePoint components use the Unified Logging Services (ULS), those logs are normal text files and you can find them in the 12 hive at 12\Logs. You can tweak the ULS settings via the Diagnostic logging link under Logging and Reporting in the operations section of SharePoint central administration to control the verbosity of events captured in the Log files, you can modify the settings per category or for all the categories as shown in the figure; thus modifying the number of events captured. The list entries are sorted in order from most-critical to least-critical. I always just set all of the categories to verbose because it&#8217;s sometimes difficult to specify the categories needed to be changed when a problem occurs.</p>
<p style="center;"><a href="http://sharepointmagazine.net/wp-content/uploads/2009/02/spmag7.jpg"><img class="size-full wp-image-2638 aligncenter" src="http://sharepointmagazine.net/wp-content/uploads/2009/02/spmag7.jpg" alt="" width="499" height="455" /></a></p>
<p><a href="http://blog.thekid.me.uk/Media/WindowsLiveWriter/DebuggingtipsforSharePoint_1121/image_15.png"><strong></strong></a></p>
<p>If you want to tweak the verbosity setting per category, make sure to leave the default value of the General category for trace logging as it is (Verbose) because entries about the provisioning and deployment processes are logged under the General category. Also be aware that updating all categories will make you lose the changes you made to individual ones.</p>
<p>When you choose to increase the number of events captured by the ULS, you will find the log files very cluttered and hard to use, and SharePoint provides no built-in viewer. To fill the gap and facilitate troubleshooting, free third-party tools exist like <a href="http://www.codeplex.com/SPLogViewer">LogViewer</a>, <a href="http://hristopavlov.wordpress.com/sptraceview/">SPTraceView</a> and <a href="http://codeplex.com/wssmosslogfilereader/">WSS/MOSS Log File Reader</a> .Some utilities including SPTraceView will aggregate log data from more than one server in the farm.</p>
<p>Next figure shows LogViewer in action.</p>
<p style="center;"><a href="http://sharepointmagazine.net/wp-content/uploads/2009/02/spmag8.jpg"><img class="size-full wp-image-2639 alignnone" src="http://sharepointmagazine.net/wp-content/uploads/2009/02/spmag8.jpg" alt="" width="500" height="355" /></a></p>
<p>I&#8217;d also like to point out that you can write code that incorporates logging to MOSS logs. Writing to the same trace log alleviates the need for developers to log their development information in other places such as the Windows Event Log, which is more commonly used by system administrators.</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/02/spmag11.jpg"><img class="aligncenter size-full wp-image-2642" src="http://sharepointmagazine.net/wp-content/uploads/2009/02/spmag11.jpg" alt="" width="500" height="217" /></a>The only limitation to using the code snippet above is that you cannot set the log event level (e.g. low, medium, and critical) as it&#8217;ll always display the error level in the trace logs as High. The logger is located in 12\ISAPI \Microsoft.Office.Server.dll and therefore it&#8217;s only available with the MOSS install, not WSS 3.0.</p>
<p>What if you need to write into SharePoint trace logs while having full control on the error level? This is a pretty easy thing to do, because MSDN has a wonderful <a href="http://msdn.microsoft.com/en-us/library/aa979522.aspx">sample of code</a> that you can reuse. I always use this code in my features.</p>
<p>Simply add the class to your project and then you can write to the logs using something like the following code.</p>
<p>TraceProvider.RegisterTraceProvider();<br />
TraceProvider.WriteTrace(TraceProvider.TagFromString(&#8221;XXXX (must be 4 letter tag)&#8221;), TraceProvider.StringToSeverity(&#8221;Exception or Information&#8221;), Guid.NewGuid(), &#8220;Method Name&#8221;, &#8220;Assembly Name&#8221;, &#8220;Project Name&#8221;, &#8220;Message&#8221;);<br />
TraceProvider.UnregisterTraceProvider();<strong> </strong></p>
<p><strong>4. </strong><strong>Windows Event Logs</strong></p>
<p>You should include Windows Event Logs as part of your normal troubleshooting because it sometimes contains useful entries that SharePoint is unable to log via ULS<strong>. </strong>You can increase and decrease logging by severity level in the same way you do for ULS<strong>.</strong></p>
<p>It&#8217;s possible to log errors to the system event log from your custom code but you need to promote the privileges as shown.</p>
<p><strong> <a href="http://sharepointmagazine.net/wp-content/uploads/2009/02/spmag12.jpg"><img class="size-full wp-image-2643 alignnone" src="http://sharepointmagazine.net/wp-content/uploads/2009/02/spmag12.jpg" alt="" width="560" height="290" /></a></strong><strong> </strong></p>
<p><strong>5. </strong><strong>Debug And Trace</strong></p>
<p>After you take your SharePoint site live, you are not the only one who is using it anymore (hopefully), so you need  effective plans to track down errors.</p>
<p>System.Diagnostics.Debug and Trace statements are very useful in this case. Used in conjunction with <a href="http://www.microsoft.com/technet/sysinternals/utilities/debugview.mspx">DebugView</a> you can determine what has gone wrong! Debug Calls are removed from the release builds, so you should use them in your development environment but Trace Calls remain in release code and so will add an overhead to the code execution yet they are very helpful when you cannot attach a debugger  (for instance on the staging or the production environments) . Since manually adding trace calls might be time consuming, I would strongly recommend using a tool such as <a href="http://www.jetbrains.com/resharper/" target="_blank">ReSharper</a> to drop in these statements quickly rather than relying on typing or copy/paste. The next figure shows the trace output using <a href="http://www.microsoft.com/technet/sysinternals/utilities/debugview.mspx">DebugView</a>.<strong> </strong></p>
<p style="center;"><a href="http://sharepointmagazine.net/wp-content/uploads/2009/02/spmag9.jpg"><img class="size-full wp-image-2640 aligncenter" src="http://sharepointmagazine.net/wp-content/uploads/2009/02/spmag9.jpg" alt="" width="500" height="330" /></a></p>
<p><strong><span style="underline;">SharePoint Troubleshooting Toolbox!</span></strong></p>
<p>Well, let&#8217;s create our debugging toolbox, the following utilities should be included in our SharePoint debugging toolbox; we&#8217;ll certainly need them in our long journey with SharePoint development.</p>
<ul>
<li> <a href="http://www.codeplex.com/features">Debug Config Feature</a></li>
<li> <a href="http://blogs.msdn.com/sharepoint/archive/2007/04/10/debugger-feature-for-sharepoint.aspx">Debugger Feature</a></li>
<li> <a href="http://www.codeplex.com/SPLogViewer">LogViewer</a></li>
<li> <a href="http://www.codeplex.com/spm">SharePoint Manager</a></li>
<li> <a href="http://hristopavlov.wordpress.com/sptraceview/">SPTraceView</a></li>
<li> <a href="http://codeplex.com/wssmosslogfilereader/">WSS/MOSS Log File Reader</a></li>
<li> <a href="http://www.microsoft.com/technet/sysinternals/utilities/debugview.mspx">DebugView</a></li>
<li> <a href="http://code.msdn.microsoft.com/SPDisposeCheck">SPDisposeCheck</a></li>
<li> <a href="http://www.jetbrains.com/resharper/" target="_blank">ReSharper</a></li>
<li> <a href="http://www.jetbrains.com/resharper/" target="_blank">Fiddler</a> (HTTP Debugging Proxy which logs all HTTP traffic between your computer and the Internet)</li>
<li> <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07&amp;displaylang=en">LogParser</a> ( for IIS log analysis )</li>
<li> <a href="http://www.araxis.com/merge/index.html">Araxis</a> ( File comparison tool )</li>
<li> <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=a362781c-3870-43be-8926-862b40aa0cd0&amp;DisplayLang=en">CLR Profiler</a> (The CLR Profiler allows developers to see the allocation profile of their managed applications)</li>
</ul>
<p><strong><span style="underline;">Summary</span></strong></p>
<p>This was the first article in a series that will help you getting started with SharePoint programming and I decided to introduce you to some of the troubleshooting utilities and tools that can really make your life easier before getting our hands dirty with SharePoint code since troubleshooting can really be a nightmare for those who are new to the platform.<br />
Remote-Only Custom Errors allow you to display custom errors only to remote clients. This means that if you are browsing your SharePoint site locally, you will get the fully detailed error messages. However, anybody else will receive the standard SharePoint page.</p>
<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/development/getting-started-with-sharepoint-programming-simplifying-sharepoint-debugging-by-creating-the-troubleshooting-toolbox">Simplifying SharePoint debugging by creating the troubleshooting toolbox</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/-GQ4mEE3Eqyp5PAD4lKNcHJKaTQ/0/da"><img src="http://feedads.g.doubleclick.net/~a/-GQ4mEE3Eqyp5PAD4lKNcHJKaTQ/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/-GQ4mEE3Eqyp5PAD4lKNcHJKaTQ/1/da"><img src="http://feedads.g.doubleclick.net/~a/-GQ4mEE3Eqyp5PAD4lKNcHJKaTQ/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SharepointMagazine?a=ne6ILjmYeMU:XUC2i7K70Ps:kmCBgzMKvIA"><img src="http://feeds.feedburner.com/~ff/SharepointMagazine?i=ne6ILjmYeMU:XUC2i7K70Ps:kmCBgzMKvIA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SharepointMagazine/~4/ne6ILjmYeMU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/technical/development/getting-started-with-sharepoint-programming-simplifying-sharepoint-debugging-by-creating-the-troubleshooting-toolbox/feed</wfw:commentRss>
		<feedburner:origLink>http://sharepointmagazine.net/technical/development/getting-started-with-sharepoint-programming-simplifying-sharepoint-debugging-by-creating-the-troubleshooting-toolbox</feedburner:origLink></item>
		<item>
		<title>The World of Office Business Applications (OBAs) - Part 2</title>
		<link>http://feedproxy.google.com/~r/SharepointMagazine/~3/YFyUALEpLz4/the-world-of-office-business-applications-obas-part-2</link>
		<comments>http://sharepointmagazine.net/technical/development/the-world-of-office-business-applications-obas-part-2#comments</comments>
		<pubDate>Tue, 17 Mar 2009 08:20:43 +0000</pubDate>
		<dc:creator>Ágnes Molnár</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Technical]]></category>

		<category><![CDATA[application]]></category>

		<category><![CDATA[bussiness]]></category>

		<category><![CDATA[integration]]></category>

		<category><![CDATA[LOB System]]></category>

		<category><![CDATA[OBA]]></category>

		<category><![CDATA[Office]]></category>

		<category><![CDATA[platform]]></category>

		<category><![CDATA[sharepoint]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=2267</guid>
		<description><![CDATA[In our everyday work we all use several Line-of-Business systems as well as all of us know well the Office client applications. Although the integration between them is not too common yet, I'd like to show you the advantaged and disadvantages, pros and cons of the integration, and give some useful tips and tricks if you decide to make some OBAs.<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/development/the-world-of-office-business-applications-obas-part-2">The World of Office Business Applications (OBAs) - Part 2</a></p>
]]></description>
			<content:encoded><![CDATA[<p>See also the first part of the series:</p>
<ul>
<li><a href="http://sharepointmagazine.net/technical/development/the-world-of-obas-part1">Part 1 - Introduction</a></li>
</ul>
<p>In our everyday work we all use several Line-of-Business systems as well as all of us know well the Office client applications. Although the integration between them is not too common yet, I&#8217;d like to show you the advantaged and disadvantages, pros and cons of the integration, and give some useful tips and tricks if you decide to make some OBAs.</p>
<p>In the first part I was introducing you, what the OBA (Office Business Application) means, what parts and components can you build them from, and what are the basics of an OBA building. In the second part we&#8217;ll see the scenario about the full demo what is going to built in the following parts.</p>
<h3>Background</h3>
<p>Nowadays the expression &#8220;Software + Services (S+S)&#8221; is very-very fashionable as well as important and promising. Few weeks ago the basic topic of the PDC 20008 was the cloud computing, Azure and related things. My current articles are not about them (although they are very-very interesting and exciting things and we should be very happy to be the part of that story), but I can&#8217;t avoid this.</p>
<p>So, of course you can have your own, on-premise softwares as you need them. Nowadays you can buy them as services yet (Software as a Service - SaaS). These services are hosted somewhere in the cloud, in huge data centers - but doesn&#8217;t matter where and how, you simply get capacity, scalability, maintenance, etc. as you need, and you don&#8217;t have to have resources on your side anymore.</p>
<p>If you would like Software + Services, all together, you have to plan carefully what you should have on-premise (for example client applications), and what you can (or should) place to the cloud.Basically you have a third option too: you can give your applications and services to a hoster, which is a way between on-premise and cloud services. From my view logically this is almost the same as you host them (outsides of the walls of your office), so I&#8217;ll talk about a real, very clear S+S architecture in the followings.</p>
<p>Of course, my focus is based on Office Business Applications. First of all, let&#8217;s see what does S+S mean in the OBA world. The Software side is very simple: you have your Office clients on the client computers in the offices, and/or you have SharePoint on the server-side. But the SharePoint not only have User Interface and client services to the users: it has some Services as well, so it can be on the both sides in the same time. For example, these services can be the Enterprise Search, LOB system integration, Content Management, etc. which are accessible by the SharePoint UI, Office clients and other (even custom) applications as well.</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2008/12/software_services.jpg"><img class="aligncenter size-medium wp-image-2268" src="http://sharepointmagazine.net/wp-content/uploads/2008/12/software_services-300x176.jpg" alt="" width="300" height="176" /></a></p>
<h3>The Story</h3>
<p>In the followings I&#8217;m building a very simple application based on the idea that we have a company what has a typical architecture with a lot of separated LOB (Line of Business) systems, huge amount of connections and interfaces between them (like a spider web), as you can see on the following picture. The end-users access these systems mostly via dedicated clients.</p>
<p style="center;"><a href="http://sharepointmagazine.net/wp-content/uploads/2008/12/oba_lob_systems.jpg"><img class="aligncenter size-full wp-image-2270" src="http://sharepointmagazine.net/wp-content/uploads/2008/12/oba_lob_systems.jpg" alt="" width="470" height="235" /></a></p>
<p>Because of several reasons, this company decides to make a very new structure to their architecture, and divide their LOB Systems (with data and processes) to two groups: the first group is located on-premise afterwards, but the others going to the cloud (as services). The second important issue is the question integration: what systems should be integrated with each other, and which ones have to be separated?</p>
<p>Basically, the integration decision might seem to be technical issue, but actually this is a business one. During the planning of this architecture, you have to answer a ton of questions:</p>
<ul>
<li>Do you want to build architecture with collaborative systems, or need independent applications?</li>
<li>What kind of collaborations do you need in your company?</li>
<li>Do you have/ need solution-oriented or task-oriented systems?</li>
<li>What is your primary goal: to have set of systems with well-defined, global responsibilities, or separated applications with separated responsibilities?</li>
<li>How important are scalability, maintainability, robustness etc. to you?</li>
<li>etc.</li>
</ul>
<p>Well, our company has decided GO! - so let&#8217;s see what functionalities do we need, and what the first steps are during implementation.</p>
<h3>Functionality</h3>
<p>Our company needs a complex document management system, with SharePoint-contents, custom Office extensions, and some data coming from the cloud. The following picture shows the basic architecture of the system:</p>
<h3><img class="aligncenter size-full wp-image-2393" src="http://sharepointmagazine.net/wp-content/uploads/2008/12/spmag_architecture.jpg" alt="" width="500" height="262" /></h3>
<p>So, from the client side you can see two kind of User Interfaces: your Office 2007 applications (Word) with OBA addins, and MOSS sites with custom contents. These contents come from not only MOSS itself, but from SQL Data Services and SQL Server Reporting Services as well. On the following pictures I show you, what the users can see in their Word 2007, and on a MOSS page:</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2008/12/spmag_word.jpg"><img class="aligncenter size-medium wp-image-2272" src="http://sharepointmagazine.net/wp-content/uploads/2008/12/spmag_word-300x287.jpg" alt="" width="300" height="287" /></a></p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2008/12/spmag_demosite.jpg"><img class="aligncenter size-medium wp-image-2271" src="http://sharepointmagazine.net/wp-content/uploads/2008/12/spmag_demosite-300x176.jpg" alt="" width="300" height="176" /></a></p>
<p>Of course, to make your system do things like these, you have to configure and develop a lot. But don&#8217;t worry, it&#8217;s much more easier, and much more beautiful that you&#8217;re expecting, believe me! In the following parts I&#8217;ll show you the following steps to make your own Service-based OBA:</p>
<blockquote><p>Part 3.	Client side - Office 2007 add-ins<br />
Part 4.	SharePoint - The server<br />
Part 5.	SharePoint - Business Data (LOB Systems)<br />
Part 6.	SQL Data Services - My favourite LOB System<br />
Part 7.	Conclusions</p></blockquote>
<p>Stay tuned, next parts are coming soon!</p>
<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/development/the-world-of-office-business-applications-obas-part-2">The World of Office Business Applications (OBAs) - Part 2</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/FZQQ1UEGEauV6Jl4w7qL4jepUnk/0/da"><img src="http://feedads.g.doubleclick.net/~a/FZQQ1UEGEauV6Jl4w7qL4jepUnk/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/FZQQ1UEGEauV6Jl4w7qL4jepUnk/1/da"><img src="http://feedads.g.doubleclick.net/~a/FZQQ1UEGEauV6Jl4w7qL4jepUnk/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SharepointMagazine?a=YFyUALEpLz4:LHkBd6tSDuc:kmCBgzMKvIA"><img src="http://feeds.feedburner.com/~ff/SharepointMagazine?i=YFyUALEpLz4:LHkBd6tSDuc:kmCBgzMKvIA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SharepointMagazine/~4/YFyUALEpLz4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/technical/development/the-world-of-office-business-applications-obas-part-2/feed</wfw:commentRss>
		<feedburner:origLink>http://sharepointmagazine.net/technical/development/the-world-of-office-business-applications-obas-part-2</feedburner:origLink></item>
		<item>
		<title>Leveraging the SharePoint Platform (Part 5) - Why use SharePoint as a Development Platform?</title>
		<link>http://feedproxy.google.com/~r/SharepointMagazine/~3/p7dXdZhxxqQ/leveraging-the-sharepoint-platform-part-5-why-use-sharepoint-as-a-development-platform</link>
		<comments>http://sharepointmagazine.net/technical/development/leveraging-the-sharepoint-platform-part-5-why-use-sharepoint-as-a-development-platform#comments</comments>
		<pubDate>Mon, 09 Mar 2009 15:59:36 +0000</pubDate>
		<dc:creator>Jeremy Thake</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[CAML]]></category>

		<category><![CDATA[framework]]></category>

		<category><![CDATA[jquery]]></category>

		<category><![CDATA[platform]]></category>

		<category><![CDATA[sharepoint]]></category>

		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=2760</guid>
		<description><![CDATA[We are coming near the end of this 6 part series, but don't worry, it's not the last you'll hear of me! This part focuses on 'Why develop leveraging the SharePoint Platform?'. This is really targeted at ASP.NET developers specifically, but also other web application developers from other walks of life also. Or anyone currently working with Vanilla SharePoint and wanting to dig a little deeper!<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/development/leveraging-the-sharepoint-platform-part-5-why-use-sharepoint-as-a-development-platform">Leveraging the SharePoint Platform (Part 5) - Why use SharePoint as a Development Platform?</a></p>
]]></description>
			<content:encoded><![CDATA[<p><a href="../news/technical/development/leveraging-the-sharepoint-platform-part-1">Part  1 - What is the SharePoint Platform</a><br />
<a href="../news/news/analysis/leveraging-the-sharepoint-platform-part-2">Part  2 - What capabilities to start with</a><br />
<a href="../news/analysis/leveraging-the-sharepoint-platform-part-3">Part  3 - How to start with the SharePoint Platform</a><br />
<a href="../news/analysis/leveraging-the-sharepoint-platform-part-4">Part  4 - Levels of leveraging the SharePoint Platform</a><br />
Part 5 - Why use  SharePoint as a Development Platform<br />
Part 6 - Lessons learnt from Leveraging  the SharePoint Platform</p>
<p>We are coming near the end of this 6 part series, but don&#8217;t worry, it&#8217;s not  the last you&#8217;ll hear of me! This part focuses on &#8216;Why develop leveraging the  SharePoint Platform?&#8217;. This is really targeted at ASP.NET developers  specifically, but also other web application developers from other walks of life  also. Or anyone currently working with Vanilla SharePoint and wanting to dig a  little deeper!</p>
<h2>Development Languages</h2>
<p>As discussed in the <a href="../technical/development/leveraging-the-sharepoint-platform-part-1">Part  1</a>, SharePoint leverages ASP.NET and NET WF among other languages such as  XHTML, CSS, XSLT, XML and JavaScript. Most ASP.NET developers will already be  proficient with these languages making the learning curve pretty much around the  Framework itself. The Collaborative Application Markup Language (CAML) is about  the only new language that is new to SharePoint Developers which is used to  build queries in XML.</p>
<h2>The SharePoint Framework</h2>
<p>One of the first things to remember is that SharePoint is a Platform and NOT  a Product. SharePoint is there to be leveraged. It is pretty much useless  vanilla out of the box from a fresh installation as an end user. It needs  customisation and development implementations for a Solution to be usable and  successful.</p>
<h3>Functionality already there</h3>
<p>As discussed in <a href="../news/technical/development/leveraging-the-sharepoint-platform-part-1">Part 1</a> and <a href="../news/technical/development/leveraging-the-sharepoint-platform-part-2">Part 2</a>, there is a lot of functionality out of the box and it is worth being aware what this is to see if you can get any wins out of reusing this in your solution implementations.</p>
<h3>Plumbing already there</h3>
<p>SharePoint provides lots of plumbing out of the box that you&#8217;d typically be  writing yourself or plugging together a bunch of components. Common bits you  have to put together are: User interface Framework, Windows Services, SQL  Databases, Persistence Layers, CRUD UI screens, Security, Workflow engines, File  Upload, Deployment Framework etc. All this is there at you disposal with a few  lines of code or clicks in the User Interface. This saves a significant amount  of time up front.</p>
<h3>Learn the Framework</h3>
<p>Like the .NET Framework, some things are hidden away in various namespaces  and often you&#8217;ll find developers writing functions that already exist. There&#8217;s  plenty of content out there to ensure you don&#8217;t make this mistake. I personally  find <a href="http://msdn.microsoft.com/en-us/office/aa905503.aspx">MSDN</a> currently a bit dry as the structure is based on each object in the object model  hierarchy and it’s methods and properties. Often these don’t fit into a scenario  where you’d use them in isolation. The scenario based examples are littered all  over the blogosphere and more recently being structured on the <a href="http://www.sharepointdevwiki.com/">SharePointDevWiki.com</a>. MSDN do have  these scenarios, but they are just written into one long list of articles with  no structure which makes it hard to discover what you’re looking for. <a href="http://www.sharepointdevwiki.com/">SharePointDevWiki.com</a> gives you the  best of both worlds.</p>
<h3>More than one way to do things</h3>
<p>As I discussed in <a href="../news/analysis/leveraging-the-sharepoint-platform-part-4">Part  4</a>, there is more than one way to skin a cat in SharePoint and it is  important to agree on a standard approach within each SharePoint environment for  consistency. Being aware of each approach and it’s strengths and weaknesses is  just the start of the implementation process!</p>
<h3>Infrastructure Handled for You</h3>
<p>SharePoint is becoming more and more common across IT infrastructure and you  can bet your bottom dollar it&#8217;ll only get more common as time marches on. The  platform allows you to build solutions and not have to focus on things such as:  Scalability, Disaster Recovery, Performance, Interface Design Frameworks,  Security and Deployment. All this stuff is part of the plumbing of  SharePoint Infrastructure and managed by your Infrastructure team and propeller  head Architects. More often than not, they&#8217;ll be a few guidelines to follow when  building your solution and that&#8217;ll be the last you hear of them! Please don’t  get into the habit of doing this stuff as well as development, see my recent  post on ‘<a href="http://wss.made4the.net/archive/2009/02/15/the-sharepoint-implementation-market-needs-to-grow-up.aspx">The  SharePoint Implementation Market needs to grow up!</a>’ to find out more on  this.</p>
<h3>Frameworks Evolve</h3>
<p>One thing to remember with Frameworks is that they evolve over time.  SharePoint has already gone through 3 major versions with another just around  the corner in Q1 2010 (SharePoint 14). When you implement your solutions on top  of SharePoint, without any extra effort (if you&#8217;ve done things <strong><a href="http://wss.made4the.net/archive/2008/05/26/solution-development-in-sharepoint-2007.aspx">correctly</a></strong>)  you get a whole heap of extra functionality when you upgrade to the next major  version.</p>
<h3>Extend the Framework</h3>
<p>You&#8217;ll find people rewriting functionality because it doesn&#8217;t work &#8220;quite  right&#8221;, but realistically people should be <strong>extending</strong> the  framework. Often this is purely down to the skill level as a .NET Developer or  in Power Users case…no skill level at all. If you rewrite or hack the current  functionality, you&#8217;ll find that updates will overwrite your changes, extending  the framework ensures they still exist. You&#8217;ll probably have to do some  integration testing to ensure your extensions still work on top of the new  version. This is happening more and more as Power Users find ways to work around  the Development approach with tools such as jQuery, see my post on ‘<a href="http://wss.made4the.net/archive/2009/02/23/jquery-the-sharepoint-band-aid.aspx">jQuery:  the SharePoint Band Aid</a>’ for more information on this.</p>
<h2>Maturity of the SharePoint Dev Community</h2>
<p>As I <a href="http://wss.made4the.net/archive/2009/02/15/the-sharepoint-implementation-market-needs-to-grow-up.aspx">mentioned  recently</a> the SharePoint Development community has got a long way to grow to  be respected. I would recommend reading that post to get a deeper understanding  of what I mean. I&#8217;ll cover off a few things here that are relevant to the  objective of this post:</p>
<h3>Rapid Application Development</h3>
<p>Like any platform, SharePoint is great a rapidly building applications and is  therefore great for Prototyping. Be extremely careful to set the expectations to  the End User that these are Prototypes and not the real thing. You will need to  build the end solution with a lot more rigour than throwing components together  to get an end to end solution running to pilot.</p>
<h3>Agile Methodology</h3>
<p>Because you can rapidly build solutions you will find development teams  having very short iterations producing extremely rich functionality. This lends  itself well to an Agile approach to development, which is where the Development  Market should really be, moving away from the traditional Software Development  Lifecycle (SDLC).</p>
<h3>Test Driven Development (TDD)</h3>
<p><a href="http://www.21apps.com/">Andrew Woodward</a> is leading the charge  with SharePoint and TDD. There is also ongoing documentation on the community  happenings around this on the <a href="http://www.sharepointdevwiki.com/display/public/SharePoint+Development+with+Unit+Testing">SharePointDevWiki.com</a>.  <a href="http://www.binarywave.com/blogs/eshupps/Lists/Posts/Post.aspx?ID=179">Eric  Shupps</a> has just posted an anti-TDD SharePoint post here which has caused a  lot of discussion around the whole paradigm. I take the stance that it is  suitable in certain scenarios, those of which I have not had time to define yet,  but will do on the SharePointDevWiki.com shortly. If you are currently in th  e.NET space and using TDD, the community would welcome your feedback as it is  still in limbo!</p>
<h3>Source Control</h3>
<p>A lot of implementations can be done without writing a single line of code  and some can be written with a few. Often it is just all too hard to keep a  repository of these &#8220;little&#8221; changes..but we&#8217;ve all seen an avalanche right?  Don&#8217;t be fooled by teams that say you can&#8217;t use source control with SharePoint  Implementations or by those who say SharePoint does it for you! That is not  totally true! You should place as much in source control as possible outside of  the SharePoint environment and it is completely feasible!</p>
<h3>Development Tools</h3>
<p>Unfortunately the Development tools aren&#8217;t what they should be for such a  used Platform, so much so that the community has had to lend a hand! I advise  you to get familiar with the tools that are <a href="http://www.sharepointdevwiki.com/display/public/Solution+package+development+tool+comparisons">available  and their limitations</a>. I also advise you to take a look at what could be  possible in the future with a community project to build the <a href="http://www.sharepointdevwiki.com/display/public/The+Ultimate+SharePoint+Development+Tool">Ultimate  SharePoint Development tool!</a></p>
<p>There has been some sneak peeks into <a href="http://blogs.msdn.com/somasegar/archive/2009/02/19/sharepoint-tools-support-in-visual-studio.aspx">VS2010</a> (and  VS2010 <a href="http://blogs.msdn.com/jasonz/archive/2009/02/20/a-new-look-for-visual-studio-2010.aspx">UI  look and feel</a>) as well as the introduction of <a href="http://blogs.msdn.com/pandrew/archive/2009/02/20/vsewss-1-3-feb-2009-ctp-released.aspx">VSeWSS  1.3 CTP</a> which has come along way from VSeWSS 1.2. But the community still  seems to be backing WSPBuilder very strongly due to the limitations of the  VSeWSS product paradigm where it doesn’t conform to the 12 Hive structure like  WSPBuilder and STSDev.</p>
<h2>Community Content</h2>
<p>As discussed in a <a href="http://wss.made4the.net/archive/2009/02/15/sharepoint-community-content-where-to-find-it.aspx">recent  blog post</a>, the SharePoint community is simply unprecedented against any  other platform out there! I have never seen a community so eager to share their  knowledge. Go to Google and do a search for OpenText &#8216;RedDot CMS&#8217; or &#8216;SAP&#8217; or  &#8216;Business Objects&#8217; and see how much information is online to help the community  on implementing that platform. There are 500+ blogs, forums, the <a href="http://www.sharepointdevwiki.com/">SharePointDevWiki.com</a>, podcasts and  webcasts, I listed a few below but keep up to date with this list <a href="http://www.sharepointdevwiki.com/display/public/SharePoint+Community">here</a>.</p>
<h3>Blogs</h3>
<p>At a minimum you should read these blogs to keep up with SharePoint  Customisation and Development:</p>
<ul>
<li><a href="http://blogs.msdn.com/sharepoint">Microsoft SharePoint Team  Blog</a></li>
<li><a href="http://blogs.msdn.com/sharepointdesigner">SharePoint Designer Team  Blog</a></li>
<li><a href="http://andrewconnell.com/blog">Andrew Connell (WCM)</a></li>
<li><a href="http://heathersolomon.com/blog">Heather Soloman (CSS/UI)</a></li>
<li><a href="http://www.sharepointjoel.com/">Joel Oleson (Architecture)</a></li>
<li><a href="http://sharepoint.microsoft.com/blogs/mikeg/default.aspx">Mike  Gannotti</a></li>
<li><a href="SharePointDevWiki.com">SharePointDevWiki.com</a></li>
<li><a href="../">SharePointMagazine.net</a></li>
<li><a href="http://www.endusersharepoint.com/">EndUserSharePoint.com</a></li>
</ul>
<h3>Podcasts</h3>
<ul>
<li><a href="http://sharepointpodshow.com/">SharePointPodShow.com</a> – <a href="http://wss.made4the.net/archive/2008/12/15/my-sharepoint-development-best-practices-sharepointpodshow-interview-is-live.aspx">click  here listen to my interview</a></li>
<li><a href="http://www.mossgonewild.com/">MOSS Gone Wild</a></li>
</ul>
<h3>Webcasts</h3>
<ul>
<li><a href="http://channel9.msdn.com/tags/Sharepoint/">Channel 9 - SharePoint </a></li>
<li><a href="http://sharepoint.microsoft.com/blogs/mikeg">Mike Gannotti  (Webcasts)</a></li>
</ul>
<h3>Forums</h3>
<ul>
<li><a href="http://social.technet.microsoft.com/Forums/en-US/category/sharepoint/">MSDN  SharePoint Forums</a></li>
</ul>
<h3>Twitter</h3>
<ul>
<li><a href="http://twitter.grader.com/search?Term=sharepoint">Twitter Grade |  SharePoint</a> – note to SharePoint Twitterers – make sure you mention  SharePoint in your profile!</li>
</ul>
<h2>Training Opportunities</h2>
<p>There is an enormous amount of options with regards to training in SharePoint  Customisation/Development.</p>
<h3>Classroom Based</h3>
<p>Classroom based training is spreading like wildfire with a variety of options  in most countries across the World. These courses tend to focus on the Framework  fundamentals currently rather then leveraging the tools to give Developers a  grounding&#8230;without this, and knowledge just of the tool would mean that  debugging code would be incomprehensible.</p>
<h3>Online Based</h3>
<p>Microsoft along with other Vendors are providing lots of rich online  training, including Virtual Labs. As a trainer myself, I find that online  training is not suitable for everyone and that class room training supported by  a trainer who knows the platform inside out is a lot more valuable.</p>
<p>As I&#8217;ve <a href="http://wss.made4the.net/archive/2008/11/10/sharepoint-developer-resources-not-to-be-missed-not-just-a-repeat-announcement-of-sharepoint-guidance-.aspx">mentioned  before</a> there are some <a href="http://www.sharepointdevwiki.com/display/public/Online+Learning">great  places</a> to start learning:</p>
<ul>
<li><a href="http://www.microsoft.com/click/SharePointDeveloper/">Do Less, Get  More, Develop on SharePoint</a></li>
<li><a href="http://msdn.microsoft.com/en-us/rampup/dd221355.aspx">Ramp Up</a></li>
<li><a href="http://www.microsoft.com/spg">Patterns &amp; Practices: SharePoint  Guidance</a></li>
<li><a href="http://www.sharepointdevwiki.com/">SharePointDevWiki.com</a></li>
</ul>
<p>There are paid labs too:</p>
<ul>
<li><a href="http://www.microsoft.com/learning/sharepoint/2007/default.mspx">Microsoft  e-Learning: SharePoint</a></li>
<li><a href="http://www.tedpattison.net/">Ted Pattison Group</a></li>
</ul>
<h3>Books</h3>
<p>It seems every time I check Amazon there is another SharePoint book being  released. They are getting more and more specific to the particular capability  areas of SharePoint such as BDC, Workflow, InfoPath which allows Developers to  deep dive into the areas they are trying to implement.</p>
<p>Check out <a href="http://www.amazon.com/s?ie=UTF8&amp;tag=mozilla-20&amp;index=blended&amp;link_code=qs&amp;field-keywords=sharepoint&amp;sourceid=Mozilla-search">Amazon  for SharePoint</a> or the <a href="http://www.sharepointdevwiki.com/display/public/Books">SharePointDevWiki.com  book list</a>.</p>
<h2>The Cool Stuff to play with in the Toy Box</h2>
<p>There is plenty of cool activity in the development space to keep us  Developers happy and challenged&#8230;which will obviously need keep passionate  about the Platform. It is also a great way to differentiate yourself in the  SharePoint Community as mentioned when listing the bloggers out there.</p>
<h3>Silverlight</h3>
<p>Silverlight is making inroads into the Internet with its powerful Video  Streaming technology but also because of the implementation process that  separates Design from Development. There has been <a href="http://www.diigo.com/user/jthake/sharepoint+silverlight">some posts  already</a> surfacing on integrating Silverlight into SharePoint and also  rumours of SharePoint 14 improving the UI using Silverlight.</p>
<h3>TDD</h3>
<p>As mentioned above, TDD is a hot topic, and would also be a great area to  focus your existing skills on and apply them to SharePoint Implementations. I  encourage you to check out the <a href="http://www.diigo.com/user/jthake/tdd+sharepoint">posts around on  TDD</a>.</p>
<h3>WCF</h3>
<p>WCF is still relatively new and with those long horrible xml configuration  files going to take a while for the majority of Developers to move away from  standard .NET Web Services. SharePoint doesn’t support WCF out of the box but  there are <a href="http://www.diigo.com/user/jthake/wcf+sharepoint">posts out  there on this</a>.</p>
<h3>Azure</h3>
<p>A post for Developers wouldn’t be ‘cool’ if I didn’t mention Cloud Computing  <img src='http://sharepointmagazine.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> SharePoint Online is SharePoint in the Cloud. There are <a href="http://www.diigo.com/user/jthake/sharepoint+cloud">plenty of post</a> on  it and what you can/can’t do if the platform is hosted up in the cloud.</p>
<h3>jQuery</h3>
<p>So I caused a bit of a storm in a teacup with my ‘jQuery: the SharePoint Band  Aid’ post. <a href="http://www.diigo.com/user/jthake/sharepoint+jquery">jQuery +  SharePoint</a> is not going to go away and there are some great examples of how  powerful it can be. Microsoft have picked up jQuery and are running with it for  SharePoint 14 also.</p>
<h3>PowerShell</h3>
<p>PowerShell (PoSH) is another scripting language that seems to have taken the  SharePoint world by storm. If you are a PoSH wizard, then you should start  showing off your stuff by manipulating the SharePoint Object model. Check out  these <a href="http://www.diigo.com/user/jthake/powershell+sharepoint">PoSH  posts</a> to see what others are already doing. SharePoint 14 will also have a  lot of PoSH stuff going on for you to leverage.</p>
<h1>Conclusion</h1>
<p>So hopefully this gives you a feel for what SharePoint can do for you as a  Customiser/Developer and also where to find more information to help you.</p>
<p>I encourage everyone who is going down this path to help collaborate on the <a href="http://www.sharepointdevwiki.com">SharePointDevWiki.com</a> to make experiences for new people moving in this direction easier in the future.</p>
<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/development/leveraging-the-sharepoint-platform-part-5-why-use-sharepoint-as-a-development-platform">Leveraging the SharePoint Platform (Part 5) - Why use SharePoint as a Development Platform?</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/RSGYfbB9FPylEdCGO9EkmcVjSqc/0/da"><img src="http://feedads.g.doubleclick.net/~a/RSGYfbB9FPylEdCGO9EkmcVjSqc/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/RSGYfbB9FPylEdCGO9EkmcVjSqc/1/da"><img src="http://feedads.g.doubleclick.net/~a/RSGYfbB9FPylEdCGO9EkmcVjSqc/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SharepointMagazine?a=p7dXdZhxxqQ:WUnjGV7L3x4:kmCBgzMKvIA"><img src="http://feeds.feedburner.com/~ff/SharepointMagazine?i=p7dXdZhxxqQ:WUnjGV7L3x4:kmCBgzMKvIA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SharepointMagazine/~4/p7dXdZhxxqQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/technical/development/leveraging-the-sharepoint-platform-part-5-why-use-sharepoint-as-a-development-platform/feed</wfw:commentRss>
		<feedburner:origLink>http://sharepointmagazine.net/technical/development/leveraging-the-sharepoint-platform-part-5-why-use-sharepoint-as-a-development-platform</feedburner:origLink></item>
		<item>
		<title>Everything You Need to Know about BDC: Part 5 of 8</title>
		<link>http://feedproxy.google.com/~r/SharepointMagazine/~3/BgyK_2ppIRM/everything-you-need-to-know-about-bdc-part-5-of-8</link>
		<comments>http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-5-of-8#comments</comments>
		<pubDate>Tue, 03 Mar 2009 06:00:56 +0000</pubDate>
		<dc:creator>Wen He</dc:creator>
		
		<category><![CDATA[Administration]]></category>

		<category><![CDATA[Customisation]]></category>

		<category><![CDATA[Development]]></category>

		<category><![CDATA[Technical]]></category>

		<category><![CDATA[adf]]></category>

		<category><![CDATA[Application Definition]]></category>

		<category><![CDATA[BDC]]></category>

		<category><![CDATA[Business Data]]></category>

		<category><![CDATA[Customization]]></category>

		<category><![CDATA[Enterprise Search]]></category>

		<category><![CDATA[search]]></category>

		<category><![CDATA[Search Center]]></category>

		<category><![CDATA[User Experience]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=2512</guid>
		<description><![CDATA[In this article, we will be focusing on BDC Search. Specifically we’ll be focusing on how to enable BDC Search, how to enable full and incremental crawls of BDC data sources, and how to create a search content source and search scopes. <p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-5-of-8">Everything You Need to Know about BDC: Part 5 of 8</a></p>
]]></description>
			<content:encoded><![CDATA[<p><span>Welcome back to Part 5 of our 8 Business Data Catalog (BDC) series. In this article, we will be focusing on BDC Search. </span><span>Specifically we’ll be focusing on how to enable BDC Search, how to enable full and incremental crawls of BDC data sources, and </span><span>how to create a search content source and search scopes. We’ll then walk you through how to make our customer </span><span>data searchable and how to make the search results &#8220;actionable&#8221;.</span></p>
<p><span>If you’ve been following our BDC series, we’ve previously gone through the following topics:</span></p>
<ol>
<li><span><span><span><span><a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-1-of-8">Part 1</a></span></span></span>, BDC Technical Architecture</span></li>
<li><span><span><span><span><a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-2-of-8">Part 2</a></span></span></span>, Application Definition File (ADF) and its Development</span></li>
<li><span><span><span><span><a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-3-of-8">Part 3</a></span></span></span>, Developing an ADF to Connect to Web Services</span></li>
<li><span><span><span><span><a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-4-of-8">Part 4</a></span></span></span>, Using BDC Web Parts to Consume BDC Data</span> and Embedding BDC Data in Lists</li>
</ol>
<div><span>Now consider the following scenarios:</span></div>
<ul>
<li>How can I find the customer information for Great Lake Good Market in CRM?</li>
<li>How can I find the projects and resources details in Project Server 2007?</li>
<li>How can I find an employee&#8217;s legal name in HR system?</li>
</ul>
<p>With the help of the BDC Search, these all become possible. The Enterprise Search in MOSS can gather, index, and offer full-text search on all business data (entity instances) from applications registered in the BDC. Not only does it enable us to find answers in MOSS, but also it allows us to do so without having to leave SharePoint to go to these systems individually.  It makes integrating search into existing line of business (LOB) applications like a CRM solution easier.</p>
<p>For example, if we register the <strong>Northwind</strong> sample database in the BDC, Enterprise Search can crawl it and return customer data in search results. In addition, the Enterprise Search feature’s extensibility enables us to create customized search experiences. We can create a custom search tab in the Search Center where our users can search for customers in the database, and we can also create a custom UI for the search results based on which we can also take action.  So let&#8217;s dive right into it.</p>
<h3>BDC Search Overview</h3>
<p>As we&#8217;ve covered in prior articles, surfacing the BDC data to SharePoint using BDC Web Parts and lists is just first part of the BDC saga, it can also enable you to index and search on the BDC data. The following figure is an example of searching for information about a customer and then displaying both structured data from the database and unstructured documents and content stored within SharePoint.</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/01/image23.png"><img style="0px" src="http://sharepointmagazine.net/wp-content/uploads/2009/01/image-thumb23.png" border="0" alt="image" width="644" height="370" /></a><br />
<strong>Figure 1:  Enterprise Search with BDC</strong></p>
<p>Here&#8217;s another example of leveraging BDC to index Project Server data and enable us to search the different objects (projects, tasks, resources, custom fields, lookup tables, and so on).  This is of great value because out of the box the Project Server data is not indexed. Only the objects in project workspace are indexed such as Issues, Risks, Documents, etc. For instance, if we are looking for project detail information for the Enterprise resource planning (ERP) project, we can search our Project Server and find the answers as shown in <strong>Figure 2</strong>:</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/01/image22.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/01/image-thumb22.png" border="0" alt="image" width="644" height="402" /></a><br />
<strong>Figure 2: Search Project Server with BDC</strong></p>
<p>The BDC is truly a catalog of business applications that helps bridge the gap between MOSS and business applications by bringing in key data from various applications to SharePoint sites, lists, searches, and user profiles.  Let&#8217;s revisit the BDC architecture from <span><span><span><span><a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-1-of-8">Part 1</a></span></span></span></span> with <strong>both XML</strong> <strong>Metadata</strong> and <strong>Search</strong> components highlighted in <strong>Figure 3</strong>.</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2008/12/image87.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2008/12/image-thumb86.png" border="0" alt="image" width="644" height="450" /></a><br />
<strong>Figure 3:  BDC architecture with emphasis on the Search</strong></p>
<p>Firstly, we&#8217;ve highlighted the XML Metadata because it is the key element in the Application Definition that makes the BDC Search possible. BDC operates off of an XML-based Application Definition File (ADF). The metadata in ADF enables MOSS to crawl the BDC data source and add them to the search index.</p>
<p>Secondly, we highlight the Search component because the search engine uses a protocol handler to crawl and a security trimmer to filter results. BDC uses these just like third party implementations when supporting BDC searching.</p>
<p>BDC Search enables us to quickly find content in business data through search queries. It also integrates with search scopes and search center to become an integral part of MOSS Enterprise Search. Here I&#8217;ve created a custom search tab and a search scope for the BDC data to create a unique search experience in which the BDC search results are segregated from the rest of SharePoint search results. See <strong>Figure 4</strong>.</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2008/12/image88.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2008/12/image-thumb87.png" border="0" alt="image" width="644" height="454" /></a><br />
<strong>Figure 4: Customized BDC Search Experience in Search Center</strong></p>
<p>By enabling the search of BDC data, BDC Search extends the SharePoint search capabilities. This extends the reach of the back-end LOB systems.  Today most LOB systems don’t have Full-Text search capability and BDC Search can serve for that purpose.</p>
<p>However, out of the box the BDC Search does not support indexing unstructured data like documents in a document management system. This is because the protocol handler for BDC is meant to connect to external structured data only. With custom protocol handlers, it&#8217;s possible to make MOSS index unstructured data . For example, using Web services to directly support BDC we can enable SharePoint to search, list, and retrieve documents from an external document management system via Web services.</p>
<p>Now let&#8217;s look into how to enable BDC Search.</p>
<h3>Enabling BDC Search</h3>
<p>One might think once we import an ADF, we can start to search.  BDC Search doesn&#8217;t come automatically, and we must enable it.  To enable BDC Search, we must first make sure these two methods exist in the ADF for the entity you want to crawl:</p>
<ol>
<li>SpecificFinder</li>
<li>IdEnumerator</li>
</ol>
<p>These are the only required metadata for Enterprise Search to use BDC to index the business application&#8217;s data.</p>
<p>In <span><span><span><span><a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-2-of-8">Part 2</a></span></span></span>,</span> we’ve covered the ADF and its vocabulary: System (data source), Entity (table), Method (operation on entity), and Association (relationship). There are three primary types of methods: Finder, SpecificFinder and IdEnumerator. An IdEnumerator method returns a searchable list of unique IDs for an entity. This list enables indexing of the entities and SpecificFinder is then used to find details for the entity instance based on the specific ID. Therefore, IdEnumerator and SpecificFinder work together to enable Enterprise Search to use BDC to crawl the business data.</p>
<p>Now since we have a good understanding of what it takes, let&#8217;s put it in action. We&#8217;re going to use <a href="http://msdn.microsoft.com/en-us/library/bb736296.aspx"><strong>Business Data Catalog Definition Editor</strong></a>, a free tool from the <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=6D94E307-67D9-41AC-B2D6-0074D6286FA9&amp;displaylang=en"><strong>MOSS SDK</strong></a>, to create our ADF (shown in <strong>Figure 5</strong> below). Though one of the limitations of this tool is that it doesn&#8217;t create a <strong>Finder</strong> method, BDC Search doesn&#8217;t need use this anyway, so it works very well for creating an ADF that&#8217;s just used for searching. You can learn how to use this tool <a href="http://msdn.microsoft.com/en-us/library/bb736296.aspx">here</a>.</p>
<p><span><span><span><span><span><span><span><span><span>Incidentally, both <a href="http://www.simego.net/MOSS_BDC_Design_Studio.aspx">MOSS BDC Design Studio</a> and <a href="http://www.lightningtools.com/bdc-meta-man/default.aspx">BDCMetaMan</a> will create these methods necessary to implement BDC searching.</span></span></span></span></span></span></span></span></span></p>
<p>We begin by adding a LOB system for our sample database, a modified version of <strong>Northwind</strong> database. We&#8217;re going to use the <strong>Customers</strong> entity that resembles one in a CRM system (or the like).</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2008/12/image89.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2008/12/image-thumb88.png" border="0" alt="image" width="644" height="380" /></a><br />
<strong>Figure 5: </strong><strong>Create Application Definition</strong></p>
<p>To index and search for Customers entity in the database, we&#8217;re performing the following tasks:</p>
<ol>
<li>Define an IdEnumerator method in the BDC definition (<strong>Figure 6</strong>)</li>
<li>Define a SpecificFinder method in the BDC definition (<strong>Figure 7</strong>)</li>
</ol>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2008/12/image90.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2008/12/image-thumb89.png" border="0" alt="image" width="644" height="138" /></a><br />
<strong>Figure 6: Define a special type of MethodInstance method IdEnumerator</strong>.</p>
<p>The <strong>IdEnumerator </strong>method returns a list of CustomerID records, which will be indexed by MOSS Search. So now we know that the sole purpose of <strong>IdEnumerator </strong>here is to enable Search.  Here&#8217;s the SQL query:</p>
<div><span style="Courier New;">Select CustomerID from Customers</span></div>
<div><span><br />
</span></div>
<div><span> <a href="http://sharepointmagazine.net/wp-content/uploads/2008/12/image91.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2008/12/image-thumb90.png" border="0" alt="image" width="644" height="218" /></a><br />
</span><strong>Figure 7: Define a SpecificFinder</strong></div>
<div>
<p>The <strong>SpecificFinder</strong> method then uses the CustomerID returned from above IdEnumerator method as a parameter (<strong><span class="kwrd">where</span> CustomerID=@CustomerID</strong>) to retrieve the fields for this particular customer. This is how the BDC search is able to search the entire Customers entity. So to make a field searchable, we just include it in the query and return as type <strong>string</strong>.  Here&#8217;s the SQL Query:</p>
<p><span style="x-small;">Select CustomerID,CompanyName,ContactName,ContactTitle,Address,City,Region,PostalCode,Country,Phone,Fax<br />
</span><span style="x-small;">from Customers<br />
</span><span style="x-small;">where customerID=@CustomerID</span></p>
<h3>Import Application Definition</h3>
<p>Now we have our required metadata well-defined in the ADF, we are ready to export the XML metadata to an ADF file and then import it to MOSS.  Once we have it imported, we can confirm that our Customers entity implements the two methods in SSP Administration page by viewing application and then entity. The Crawlable property under Entity Information means our Customers entity is available to be crawled, as shown in <strong>Figure 8</strong>.</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2008/12/image92.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2008/12/image-thumb91.png" border="0" alt="image" width="644" height="209" /></a><br />
<strong>Figure 8: View Entity Information in SSP</strong></p>
<p>So far we have started from creating the ADF to importing it to enable searching. Since we can enable searching on any entity that has an IdEnumerator and SpecificFinder defined, we don&#8217;t have to start from scratch to set this up specifically for search.  We can just go straight to configuring the Enterprise Search.</p>
<h3>Configuring the Enterprise Search</h3>
<p>Configuring the Enterprise Search consists of the following steps:</p>
<ol>
<li>Create a content source</li>
<li>Perform a full crawl</li>
<li>Create a search scope (optional)</li>
<li>Add scope rule (optional)</li>
</ol>
<p>We start by creating a content source for our BDC application and performing a full crawl, then optionally create a search scope and scope rule.  These steps are very straight forward so I will focus on the main points. If you&#8217;re interested in each and every detail, check out the <a href="http://sharepointmagazine.net/technical/customisation/customizing-search-series-new-content-and-scope-from-a-bdc-application">Customizing Search Series</a> by Steve Mann.</p>
<p><strong>Step 1: Create a content source (Figure 9)</strong></p>
<p>In order to create a content source, go to SSP Administration page –&gt; Search Settings under Search section, and click on &#8220;Content Sources and Crawl Schedules&#8221;. Click on &#8220;New Content Source&#8221; and give a name for this content source; specify &#8220;Business Data&#8221; as the type of the content to be crawled. Additionally, if we wish to index the content at regular intervals we could create a Crawl schedule that defines our full crawl schedules. Here is how my screen looks:</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2008/12/image93.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2008/12/image-thumb92.png" border="0" alt="image" width="308" height="484" /></a><br />
<strong>Figure 9: Create a content source</strong></p>
<p><strong>Step 2: Perform a full crawl (Figure 10)</strong></p>
<p>In the above step, since I&#8217;ve checked the Start full crawl of this content source, it will initiate a full crawl of the new content source, and we should now see the content source crawling as shown below:</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2008/12/image94.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2008/12/image-thumb93.png" border="0" alt="image" width="563" height="197" /></a><br />
<strong>Figure 10: Perform a full crawl</strong></p>
<p>We can also check the crawl log to make sure that the BDC data has been indexed correctly. At this point, we should be able to search our customers table. If we search for &#8220;great lakes&#8221;, we get search results as shown in <strong>Figure 1 </strong>above.</p>
<p>As we can see, both documents and BDC Search Results are listed together. This demonstrates some of the real power behind Enterprise Search. That is, we’re seeing SharePoint content side by side with external BDC content. This is great especially when we intend to search everything including both documents and BDC sources.</p>
<p>Another real power of Enterprise Search is its extensibility. We can create customized search experiences by creating a custom search tab in the Search Center where our users can search for customers in the database, and we can create a custom UI for the search results. This is what we’re going to do to separate the BDC Search results from other content. We can achieve this by performing the following two additional steps: 1) creating a search scope for BDC and 2) adding a scope rule.</p>
<p><strong>Step 3: Create a search scope (Figure 11)</strong></p>
<p>In order to create a search scope, go to the SSP Administration page, under Search section, click on Search settings. In the &#8220;Scopes&#8221; area, click on &#8220;View Scopes&#8221;.  Click on &#8220;New Scope&#8221;, give it a name.</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2008/12/image95.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2008/12/image-thumb94.png" border="0" alt="image" width="644" height="302" /></a><br />
<strong>Figure 11: Create a search scope</strong></p>
<p><strong>Step 4: Add scope rule </strong></p>
<p>Click on &#8220;Add Rules&#8221; where it says &#8220;Empty - Add Rules&#8221; on the newly added scope (<strong>Figure 12</strong>).</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2008/12/image96.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2008/12/image-thumb95.png" border="0" alt="image" width="644" height="276" /></a><br />
<strong>Figure 12: Add scope rule</strong></p>
<p>Specify a Content Source as shown below (<strong>Figure 13</strong>):</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2008/12/image97.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2008/12/image-thumb96.png" border="0" alt="image" width="644" height="233" /></a><br />
<strong>Figure 13: Add scope rule - specifying a content source</strong></p>
<p>Our BDC Search scope has been created and is now available in the search drop-down as shown in <strong>Figure 14</strong>. If we now search for &#8220;great lakes&#8221;, we get search results back from the existing database as shown in <strong>Figure 4 </strong>above.</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2008/12/image98.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2008/12/image-thumb97.png" border="0" alt="image" width="644" height="137" /></a><br />
<strong>Figure 14: BDC Search scope is available for use</strong></p>
<p>As you have seen, the last two steps, even though optional, do give us additional value.  That is, to segregate the BDC search results from the rest of SharePoint search results so that we can focus on just business data. Thus better search relevance is accomplished through the extensibility!</p>
<h3>BDC Search Access Permission</h3>
<p>It is a good time for us to know how to configure BDC Search access permission so that it will work out-of-the-gate. Often times we forget about it or ignore it, and only when the crawling fails or when the search returns no results, do we go in and dig the logs, even though it is not a bad troubleshooting methodology.</p>
<p>In these examples, we’ve been using &#8220;PassThrough&#8221; authentication in the ADF. That means additional settings have to be configured so that the &#8220;Default Content Access Account&#8221; (the account used to crawl) has access to the database. Also the “Default Content Access Account” must have appropriate rights to the BDC application and entity.</p>
<p>We’ll achieve that in the following steps:</p>
<ol>
<li>Create a new Active Directory account for BDC search. We’ll call ours MOSS.Search.</li>
<li>Change the default content access account to that account in search settings (<strong>Figure 15</strong>).</li>
<li>Change search crawler account to that account under Operations –&gt; Services –&gt; Office SharePoint Server Search.</li>
<li>Grant this account db_datareader access to the database in SQL Server.</li>
<li>Grant this account Execute, Selectable in clients in Manage permissions for the ADF (<strong>Figure 16</strong>).</li>
</ol>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2008/12/image100.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2008/12/image-thumb99.png" border="0" alt="image" width="644" height="344" /></a><br />
<strong>Figure 15:  Specify the Default Content Access Account</strong></p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2008/12/image101.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2008/12/image-thumb100.png" border="0" alt="image" width="644" height="208" /></a><br />
<strong>Figure 16:  Grant Execute, Selectable permissions</strong></p>
<p><strong>Note:</strong> there might be a delay of a few minutes after the permission is changed on BDC application. You may delete and re-import the BDC application definition at when needed &#8212; no need to re-crawl as long as the BDC name is not changed.</p>
<h3>Enabling Incremental Crawling</h3>
<p>Next, we’re going to show you how create an enhancement to our ADF to support incremental crawling through the use of the __BdcLastModifiedTimestamp entity property.</p>
<p>To optimize search performance, it’s important to have incremental crawl. As you may know, Incremental Crawl is a process of crawling only new or changed content from the previous full or incremental crawl. This means that we have to let BDC know what has changed since its last crawl.</p>
<p>To ensure that incremental crawls can be performed in the database when indexing, we’ll need to enhance the IdEnumerator method that has a return field that represents the last update time for that particular row. The Type attribute of the __BdcLastModifiedTimestamp property must be System.String and its value must be set to the value of the Name attribute of the TypeDescriptor for the field returned by the IDEnumerator method that contains the last modified date and time of the entity instance. This is illustrated below.</p>
<p>In our Customers table, we start by adding a column called LastUpdated of data type DateTime to indicate the last modified time of a single row. SharePoint indexing service will use that as a time stamp and incremental crawling is enabled. SQL-knowledgeable people should not confuse this with a timestamp data type. The example we are walking through is specific to SQL Server, but the concept will apply to other databases or Web Service methods.</p>
<p>Here are the specific steps to enable incremental crawling:</p>
<ol>
<li>Update the database table to add a LastUpdated column of datetime data type (<strong>Figure 16</strong>).</li>
<li>Ensure the value of LastUpdated column is set to the current date and time when the row changes. (This can be accomplished with an Update trigger.)</li>
<li>Update ADF to have the __BdcLastModifiedTimestamp property of the entity set to LastUpdated (<strong>Figure 17).</strong></li>
<li>Update ADF to have IdEnumerator mothod return LastUpdated field (<strong>Figure 18</strong>).</li>
<li>Update ADF to have a TypeDescriptor with its TypeName attribute set to System.DateTime (<strong>Figure 19</strong>).</li>
</ol>
<p>The following figures are the screens for performing the above tasks:</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/01/image.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/01/image-thumb.png" border="0" alt="image" width="228" height="244" /></a><br />
<strong>Figure 16: Create a LastUpdated column of datetime type in SQL Server</strong></p>
<p><img src="http://sharepointmagazine.net/wp-content/uploads/2008/12/image102.png" alt="" /><br />
<strong>Figure 17: Add the __BdcLastModifiedTimestamp property</strong></p>
<p><img src="http://sharepointmagazine.net/wp-content/uploads/2008/12/image103.png" alt="" /><br />
<strong>Figure 18: Have IdEnumerator method return LastUpdated field</strong></p>
<p><img src="http://sharepointmagazine.net/wp-content/uploads/2008/12/image104.png" alt="" /><br />
<strong>Figure 19: Add a TypeDescriptor with its TypeName attribute set to System.DateTime</strong></p>
<p>To compare the performance, I then performed an incremental crawl.  This is shown in <strong>Figure 20</strong> below.</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2008/12/image105.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2008/12/image-thumb104.png" border="0" alt="image" width="644" height="249" /></a><br />
<strong>Figure 20: Comparison between the incremental crawling and the full crawling.</strong></p>
<p>In our sample, it took significantly less time in the incremental crawling than the full crawl (35 seconds vs. 54 seconds).  Depending on the size of the database and the number of changes that need to be processed with each crawl, the difference in crawl times will vary. The key of enabling incremental crawl here is performance so that the back-end systems are not unnecessarily burdened by the crawling.</p>
<h3>Actions</h3>
<p>Lastly, let’s show you how we can make our BDC search results &#8220;actionable&#8221; by creating a custom action on the Customers entity. There are two ways to create a custom action. It can be defined either in the ADF or added after the ADF is imported by going to SSP administration page (View Application –&gt; View Entity).</p>
<p>By default through the <strong>SpecificFinder</strong> method, we get a default view Profile action that links to a simple page with your search results. This is where the customization comes in, and you could create custom Web Parts to provide more user-friendly and richer user experience. We’ll dedicate Part 8 of this series to Custom Actions so you have the best for last. For this article, let&#8217;s quickly create a custom action to map the customer using Live Search Maps (maps.Live.com).</p>
<p>Here are the specific steps to enable custom action with Live Search Maps:</p>
<ol>
<li>Add Action and set parameters (<strong>Figure 21)</strong></li>
<li>Check action<strong> (Figure 22</strong>)</li>
</ol>
<p>Go to SSP administration page (View Application –&gt; View Entity), add action and configure URL parameters.</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2008/12/image106.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2008/12/image-thumb105.png" border="0" alt="image" width="518" height="484" /></a><br />
<strong>Figure 21:  Create a custom action in SSP</strong></p>
<p>The parameter &#8220;Address&#8221; will be substituted at index &#8220;0&#8243;, which is specified as a querystring URL to maps.live.com. If you have already deployed your ADF before creating a custom action, you will need to redeploy it if you use this approach to adding a custom action.</p>
<p>Check the custom action to ensure it&#8217;s configured and ready for use <strong>(Figure 22</strong>).</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2008/12/image107.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2008/12/image-thumb106.png" border="0" alt="image" width="644" height="125" /></a><br />
<strong>Figure 22: Live Map Action appears under Actions</strong></p>
<p>Now let&#8217;s test-drive our search and custom action in the following two steps:</p>
<ol>
<li>Search any customer in the Search Center (<strong>Figure 23</strong>)</li>
<li>Perform the custom action based on the search result (<strong>Figure 24</strong>)</li>
</ol>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/01/image2.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/01/image-thumb2.png" border="0" alt="image" width="644" height="217" /></a><br />
<strong>Figure 23: Search result of a customer entity</strong></p>
<p>Clicking on &#8220;The Big Cheese<strong>&#8220;</strong> will take us to the default profile page, where we can see and act upon the custom action <strong>Live Map (maps.live.com)</strong> as shown below. Clicking on <strong>Live Map</strong> will issue a search on maps.live.com using the address of &#8220;The Big Cheese&#8221;. Here&#8217;s the live map (<strong>Figure 26</strong>). Neat!</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2008/12/image108.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2008/12/image-thumb107.png" border="0" alt="image" width="240" height="322" /></a><br />
<strong>Figure 24: BDC Search Results with Live Map action available</strong></p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2008/12/image109.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2008/12/image-thumb108.png" border="0" alt="image" width="644" height="439" /></a><br />
<strong>Figure 25:  Live Map of the searched customer</strong></p>
<h3>Conclusion</h3>
<p><span style="x-small;">In this article we have covered the concepts behind BDC search and how to enable it. We&#8217;ve then walked you through how to make our Customer data searchable, and how to make a custom action on search results. In doing so, we&#8217;ve demonstrated the power behind BDC and MOSS Enterprise Search. Even though we have only used a database in our example, this is also all possible with Web Services, provided the SpecificFinder and IdEnumerator methods are still in place. Hope you have enjoyed reading it as much as I have enjoyed writing it. Look forward to your comments and suggestions.  Aloha!</span></div>
<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-5-of-8">Everything You Need to Know about BDC: Part 5 of 8</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/76aTAWq9XrDHPnOgP9OvGBCYr8U/0/da"><img src="http://feedads.g.doubleclick.net/~a/76aTAWq9XrDHPnOgP9OvGBCYr8U/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/76aTAWq9XrDHPnOgP9OvGBCYr8U/1/da"><img src="http://feedads.g.doubleclick.net/~a/76aTAWq9XrDHPnOgP9OvGBCYr8U/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SharepointMagazine?a=BgyK_2ppIRM:X8w0lo4FRXw:kmCBgzMKvIA"><img src="http://feeds.feedburner.com/~ff/SharepointMagazine?i=BgyK_2ppIRM:X8w0lo4FRXw:kmCBgzMKvIA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SharepointMagazine/~4/BgyK_2ppIRM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-5-of-8/feed</wfw:commentRss>
		<feedburner:origLink>http://sharepointmagazine.net/technical/administration/everything-you-need-to-know-about-bdc-part-5-of-8</feedburner:origLink></item>
		<item>
		<title>User Experience Week: Using DelegateControls to Customize the User Experience</title>
		<link>http://feedproxy.google.com/~r/SharepointMagazine/~3/hlqLookIwkA/sharepoint-magazine-user-experience-week-using-delegatecontrols-to-customize-the-user-experience</link>
		<comments>http://sharepointmagazine.net/technical/development/sharepoint-magazine-user-experience-week-using-delegatecontrols-to-customize-the-user-experience#comments</comments>
		<pubDate>Fri, 27 Feb 2009 07:09:50 +0000</pubDate>
		<dc:creator>furuknap</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=2710</guid>
		<description><![CDATA[In this final article for the SharePoint User Experience Week here on SharePoint Magazine I will talk about one of the least used, but most powerful techniques we have for customizing the SharePoint User Experience, namely the DelegateControl.<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/development/sharepoint-magazine-user-experience-week-using-delegatecontrols-to-customize-the-user-experience">User Experience Week: Using DelegateControls to Customize the User Experience</a></p>
]]></description>
			<content:encoded><![CDATA[<p>In this final article for the SharePoint User Experience Week here on <a href="http://sharepointmagazine.net/" target="_blank">SharePoint Magazine</a> I will talk about one of the least used, but most powerful techniques we have for customizing the SharePoint User Experience, namely the DelegateControl.</p>
<p>Before we get going, however, I’d like to give you a small gift for your attention through this week. Exclusive to the first 25 SharePoint Magazine readers you can use the discount code SPMUX to get a $5 discount on the first issue of <a title="Learn SharePoint with Understanding SharePoint Journal" href="http://www.understandingsharepoint.com/journal" target="_blank">Understanding SharePoint Journal</a>. This message will be removed once the first 25 people have got their issue.</p>
<h1>What is a DelegateControl?</h1>
<p>A DelegateControl is a SharePoint ASP.NET control that acts as a placeholder for content or other controls. Think regular ASP.NET content placeholders but with a SharePoint Feature deployment method, meaning you can activate content on a page as you would activate any other feature in SharePoint. You might have seen these already is you’ve looked into the default.master file of a standard SharePoint installation.</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/02/delegatecontrolsindefaultmaster.png"><img style="0px" src="http://sharepointmagazine.net/wp-content/uploads/2009/02/delegatecontrolsindefaultmaster-thumb.png" border="0" alt="delegatecontrols.in.default.master" width="1101" height="311" /></a></p>
<p>A lot of SharePoint default functionality uses DelegateControls. For example, the search box is really a DelegateControl, and when you install or activate MOSS or Search Server search functionality these products uses the DelegateControl to add their own search boxes to any existing site.</p>
<h2>Your First DelegateControl</h2>
<p>Let’s get our hands dirty right away and see how this gets done. Also, this is the example used by MSDN to show off the Delegate Control, so you might have seen this before.</p>
<ol>
<li>Start by creating a new feature. If you use <a href="http://www.codeplex.com/wspbuilder" target="_blank">WSPBuilder</a>, as explained in the “<a href="http://sharepointmagazine.net/technical/development/customizing-the-user-experience-of-sharepoint-fast-track-to-feature-generation-part-6-of-6" target="_blank">Fast Track to Feature Generation</a>” article, use a Blank Feature item type, and set the scope to Web.</li>
<li>In your elements.xml file, add the following code:</li>
</ol>
<p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;utf-8&#8243; ?&gt;<br />
&lt;Elements xmlns=&#8221;<a href="http://schemas.microsoft.com/sharepoint/&quot;">http://schemas.microsoft.com/sharepoint/&#8221;</a>&gt;<br />
&lt;Control ControlSrc=&#8221;~/_ControlTemplates/MySearchControl.ascx&#8221;<br />
Id=&#8221;SmallSearchInputBox&#8221;<br />
Sequence=&#8221;1&#8243;/&gt;<br />
&lt;/Elements&gt;</p>
<ol>
<li>Create a new file in the [12]\TEMPLATE\CONTROLTEMPLATES folder called MySearchControl.ascx. Open the file in Visual Studio</li>
</ol>
<p>You may also deploy the .ascx user control using WSPBuilder. If so, add a folder in the Solution Explorer under 12\TEMPLATE called CONTROLTEMPLATES and add the .ascx file there.</p>
<ol>
<li>In the MySearchControl.ascx file, add some sample ASP.NET controls, for example:</li>
</ol>
<p>&lt;%@ Control Language=&#8221;C#&#8221;%&gt;<br />
&lt;asp:Label ID=&#8221;Label1&#8243; runat=&#8221;server&#8221; Text=&#8221;No search here&#8230;&#8221;&gt;&lt;/asp:Label&gt;</p>
<ol>
<li>Deploy your feature and activate it before retuning to the front page. You should see something along the lines of:</li>
</ol>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/02/nosearchhere.png"><img style="0px" src="http://sharepointmagazine.net/wp-content/uploads/2009/02/nosearchhere-thumb.png" border="0" alt="NoSearchHere" width="425" height="308" /></a></p>
<p>The cool thing here is that once you grow tired of the support calls asking where the search box went you can simply deactivate the feature and your old search box returns.</p>
<p>Ok, this was a really simple, and likely completely useless example, but I just wanted to show how DelegateControls work. Let’s see if we can explore something a bit more useful.</p>
<h1>The Structure of a SharePoint:DelegateControl</h1>
<p>While the example above demonstrates how to use a DelegateControl and override its contents it is a simple and not very useful example. However, it serves as a starting point for the rest of this article, so I’ll explain what actually goes on.</p>
<h2>Control types and Id</h2>
<p>In the elements file we created earlier we added two attributes, the ControlSrc and the Id. These attributes determine which content (ControlSrc) should be placed in which DelegateControl (Id). Every DelegateControl must have a ControlId property when added to an ASP.NET page, and your Id attribute in the elements file should match this ControlId property.</p>
<p>The actual control is either a user control, in which case we specify the ControlSrc attribute and point it to our control, or it can be a server control, in which case we need to exchange the ControlSrc with a ControlAssembly and a ControlClass attribute:</p>
<p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;utf-8&#8243; ?&gt;<br />
&lt;Elements xmlns=&#8221;<a href="http://schemas.microsoft.com/sharepoint/&quot;">http://schemas.microsoft.com/sharepoint/&#8221;</a>&gt;<br />
&lt;Control ControlAssembly=&#8221;[STRONG ASSEMBLY NAME]&#8221;<br />
ControlClass=&#8221;[CLASS NAMESPACE AND NAME]&#8221;<br />
Id=&#8221;SmallSearchInputBox&#8221;<br />
Sequence=&#8221;1&#8243;/&gt;<br />
&lt;/Elements&gt;</p>
<p>You would of course exchange the [STRONG ASSEMBLY NAME] and [CLASS NAMESPACE AND NAME] with their respective values for your assembly and class. If you need help finding the strong name, just check out the post on ”<a title="How do I find the strong name of an assembly" href="http://www.understandingsharepoint.com/justask/how-do-i-find-the-strong-name-of-an-assembly" target="_blank">How do I find the strong name of an assembly</a>” at JustAsk or read on for a tip on how to do this if you have WSPBuilder installed.</p>
<h2>Sequence</h2>
<p>However, once we have defined which control to add to which DelegateControl we must understand a bit more about how the DelegateControl works to understand the remaining attribute Sequence.</p>
<p dir="ltr" align="left">The Sequence attribute basically tells SharePoint the order in which to process multiple controls. To understand how this works, consider having two features that both add content to the same DelegateControl. Now, a DelegateControl in a SharePoint page can set the AllowMultipleControls to True, in which case both the features’ content gets added, with the feature with the lowest Sequence attribute added first. The AdditionalPageHead DelegateControl is an example of a control that allows multiple controls to be added, and it is the only DelegateControl that allows this in the default.master that ships with SharePoint.</p>
<p dir="ltr" align="left">If the DelegateControl does not set the AllowMultipleControls to true, the only the feature with the lowest Sequence attribute gets added at all. The other features will not have their content added. This means that when you add a control to a DelegateControl you need to know which features have deployed content to the same DelegateControl, if any.</p>
<h1>Adding a bit of flair</h1>
<p>The AdditionalPageHead is a really useful DelegateControl. It is located inside the HEAD section of the default.master and it has the AllowMultipleControls set to True. This means we can add all sorts of goodies to the head using a feature.</p>
<h2>Style sheets through DelegateControls</h2>
<p>If you have read fellow SharePoint Magazine author Paul Culmsee’s series on <a href="http://www.cleverworkarounds.com/2007/10/08/sharepoint-branding-how-css-works-with-master-pages-part-1/" target="_blank">SharePoint Branding</a> you will know the difficulty facing designers looking to get their CSS added at the right time. Oh, and if you haven’t read the series it is well worth spending a few minutes reading through the first three parts at least.</p>
<p>Since the AdditionalPageHead DelegateControl is located right where we need to add any custom style sheets we can create our own control to add that style sheet and activate the sheet with a feature. As an added bonus, the AdditionalPageHead DelegateControl is also present in the application.master file, meaning we can add style sheets to the application pages as well, without ever touching a single Microsoft provided file.</p>
<p>Let’s see if we can solve Paul’s problem with a DelegateControl control.</p>
<p>Start with a new Visual Studio project, type WSPBuilder Project.</p>
<p>Add a new Feature with Receiver element. Next, add the following to your elements.xml file:</p>
<p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;utf-8&#8243; ?&gt;<br />
&lt;Elements xmlns=&#8221;<a href="http://schemas.microsoft.com/sharepoint/&quot;">http://schemas.microsoft.com/sharepoint/&#8221;</a>&gt;<br />
&lt;Control ControlAssembly=&#8221;[STRONG ASSEMBLY NAME]&#8221;<br />
ControlClass=&#8221;[CLASS NAMESPACE AND NAME]&#8221;<br />
Id=&#8221;AdditionalPageHead&#8221;<br />
Sequence=&#8221;1&#8243;/&gt;<br />
&lt;/Elements&gt;</p>
<p>Why use a Feature with Receiver instead of a Blank feature? Here’s a little trick, WSPBuilder does some real magic for you when building anything that requires you to input assembly information anywhere. Not only will WSPBuilder create a new class file for you, but it will enter the information you need for your Control element into the ReceiverAssembly and ReceiverClass of the feature.xml file in your new feature folder. Just copy the ReceiverAssembly attribute into the ControlAssembly and ReceiverClass into the ControlClass.</p>
<p>Delete the FeatureReceiver and FeatureClass from the feature.xml file, you wont need it, and it will break your feature activation.</p>
<p>Open the class file created by WSPBuilder for you, in the FeatureCode folder. Currently this is set to be a FeatureReceiver, so modify the file until you are left with this:</p>
<p>using System;<br />
using System.Collections.Generic;<br />
using System.Text;<br />
using Microsoft.SharePoint;<br />
using System.Web.UI.WebControls;</p>
<p>namespace StyleSheetDelegateControl<br />
{<br />
public class StyleSheetControl : WebControl<br />
{<br />
}<br />
}</p>
<p>This is just the outline for our control, the rest of the code we will add to the RenderControl method in a few steps. First, let’s add a simple CSS file to add to our pages.</p>
<p>Add a new folder called LAYOUTS to the TEMPLATE folder in your solution explorer.</p>
<p>WSPBuilder will map this folder to the LAYOUTS folder in [12]\TEMPLATE. The LAYOUTS folder in [12]\TEMPLATE is again linked to the virtual path _layouts in any SharePoint site, so it makes sense to put our style sheet there.</p>
<p>Add a new item to the LAYOUTS folder, type StyleSheet and name it “MyCustomSheet.css” or something nice. Just don’t call it anything that is already in the LAYOUTS folder.</p>
<p>Your Solution Explorer should now look something like this:</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/02/solutionwithcss.png"><img style="0px" src="http://sharepointmagazine.net/wp-content/uploads/2009/02/solutionwithcss-thumb.png" border="0" alt="SolutionWithCSS" width="293" height="381" /></a></p>
<p>Add something to the CSS file to test that your changes are actually happening. You might for example put</p>
<p>body<br />
{<br />
background: yellow;<br />
}</p>
<p>into the file.</p>
<p>Open the class file again, and output the link to the new style sheet in the RenderControl method as such:</p>
<p>public override void RenderControl(System.Web.UI.HtmlTextWriter writer)<br />
{<br />
writer.Write(&#8221;&lt;link rel=\&#8221;stylesheet\&#8221; type=\&#8221;text/css\&#8221; href=\&#8221;/_layouts/MyCustomSheet.css\&#8221;/&gt;&#8221;);<br />
}</p>
<p>Of course, if you named your file something else you would change the file name, but you know that. Also, I’m just linking to the root of the site collection (/_layouts/) and you might want to change that the use the SPWeb.Url property or something like that. this is just for illustrative purposes, right?</p>
<p>To test your new control, build your WSP file by right-cliking the project name in the Solution Explorer and choose WSPBuilder-&gt;Build WSP. To deploy, simply re-enter the WSPBuilder menu and select Deploy.</p>
<p>Finally, go to your favorite SharePoint site and activate the feature on the Site Settings-&gt;Site Features page. Depending on how fancy you made the CSS file you should see something like this:</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/02/cssresults.png"><img style="0px" src="http://sharepointmagazine.net/wp-content/uploads/2009/02/cssresults-thumb.png" border="0" alt="CSSResults" width="761" height="503" /></a></p>
<p>Sweet! Not only have we created a method to dynamically add a CSS file to a page using a feature, but what is really cool is that this feature also works on application pages.</p>
<p>Nice trick, eh?</p>
<h1>Further ideas</h1>
<p>Now that you have seen how your can create a DelegateControl and have it run regular .NET code I hope you get inspired to take this idea further. For example you could create a solution that displays different style sheets for different users. how about displaying a style sheet only if the current user is site admin? simply replace the writer.Write line with:</p>
<p>if (SPContext.Current.Web.UserIsSiteAdmin)<br />
{<br />
writer.Write(&#8221;&lt;link rel=\&#8221;stylesheet\&#8221; type=\&#8221;text/css\&#8221; href=\&#8221;/_layouts/MyCustomSheet.css\&#8221;/&gt;&#8221;);<br />
}</p>
<p>Now site administrators get and extra reminder that they are indeed running as site administrators and are thus capable of havoc, while regular users are get the standard interface.</p>
<p>Or, you could evolve this into a full-blown solution that allows users to select from a pre-defined set of styles, and have the control pick the right style sheet on an individual basis.</p>
<p>Before I end this article, I just want to share a few tips with you regarding utilizing DelegateControls.</p>
<h1>Creating your own DelegateControls</h1>
<p>DelegateControls support default content, which you can see demonstrated in the default.master in the TopNavigationDataSource control, around line 132. If no control has been added using a feature then the default content is used. When creating your own master pages, include DelegateControls for any part of the site that might potentially need to be changed, such as style sheets, navigational elements, images, etc. It is a lot easier to not use a DelegateControl when you have the option than it is to implement it later. Since the default content can contain any other ASP.NET control, all you have to do, to enable the option to override content using DelegateControls, is to wrap your content with a SharePoint:DelegateControl as such:</p>
<p>&lt;SharePoint:DelegateControl runat=&#8221;server&#8221; ControlId=&#8221;[MyControlId]&#8220;&gt;<br />
&lt;Template_Controls&gt;<br />
[YOUR CONTENT]<br />
&lt;/Template_Controls&gt;<br />
&lt;/SharePoint:DelegateControl&gt;</p>
<p>Then, when you need to change the content on a site, simply add a new feature that uses the Control element with the Id attribute you chose.</p>
<p>Second, when creating your own DelegateControls, think carefully about wheter you want to set AllowMultipleControls. If you add it, remember that _all_ features with Control elements matching your DelegateControl will be added. However, if you have good feature control it is easier to de-activate an unwanted feature than it is to add AllowMultipleControls afterwards.</p>
<h1>The End of SharePoint User Experience Week</h1>
<p>I do hope you have enjoyed this little tour of DelegateControls, and seen how cool it is to be able to insert content into any SharePoint page using a feature.</p>
<p>And, of course, I really, really hope you have enjoyed the SharePoint Magazine User Experience week, and that you now have a better understanding of the possibilities you have for creating or modifying the SharePoint User Experience. I can tell you that I have really enjoyed writing for you.</p>
<p>If you have ideas for future articles, comments, or questions, don’t be afraid to ask. You can contact me at furuknap&lt;[at]&gt;gmail.com. If your idea or question is really good you might just be featured in an article or even in the <a title="Learn SharePoint with Understanding SharePoint Journal" href="http://www.understandingsharepoint.com/journal" target="_blank">Understanding SharePoint Journal</a>.</p>
<p>Now, if you’ll all excuse me, I have a development machine that needs some cleaning.</p>
<p>.b</p>
<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/development/sharepoint-magazine-user-experience-week-using-delegatecontrols-to-customize-the-user-experience">User Experience Week: Using DelegateControls to Customize the User Experience</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/w1YBqZgun13lU9AYA_Zztx9zHcI/0/da"><img src="http://feedads.g.doubleclick.net/~a/w1YBqZgun13lU9AYA_Zztx9zHcI/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/w1YBqZgun13lU9AYA_Zztx9zHcI/1/da"><img src="http://feedads.g.doubleclick.net/~a/w1YBqZgun13lU9AYA_Zztx9zHcI/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SharepointMagazine?a=hlqLookIwkA:9hQFCeFJRUc:kmCBgzMKvIA"><img src="http://feeds.feedburner.com/~ff/SharepointMagazine?i=hlqLookIwkA:9hQFCeFJRUc:kmCBgzMKvIA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SharepointMagazine/~4/hlqLookIwkA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/technical/development/sharepoint-magazine-user-experience-week-using-delegatecontrols-to-customize-the-user-experience/feed</wfw:commentRss>
		<feedburner:origLink>http://sharepointmagazine.net/technical/development/sharepoint-magazine-user-experience-week-using-delegatecontrols-to-customize-the-user-experience</feedburner:origLink></item>
		<item>
		<title>Customizing the User Experience of SharePoint: Fast track to Feature Generation (Part 6 of 6)</title>
		<link>http://feedproxy.google.com/~r/SharepointMagazine/~3/Yx1h6Fj68og/customizing-the-user-experience-of-sharepoint-fast-track-to-feature-generation-part-6-of-6</link>
		<comments>http://sharepointmagazine.net/technical/development/customizing-the-user-experience-of-sharepoint-fast-track-to-feature-generation-part-6-of-6#comments</comments>
		<pubDate>Thu, 26 Feb 2009 07:03:03 +0000</pubDate>
		<dc:creator>furuknap</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Technical]]></category>

		<category><![CDATA[CAML]]></category>

		<category><![CDATA[experiance]]></category>

		<category><![CDATA[magazine]]></category>

		<category><![CDATA[manager]]></category>

		<category><![CDATA[sharepoint]]></category>

		<category><![CDATA[User]]></category>

		<category><![CDATA[wsp]]></category>

		<category><![CDATA[wspbuilder]]></category>

		<guid isPermaLink="false">http://sharepointmagazine.net/?p=2691</guid>
		<description><![CDATA[The final part of the "Customizing the SharePoint User Experience" series teaches tricks and tips for speeding up feature generation for SharePoint.<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/development/customizing-the-user-experience-of-sharepoint-fast-track-to-feature-generation-part-6-of-6">Customizing the User Experience of SharePoint: Fast track to Feature Generation (Part 6 of 6)</a></p>
]]></description>
			<content:encoded><![CDATA[<p>It’s the final part of the “Customizing the User Experience of SharePoint” series. This day we also celebrate the third day of SharePoint User Experience week here on <a href="http://sharepointmagazine.net/" target="_blank">SharePoint Magazine</a>. One full week, focusing only on understanding SharePoint architecture from a user experience point of view. I couldn’t be more happy on drugs.</p>
<p>The Customizing the User Experience of SharePoint series aims to explain how the user experience works, from how the interface is built down to details on how columns in lists get created.</p>
<p>The series is also an exclusive preview of the topics from my upcoming book, “<a title="SharePoint Developer book" href="http://www.understandingsharepoint.com/userexperience" target="_blank">Building the SharePoint User Experience</a>”, which deals with SharePoint user experience for 350 pages. Actually, as with this series, the book explains the SharePoint architecture from a user experience perspective.</p>
<p>Here is an article outline for the six parts:</p>
<p><strong>Part 1: Overview of the default SharePoint interface from a technical point of view</strong></p>
<p>In the first article we will look at how the default SharePoint interface is built. We will look at a site, going from top-down, explore some of the the default lists, the fields used to create the basic field types, which content types are available, and how list forms are rendered.</p>
<p><strong>Part 2: Modifying the default experience </strong></p>
<p>This article will show you which options are available for you to modify and improve the default setup. Learn how to override the default rendering of fields or forms without voiding your supported state.</p>
<p><strong>Part 3: Lists and custom list forms </strong></p>
<p>The third article will cover the basics of customizing lists using different views, custom list forms, and fields.</p>
<p><strong>Part 4: Content types user interface</strong></p>
<p>The next article will explore how you can utilize content types to display different input forms and display forms.</p>
<p><strong>Part 5: Custom fields deep dive </strong></p>
<p>Ever wanted to create a new field type? SharePoint enables you to do this and it is a very powerful tool for customizing the user experience.</p>
<p><strong>Part 6: Fast track to feature generation </strong></p>
<p>Writing custom lists with content types by hand can take a massive amount of time. In the final installment I will share with you some tools and techniques that makes list, field, and content type generation very fast.</p>
<p>And that is exactly what we’re going to cover today. We’ll explore how you can speed up development time using some simple tools and techniques that are freely available. So let’s get down to business, shall we?</p>
<h1>Tools of the trade</h1>
<p>Being an efficient developer is not about having the most tools, but about having the right tools. More importantly, it is about learning how to apply those tools in the right fashion. I’ll give you a few tips here, tips that enable me to create features, having complex columns, content types, and list views within minutes rather than hours.</p>
<p>I am going to assume that you have a copy of Visual Studio that you like. VS 2005 or 2008 will do, I’ll use 2005 here to make sure we support everyone. If you don’t have Visual Studio you should get that now, the <a href="http://www.microsoft.com/exPress/download/" target="_blank">Express</a> versions will do.</p>
<p>Here’s what you’ll need in addition:</p>
<p><a href="http://www.codeplex.com/wspbuilder" target="_blank">WSPBuilder</a></p>
<p>WSPBuilder is the coolest little tool for SharePoint developers. The main function of WSPBuilder, as the name implies, is to build WSP file. If you don’t know, WSP files are installable solution packages for SharePoint. What you should also know is that creating these WSP files is a **** ** *** ***.</p>
<p>WSPBuilder makes building WSP files a lot easier for us, but its true beauty lies in an extension that you can install to Visual Studio. Doing so gives you a set of tools which we will explore in a moment. For now, get the WSPBuilder and its Visual Studio extensions from the CodePlex link above.</p>
<p><a href="http://www.codeplex.com/spm" target="_blank">SharePoint Manager 2007</a></p>
<p>SharePoint Manager 2007, or SPM for short, not to be confused with SharePoint Magazine, which is also SPM for short, is a SharePoint object model browser that allows you to inspect you SharePoint installation. Not just that, but SPM allows you to perform basic manipulation of your SharePoint sites, lists, content types, and columns.</p>
<p>Oh, and to make SPM even more perfect, it is absolutely free. Which is true for both usages of the abbreviation.</p>
<p>Let’s start learning how to utilize these tools to become a SharePoint development superstar.</p>
<h1>WSPBuilder</h1>
<p>Once installed you should get a few new project types in Visual Studio under the WSPBuilder node. Select to create a new WSPBuilder Project and name it something you like. The name here will be the name of the solution so pick something nice <img src='http://sharepointmagazine.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/02/wspbuilderprojects.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/02/wspbuilderprojects-thumb.png" border="0" alt="WSPBuilderProjects" width="685" height="466" /></a></p>
<p>Once your project is created you will see that you get a few items in your solution explorer. Most notably, notice that you have a 12 folder. This 12 folder will map to the [12] hive when you deploy your solution later. This in itself will save you a lot of time when deploying components that are not features, such as custom application pages, images, site definitions, and custom field types.</p>
<p>However, for our demonstrations here we will focus on creating features. After all, this is a fast track to feature generation, right?</p>
<p>Your first demonstration is to create a feature with an event handler attached. Of course, feature receivers requires you to deploy an assembly to the GAC, meaning you need to strong name your assembly, which entails setting the project to be signed, creating a new signing key, and building the assembly. Then, to tie the assembly to the feature receiver you need to build the feature.xml file, reflect on that assembly to get the strong name, and get the right class name before you past all that stuff into the feature.xml file. Then you need to build your solution, deploy the assembly to the GAC before you copy all your feature files into the 12 hive. Or you could build a DDF file and create a WSP solution file, which is about as fun as watching grass grow in real-time. An this is before you create your class file and remember which assemblies to reference and which class from which to inherit.</p>
<p>Or, you could simply right-click your WSPBuilder project, add new item, and select Feature with Receiver from the WSPBuilder node as your item type. Select which scope your feature shuold have, and optionally give it a nice name and description, and hit Ok. In one single and short operation you have created a new feature, configured your project to be signed, which, by the way, WSPBuilder did even before you added the feature, extracted the strong name from the assembly, written the feature.xml file, created the class file which inherits from the correct class, overridden all the right methods, and created an empty, ready-to-use, just-add-water elements.xml file.</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/02/wspbuilderfeature.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/02/wspbuilderfeature-thumb.png" border="0" alt="WSPBuilderFeature" width="951" height="356" /></a></p>
<p>Neat, eh? Oh, you haven’t seen anything yet.</p>
<p>Note that, by default, WSPBuilder will create a class file that just throws an exception whenever you try to do anything with the feature in SharePoint, so your first order of business is usually to open the class file and remove the exception throwing from all four methods.</p>
<p>Of course, creating the feature is only the first part of the job. Next you need to actually deploy the feature. This, it is rumored, is a very complex operation, requiring you to master the art of DDF file building. With WSPBuilder, however, all you need to do is right-click your project, choose WSPBuilder-&gt;Build WSP and you suddenly have a WSP file ready to deploy. And if you can’t be bothered to actually install and deploy the solution yourself, WSPBuilder handles that for you as well, by simply giving you a Deploy menu item inside the Same WSPBuilder menu you used to build the WSP file.</p>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/02/wspbuildermenu.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/02/wspbuildermenu-thumb.png" border="0" alt="WSPbuilderMenu" width="481" height="351" /></a></p>
<p>You’ll also notice that you have several other options on the WSPBuilder menu as well. Upgrading and uninstalling your solution is quite a time-saver, but you can also very easily copy files to [12] or deploy your assembly to the GAC if you need to do these steps manually for some reason. Also, what really saves me time when debugging SharePoint code is the ability to quickly attach the debugger to the IIS Worker processes. I know, this is quite possible quite fast using the regular menu in Visual Studio, but I just like to have this option a bit more conveniently located.</p>
<p>The only thing I’m missing from this menu is IIS Reset. Some changes are not picked up by AppPool recycling alone, so Carsten, if you’re reading this, please add IIS Reset to the WSPBuilder context menu.</p>
<p>By the way, Carsten Keutmann is the fool that has made both WSPBuilder and SharePoint Manager. I’m saying he’s a fool, because he would rival Bill Gates in wealth if he charged you just a percent of the time you save using his products. But no, he goes around giving this away for free. Which is very honorable, but quite follish. He is a genius in writing his tools, though, so I guess he is the most foolish genius there is.</p>
<p>But wait! We were talking about developing features. Let’s move on.</p>
<h1>Extracting feature CAML.</h1>
<p>You may not know this, but most SharePoint objects, such as columns, content types, and lists, can export the CAML used the create them. To get this XML you would grab the contents of the SchemaXml property of the object using code. So, for instance, if you want to extract the XML used to define a certain column you would call SPField.SchemaXml, and for a content type SPContentType.SchemaXml.</p>
<p>This is very useful because it allows you to create an object, such as a column, in the web interface of SharePoint, and then extract the CAML and put it in your feature for later deployment.</p>
<p>And this is fine, but a little awkward because you need to write code to extract the code. Or, you can have someone create a program that makes this a lot easier.</p>
<p>Enter our overly generous Dane again, Carsten Keutmann. Now, know that I really love you man, in fact, I plan on naming my first two kids WSPBuilder and SharePoint Manager, but you have got to start at least taking donations for your programs. Think of the Danish economy, you would support a nation from the taxes alone!</p>
<p>For the rest of us, Carsten has created another nice program, the SharePoint Manager, which you should have downloaded by now. SPM allows you to browse your entire SharePoint installation and view all the properties of all the objects, which is exactly what we need. I’ll walk you through creating and deploying a custom site columns in three easy steps:</p>
<ol>
<li>Start by creating a site column in any of your sites. Make it something a bit complex, such as a multi-choice column (checkboxes).</li>
<li>Using SharePoint manager, browse to your site where you created the column and open the Fields note to locate your column.</li>
<li>Copy whatever XML is in the Schema Xml tab of SPM, less the XML declaration, and paste into your elements.xml which you created earlier. Deploy and you’re done.</li>
</ol>
<p><a href="http://sharepointmagazine.net/wp-content/uploads/2009/02/spmcolumnschema.png"><img src="http://sharepointmagazine.net/wp-content/uploads/2009/02/spmcolumnschema-thumb.png" border="0" alt="SPMColumnSchema" width="680" height="528" /></a></p>
<p>How much easier can you create a new column? I absolutely love SPM, and when combined with WSPBuilder, you got a killer duo that will save you hours of development time on every project.</p>
<p>You can do the same thing for other objects as well. However, some of the XML that you get is not deployable right off the bat. For example, for content types you need to change the Fields element to FieldRefs, as content types only contain references to fields. Doing so you also need to change all the Field elements into FieldRef elements, which also means removing a lot of illegal attributes. But still, this is incredibly much faster than writing one from scratch.</p>
<p>Now, another really useful object with which you can attempt this is for Views. Creating custom views in CAML can be a difficult task, as we saw in part 3 of this series. However, if you create a view on a list and you want that view added to a custom list template you can, still in SPM, go to the list where you created the view and get mostly usable XML in the Schema Xml tab. I say mostly, because there still are some things you need to do yourself. For example you will want to change the View Url to something that is list relative and not an absolute path, which is the default when you export a list’s XML, and you would also need to set the WebPartZoneId and the SetupPath, but all in all this beats writing 2500 lines of code any day.</p>
<h1>So long and thanks for all the fish!</h1>
<p>It’s been a long week, and a lot of hopefully useful information for you. I’m going to stop for now and just recap what we have seen in this series.</p>
<p>We’ve explored a SharePoint site down to a fairly low level, leaning how the architecture of SharePoint really works and how you can use that knowledge to create a user experience that is much more in tune with your needs than the default out-of-the-box experience. You’ve seen how sites are built, how lists and list templates are created, how View CAML is not really so bad after all, you’ve seen how to create custom site columns as well as learned at least that you can create your own custom field types, although we didn’t get to explore this nearly as deep as we could.</p>
<p>Finally, I hope this article has shown you some tips on how you can create all these things very rapidly, utilizing the SharePoint web interface and some nice free tools to speed up the development of new features.</p>
<p>Thanks for reading all this, and please, if you like it tell your friends about SharePoint Magazine. If you don’t like it, well, you don’t need to tell anyone.</p>
<p>.b</p>
<h1>Hey, what about the bonus article?</h1>
<p>Oh, yeah, I nearly forgot. The topic of tomorrow’s article will be DelegateControls. I mentioned these briefly earlier, but since they are so powerful I felt I needed to elaborate a bit more on their use.</p>
<p>Also there will be a special surprise available only to the first readers of that article. Subscribe to the <a href="http://feeds2.feedburner.com/SharepointMagazine" target="_blank">SharePoint Magazine RSS Feed</a> and you will be notified as soon as the article is out. The early bird catches the worm, you know…</p>
<p><h3>This article was posted on:</h3>
<a href="http://sharepointmagazine.net"><img src="http://sharepointmagazine.net/images/logo2.gif" border="0"/></a>

DISCLAIMER:
Views expressed in this section are those of the authors and do not necessarily reflect the editorial position of SharePointMagazaine.net . SharePointMagazaine.net does not knowingly publish false information and may not be held liable for the views of authors exercising their right to free expression. </p>
<p><a href="http://sharepointmagazine.net/technical/development/customizing-the-user-experience-of-sharepoint-fast-track-to-feature-generation-part-6-of-6">Customizing the User Experience of SharePoint: Fast track to Feature Generation (Part 6 of 6)</a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/5-oG3bTp_Mpygu1r7t1QpPtJsZw/0/da"><img src="http://feedads.g.doubleclick.net/~a/5-oG3bTp_Mpygu1r7t1QpPtJsZw/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/5-oG3bTp_Mpygu1r7t1QpPtJsZw/1/da"><img src="http://feedads.g.doubleclick.net/~a/5-oG3bTp_Mpygu1r7t1QpPtJsZw/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SharepointMagazine?a=Yx1h6Fj68og:JAghx3Z-iKM:kmCBgzMKvIA"><img src="http://feeds.feedburner.com/~ff/SharepointMagazine?i=Yx1h6Fj68og:JAghx3Z-iKM:kmCBgzMKvIA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SharepointMagazine/~4/Yx1h6Fj68og" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sharepointmagazine.net/technical/development/customizing-the-user-experience-of-sharepoint-fast-track-to-feature-generation-part-6-of-6/feed</wfw:commentRss>
		<feedburner:origLink>http://sharepointmagazine.net/technical/development/customizing-the-user-experience-of-sharepoint-fast-track-to-feature-generation-part-6-of-6</feedburner:origLink></item>
	</channel>
</rss>
