Associated Calculated Columns in Reusable Workflows (SP2010)

One of the great things about SharePoint 2010 is the ability to create reusable workflows. No more tying a workflow to an individual list or library. Now, you can tie a workflow to a content type, and reuse it in multiple list or library instances. Unfortunately, today I found what I think is a bug in using calculated columns in reusable workflows. Let me lay out the scenario.

Scenario

To play along, you’ll need to understand a bit about site columns, content types, and reusable workflows.

    1. Create a test content type with the following site columns.
      • Cost 1 (currency column)
      • Cost 2 (currency column)
      • Total Cost (calculated column with the function =SUM([Cost 1],[Cost 2]))
    2. Create a test list and set the default content type to be the test content type.
    3. Create a test reusable workflow (no steps needed yet), publish it, and attach it to the test content type.

Got that all set up? Great.

Chances are good, you’re going to want to access the columns from your content type in the workflow – either for logging purposes or to generate messages in emails or what have you. But, since the workflow isn’t directly connected to the list, you’ll need to create association columns to the data you want to use. That’s a straight-forward process, and takes just 3 quick steps.
      1. Click “Association Columns” in the ribbon.
      2. Click “Select a Site Column.”
      3. Find your site column and select it.
Steps to Set Up an Association Column
Steps to Set Up an Association Column

We should be good to go! Now when you want to use the Association Column, it will show up as part of “Current Item” in your workflow.

Selecting an Association Column
Selecting an Association Column

Super easy, right?

The Problem

Hold the phone. Nothing is ever quite THAT simple with SharePoint. What happens with the datatype of that Site Column?

Well, if this is a non-calculated column, you’ve got no problem. SharePoint Designer recognizes the data type of the column and asks you how you want to format it.

Select the format of the returned field
Select the format of the returned field

The same is true if you’re using a list workflow with a calculated column.

But, if you’re using a reusable workflow with a calculated column, you’re out of luck. SharePoint Designer will only return it as a string.

No option to select return type with calculated association columns
No option to select return type with calculated association columns

Worse yet, the string that is returned includes information on the data type – in the case of my currency column, the string returned is “float;#40.0000000000000.”

Unusable string is returned
Unusable string is returned

So, what do you do?

I’m guessing you could write some crazy string manipulation functions to handle the formatting of this weird string.

Or, you could try to set the value of the Association Column to an intervening workflow variable of type double. The interface will choose to return the Association Column as a double.

Setting an Association Column to a Local Variable
Setting an Association Column to a Local Variable

You could try that. But, it won’t work. It LOOKS like it will work. But, if you try to do it, here’s what you get:

Coercion Failed: Unable to transform the input lookup data into the requested type.
Coercion Failed: Unable to transform the input lookup data into the requested type.

Is anybody else getting the feeling this is a bug? No? Okay. Moving right along.

The Total Hack Solution

What I’ve found is that the easiest thing to do is to (if possible) is just replicate your calculations within SharePoint Designer. In my case, this resulted in a series of addition problems with intervening variables.

Replicating the calculation in SPD
Replicating the calculation in SPD

Barring that approach, I think your only option would be to use a list-based workflow on the list to update a secondary non-calculated column and firing that workflow before the reusable workflow. Of course, that completely defeats the purpose of having a reusable workflow.

*sigh*

Any body else have any bright ideas?

Advertisement

Joined Subviews with Linked Datasources in SharePoint 2010

I recently completed a project that involved joining a list (Appendix A) and a document library (Appendix A documents). Each document, when added to the library, was associated with an item from the list. There were three document types and each item in Appendix A needed to have 3 matching documents in the library. The project administrators needed a quick way to scan for missing documents.

The obvious solution was to put a data view web part on a page with a linked datasource and a joined subview (displaying all the documents associated with each list item).

I was going for something like this:

A report showing items from the list and their associated documents
A report showing items from the list and their associated documents

I figured it should be fairly easy, considering I already had a lookup column on the Appendix A Documents library, linking it to the list.

But, you know, this is SharePoint. It’s never quite THAT straightforward, right? Look what happens when you try to do a joined subview on your lookup column:

The look up column adds extra information - so no match!
The look up column adds extra information - so no match!

The lookup column adds extra information – notable the ID of the item, followed by a semi-colon and a # sign.

Now, if you want to be an XSLT ninja and do some string manipulation, you can get around this issue the hard way. But, the easy way is to just go back to your original lookup column, and use the new SharePoint 2010 feature to “Add a column to show each of these additional fields.” Just make sure that whichever column you’re adding and joining is unique. I used the ID in this example, as that is always unique.

Include A Second Unique Column
Include A Second Unique Column

Now, go back to your joined subview and select your additional column. Voila!

Correctly Linked Columns
Correctly Linked Columns

Modifying the SharePoint 2010 Preview Pane View Style

Out of the box, SharePoint 2010 offers several styles that can be selected when creating a view of a list or library. One really useful style is the Preview Pane. If you have a list with a lot of columns, the Preview Pane style is great for creating a vertical view of the data, avoiding the dreaded horizontal scroll. If you’re not familiar with the Preview Pane, Microsoft has a quick screen cast that shows how to use it.

Unfortunately, out of the box, there’s no way to identify which column should be used in the pick list – that list of items on the left side of the preview pane. It defaults to the title column, and there’s no way in the web-based tools to modify that. So, what happens if for some reason you’re not using the title column in the intended manner? Well, you end up with something like this:

A Not Very Functional Preview Pane View
A Not Very Functional Preview Pane View

Not so great, right? If you Google around for a solution, you’ll find options such as using a workflow to update the title column with the data you want when an item is added or using a CAML editor tool. Hm…. No thanks.

Turns out that you can make it work with a little help from SharePoint Designer. Fire up SharePoint Designer 2010. Load your site. Navigate to your list. In the Views module, click the preview pane view that you created. (If you haven’t created one, watch that screen cast and create one first.)

Click the Preview Pane View to edit it
Click the Preview Pane View to edit it

Now that you’re in edit mode for the Preview Pane style, do any of the typical tweaks you might do on any view – change the sort order, the paging, add or remove columns. Do everything you might want to do using the Ribbon options before we get to this next part. It makes life easier.

Now for the fun stuff.

Find either the title or the words “(no title)” in the left column. Highlight either the title in a row of data or the “(no title)” words. Right click, and select “Edit Formula.”

Highlight the words to replace and select "Edit Formula"
Highlight the words to replace and select "Edit Formula"

A pop-up window will open where you can select another column of data, enter static text, or use any number of formulas to generate the text you want to use. I concatenated two columns.

Using a formula to concatenate columns
Using a formula to concatenate columns

If you have some rows of data with titles and some without, you’ll need to repeat this process for both types of columns.

So, what’s happening behind the scenes is that a new XSLT template is being added to code view. It’s called the “LinkTitleValue.LinkTitle” template, and it determines what data is being used for the link to the item. The template looks like this:

<xsl:template name="LinkTitleValue.LinkTitle" ddwrt:dvt_mode="body" ddwrt:ghost="" xmlns:ddwrt2="urn:frontpage:internal">
<xsl:param name="thisNode" select="."/>
<xsl:param name="ShowAccessibleIcon" select="0"/>
<xsl:variable name="titlevalue" select="$thisNode/@Title"/>
<xsl:choose>
<xsl:when test="$titlevalue=''">
<xsl:value-of select="concat($thisNode/@Chapter_x0020_Name, ' - ', $thisNode/@EIN)"/>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="$HasTitleField">
<xsl:value-of select="concat($thisNode/@Chapter_x0020_Name, ' - ', $thisNode/@EIN)" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$titlevalue" />
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="$ShowAccessibleIcon">
<img src="/_layouts/images/blank.gif" class="ms-hidden" border="0" width="1" height="1" alt="{$idPresEnabled}" />
</xsl:when>
<xsl:otherwise></xsl:otherwise>
</xsl:choose>
</xsl:template>

Save your file and test it. Looks great, right?

Title Successfully Replaced
Title Successfully Replaced

You have now successfully replaced your title with your preferred information and it’s linked to the item. It also has an ECB menu attached to the item.

What happens if we use the ECB menu to view or edit the item? Oops! The Javascript gets confused and it drops out the text we just spent our time putting in there!

Oops! Where'd our text go?
Oops! Where'd our text go?

I haven’t dug into why this is happening, and I’m sure someone else will do that. (Leave a comment if you figure it out!) But, I do have a workaround. One more step. I find this step easier to do back in the browser. So, save and close SharePoint Designer. Fire up notepad and type the following:

<style type="text/css">

.s4-ctx {
display:none;
}

</style>

Save it as a text file and upload it to your site. Make note of the location. (Right click and “copy shortcut.”) (I used the “site assets” library.)

Navigate to your view. Select Site Actions -> Edit Page. Add a Content Editor Web Part and edit the web part to add a Content Link. Paste the shortcut and click “Ok.”

Link to your text file from the content editor webpart.
Link to your text file from the content editor webpart.

Save your file. Your “title” pane will now have the data you want, minus the ECB menu. Hovering over the item will load it in the preview pane. Clicking it will load the pop-up window for viewing or editing the content. One caveat, and Microsoft insists it’s a “feature – not a bug,” is that you’ve now lost your view menu in the breadcrumbs. (Glyn Clough provides more information about this issue. And Pentalogic has a free solution that fixes the issue on all pages, but may be a bit “nuclear,” as they put it.)

The View Menu disappears on view pages that have been edited.
The View Menu disappears on view pages that have been edited.

The workaround for that is to edit the page in SharePoint Designer to add your custom css. However, this customizes the page. You’ll have to choose whether you’d rather deal with customized pages or an alteration of the the UI. If you want to customize the page and retain the breadcrumbs, remove the Content Editor Webpart and save your page. Fire up SharePoint Designer again. Navigate to your list. Right click on your Preview Pane view and select “Edit File in Advanced Mode.”

Edit File in Advanced Mode
Edit File in Advanced Mode

Note: If you do not have the Edit File in Advanced Mode option, it is because your site collection or farm administrator has restricted the use of SharePoint Designer in your environment.

Once your view loads in advanced mode, switch to code view and search for “PlaceHolderAdditionalPageHead.” Add the CSS we had previously added via the Content Editor Webpart to that tag, like so:

Add CSS Via SharePoint Designer
Add CSS Via SharePoint Designer

Save your file. Voila – you now have customized title pane with no ECB menu and have retained the view selector breadcrumb.

The other major advantage of using this method versus the Content Editor Webpart is that the CSS will render in the head of the page, where it belongs. However, if you do choose to use this approach, make sure you are tracking what pages you are customizing so that when it comes time to upgrade you’ll know which files need to be double-checked.

Calendar Overlay – a simple SharePoint 2010 OOTB Master Calendar

A master calender is a common request for team sites that have sub-sites. If you are running SharePoint 2010, there’s now a built-in way to do a roll-up master calendar using the calendar overlay feature.

The Steps

  1. At the site on which you want to display the master calendar, either create a calendar list or use the existing team site calendar.
  2. On the Calendar tab in the ribbon, click Calendars Overlay.

    Calendar Overlay Button on the Ribbon
    Calendar Overlay Button on the Ribbon
  3. Click the New Calendar link to add a new calendar.

    Click the New Calendar Link
    Click the New Calendar Link
  4. In the next screen, you will need to provide information about the calendar you are adding (name, description, etc.) plus the URL of the site that houses the calendar. *(Note that the URL should be to the site, not to the calendar itself. SharePoint will find all the possible lists and views once you click the Resolve button after entering the URL address.) If the site has multiple calendar lists or views, you will need to select the one you wish to overlay from the drop down boxes. Check the box next to Always Show. Click OK.

    Enter Calendar Information
    Enter Calendar Information
  5. Repeat Steps 3-4 for each calendar you wish to add.
  6. When all the calendars are added, click “Ok.”
  7. Now all the calendars will show on the main calendar.

    Combined Calendar View
    Combined Calendar View

The Caveats

You knew there were some, right?

  1. You can only include 10 calendars.
  2. You only have 8 colors to choose from.
  3. You can include calendars that are above the site of the “master calendar” and that are siblings to the master calendar, and even that aren’t in the same site collection (Yay!). But, if the person visiting the site doesn’t have permissions to view the other calendar, you’ll get this error:
    Permissions Error
    Permissions Error

    Oops. So, be careful with permissions on your overlays.

  4. If you connect to Outlook on the main calendar, it will not include the overlaid calendars.
  5. If you add a web part of the master calendar to a page, it will not include the overlaid items you have to switch to “calendar” view in the web part properties to see the overlaid items.
  6. You can overlay lists that are not of the calendar type, as long as they have a calendar view. (This isn’t really a caveat – just a good thing to note.)
