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

<channel>
	<title>SharePoint Magazine</title>
	<atom:link href="http://sharepointmagazine.net/feed" rel="self" type="application/rss+xml" />
	<link>http://sharepointmagazine.net</link>
	<description>SharePoint Magazine is an online Magazine dedicated to the world of SharePoint</description>
	<lastBuildDate>Thu, 28 Jan 2010 12:29:07 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Avoid Newbie Mistakes: 10 Steps to Successful SharePoint Deployments</title>
		<link>http://sharepointmagazine.net/technical/administration/avoid-newbie-mistakes-10-steps-to-successful-sharepoint-deployments</link>
		<comments>http://sharepointmagazine.net/technical/administration/avoid-newbie-mistakes-10-steps-to-successful-sharepoint-deployments#comments</comments>
		<pubDate>Thu, 17 Sep 2009 09:30:14 +0000</pubDate>
		<dc:creator>Joel Oleson</dc:creator>
				<category><![CDATA[Administration]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[deployments]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[governance]]></category>
		<category><![CDATA[joel]]></category>
		<category><![CDATA[mistakes]]></category>
		<category><![CDATA[newbie]]></category>
		<category><![CDATA[oleson]]></category>
		<category><![CDATA[sharepoint]]></category>

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

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

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

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

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

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

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

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

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

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

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

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

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

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