CSOM GetItemById Results in “The property or field has not been initialized”

Kirk Liemohn is a Principal Software Engineer at ThreeWill. He has over 20 years of software development experience with most of that time spent in software consulting.

I was having a problem where I was trying to migrate list content from SharePoint 2010 to SharePoint 2013 but a couple of fields were not making it over.  I was using a migration tool that I like to use, but had to resort to connecting to both SharePoint 2010 and SharePoint 2013 using CSOM due to environment restrictions.  I know there are limitations with CSOM and likely more with SharePoint 2010 than there are with SharePoint 2013, but I was still surprised the tool couldn’t get values for these two fields.

I thought I could get around this if I wrote the code myself so I gave it a shot.  I wrote some PowerShell to first query for the list item IDs from the source list.  The code uses a CAML query and only has the ID field in the ViewFields for the query.  I then iterate across the results of the query.  For each result I get the entire source item by ID as follows:

$sourceItem = $sourceList.GetItemById($sourceItemFromCAMLQuery.ID)

GetItemById is the key method above as I thought it would do a good job of getting all fields for that list item.  However, for the two fields that gave me problems with the migration tool, it failed with my code.  The line of code that gave me an error was:

 $sourceValue = $sourceItem[$fieldName]

The exception thrown was of type PropertyOrFieldNotInitializedException.  The exception message was:

The property or field has not been initialized. It has not been requested or the request has not been executed. It may need to be explicitly requested.

I immediately thought this might be a row ordinal issue based on problems it has caused me in the past.  In retrospect I discovered that according to the schema XML for the fields, they are still in row ordinal 0 (which is good) so that didn’t explain my issue, but my fix was the same regardless.

To fix this problem I simply added these two problem fields to the ViewFields for my initial CAML query and subsequently get the values from the CAML query instead of the list item obtained using GetItemById.  It added a little complexity since I had to pay attention to which field values I obtained from the CAML query and which I obtained from GetItemById, but it solved my problem!  I hope it helps others as well.

read more
Kirk LiemohnCSOM GetItemById Results in “The property or field has not been initialized”

Using JavaScript IIFE’s and Promise Chaining with Lookup Fields

Lane is a Senior Software Engineer for ThreeWill. He is a strong technology expert with a focus on programming, network and hardware design, and requirements and capacity planning. He has an exceptional combination of technical and communication skills.

After reading Will’s excellent blog post about bootstrapping an Angular app with server side data, I wanted to share a trick that I recently used for bootstrapping a pure client side SharePoint app that dealt with lookup fields and promise chaining. While in this post I will also be using Angular, this technique should work with any framework that uses JavaScript promises (such as jQuery’s Defer or Kris Kowal’s Q).

In both SharePoint 2010 and 2013, the REST API will not return lookup field display values (unless you use the $expand query operator, but that only works if you know ahead of time which of the fields are lookups). Instead, the API will just return the ID of the lookup value, meaning you have to make another trip to the server to get the display value for the lookup field. However, when you are working with JavaScript promises, this can get messy quickly because of the asynchronous nature of promises and the need for following a synchronous series of steps to load list data from multiple lists.

In the JavaScript world, there is the notion of an IIFE (Immediately Invoked Function Expression). As it’s name implies, IIFE’s are a mechanism for immediately executing a function block without needing to have a function declaration (Ben Alman does a much better and far more detailed explanation of IIFE’s if you are interested). Using an IIFE inside of a promise’s .then() callback allows your code to be schema-agnostic while being much easier to read and (in my humble opinion) cleaner.

So let’s use a simple,. slightly contrived, example. Say we have two lists: Parent and Child. Parent has a lookup field that is bound to a field on the Child list. Using an IIFE inside a .then() callback to make the second trip to the server to get the Child’s lookup value would look something like this:

That’s it. Now you may have noticed that I contradicted myself because in the above code I have hard coded the ChildColumnId field, so it would have actually been much easier to just use the $expand keyword and avoid the need for the second round trip in the first place. I did this to make the code easier to understand. A more detailed example would be something like this:

You might have noticed that I also adding the result onto the parent object differently. In the first example, I added the ChildColumn field as a child object off the Parent;  In the second example, I added Child Columns as a property on Parent. Frankly, I just did this because it made the code on the second example a little easier to read (and write) but either approach is perfectly fine depending on your situation and how you are binding your view.

A working demo project for SharePoint 2013 can be downloaded here.

read more
Lane GoolsbyUsing JavaScript IIFE’s and Promise Chaining with Lookup Fields

Chatter for SharePoint

Eric Bowden has over 19 years of software development experience around enterprise and departmental business productivity applications.


In 2012, we were fortunate to work with on an integration between Chatter and SharePoint.  This post gives an overview of the product – contact us if you’d like more information about getting the integration in place.

Chatter for SharePoint: Overview of Features

Chatter for SharePoint includes two web parts: Chatter for SharePoint Team Sites Web Part and the Chatter for SharePoint My Sites Web Part. Features common to both web parts are described below and are followed by a description of features which are unique to each of the web parts.

Common Features for Chatter for SharePoint Web Parts

  • Users can Comment on a feed post.
  • Users can Like and Unlike a feed post.
  • Users can view which users have Liked a feed post.
  • Users can delete feed posts and comments, subject to permissions enforced by Chatter.
  • Feed posts and comments can include @mentions, which includes a user look-up feature.
  • Users can hover over user names, avatars, and @mentions in the Chatter feed to:
    • View the user’s avatar and work phone number.
    • Follow or stop following the user.
    • Send the user a private message.
  • Users can click a user name or avatar to be directed to the user’s profile page in Chatter.
  • Users can click a group name to be directed to the group profile page in Chatter.
  • User can create posts which include a file attachment or link:
    • Users can upload files, from their local computer or from SharePoint.
    • Users can share a link which they provide.
    • Users can share files in SharePoint as a link.
  • Administrators can disable uploading of SharePoint files to Chatter by web application.
  • Users can free-text search all Chatter posts.

Common Features for Chatter for SharePoint Web Parts : Illustrations

Figure 1 : Comments

Figure 2 : Like a feed post and view which users also like the same feed post

Figure 3 : Delete a feed post or comment

Figure 4 : @mentions

Figure 5 : View contact info, follow, or send a private message

Figure 6 : Sharing a link

Figure 7 : Sharing a file from your local computer

Figure 8 : Sharing a file from SharePoint – Step 1

Figure 9 : Sharing a file from SharePoint – Step 2

Figure 10 : Users can search for Chatter updates

Chatter for SharePoint Team Sites Web Part

  • Users can submit a feed post to the selected group.
  • Users can view the text for feed entries from a group in Chatter.
  • The Chatter group displayed is determined in one of the following ways:
    • The user can search for and select a group by name
    • The user can choose the group from among a set of groups configured as web part properties by the SharePoint administrator.
    • The SharePoint administrator can configure the web part to display feeds for a single group.

Chatter for SharePoint Team Sites Web Part : Illustrations

Figure 11 : The user can search for and select a group by name

Figure 12 : The user can select the group from among a set of groups configured as web part properties by the SharePoint administrator

Figure 13 : The SharePoint administrator can configure the web part to display feeds for a single group

Chatter for SharePoint My Sites Web Part

  • Users can submit a feed post to their profile feed.
  • Users can view the text for feed entries from their profile and all entities that they follow in Chatter (e.g. the user’s news feed).
  • User can filter feed items to display:
    • All followed entities
    • People
    • Groups
    • Files
    • Feed posts which have been bookmarked
    • Record types which are followed (e.g. Contacts, Reports, etc..)

Chatter for SharePoint My Sites Web Part : Illustrations

Figure 14 : Users can submit a feed post to their profile feed

Figure 15 : Users can filter the feed items

read more
Eric BowdenChatter for SharePoint

Top 10 Reasons Why Your Law Firm Needs a Client Extranet

Danny serves as Vice President of Marketing at ThreeWill. His primary responsibilities are to make sure that we are building partnerships with the right clients and getting out the message about how we can help clients.

Innovative law firms are starting to use Client Extranets – a website where both the firms’ lawyers and their clients can collaborate and discuss important matters.  In this blog post, we’ll explore 5 business benefits and 5 technical benefits of a Client Extranet.

Reason 1 – Stay on the Same Page

One of the most common complaints about using email to collaborate is there is not a single place that you can go to understand what has been agreed upon.  The Extranet becomes that place.

Reason 2 – Sell Additional Services

Use your Client Extranet as a marketing platform in coordination with your website to market additional services.  Some firms create a central place on the Extranet that any logged-in user can see – use this area to market your services.

Reason 3 – Improve Billing Communication and Transparency

An Extranet is a place where you can communicate billing – allow clients to log in at any time to check billings and build trust with clients.

Reason 4 – No More Huge Attachments

Use the Client Extranet to store documents.  Send links to documents on the extranet and stop clogging up your client’s inbox with the huge attachments.

Reason 5 – Increase Client Loyalty

When you set up a place on your extranet for collaboration, it becomes more and more valuable over time.   You have context for decisions made and important correspondence captured.  This helps to solidify your services and keep loyal clients.

Doug Horton, CEO of Handshake Software Inc., leads a company that focuses on SharePoint solutions for the legal industry. “The demands put on the modern law firm by their clients to deliver high-quality legal services, faster, cheaper and 24/7 is straining older technologies, established workflows and law firm systems.  Having a Client Extranet is becoming a must-have tool for any lawyer to provide effective client service.”

Reason 6 – Versioning

Now we are on to some of the technical benefits.  Many of the technical benefits pertain to SharePoint, a platform from Microsoft that is commonly used for creating Client Extranets.  One of the built in features is versioning – with capabilities to only show minor updates to internal people.  For example, you can work on 1.1 of an agreement internally and the client will not see changes until a 2.0 is published.

Reason 7 – Auditing

SharePoint keeps track of who makes changes to documents and you have a full auditing history of files.

Reason 8 – Search

Your Extranet becomes a resource for clients to look up answers to common questions.  You can set up Search to not only search private spaces securely, but also your public facing website.

Reason 9 – Workflow

Make sure the right documents are approved by the right people at the right time through workflows.  Workflows allow you to create structured processes that you want to reinforce as best practices in your organization.

Reason 10 – Flexibility

As your client becomes comfortable with using your extranet, they become more comfortable with the partnership overall.  Having the ability to meet the technical demands of your client can give you a competitive advantage.

“One of the biggest benefits that we have seen from a Client Extranet is that it enables us to take a more collaborative approach and meet the changing demands of our clients,” says Jonathan Thurmond, Web Systems Manager at the innovative law firm of Sutherland Asbill & Brennan LLP.  “An Extranet allows our firm to be flexible in how we deliver services in a changing environment.”


ThreeWill works with innovative law firms to get Extranets up and running using a product from Microsoft called SharePoint.  This product allows you to get the above benefits and more.  We would love to talk to you about your organization leveraging the built-in capabilities of SharePoint to allow your firm to grow and thrive.

About Handshake Software

Handshake Software is the market-leading and award-winning provider of SharePoint-based products and services to the legal market including intranets, extranets, enterprise search, and mobility solutions.

About Sutherland

Sutherland Asbill & Brennan LLP is a law firm with global reach known for solving challenging business problems and resolving sophisticated legal issues for many of the world’s largest companies.

About ThreeWill

ThreeWill is a consulting firm based in Alpharetta, Georgia that is focused on building collaborative solutions on SharePoint 2013, Office 365 and Microsoft Azure.

read more
Danny RyanTop 10 Reasons Why Your Law Firm Needs a Client Extranet

Hiding “Add new item” and “There are no items to show…” in SharePoint

Kirk Liemohn is a Principal Software Engineer at ThreeWill. He has over 20 years of software development experience with most of that time spent in software consulting.

The XSLTListViewWebPart (a.k.a. XLV web part) is used for showing list views in SharePoint 2010.  If you have permission to add new items in the list you may see an “Add new item” link.  When there are no items in the list you may see “There are no items to show…” text.

If you want to get rid of these from your views there are various approaches.  To globally remove the “Add new item” you can add the following to your css:{display:none;}

However, there is no unique css class assigned to the “There are no items…” text.  You could use jQuery to find it and clean it up, but there is a better way if you are defining your own list views…

To remove the “Add new item” link from a list view simply use the “FreeForm” toolbar type instead of “Standard”.

Note that Visual Studio will give you intellisense for this and provide both “FreeForm” and “Freeform” as options.  You need to use “FreeForm” for this to work.


Incidentally, using <Toolbar Type=”RelatedTasks” /> works as well but the name indicates a usage that didn’t fit for my views.  For more on Toolbar types see:

To remove the “There are no items…” text simply add the following to your view definition:

<ParameterBinding Name="NoAnnouncements" DefaultValue="" />
<ParameterBinding Name="NoAnnouncementsHowTo" DefaultValue="" />

The “There are no items to show in this view of the “<list_name>” list.” comes from the NoAnnouncements parameter (yes, bad name as this applies to all lists, not just announcement lists).  The “To add a new item, click “New”.” comes from the NoAnnouncementsHowTo parameter.

These are used in 14\TEMPLATE\LAYOUTS\XSL\vwstyles.xsl in the following template:

<xsl:template name="EmptyTemplate">
<td colspan="99">
<xsl:value-of select="$NoAnnouncements"/>
<xsl:if test="$ListRight_AddListItems = '1'">
<xsl:text ddwrt:whitespace-preserve="yes" xml:space="preserve"> </xsl:text>
<xsl:value-of select="$NoAnnouncementsHowTo"/>

By default the following parameters are on most views:

<ParameterBinding Name="AddNewAnnouncement" Location="Resource(wss,addnewitem)" />
<ParameterBinding Name="NoAnnouncements" Location="Resource(wss,noXinviewofY_LIST)" />
<ParameterBinding Name="NoAnnouncementsHowTo" Location="Resource(wss,noXinviewofY_ONET_HOME)" />

You might be tempted to give AddNewAnnouncement a blank DefaultValue as well, but this does not work. Looking through vwstyles.xsl indicates that it should work, but it did not in my environment.  However, when looking at the XSL I noticed that the toolbar type was also a determining factor so I used that as shown further above.

Another option for changing or removing “Add new item” may be to put your own XSL file in 14\TEMPLATE\LAYOUTS\XSL and override the “Freeform” template where (it appears) that the “Add new item” is rendered. However, I tried this approach and it did not work, but I think this may be because “Freeform” is not the appropriate template name.  If you look at Glyn Clough’s blog on Overriding the no items message in an XLV he uses this very approach to remove the “There are no items…” text.  I prefer the ParameterBinding approach above to his approach because it is more granular.  However, if he can override a template, then this should work for the “Add new item” template as well if you can find which one to override.

Finally, to learn more about ParameterBindings, I highly recommend reading XsltListViewWebPart & ContentByQueryWebPart – ParameterBindings, localization and embedded server controls by Stefan Stanev.

read more
Kirk LiemohnHiding “Add new item” and “There are no items to show…” in SharePoint

How to Migrate a SharePoint 2010 Solution to 2013

Chris is a Senior Software Engineer at ThreeWill. His area of focus is consulting in the development of Microsoft .NET and SharePoint technologies. His primary role has been development lead in recent projects. Project roles have ranged from Development/Technical Lead to Development Resource.

Introduction to How to Migrate a SharePoint 2010 Solution to 2013

I recently had a need to migrate/port an existing SharePoint 2010 farm-based solution to work in SharePoint 2013.  The following sections describe some of the changes I had to account for to complete the migration.

To help provide context, the farm solution consisted of the following items:

  • 3 Site Collection-level Features
  • 1 Farm-level Feature
  • 4 “Admin” application pages
  • 2 Web Parts
  • 1 Custom List Definition and Instance (at the Site Collection-level)

Visual Studio 2012 Updates

In order to compile/build a project that originated from Visual Studio 2010, I had to install and configure “Microsoft Office Developer Tools for Visual Studio 2012” in order to open the projects in Visual Studio 2012.

The following link describes how to download and install “Microsoft Office Developer Tools for Visual Studio 2012”.

How to enable SharePoint 2013 Development Project Templates in Visual Studio 2012

Assembly Reference Updates

All .NET Framework references had to be updated to v4.0

The following SharePoint references had to be updated for SharePoint 2013.  This is not an exhaustive list of references, but shows the ones I had to update (and should serve as a reference for the most common ones).

Assembly Name

SharePoint 2010 Version / Runtime

Microsoft.BusinessData.dll14.0.0.0 / v2.0.50727
Path to SharePoint 2013 VersionC:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\ISAPI\


Path to SharePoint 2013 VersionC:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\ISAPI\


Search.Connector.dll / v2.0.50727
Path to SharePoint 2013 VersionC:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\ISAPI\


Search.dll / v2.0.50727
Path to SharePoint 2013 VersionC:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\ISAPI\


ApplicationPages.Administration.dll / v2.0.50727
Path to SharePoint 2013 VersionC:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\CONFIG\ADMINBIN\


Path to SharePoint 2013 VersionC:\inetpub\wwwroot\wss\VirtualDirectories\80\_app_bin\
C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\CONFIG\BIN\

Microsoft.SharePoint.dll14.0.0.0 / v2.0.50727Path to SharePoint 2013 Version

C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\ISAPI\


Security.dll14.0.0.0 / v2.0.50727Path to SharePoint 2013 Version

C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\ISAPI\


WorkflowActions.dll14.0.6108.5000Path to SharePoint 2013 Version

C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\ISAPI\



Note: If your build infrastructure does not have SharePoint 2013 installed, you may want to consider creating a “Common” folder to use for referencing a copy of all SharePoint 2013 assemblies…

Code Updates

Step One

All path references pointing to a location in the SharePoint Root have to be updated.  This includes the following base level paths.

Some Examples:

Control Templates


~/_CONTROLTEMPLATES/{Your custom folder here}


~/_CONTROLTEMPLATES/15/{Your custom folder here}



/_layouts/images/{Your custom folder here}


/_layouts/15/images/{Your custom folder here}

Styles/CSS (example placement of solution-specific CSS)


/_layouts/{Your custom folder here}/css


/_layouts/15/{Your custom folder here}/css

JavaScript  (example placement of solution-specific JavaScript)


/_layouts/{Your custom folder here}/scripts


/_layouts/15/{Your custom folder here}/scripts

Step Two

Application page (.aspx) assembly references had to be updated to reflect the SharePoint 2013 versions.


<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" 
Assembly="Microsoft.SharePoint, Version=, 
Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>


<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" 
Assembly="Microsoft.SharePoint, Version=, 
Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

Step Three

Since I had to switch references to a newer version of .NET Framework, I had to update some method calls.  This will definitely depend on the .NET Framework and SharePoint 2013 implementation details that you rely on.  Once you have been able to successfully open the existing Visual Studio 2010-based project in Visual Studio 2012, and have handled the items above, simply compiling/building the solution in Visual Studio 2012 should present you with a list of warnings/errors to deal with…


  • “RegisterPluggableSecurityTrimmer” method on PluggableSecurityTrimmerManager now expects 4 parameters and not 3
  • “CreateCrawledProperty” method on Category now expects 3 parameters and not 4
  • Properties on a “Mapping” object now have to be explicitly set vs. set in a constructor


Hopefully, the content of this article will help you with your conversion to Visual Studio 2012.  There are likely other conversion issues to be aware of that are not captured here.

This is not meant to be an exhaustive list, but more of a guide to get you started on the conversion and off to a productive start.

What other things would you add to this list?  Leave your suggestions in the comments section below…

read more
Chris EdwardsHow to Migrate a SharePoint 2010 Solution to 2013

A Tasking Exercise – Working with SharePoint Tasks

John Underwood is a Technical Evangelist at ThreeWill. He has nearly thirty years of software development experience. He is an experienced technical instructor with superior presentation skills and is proficient in delivering standard curriculum as well as developing and delivering custom curriculum.


One of the interesting features of SharePoint 2013 is the introduction of the My Tasks feature.

It addresses one of the more common problems with SharePoint: you’ve been assigned various tasks across many different SharePoint sites, and now you have to keep up with all of them. My Tasks consolidates the tasks assigned to you in one simple view and saves you the tedium of visiting each site containing assigned tasks.

So, what if you’re in a company that is slow to upgrade to SharePoint 2013?

Well, it turns out there’s a clever search technique that you can implement in SharePoint 2010 that will give you similar results.


How many times have you asked a question and gotten an unsatisfactory answer, only to rephrase the question and get what you’re looking for?

Well, that can also be the case with SharePoint. We can use the SharePoint search facility to locate tasks by simply using the query term “tasks”. However, doing so will probably produce results that are too broad:

Everything that has the word  "tasks" in it!

Everything that has the word “tasks” in it!

Now let’s ask the question again, but be a bit more specific about what we want using the following query:


Notice that this produces a startlingly different result…

It only shows tasks!

It only shows tasks!

Depending on your technical background, this query either makes total sense or looks like a foreign language. Either way, at its core it is a simple request: “SharePoint, please only show me items in a task list, and nothing else.”


Great, we’ve narrowed our search to tasks only. But the real goal was to find only the tasks assigned to a certain person (that person being “me”, of course).

It would be nice at this point if SharePoint included a keyword that refers to the current user (such as [Me] when creating a view) but sadly that is not the case. However, it’s easy enough for us to ask for items assigned to a particular person using the following query (in this case we’re assuming the user’s name is Jim Shorts):

ContentClass:STS_ListItem_Tasks assignedto:"jim shorts"

Simply put, “SharePoint, only show me tasks, and only show me the ones assigned to Jim Shorts.”

Notice Jim has tasks on two different sites.

Notice Jim has tasks on two different sites.

Where do we go from here?

If you look carefully, you’ll notice that the end of the address for the results page for this search looks something like this:


Simply put, the query details get appended into the URL. Now then, how do you run this query again to see your latest tasks? Well, just add the URL to your browser’s favorites list and then click the link anytime you want to see your latest tasks.



Want to learn more about what SharePoint Search and search-driven applications can do for you?

If so, please attend our upcoming webinar entitled Enterprise SharePoint Search. You’ll see even more about search-driven applications as well as learn about how ThreeWill can help you get the most out of SharePoint search.

Register Now
read more
John UnderwoodA Tasking Exercise – Working with SharePoint Tasks

August 22nd Free Webinar – Enterprise SharePoint Search

John Underwood is a Technical Evangelist at ThreeWill. He has nearly thirty years of software development experience. He is an experienced technical instructor with superior presentation skills and is proficient in delivering standard curriculum as well as developing and delivering custom curriculum.


SharePoint at it’s best can be a useful repository of company information, but in some cases it can be difficult to find the right data at the right time. This presentation looks and SharePoint Search capabilities for SharePoint 2010 and SharePoint 2013, and provides insights that users and technical resources alike can employ to make search a valuable tool.


SharePoint Users/Power Users, IT Personnel


  1. Asking the question correctly
    • Basic search terms
    • Using refiners
    • Qualifying search queries
  2. Search-driven applications
    • What is a search-driven application?
    • Search-driven apps for users
    • Taking it to the next level
  3. Customizing the results UI
    • Search results web parts
    • Using Display Templates in SharePoint 2013
  4. Extending and enhancing search
    • Integrating with external data sources
    • Custom security trimming
Register Now
read more
John UnderwoodAugust 22nd Free Webinar – Enterprise SharePoint Search

Lessons Learned About Bringing a SharePoint App to Mobile

Guy is a Senior Consultant with ThreeWill. He has over 14 years of information technology experience delivering value and efficiencies to customers and providing solutions. These include evaluation, selection, design, development, deployment and support of several large-scale projects including in-house software applications and off the shelf software and hardware. He has a high level of troubleshooting skills related to application development, windows based operating systems and networking.

Bringing a SharePoint App to Mobile

Here are some things I learned while working on the Mobile version of a SharePoint line of business application. The existing application uses sandboxed solutions/javascript and the SharePoint client object model.   Basically the effort was plagued with screen lock ups and authentication prompts when using Safari on iPhone and iPad.  Other browsers (like Chrome) did not have the same issue(s).

General Mobile Best Practices

  • Use the viewport meta tag to scale the page according to the device-width
  • Changed web.config to bypass SharePoint’s OOTB mobile view (see this)
  • Used different page layouts, pages, stylesheets and media queries to target smaller form factor
  • Ideally media queries can be used to target high resolution (like Retina) screens for loading images, etc that are higher quality.  this works on most phones/browsers except Windows Phone 8’s IE10 (in reports 96dpi even though it’s high res).  this is a known bug and Microsoft is expected to release a patch
  • Made use of the UserAgent to target different mobile devices (iPad vs iPhone, etc)
  • Minify css and js (AjaxMinify)
  • Reduce the number of requests by combining files such as css and js (AjaxMinify)
  • Reduce the size of images

Safari Mobile (iPhone and iPad) Browser Issues

  • Had to implement JavaScript “SetTimeout” when calling the Client Object Model’s ExecuteQueryAsync (was getting intermittent errors like “Invalid Request”)
  • Safari was caching the POST (see this) so we added a remarked datetime stamp so it always unique
  • Replaced some of the images non-image representations where possible
  • Added a redirect page as the welcome page to reduce the load (a better solution would be server side; however, we couldn’t due to AT&T’s policy restrictions)
  • When switching to landscape and back to portrait causes the font size to change.  You can fix by adding “* { -webkit-text-size-adjust:100%;}” to the mobile stylesheet(s)


  • If you’re wanting to do mobile development that utilizes Safari, make sure you have a Mac.  The best simulator that I found was the iOS Simulator included with Xcode.  Then, you can use the Safari Web Inspector to debug (note that traditional breakpoints cause Safari to crash–at least that has been my experience) and see which resources are being loaded, etc.
  • For the Android, use the SDK
  • For Windows Phone, use the SDK

When using the emulators on a Windows 8 machine for both Android and WIndows Phone you could encounter an issue with Hyper-V.  Both emulators can make use of Intel’s VT-x Virtualization Technology.  Before starting the Android emulator ensure you have disabled Hyper-V.  Then re-enable when wanting to use the Windows Phone emulator.


  • In order to use VT-x, you’ll need to run the “Hardware Accelerated Execution Manager” if you haven’t already.  Instructions (and other emulator information) can be found (here)

Windows Phone

  • While I haven’t done extensive testing with the Windows Phone and IE10, I did find that window.orientation (javascript) is not available on the device.  I was not able to use media queries at all with IEMobile 8.0.  I finally just used a IE condition to load a Windows Phone stylesheet.  I also used percentages for sizing since I couldn’t tell if the user had rotated the phone.
  • Media Queries – I think these are supposed to work; however, with my testing they didn’t.  It could be the doctype; however, I didn’t have time to get to the root issue.

Please note that this is a working post that I’ll continue to update…please share your questions and your experiences in the comments below.

read more
Guy LeeLessons Learned About Bringing a SharePoint App to Mobile

The Final Four (or Five) – SharePoint Migration Tools

Will Holland is a Senior Software Engineer at ThreeWill. Will has proven to be adept at understanding a client’s needs and matching them with the appropriate solution. Recently he’s developed a passion for working with .NET, MVC, and cloud-based solutions such as Microsoft Azure and Office 365.

For the past year, I have been involved in a project involving an enterprise level migration from SharePoint 2007 to SharePoint 2010. Without getting into too many gritty details, this particular client determined that the best approach to complete the migration in a manner that conformed to their practices and procedures they wanted to purchase a third party tool. Many tools were considered and many sales-folk harassed. In the end, the list of options came down to five different tools. In this post I’ll talk about the different tools, the pros and cons of each, and some of the client-specific requirements a selection had to meet.

The Yardstick – How We Measured A Tool’s Worth

As I mentioned, there were five different tools that made it to the ‘finals’:

  1. MetaVis’ Architect Suite,
  2. Quest’s Migration Suite for SharePoint,
  3. AvePoint’s DocAve SharePoint Migrator,
  4. Axceler’s Davinci,
  5. and Idera’s SharePoint Migration Suite.

My client also had several key points that they wanted to use to measure and compare the tools to each other. First, with SharePoint 2013 being added to the mix, my client has begun consideration of a cloud-based environment and, as such, they preferred that any tool they purchased also support migrating to such an environment.

Next, due to internal governance processes the preferred tool needed to be ‘agent-less’ – nothing should require an installation into production. Each production install must go through a lengthy and complicated review process before being allowed. Since our plan called for multiple test iterations the review process would need to be repeated several times, further adding to the amount of time taken to complete the migration.

The other points are a bit more transparent than the first two mentioned. Cost was, obviously, a factor as well as any impact to production up-time. The licensing scheme used by the vendor was another concern. There are a few different schemes commonly used. Some vendors use an “Unlimited” license meaning that you can migrate as much and as often as you want. Other vendors license you based on an amount of data being migrated, usually measured in GB. Of those, some don’t count “test” iterations against your license, some do. Still others license individual users.

The Competitors – A Break Down

MetaVis: Architect Suite

Website –

Cloud Migration Support: Yes
Additional Cost for Cloud: No
Agent-less Install: Yes
Up-time Impact: None
Licensing Scheme: Unlimited (Not priced per GB)

The tool from MetaVis is a very well rounded tool that offers its users the ability to migrate on a variety of levels, ranging from an entire farm to a single document. It will also migrate metadata, all Out-of-box and SharePoint Designer workflows, web parts and permissions.

Quest: Migration Suite for SharePoint

Website –

Cloud Migration Support: Yes
Additional Cost for Cloud: No
Agent-less Install: Yes
Up-time Impact: None expected (Could never get an official ‘guarantee’ from them)
Licensing Scheme: Per GB migrated.

The most important thing to note about the Quest tool is that it is, virtually the same tool offered by Metavis. In fact, it is a licensed version of the Metavis tool. If you don’t mind the ‘Per GB migrated’ licensing you may be able to get this a bit cheaper than the Metavis version with no feature loss.

AvePoint: DocAve SharePoint Migrator

Website –

Cloud Migration Support: Yes
Additional Cost for Cloud: No
Agent-less Install: No
Up-time Impact: None
Licensing Scheme: Per GB migrated

AvePoint is a fairly well established player in the migration market these days. There tools are reportedly solid but, for this customer, the fact that they required something being installed to production was a no-go.

Axceler: Davinci

Note : Since I completed my review of Davinci Axceler has removed Davinci and now has  “ControlPoint for SharePoint Migration.” I cannot say whether their new tool is simply a rebranded Davinci or a complete overhaul.

Website –

Cloud Migration Support: No
Additional Cost for Cloud: N/A
Agent-less Install: No
Up-time Impact: Unclear (Sales rep couldn’t directly answer and never followed-up with us).
Licensing Scheme: Mixed. Must purchase both a license for each user and a ‘Per GB’ license.

Axceler is known for their ControlPoint software but has just recently decided to jump into the Migration game and, well, it shows a bit when talking with them. Eventually, the conversation always ends up back at ControlPoint, even during what is supposed to be a demo of Davinci.

Idera: SharePoint Migration Suite

Website –

Cloud Migration Support: No
Additional Cost for Cloud: N/A
Agent-less Install: Yes
Up-time Impact: None
Licensing Scheme: Single User License

Idera, like Quest, has opted to license Metavis’ software. Oddly enough, though, they don’t support cloud Migrations at this point which almost immediately disqualified them for my client.

So, Who Ended Up The Winner?

For my customer, the decision was made to go with Metavis. It was the only one of the five that meet all three of their ideals. There were a few, more minor differences between the different software but in the end they all typically supported the same functionality. Price didn’t play into my customer’s decision as much as functionality. Metavis was dead center on pricing relative to the others; Quest was the cheapest while Axceler was the most expensive (they quoted us buying Control Point and adding Davinci at no additional cost).

What works for your migration might be a bit different than what worked for my client. Also, there are other tools out there that weren’t considered (Metalogix comes to mind) that might work better for your needs. Each migration is somewhat different and every client is going to have slightly different priorities.

Editor Note – On other ThreeWill projects, we’ve had experience with many of the tools evaluated and as Will points out we believe that one tool doesn’t fit all.  Let us know if we can help you with evaluating options by contacting us.  Also, be sure to read Bo George’s SharePoint Migration Options to learn more about using built-in tools for migrations.

Do You Have A Favorite?

Let me know your experience with evaluating options for your company or clients – I’m interested to compare your experiences with mine so please leave comments below.

Here’s an unscientific poll to see if there is an obvious favorite.  Share your vote to see results.

read more
William HollandThe Final Four (or Five) – SharePoint Migration Tools

Computed Fields in SharePoint 2010

Kirk Liemohn is a Principal Software Engineer at ThreeWill. He has over 20 years of software development experience with most of that time spent in software consulting.

Computed fields in SharePoint are often confused with Calculated Fields. Calculated fields are useful for taking other fields values within the same record and combining them in some way into another field. Computed fields, on the other hand, are most useful for render time. If you need to have special JavaScript, for example, you cannot use a Calculated field.

Creating a computed field in SP2010 requires two steps:

  1. Creating the field schema.
  2. Creating the field XSL.

Creating the Field Schema

This can be done by adding the field to the schema.xml file (if you are defining the list) or via the API by calling SPList.Fields.AddFieldAsXML(myXml).

The field schema should look like the following:

<Field ID="{6ddf785c-bce5-421c-95ba-c984b73993ed}" Name="SubmissionTitleLink" DisplayName="Title" TextOnly="TRUE" ReadOnly="TRUE" Type="Computed" Sortable="FALSE" Filterable="FALSE" ClassInfo="Icon" AuthoringInfo="(link to view item)" SourceID="" StaticName="SubmissionTitle" FromBaseType="TRUE">
    <FieldRef Name="ID"/>
    <FieldRef Name="Title"/>

To create the ID, just generate your own GUID and set the Name, DisplayName, and StaticName to the appropriate values(s). You can also set the AuthoringInfo to whatever makes sense for you.

The FieldRef entries are required for any field values that you need to consume when you render. A normal one might be <FieldRef Name="Title" />.

You might be tempted to add a <DisplayPattern> to your field schema. Don’t bother because it is ignored in SP2010. This was used in SP2007, but now SP2010 uses the field XSL discussed below (see also:

Creating the Field XSL

This is where you provide the rendering logic for your field. This will be used by the XSLTListViewWebPart (list views). You need to create a file and put it in 14\TEMPLATE\LAYOUTS\XSL. The file name should be fldtypes_*.xsl (e.g., fldtypes_mycompany_myproject.xsl). Here is an example:

<xsl:template match="FieldRef[@ID='6ddf785c-bce5-421c-95ba-c984b73993ed']" mode="Computed_body">
  <xsl:param name="thisNode" select="."/>
  <a href="#">
    <xsl:attribute name="onclick">
      <xsl:value-of select="$thisNode/@ID"/>
      <xsl:text>); return false;</xsl:text>
    <xsl:value-of select="$thisNode/@Title"/>

In this case we use ID and Title from the list to provide a link with a JavaScript onclick event. The field defined in the first section had to have the ID and Title fields in the <FieldRefs> section to make these available. Instead of matching on ID, you can match on Name. However, since this XSL is global across all lists, using the ID is probably a better choice.

