Photography, SharePoint

SharePoint Saturday Denver ShareSki Wrapup

It’s been a couple weeks now since the event, but I finally made the time to upload the pictures I took during the SharePoint Saturday Denver ShareSki event to Loveland. Although I was sidelined and stayed in the lodge, it was a great event and I had the opportunity become better acquainted with some of the attendees. It got off to a rocky start as the power was out at Loveland when we got there, but they eventually got one lift running on a generator and finally power restored 45 minutes or so after that. All in all, I think everyone had a great time. At the very least, based on the quiet bus ride home the skiing/boarding tired them out!

Getting ready to head out Group at Lodge Group at Lodge Tracy interviewing Clay

Enjoy the additional pictures over on Flickr and feel free to use them as you see fit. If you need a higher quality version than what’s on Flickr let me know.


Speaking at SharePoint Saturday Utah

The next SharePoint Saturday event I’ll be attending is on 12/3 in beautiful Salt Lake City (technically, Sandy) Utah on 12/3. I was honored to be chosen to present a session on web templates, where I’ll cover site templates, site definitions, and how they differ from web templates and then walk through some scenarios of building actual web templates. As of this post, I’m scheduled in the last slot of the day so if you’re in the audience I’ll know you’re dedicated to learning SharePoint!

It should be an awesome event, including a #ShareSki event on Friday (which I have to!) and a #SharePint after the event on Saturday. As always, it’s a free event but you do need to register.

Joel Oleson, one of the organizers, has recently published the session schedule so check it out. If you still need to register, head on over to EventBrite.


SharePoint Saturday Denver 2011 Recap

The third installment of SharePoint Saturday Denver is a wrap! It was a huge success, thanks in no small part to all of the volunteers and 350+ attendees. If you didn’t get a chance to attend, keep an eye out for next years event!

On Friday I presented a session on records management in SharePoint 2010. It was a great crowd and I had a lot of fun presenting and talking with everyone. I promised to post some links to other websites that had material related to records management in SharePoint so I’ll have a follow up on that.

My Friday session was on Search Engine Optimization in SharePoint. Although the crowd was smaller than my RM talk, it was equally as fun. SEO has been a topic that has come up a lot more recently as folks are starting to realize SharePoint 2010 is a great platform for Internet facing sites so it was great to share my little nuggets of info I’ve gained along the way.

Here are my presentations:

Yes, Records Management IS Possible in SharePoint!
Search Engine Optimization for SharePoint

SharePoint, Technical

Create a Record Search Center

The new In-Place record declaration functionality in SharePoint 2010 is a nice feature, but once you use it in a farm for a while, sooner or later users will need to find items that have been declared records. Out of the box, there’s no way to do that. Taking a look at my previous post on how SharePoint handles records under the covers gives you what you need to expose those records, and an easy way to do that is using SharePoint search. (FAST would be similar to below, but these steps are for SharePoint Search.)

This wouldn’t normally involve an entire “search center” within SharePoint, so I’ll be creating a simple web part page and walk through the configuration necessary to enable searching on declared records.

Create a managed property

As we learned in part 1 of this series, there are two properties that are used by SharePoint when an item is declared a record. The field _vti_ItemHoldRecordStatus looks promising, but it is hidden. Unless someone teaches me how to create a crawled property on a hidden field, we can’t use that. The other option is _vti_ItemDeclaredRecord, which is the timestamp of when the item was declared. Luckily, it is cleared out when the item is undeclared, and it is not hidden. Which means we can use it to create a scope to narrow down our records!

  1. Open up Central Administration and go to Application Management, Manage Service Applications
  2. Click on your search service application to manage it
  3. In the left nav, click on Metadata Properties
  4. In the top of the list, click Crawled Properties
  5. Do a search for itemdeclaredrecord. If you find a property with the name ows__vti_itemdeclaredrecord, move on to the next step. If not, go declare a record in your farm and kick off a full crawl.
  6. In the top of the list, click on Managed Properties
  7. Click New Managed Property
    1. Name the property “ItemDeclaredRecordDate”
    2. Type of Date/Time
    3. Add a mapping to the ows__vti_itemdeclaredrecord crawled property
    4. Check Available for use in Scopes
    5. Click OK
  8. Kick off a full crawl

Create search page

Now we need to create the page users will access to search for items declared as records, based on the property we created above.

  1. Navigate to a site where you want to provide this functionality and create a new page (any layout will do as long as it allows web parts Smile)
  2. Edit the page and add two web parts (you can add more to your desire and needs):
    1. Search Box
    2. Search Core Results
  3. Edit the Search Box web part
    1. Under the Miscellaneous section, set the Target search results page property to be the URL of the page you are on (or a different results page if you’re creating a separate results page)
  4. Edit the Search Core Results web part
    1. Under the Results Query Options section, set the Append Text to Query value to ItemDeclaredRecordDate>”1/1/1900″
  5. Save & Exit

All done. You now have a page that should only return declared records in the search results!

SharePoint, Technical

How SharePoint Declares Items as a Record

This is one of those posts that’s been in my head for a while. I had some time on the couch last weekend and was prompted by a question in the SharePoint forums so I spent some time looking into the inner workings of a Record in SharePoint 2010. This is part 1 of 2 where I’ll list my findings regarding how SharePoint (internally) declares items as a record. In other words, what really happens when you click “declare as record” in the UI. Part 2 will use this info to create a search page to allow users to search all records.

Most of this was discovered using ILSpy to look into the methods SharePoint uses when an item is declared a record and when it needs to determine if an item is a record. I’ll start with the latter.

Within the Microsoft.Office.RecordsManagement.RecordsRepository namespace within the Microsoft.Office.Policy assembly, there is a method called Records.IsRecord(SPListItem item). Long story short, that method will eventually get you to a common utility method called GetHoldAndRecordStatus which pulls out the value of a HoldRecordStatus field:

Title Hold and Record Status
Internal Name _vti_ItemHoldRecordStatus
GUID 3AFCC5C7-C6EF-44f8-9479-3561D72F9E8E
Microsoft.SharePoint.Publishing.FieldId HoldRecordStatus
Hidden True
Type Double

A few notes here. First, notice it’s a Double. Hmmm, magic numbers? Maybe. Also notice it’s hidden, and it seems to cover both items on hold and flagged as a record judging by the name. If you pull out the value of this column from an item that has been marked as on hold or as a record, here are the values you’ll see:

Normal record Empty, or 0
Hold 4353
Record 273

I’m sure there are other combinations of numbers that will work, judging on how the math is done internally in the other methods. Basically, they add a mask (int) depending on what you’re doing. The mask for records is 16 and the mask for holds is 4096. Someone better at math can open up those classes and let me know how the numbers are actually used. Smile

Another column that’s used in this process is:

Title Declared Record
Internal Name _vti_ItemDeclaredRecord
GUID f9a44731-84eb-43a4-9973-cd2953ad8646
Microsoft.SharePoint.Publishing.FieldId DeclaredRecord
Hidden False
Type DateTime

This is basically the timestamp for when the item was declared a record. It gets populated when the item is declared, and cleared out when it’s undeclared. Note that it’s not hidden. Smile

Now we know two properties on the list item that are set when an item is declared a record. Now what? How about we use them to search for all records?!?