Quick Impression: System Center Capacity Planner for SharePoint

I just fired up the capacity planning tool that’s all the rage these days

I found it easy to use and quickly modeled a client environment I worked on this past summer.

With some trepidation, I pressed the final OK button and it recommended something that is pretty similar to what we gave our client (we actually threw in a second application server for future excel use).  I take that to be a good sign and increases my confidence in the tool.

It seems pretty powerful stuff a much better starting point than a blank page.

I like that lets you get into some good detail about the environment.  How many users, how you project they will use the system (publishing, collaboration, etc), branch office and connectivity / network capacity between them and the mama server.  Good stuff.

It asks broad based questions and then lets you tweak the details for a pretty granular model of your environment.

I hesitated downloading it because I have so many other things to look at it, read and try to digest.  I’m glad I did.

It’s an easy two-step process.  Download system center capacity planner and then download the SharePoint models.  It runs nicely on Windows XP.

Based on my quick impression, I don’t see how it might account for:

  • Search: Total documents, maybe types of documents, languages.
  • Excel server: how much, if at all?
  • Forms server: how much, if at all?
  • BDC: how much, if at all.

Those may be modeled and I just didn’t see them in the 10 minute review.

I will definitely use it at my next client.

If I were not a consultant and instead working for a real company :), I’d model my current environment and see how the tool’s recommended model matches up against reality.  That would be pretty neat.  It could lead to some good infrastructure discussion.

</end>

Technorati Tags:

Solution: System.IO.FileNotFoundException on “SPSite = new SPSite(url)”

 