Unfortunately, it would be nice to be able to see the XML available to us using something like <xsl:copy-of select="*"/> or <xsl:copy-of select="$thisNode"/> (similar to how it is done here:, but this did not appear to help.

Note that any time you change your field XSL you’ll need to restart your web application pool to clear the old one from cache.


read more
Kirk LiemohnComputed Fields in SharePoint 2010

Custom Search Refiners

Will Holland is a Senior Software Engineer at ThreeWill. Will has proven to be adept at understanding a client’s needs and matching them with the appropriate solution. Recently he’s developed a passion for working with .NET, MVC, and cloud-based solutions such as Microsoft Azure and Office 365.

Default refiners are great….if you have some pre-existing knowledge of the document.

Out of the box, SharePoint’s search feature makes finding documents, videos, and other items much easier when the user doesn’t know where to begin looking. Sometimes, however, it’s just not enough. If your site collection contains a large number of documents, as was the case with a recent project I was on, a user’s search may return hundreds of results. The only methods the user has at their immediate disposal for narrowing those results down is to either search again with more keywords or use some crummy filters provided by the Search Refinement Panel. The default refiners, such as author, require that the searching user know details of the document prior to searching for it. Great if you just published a document and immediately had a brain fart; not so useful for the rest of us though.

Fortunately, it’s not all that difficult to create your own custom refiners that will provide your users with the experience they have been searching for. All puns aside, adding custom refiners will allow your user to narrow their search results down by more meaningful filters, thereby reducing the amount of time spent searching and, hopefully, increase productivity.


  • You have an existing site collection with the Search feature active and configured.
  • You have sufficient permissions to access and modify Central Administration.
  • You have permissions to edit pages and web parts.


For the sake of consistency, I’ll be using the “Productivity Hub” as my example site collection. The Productivity Hub is a SharePoint 2010 site collection that contains a plethora of content for users making the migration from Office 2007 to Office 2010. It’s a free download, available at

The content for the Productivity Hub is stored in a document library, aptly named “Content Library”. The content library contains a “Product” column which indicates what Office product the document is intended for. This is the column that I will use during this tutorial.

In the beginning…

To start things off, the first thing we must do is determine what data we have that could be useful to searching users. Something that helps them define what they’re looking for. If your site collection contains a large number of documents that relate to specific clients, it would probably be useful if the user could narrow their search by documents that only pertained to a chosen customer. In my case, my documents all pertain to various products in Microsoft Office 2010, so I’ll use the “Product” column so that my users can narrow their search results down based on specific Office products.

As a best practice, the best columns to use for metadata are those that are indicative of the document contents, which is why I’m not a huge fan of the OOB search refiners. It’s also best if the data stored in the column is NOT a multi-value choice or multi-line text.

If your library doesn’t contain a particularly useful column…create one!

If you must walk before you run, before you walk you must have crawled.

Unless you created a new column for your library, the chances are that your desired column has already been indexed when the last scheduled site crawl ran. Regardless, we still need to verify that it was crawled. You know what they say happens when you assume something.

The Crawled Properties Page of Central Administration

  • Open up Central Administration and navigate to Application Management | Manage Service Applications
  • From list of Service Applications click Search Service Application
  • From the Queries and Results section, click the Metadata Properties link.
  • Finally, click the Crawled Properties link.

This page contains a list of every column captured during a crawl and, hopefully, your column will be in this list somewhere. To find out, type the name of the column in the search bar towards the top of the page and let’er rip. With any luck, you’ll receive a few results. My search for “Product” resulted in quite a few, but the one I’m interested in is ows_Product(Text). If given the choice, the crawled property that contains the ows_ prefix is usually the one you want.

If you created your own column or your search results didn’t include an ows_{YourColumnName}({YourColumnType}) type result, then I’m sorry to say that before you can continue, you’re going to have to do a full or incremental crawl. This may or may not be an issue for you depending on how long a crawl takes to complete.

Once you have verified that your column has been crawled, click the Managed Properties link followed by the New Managed Property link.

The “New Managed Property” window.

  • Fill out this new window by giving your property a useful name.
    • Try keeping the name to one word, but if you need to use multiple words be sure to use Pascal casing.
  • Give your property a useful description.
  • Select the appropriate type.
  • In the second section, select Include values from a single crawled property based on the order specified.
  • Click the Add Mapping button.
  • Type the name of your crawled property and click the Find button.
  • Select your crawled property from the list and click the OK button.
  • Everything else can be left at its default values, so click the OK button.

Setup for Search Success

With our new managed property in place, we’re ready to begin adding our refiners.

Navigate your way to your search results page and put it in edit mode. The first thing we need to do is include our new metadata in the search results.

  • Locate the Search Core Results Web Part, located roughly in the middle of the page.
  • From the web part context menu, click Edit Web Part.
  • In the web part editor, expand the Display Properties section.
  • In the Fetched Properties text box, scroll towards the end until your cursor is directly in front of the </Columns> tag.
  • Add the following: <Column Name=”ProductName”/>, replace ProductName with whatever you named your managed property.
  • Click the Apply button.
  • Click the OK button.

Next, we need to define our actual refiner.

  • Locate the Search Refinement Panel web part, located on the left side of the page.
  • From the web part context menu, click Edit Web Part
  • In the web part editor, expand the Refinement section.

We need to add our refiner definition in the Filter Category Definition text box. This text box is quite a bit wordy, so it may be easier for you to copy the contents and paste them in an editor that will format it for you, such as NotePad++ or Visual Studio.

I do declare!

Once you have your code formatted, you can see that it’s an XML document that contains a series of <Category> definitions. These definitions are what define the refiners that appear on the refinement panel web part. You may also notice that they appear on the web part in the order that they are defined here, so a decision must be made on where you want your refiner to appear. I think the Product refiner is pretty useful, so I’ll simply insert my code before the other categories. Below is the definition I’ll use to declare my refiner.

Description="The Product associated with the item"
MetadataThreshold="1" NumberOfFiltersToDisplay="5"
MaxNumberOfFilters="0" SortBy="Name"
SortDirection="Ascending" SortByForMoreFilters="Name"
SortDirectionForMoreFilters="Descending" ShowMoreLink="True"
MappedProperty="ProductName" MoreLinkText="show more"
LessLinkText="show fewer">
ValueReference="Absolute" ShowAllInMore="False">








As you can see, the Category tag contains a large number of properties that you can configure. Here are a few that you’ll certainly want to understand.

  • Title – This is the display name for your refiner category.
  • MappedProperty – Extremely important. This should match the name of your managed property and the name specified when you added the column tag to the search core results web part. It is case sensitive!
  • MetadataThreshold – The number you specify is how many search results are required to be returned that match a filter before it will be presented to the user.
  • NumberOfFilterToDisplay – The number of filters to be displayed before the user has to click the “show more” link.
  • MaxNumberOfFilters – If the user clicks the “show more” link, how many filters do you want them to see. Set the value to zero if you want to show all filters.

For the complete list, please refer to this MSDN article: Refinement Panel XML Schema

The CustomFilters element has a few properties of its own, but for the most part, it will use the values shown above. The most common exception to that is when you’re refining by dates. The link above provides an explanation for each of these properties as well.

Finally, you have the CustomFilter and OriginalValue nodes. The “Name” property of CustomFilter is the text that will be displayed on the refinement panel, so keep it short and precise. The value between the OriginalValue tags is the value we expect for each custom filter. Again, this value is case sensitive. 

Once you’ve created your declaration, copy the contents of your editor and find your way back to that cluttered text box. Replace its contents with your code.

Click the Apply button and stop editing the page.

And you’re done! Well, almost. If you do a search, you notice that your refiners aren’t showing up.

I just learned to run, now you tell me to crawl again?

Yup. You’ll have to do another full crawl before your refiner will appear. Pretty much anytime you make a change to the search metadata, you’ll be forced to do this.

However, once that’s completed….

Ta-Da! My Custom Refiner LIVES!

read more
William HollandCustom Search Refiners

PowerPivot Primer

Tim is a Senior Consultant at ThreeWill. He has 15 years of consulting experience designing and developing browser-based solutions using Microsoft technologies. Experience over the last 8 years has focused on the design and implementation of SharePoint Intranets, Extranets and Public Sites.

PowerPivot for Excel and SharePoint 2010

PowerPivot is an exciting new addition to the Microsoft Business Intelligence stack that provides a lot of power to end-users.  For office savvy users who have Excel 2010 and the PowerPivot add-in, analysis against backend datasources is quick and powerful.  For users who may have less knowledge of the data or who aren’t as fluent with Excel, Workbooks with one or many Worksheets can be exposed through a browser to broaden the availability to any user who may have a need to analyze the data.

One of the latest additions to the Microsoft Business Intelligence stack is PowerPivot.  PowerPivot leverages the comfort and familiarity of Excel with the power of Analysis Services and other data sources to allow business users to analyze mission critical data without the need for IT involvement.

As a business user with Excel 2010 and the free PowerPivot add-in, a connection to a secured datasource can quickly be configured using AD or SQL Server permissions and slicing and dicing of data can be achieved in minutes.  However, there are times when personal manipulation and viewing of this data is not enough; the data needs to be shared with other users who may not be able to easily access it for any number of reasons (don’t have Excel 2010, don’t know the data, etc).  This is where PowerPivot for SharePoint 2010 comes in.  PowerPivot workbooks can be published to a PowerPivot Gallery in SharePoint 2010 where a user-friendly view of the data can be surfaced through the web browser along with the capabilities of slicing and dicing the data to get greater understanding of what is happening in the business.

With PowerPivot, tens of millions of rows can now be imported into Excel and manipulated in real time. This ability to handle massive amounts of data natively from the ubiquitous Excel application empowers business users with the ability to perform true real time analytics that previously required massive servers and tended to be painstakingly tedious.

While a blog doesn’t serve well to share all of the capabilities of this powerful set of tools, I would like to share a quick example of how to retrieve SQL Server Analysis Server (SSAS) data into an Excel 2010 PowerPivot workbook, format the names to be user friendly, and make the workbook available to end-users through SharePoint 2010.  Since many of you are probably familiar with the AdventureWorks 2008 database examples, I’ll start out with a very simple example that merely displays Sales totals that can be sliced and diced by Calendar Year, Product Category, Product Sub Category and Product.  I’ll then follow-up with something that is more visually appealing by adding a Chart as a second worksheet in the work book.

This walk-through begins with the assumption that you have Excel 2010 and that you have downloaded and installed the free PowerPivot add-in. The plugin can be found here.

The Walk-Through

Open Excel 2010 and note the new PowerPivot tab that is now available on the top row.

New PowerPivot tab available

Next, click on the PowerPivot Window button at the top left.

PowerPivot button

Note that you are presented with several data source options:  database, report, Azure DataMarket, etc.

In my example, I want to retrieve data from an Analysis Services database, so I specify the server and database as shown below.

After pointing to the correct database, a wizard will guide you through the steps of choosing the data that will be available in the Excel Workbook.

You can specify an MDX query or alternately select the Design button so that you are presented with a graphical interface to select your data.  In my example, I am selecting the Design button.

Now I can use the graphical interface to select the measures and dimensions that I want to see.

For this example, I want to look at Internet Sales Amounts and I want to see them based on Calendar Year, Product Category, Product Sub Category and Product so I drag the corresponding fields onto the design surface as shown in the following screen shots.

Now that I have selected the appropriate data elements, I click OK to continue through the wizard.

The corresponding MDX query is displayed based upon the facts and dimensions that have been selected using the designer.  Click Finish to continue.

A “Success” dialog is displayed to indicate the number of rows that met the criteria for the MDX query and the rows that were subsequently imported into the Excel Workbook.

So, now you can see the individual rows that were retrieved.  Note that the columns above have all been imported as Text data types.  Before you can leverage the numeric data in meaningful ways, you must update the data type to numeric which is shown below.

Select the column that you want to update and specify the data type and the display format.

Now you can close the PowerPivot window and return to the Excel Worksheet where you can begin to build meaningful displays that will help visualize the data.

In this simple example, I’m going to select a PivotTable, but as you can see I have several choices of how to present my data.

I’m going to put the PivotTable on the existing sheet which is Sheet1 in my example.

Now you can begin to build out your PivotTable by specifying the values to display as well as the “Slicers”.  Slicers are dimensional data that allow you to “slice” the fact data.  In our case, we will be able to slice the sales data by Calendar Year, Product Category, Product Sub Category and Product. As a general rule, each Dimension imported from the SSAS cube will be a slicer. For those who are familiar with SSAS cubes, this makes for a good analogy for what a slicer really does.

Select the Sales Amount field and drag it over to the Values column.

Specify a Custom Name for this amount if you like.  Also specify that we will be summing the Sales Amount.

Next, select the Calendar Year field and drag it into the Slicers Horizontal column.  Then, select the Product Category, Product SubCategory and Product fields and drag them to the Slicers Vertical column to achieve the display above.

Next, let’s give user-friendly names to the slicers by right-clicking on them and choosing the Slicer Settings.

Now, you can update the Display Caption to “Calendar Year”.  You can also change other items such as Sorting or Filtering if desired.

Lastly, we’ll update the Sales Amount field with a new caption and currency display as shown below.

(Note my total Sales Amount of $29,358,677.22.)

When I click the CY 2001 button in the Calendar Year slicer, note the sales amount changes to a much smaller number, $3,266,373.66.  This is because we are now only looking at sales for Calendar Year 2001.  Note also that the other slicers are updated to reflect what data applies to CY 2001.  So, we can see that only the Bikes Product Category was available in 2001.

Next, clear the Calendar Year filter by clicking on the red filter icon next to Calendar Year.

With the Calendar Year filter now cleared, click on the Clothing button in the Product Category slicer to see sales for Clothing.  Note that clothing was only available in Calendar Years 2003 and 2004.

Now that we have our workbook functioning, let’s navigate to the SharePoint PowerPivot gallery and upload the Excel Workbook.

First, access the PowerPivot Gallery on your site.

Within the PowerPivot Gallery, click the documents tab and select the upload document option.

Browse to the Excel Workbook and click Open.

Note that Workbook is now uploaded to SharePoint and the hour glass icon indicates that the thumbnail preview is being created. The thumbnail generation process can take several minutes.

When I refresh the page, I can now see that a thumbnail image has been created so that a User can easily see the visual display of the workbook along with a title and other information without opening the workbook.  Click on either image to navigate to the first sheet of the workbook in the browser.

Note that the look of the display is very similar to what was experienced in Excel.  Now users who access this SharePoint site can slice the data similar to what we did earlier in Excel.

In this scenario, I have picked the Bike Stands Product SubCategory.

While this display is very informative, it is not very visually compelling so let’s go back to Excel and add another Worksheet to this Workbook to make it more visually appealing.  Instead of updating the existing Excel Workbook, I have decided to make a copy and update the copy.  This will allow me to demonstrate the PowerPivot Gallery display of a Workbook with a single Worksheet and a Workbook with multiple Worksheets.  So, make a copy of the first Workbook and open the copy.

Navigate to the PowerPivot tab and select the PivotChart option.

Specify to add the chart to a new Worksheet.

Note that a new chart has been added along with the same field options as I had before.  Similar to before, I can now begin to select the fact and dimension values to create an appropriate display.

In this example, I chose to display Sales by Product Category with the ability to filter or slice the data based on Calendar Year.  Note that I also renamed the Worksheets to have more meaningful names.

Now, I want to upload my updated Workbook to the PowerPivot Gallery on the SharePoint site

Having navigated back to the PowerPivot Gallery, I navigate to the documents tab and select the Upload document option.

I select the “copy” to upload.

Note that I now have two PowerPivot Workbooks in the gallery.  As I hover over each of the smaller thumbnails, the larger thumbnail updates to provide a larger image.

Select the new worksheet to see the PivotChart.

Select the Calendar Year 2001button in the Calendar Year slicer to narrow down the data to only 2001.  Note that only bikes were sold during the year 2001.

read more
Tim CoalsonPowerPivot Primer

POLL : SharePoint Workflow Add-Ons

Tim is a Senior Consultant at ThreeWill. He has 15 years of consulting experience designing and developing browser-based solutions using Microsoft technologies. Experience over the last 8 years has focused on the design and implementation of SharePoint Intranets, Extranets and Public Sites.

SharePoint Workflow

SharePoint is a web application platform in the Microsoft Office server suite. Launched in 2001, SharePoint combines various functions which are traditionally separate applications: intranet, extranet, content management, document management, personal cloud, enterprise social networking, enterprise search, business intelligence, workflow management, web content management, and an enterprise application store. SharePoint servers have traditionally been deployed for internal use in mid-size businesses and large departments alongside Microsoft Exchange, Skype for Business, and Office Web Apps; but Microsoft’s ‘Office 365’ software as a service offering (which includes a version of SharePoint) has led to increased usage of SharePoint in smaller organizations.

While Office 365 provides SharePoint as a service, installing SharePoint on premises typically requires multiple virtual machines, at least two separate physical servers, and is a somewhat significant installation and configuration effort. The software is based on an n-tier service oriented architecture. Enterprise application software (for example, email servers, ERP, BI and CRM products) often either requires or integrates with elements of SharePoint. As an application platform, SharePoint provides central management, governance, and security controls. The SharePoint platform manages Internet Information Services (IIS) via form-based management tooling.

Since the release of SharePoint 2013, Microsoft’s primary channel for distribution of SharePoint has been Office 365, where the product is continuously being upgraded. New versions are released every few years, and represent a supported snapshot of the cloud software. Microsoft currently has three tiers of pricing for SharePoint 2013, including a free version (whose future is currently uncertain). SharePoint 2013 is also resold through a cloud model by many third-party vendors. The next on-premises release is SharePoint 2016, expected to have increased hybrid cloud integration.

Office 365 is the brand name used by Microsoft for a group of software plus services subscriptions that provides productivity software and related services to its subscribers. For consumers, the service allows the use of Microsoft Office apps on Windows and OS X, provides storage space on Microsoft’s cloud storage service OneDrive, and grants 60 Skype minutes per month. For business and enterprise users, Office 365 offers plans including e-mail and social networking services through hosted versions of Exchange Server, Skype for Business Server, SharePoint and Office Online, integration with Yammer, as well as access to the Office software.

After a beta test that began in October 2010, Office 365 was launched on June 28, 2011, as a successor to Microsoft Business Productivity Online Suite (MSBPOS), originally aimed at corporate users. With the release of Microsoft Office 2013, Office 365 was expanded to include new plans aimed at different types of businesses, along with new plans aimed at general consumers wanting to use the Office desktop software on a subscription basis—with an emphasis on the rolling release model.

read more
Tim CoalsonPOLL : SharePoint Workflow Add-Ons

SharePoint Migration Options

Bo is a Principal Consultant for ThreeWill. He has 18 years of full lifecycle software development experience.

SharePoint Migration Options Introduction

Recently, I was asked about migrations and what people were using for them. After responding to the email, I decided to repurpose my response into a quick blog for those that may have similar questions and just want a quick primer on their options. When it comes to migrations, you have options that are baked into the product and then you can even pursue tools from vendors that enable things that either aren’t baked into the product or aren’t always easy out of the box.

UPDATE : If you have already done a SharePoint 2010 migration, be sure to take this month’s poll.

Database Attach versus In Place Upgrade

As you may have learned from reading Pete Skelly’s “SharePoint is like sugar…” we always look to leverage things out of the box before going for custom solutions. This approach holds true when it comes to migrations from SharePoint 2007 to 2010, and you can get a lot of miles with out of the box tools and techniques.

The first question you will likely arrive at when planning to migrate to SharePoint 2010 is whether to do an in place upgrade or a database attach/upgrade. Without a doubt, for production farms the database attach is preferred. The main reason DB attach is the preferred method is that it is the best choice from a risk aversion point of view. DB attach assumes you are leaving the old farm intact for some amount of time and attaching your database to a newly built 2010 farm. This is much safer than an in place upgrade that could disrupt your currently running production farm. Additionally, most current 2007 farms don’t meet the specs for 2010, so it’s easier (and quicker) to build a new farm and attach databases to it, than to coordinate getting the current farm up to the specs before even attempting to migrate.

If there is a downside to DB attach versus In Place, it would be cost (two farms for some period of time) but this is typically worth avoiding the risk above. Depending on how heavily you’ve customized your farm and how disciplined you’ve been about documenting it, the process of recreating a new farm with all those third party and custom components may also seem like a daunting task. I like to take a glass half full approach to this and consider it an opportunity to rebuild your servers better than before with better documentation and a chance for some house cleaning.

Third Party Tools

I will not claim that database attach is a one size fits all option. It is not an automated technique and will require you to work with PowerShell and SQL to get your old content into the new farm. Depending on the size of your corpus of content copying databases, attaching them and upgrading them may take longer than you want.

There are many reasons why people begin to consider the use of Third Party Tools for their migration and there is nothing wrong with tools. Just make sure to download trials of a few tools and determine if they are satisfying your criteria for a migration tool.

Here are some reasons people might want to use tools:

  • Automated syncing of content from a 2007 to 2010 farm if both will co-exist and be used for an extended period. The only automation you will have out of the box will be what scripts and timers you create yourself, some third party tools have this built in.
  • Re-structure site hierarchy or taxonomy. DB attach is a copy of your 2007 hierarchy just upgraded and if you want to move sites around, a tool will help make this easier.
  • Allow power users to do the work. Tools sometimes let those that are not the SharePoint Farm Admin do the mapping from 2007 to 2010 which can offset some of the work load. This approach can dove-tail with the re-structuring approach as well where you set up the targets and let your users decide what content is worth moving to 2010.


If you are just getting started on your plans to migrate from 2007 to 2010, evaluate the out of the box options first. Weigh the pros/cons of each option and how your organization’s skills and needs align with what out of the box takes. If you find that you need to explore third party tools, be prepared to justify them since the costs of migration tools can sometimes be a hard sell; third party tools are typically used just for a migration and then no longer needed.

Regardless of the tool or technique you choose to do your migration, the keys to having a successful migration are always going to be effective planning, solid testing of your tool or technique, and lots of communication throughout the process.

read more
Bo GeorgeSharePoint Migration Options