You can also overlay Exchange calendars. Sharad Kumar has a good blog post on how to aggregate Exchange Appointments into a Calendar View.

XSLT XML Dump

Ever wanted to dump the raw XML from a webpart? It’s easy. Just change the XSLT to the following for nicely formatted XML.

<xsl:stylesheet version=”1.0″ xmlns:xsl=”http://www.w3.org/1999/XSL/Transform”&gt;
<xsl:output method=”xml” indent=”yes” />
<xsl:template match=”/”>
<xmp>
<xsl:copy-of select=”*”/>
</xmp>
</xsl:template>
</xsl:stylesheet>

You can save this as an style sheet in your styles library and apply it to any web parts that allow that to get a dump of the raw xml.

Displaying the Document Icon in a CrossList SharePoint 2010 DFWP

Once again, I’m finding that the DataForm Web Part (DFWP) acts slightly differently when you’re using it as a roll-up. And, once again, I’m finding great info out there on Marc Anderson’s blog about what I want to do. But, once again, it needs a slight tweak to work with a roll up.

So, if you want to include the document icon in a DFWP when you’re using it in CrossList mode with recursion through sub-sites, instead of this:

<img src="/_layouts/images/{ddwrt:MapToIcon('', ddwrt:GetFileExtension(string(@FileLeafRef)))}" alt="Type" />

You’ll need this:

<img src="/_layouts/images/{ddwrt:MapToIcon('', string(@DocIcon))}" alt="Type" />

DocIcon will need to be included in your FieldRef section of your SelectCommand:

<FieldRef Name="DocIcon"/>

Linking to Documents with a Roll-up DataForm Web Part

Say you want to make a roll-up webpart of all the word documents in a bunch of subsites on SharePoint 2010. Well, you could use the Content Query Web Part and modify the XSLT to filter out everything but word documents. Or, you could fire up SharePoint Designer and pull out the handy-dandy DataForm Web Part.  There’s really nothing new going on here that hasn’t been covered in other blogs. A great resource for getting your head wrapped around the crosslist dataform webpart is Marc Anderson’s blog. The thing that confuzzled me, though, is that when you switch the datasource from a single list, to a recursive crosslist, your data is returned with a number, followed by a semi-colon, followed by the pound sign, followed by the actual data that you want. Argh. Not good, and more Google-spelunking led me to Laura Rogers (@wonderLaura) who pointed me in the right direction on this issue. She’s linking to list items, whereas I’m linking to documents themselves. If you want to link to the documents themselves, it’s a fairly minor change though. Just change this:

{concat('/',substring-after(@FileDirRef,'#'),'/Dispform.aspx?ID=',@ID)}

to this:
{concat('/',substring-after(@FileDirRef,';#'),'/',@LinkFilename)}

(Note, be sure to add the LinkFilename to your selected fields.)

Voila – the name of the document linked to the document itself, no matter which subsite it’s found in.

SharePoint 2010: Enabling Managed Metadata features

SharePoint 2010 comes with some wonderful managed metadata features. A quick Google search returns oodles of information about planning your managed metadata, adding managed metadata columns to lists and libraries, and using metadata navigation. What most of them fail to point out is that there are features that need to be enabled in order to use the managed metadata columns and the metadata navigation. Those features aren’t exposed in the UI in an out of the box configuration.

After much spelunking and blog reading and traipsing through the SharePoint root directory, I finally figured out how to enable these two features. Using the SharePoint 2010 Management Shell (PowerShell), you simple run the following commands:


Enable-SPFeature -id "73EF14B1-13A9-416b-A9B5-ECECA2B0604C" -Url <Site-URL>
Enable-SPFeature -id "7201D6A4-A5D3-49A1-8C19-19C4BAC6E668" -Url <Site-URL>

The first one is the feature that allows the use of managed metadata columns for libraries and lists. The second one is the one that adds the metadata navigation options (and filter keys). Technically, the second feature isn’t listed as hidden and so it should show up in the UI. But, in my development install, it did not.

As a side note, when you read about features that aren’t showing in your UI, and you want to track them down, head on over to your SharePoint feature directory, which is typically:

C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\FEATURES

Find the subfolder for the feature you are interested in, and find the Feature.xml file within. Open it with a text reader, copy the ID for the feature, and plug it into the commands above. Run it and you’ll be able to install any of the hidden features.

Hopefully this will save someone else a major search hassle.