UPDATE: I posted this question to MSDN here (http://forums.microsoft.com/Forums/ShowPost.aspx?PostID=2808543&SiteID=1&mode=1) and Michael Washam of Microsoft responded with a concise answer. 

I created a web service to act as a BDC-friendly facade to a SharePoint list.  When I used this from my development environment, it worked fine. When I migrated this to a new server, I encountered this error:

System.IO.FileNotFoundException: The Web application at http://localhost/sandbox could not be found. Verify that you have typed the URL correctly. If the URL should be serving existing content, the system administrator may need to add a new request URL mapping to the intended application. at Microsoft.SharePoint.SPSite..ctor(SPFarm farm, Uri requestUri, Boolean contextSite, SPUserToken userToken) at Microsoft.SharePoint.SPSite..ctor(String requestUrl) at Conchango.xyzzy.GetExistingDocument(String minId, String maxId, String titleFilter) in C:\Documents and Settings\Paul\My Documents\Visual Studio 2005\Projects\xyzzy\BDC_DocReview\BDC_DocReview\DocReviewFacade.asmx.cs:line 69

Here is line 69:

using (SPSite site = new SPSite("http://localhost/sandbox"))

I tried different variations on the URL, including using the server’s real name, its IP address, trailing slashes on the URL, etc.  I always got that error. 

I used The Google to research it.  Lots of people face this issue, or variations of it, but no one seemed to have it solved.

Tricksy MOSS provided such a detailed error that it didn’t occur to me to check the 12 hive logs.  Eventually, about 24 hours after my colleague recommended I do so, I checked out the 12 hive log and found this:

An exception occured while trying to acquire the local farm:
System.Security.SecurityException: Requested registry access is not allowed.
at System.ThrowHelper.ThrowSecurityException(ExceptionResource resource) at
Microsoft.Win32.RegistryKey.OpenSubKey(String name, Boolean writable) at
Microsoft.Win32.RegistryKey.OpenSubKey(String name) at
Microsoft.SharePoint.Administration.SPConfigurationDatabase.get_RegistryConnectionString() at
Microsoft.SharePoint.Administration.SPConfigurationDatabase.get_Local() at
Microsoft.SharePoint.Administration.SPFarm.FindLocal(SPFarm& farm, Boolean& isJoined)
The Zone of the assembly that failed was:  MyComputer

This opened up new avenues of research, so it was back to The Google. That led me to this forum post: http://forums.codecharge.com/posts.php?post_id=67135.  That didn’t really help me but it did start making me think there was a database and/or security issue.  I soldiered on and Andrew Connell’s post finally triggered the thought that I should make sure that the application pool’s identity account had appropriate access to the database.  I thought it already did.  However, my colleague went and gave the app pool identity account full access to SQL.

As soon as she made that change, everything started working. 

What happened next is best expressed as a haiku poem:

Problems raise their hands.
You swing and miss.  Try again.
Success!  But how?  Why?

She didn’t want to leave things alone like that, preferring to give the minimum required permission (and probably with an eye to writing a blog entry; I beat her to the punch, muhahahahaha!).

She removed successive permissions from the app pool identity account until … there was no longer any explicit permission for the app pool identity account at all.  The web service continued to work just fine.

We went and rebooted the servers.  Everything continued to work fine.

So, to recap: we gave the app pool identity full access and then took it away.  The web service started working and never stopped working.  Bizarre.

If anyone knows why that should have worked, please leave a comment. 

</end>

Technorati Tags:

Solution (sort of): Set Priority on a Task Using SharePoint Designer

I have a business scenario like this:

  • A user uploads a document to a document library.
  • She selects a content type and enters meta data as needed. One of the meta data fields is a flag, "Urgent".
  • This triggers a SharePoint Designer workflow that, among other things, uses the "Collect Data from a User" action.

"Collect Data from a User" creates an item in a task list requesting approval for that document.

I needed to create a view of the task list that showed urgent requests for approval.

Solution: Put the word "URGENT:" into the title of these tasks. 

I would have preferred to specify the priority field directly.  However, I was unable to do that for several reasons:

  1. The collect data action does not provide a mechanism to update any field other than title (and those additional fields for which you want to collect data).
  2. The "assign a to do item" action has the same problem.
  3. It’s possible to insert an item into a list (i.e. insert an item into the task list directly) but this not a blocking action.  That means that the workflow will not wait for the user to complete that task.

I considered a few approaches before (thankfully) realizing we could just put "urgent" in the title.

  1. Start a workflow on the task list itself so that when a new task is created, it somehow cross references back to the document that started the first workflow, pull out the urgent flag value and update priority as needed. 
  2. Do something similar with an event receiver.  On create of the task, locate the associated document and update priority as needed.
  3. Use the "create list item" action in conjunction with the "wait for field change" action and an event receiver.  If we create a list item, we can specify all the fields we want.  Use an event receiver to update the original item when the user completes the task and the "wait for field change" action’s condition would be met and the workflow would proceed.  (For some reason, I had more or less settled on this approach before wisely deciding to walk away for a while).

There is a drawback to my solution (aside from the obvious fact that only the text of the title indicates urgency).  Since "collect feedback" only accepts hard coded title names, I need to use two different collect feedback actions whose only difference is that hard coded title. 

But, at least there’s a solution that does not require event receivers or custom SPD actions.

If someone has solved this in a more clever way, please let me know.

</end>

Sunday Funny: Keeping Your Son On His Toes

One of the many joys I take in being the parent of a ten year old boy is finding new ways to make him laugh or think a little differently about questions and things in the world.  I’ve used these techniques over the years:

===

Misconstrue his questions:

Son: What day is it?

Dad: One day before Wednesday.

S: No, what day of the month is it?

D: Oh, it’s 4 days after Jan 25.

===

Tickle him and tell him you’ll stop when he stops laughing.

===

Go down stairs to the TV room and announce, "It’s good to be the daddy."  Then, pick him up to get the warm spot on the couch and change the channel to something good, like the Scifi channel.

===

Read stories out loud.  Insert ridiculous sentences in the middle of the story.  My favorite is to add "killing him instantly" when the main characters encounters some minor trouble.  For example, "the knife slipped in his hand, cutting his index finger, killing him instantly."  Nothing quite gets your son out of a complacent and passive listening mode as the main character being killed instantly.

===

Read stories incorrectly.  Read sentences backward.  The best part of this is that the first couple of times I did this, my son thought he was helping me out by pointing out that I wasn’t reading the words in the right order.  The down side is that he really doesn’t want me to read to him any more.

===

Go to Burger King for lunch.  My son would eat BK morning, night and day if we let him.  When going, tell him, "I know you hate going there, but we simply have no choice."  When he tries to explain that he loves BK, talk over him and say things like "We don’t have time to argue about it!  We’re going and I don’t want to have a discussion!"

(This reminds me of my favorite Borg joke: "Borger King: We do it our way.  Your way is irrelevant."  hahaha!)

===

Open a book to page 9 and say, "hmm, that’s an odd page".

===

Fill the world with arch enemies.  "We’re going to run quick over toe 7-11, arch-enemy of 11-7".

"Your aunt lives in Ringwood, arch enemy to the town of Squarewood."

===

We drive up to Massachusetts from New Jersey several times a year and it often takes about 5 hours door to door.  As we arrive home and pull into the driveway say, "oh, I forgot, we need to make a quick dash to Home Depot."

===

When watching a violent episode in a TV show (such as Heroes), tell your son, "some times, at work, I need to destroy my enemies by burning them alive using the powers of my mind.  I don’t like doing it, but you gotta do what you gotta do."

===

When watching bad horror movies (see "It’s good to be the Daddy" above), ascribe improbable motives to the evil character.  For instance, tell your son that the reason Jason is so angry  is because he wants some cake and they won’t let him have any.

===

Explain phone numbers incorrectly.  Instead of telling your son to dial "201-111-2222", tell him it’s "2-011-1-12222".

===

What tricks do you use?

</end>

Technorati Tags:

Guest Blogging?

It seems fairly common in the political blogging world for a given blog to host a "guest blogger".  When I’m in political blog land I must be wearing a different pair of eye glasses because it never occurred to me that "guest blogging" might make sense for a technical blog like mine.  That is, until I read this post by Kanwal Khipple over at The Best of SharePoint Buzz- January 2008

Thinking on it, I believe there could be a lot of people out there in SharePoint land that have the itch to put together an article, short or long, technical or more business oriented, etc, but don’t run their own blog for all the usual reasons.  If you’re one of those people, I’d be happy to host it.  You can reach me via email or leave a comment.  I haven’t thought through any kind of guidelines, but I suppose that I’d want it to be oriented around SharePoint, but I also like to throw in some personal observations about consulting now and then.  I’m also trying to publish a "Sunday Funny" every week and I’m bound to run out of ideas for that.

If you’re a regular blogger already but would like to experiment with guest blogging, I’m definitely open to that too, either as a host or a guest 🙂

</end>

Technorati Tags:

Solution to BDC ADF Import Failure: “The following error occurred:”

I was once again crafting BDC ADF files by hand (so that I can build up my "get off my lawn!" cred) and hit this lovely error:

image

"Application definition import failed.  The following error occurred:"

As you can see, there’s an error, but … it’s not going to tell me what it is.

In my case, the issue turned out that I had started off with a functional ADF for a different project that connected to a database and executed a SQL query against a view.  In this new project, I am calling a method on a web service.  I had stripped out the DB specific stuff and added my web service stuff, but failed to update the <LobSystem>’s Type attribute.  I switched it to "WebService" and I happily moved on to newer and more exciting import errors, which were handled in due course.

Here is the wrong LobSystem:

  <LobSystem
    xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
    xsi:schemaLocation=http://schemas.microsoft.com/office/2006/03/BusinessDataCatalogBDCMetadata.xsd
    Type="Database"
    Version="1.0.0.0" Name="xyzzy"
    xmlns="
http://schemas.microsoft.com/office/2006/03/BusinessDataCatalog">

This is correct:

  <LobSystem
    xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
    xsi:schemaLocation=http://schemas.microsoft.com/office/2006/03/BusinessDataCatalogBDCMetadata.xsd
    Type="WebService"
    Version="1.0.0.0" Name="xyzzy"
    xmlns="
http://schemas.microsoft.com/office/2006/03/BusinessDataCatalog">

</end>

Technorati Tags:

BDC Seems a Viable Replacement For Lookups

UPDATE: This MSDN posting has some interesting observations from JXJ based on his, mainly negative, experiences going down this path: http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2623565&SiteID=1

We have a business scenario where we need to link two documents libraries via a common "document ID" field.

We often use a lookup column to implements links like this.  There are several drawbacks to lookup columns, three of which are:

  1. Only one column from the lookup lookup library can be linked. 
  2. Performance: The source library could contain hundreds of entries.  That’s too many entries in the lookup.
  3. Search: There is no integrated search.  I don’t mean in the MOSS sense of search, but there’s no way to search / filter on multiple columns from the source document library and locate the link you want.

Backed by BDC, we can use a "business data" column type and it provides a superior search and even allows multiple columns of data to appear in list views. 

I’ve had some preliminary success with this approach and plan to write more about it.

If you’ve worked this angle before and have any comments, please share!

</end>

Technorati Tags:

Solution to BDC Import Error: “Could not load Type described by TypeDescriptor’s TypeName …”

I’ve been working with BDC today, coding ADF files by hand and generating myself some errors.  One such error:

Application definition import failed. The following error occurred: Could not load Type described by TypeDescriptor’s TypeName. Parameter name: typeName Error was encountered at or just before Line: ’35’ and Position: ’20’.

MOSS displayed this error when I tried to import the ADF XML file.

I researched the Internets and found that I was referencing the LOB instance name (from the <LobSystemInstance>) in my <TypeDescriptor> node when I should have referenced the LOB name itself (from <LobSystem>).

Wrong:

<TypeDescriptor TypeName="Conchango.KeyValue, LOB Instance Name" Name="KeyValue">

Correct:

<TypeDescriptor TypeName="Conchango.KeyValue, LOB Name" Name="KeyValue">

Hope this one saves someone an hour or two of time.

</end>

 Subscribe to my blog!

Technorati Tags: