Archive for March, 2009

Dynamics CRM URL-Addressable Forms

Why should you care about “URL Addressable Forms”?

This is just a fancy way of saying you can navigate directly to almost any form or window in Dynamics CRM directly — without drilling down through the UI to get there. This trick can save you time, save screen real estate, and in extreme situations might even save your job (if you break your site map and have an unforgiving boss, for example).

The Basics; Navigating to the Service Calendar

Most Dynamics CRM users who use the web client open CRM by navigating to a URL like these:

  • http://crm.imginc.com is an example of an “on-premise” CRM (in this case, installed and hosted by my company on our servers)
  • https://img.crm.dynamics.com is an example of the Dynamics CRM Online version (hosted by Microsoft in the “Software as a Service” model)

In both cases, if you look at the URL after the page loads you’ll see something like these:

 The loader.aspx file you see is the default page that IIS loads for the organization you’re accessing; what it actually does is load up the familiar Dynamics CRM user interface with the site map on the left, the global toolbar and the CRM splash logo on top, and you see the familiar full-blown CRM web client:

crm_default

I like this “normal” UI fine, but sometimes it’s convenient to navigate directly to a page. One example of this that I find especially useful is the Service Calendar.  Accessing the Service Calendar via the standard UI is done by clicking on the Service area on the site map, and then on the Service tab you’ll see there. The problem with this approach is that the default calendar view is so squished by the site map and the rest of the CRM UI that it’s hard to use it effectively. Here’s what it looks like if you navigate to it through the standard UI:

Service Calendar Exposed through UI

Service Calendar Exposed through UI

If you want more room to move in the Service Calendar, you can navigate directly to it by substituting  ”sm/home_apptbook.aspx” for “loader.aspx” in the URLs I showed above. So if I go directly to this URL, https://crm.imginc.com/sm/home_apptbook.aspx, I get the Service Calendar all by itself:

servicecalendar_alone

Service Calendar all by itself

If what I need to do is work in the Service Calendar, this is much better! For that matter, I can go one better by minimizing the “Calendar” panel on the right, and shrinking the list of names on the left:

servicecalendarevenbetter1

 

Navigating Directly to an Account Record

This so-called “URL Addressable forms” trick works in lots of different places. Another example is with entity forms. If I navigate to an Account form through the UI, I see this:

account_1

But once you realize that every single record in CRM is uniquely identified by the so-called “GUID” you can see in the window title above, and that it’s always included in the URL, you can navigate directly to any record. The easiest way to get the URL is to enter “Ctrl-N” (open a new window) when you’re on a form like the one above, and you’ll see this:

account_21

Account form opened in its own window

Notice that the URL is now selectable in the address bar, so I can save this as a favorite or email it to a colleague! (CRM will enforce security on these links no matter how you try to get to them, so if I email the link to a colleague who doesn’t have Read permissions for this account record, they won’t be able to access the record.) 

 And in Case you Break your Site Map…

There’s another example of this when it might not only be convenient, but quite important, to navigate directly to a page: If you’ve ever tried to customize a Dynamics CRM site map you’ll like this trick! Customizing the site map can be very useful since it’s one of the main ways to customize the Dynamics CRM user interface, with links to external web sites, applications that integrate with CRM and lots of other things. The problem with customizing the site map is that if you make a mistake, your customized site map can break the CRM UI. And if you break the CRM UI you might not be able to get to the page where you can import the default site map or the most recent one that worked (if you saved it!). If this happens you’ll be very relieved if you remember this URL:

https://crm.imginc.com/tools/systemcustomization/importcustomizations/importcustomizations.aspx

Add everything after the “tools/…” to your normal CRM web URL and you’ll go right to the page where you can import your most recent working site map and fix the CRM UI you just broke!  

If you ever break your site map you'll be relieved to see this!

If you ever break your site map you'll be relieved to remember this!

Leave a Comment

CRM 4 Exam Prep: Installation and Deployment (Exam 633)

I’ve posted articles previously on the Dynamics CRM 4.0 Applications exam, and the Customization and Configuration exam, and it was recently pointed out to me that I’d never posted one on the Installation and
Deployment exam.

Sorry! I didn’t mean to disrespect this exam (even though I didn’t like it as much as the Customization and Configuration exam, and not nearly as much as the Applications exam which I liked so much I took it twice!)

I’ll start out with some links to resources that will help you prepare for the exam:

Here’s the Microsoft Learning exam prep page:
http://www.microsoft.com/learning/en/us/exams/dynamics/633.mspx

Here’s the single best source of exam prep material (the Implementation Guide): http://www.microsoft.com/downloads/details.aspx?FamilyID=1ceb5e01-de9f-48c0-8ce2-51633ebf4714&displaylang=en – (memorize the planning and installing chapters and you’ll get 40% of the required 70% right there!)

I recorded some of the instructor-led training sessions I made as part of the Partner Readiness Bootcamp Series I delivered for Microsoft over the course of the last couple years. (I really like them although I may not be the best judge as I always like my own stuff!) You can find a complete set of links to the recordings on the Learning Center on my new web site, www.IMGinc.net.

I hope you find this helpful, and good luck on the exam.

Leave a Comment

SharePoint: WordPress for the Enterprise?

If you’re reading this, it’s probably obvious that my blog platform is WordPress. WordPress is the leading platform for independent bloggers, and it’s open source. And if you’ve been reading my blog for more than a couple months, you might know I recently changed platforms. My company’s public web site is on the MOSS 2007 platform, and for a couple years prior to February 2009, I published very well hidden blog posts at an earlier version of the trick bag: http://www.imginc.com/blogs/richardk/default.aspx

Comparing SharePoint to other Platforms

Plenty of SharePoint partisans like to compare that platform feature for feature against other products. For example, Todd Stephens has an interesting blog all about “Enterprise 2.0″ with a lot of coverage of SharePoint’s role in that phenomenon. Here’s an article comparing SharePoint blogging (favorably) to a blogging-specific alternative to WordPress, Moveable Type: http://www.rtodd.com/collaborage/2009/03/another_sharepoint_enterprise.html

Now I’m a SharePoint guy, tried and true. And until I started using WordPress, I would have completely agreed with the viewpoint expressed in that article.

But after using WordPress for a couple months, I can see why it’s the leading blogging platform and SharePoint’s not. In my opinion, if what you want to do is have a blog or a bunch of blogs, WordPress is better. Here are a few of the reasons:

  • It’s much easier to manage comments in a WordPress blog than in SharePoint.
  • There’s a vibrant third-party market for WordPress blog add-ons (themes, plug-ins and widgets in the WordPress world) that let you easily customize and extend the platform.
  • There are lots of web hosting sites with support for WordPress. I use www.DreamHost.com for the Trick Bag, and it’s got a sweet one-click install to set up a WordPress site, which actually works!

SharePoint’s Role in the Enterprise

I could go on and on comparing SharePoint feature for feature to other products, but that’s really beside the point — which IS the point of this article. If I’m an enterprise IT manager, none of that matters, since SharePoint’s better for most of the things I’d care about: collaboration, ECM, search, portals…and even Web 2.0 for my internal enterprise audience! SharePoint doesn’t need to stack up, feature for feature, against blogs or wikis or other Web 2.0 application paltforms; the fact that it’s got baseline Web 2.0 features is generally good enough.  

For example, I’m currently playing a small roll on a big SharePoint 2007 rollout at Kraft, and they’re huge into blogs, wikis and discussion groups — all on their SharePoint intranet. But they didn’t choose SharePoint because it’s the best blogging/wiki/Web 2.0 platform. They chose it because it’s the best enterprise portal/cms/collaboration/publishing/search platform. The fact that it also has web 2.0 features is a nice bonus, but not why they went with it. And the fact that it’s all SharePoint under the hood means enterprise users can leverage the same essential skills whether they’re collaborating in a document library or reviewing comments on their blog.   

Maybe in the next release SharePoint will compete favorably with the leaders in web 2.0 categories like blogging. Maybe someday SharePoint will have the best blogging platform around. How many times have we seen Microsoft enter a niche with a baseline implementation, and keep investing and improving until their product is better? But again, that’s beside the point. Even if somebody has a better blog or wiki platform than SharePoint, it will still dominate the enterprise space, and that’s a pretty big beechhead from which to attack Web 2.0.

Comments (5)

What Kids Think Their Parents Do

At least, if their parents are CRM uber-geeks

My daughter Bridget always makes good use of the white boards at my office. Here’s her latest contribution to our marketing efforts:

I was quite impressed with this, especially since she didn’t even ask me to pay her for pitching my services. Gotta love these family businesses! In case her handwriting doesn’t quite keep pace with her spirit, what it says is, “Yo Yo Yo my peeps I am Ricardo Knudson And I would like to teach you about CRM”.

Wow. Not only does she know more or less what I do, she also writes wicked marketing copy.

Leave a Comment

Equinox: What to do? Watch sun rise or move DynamicsCRMUserGroup.com to WordPress?

If you’ve never seen the sun rise in downtown Chicago on or near the vernal equinox (autumnal will do just as well), it’s worth scheduling a trip for. I’m from Seattle originally, so I was always impressed with how Chicago’s street grid is laid out: unlike a city with actual geography getting in the way, here everything is exactly north and south, east and west. On the equinox the sun rises in the due east and it’s spectacular, blinding light streaming straight down glass & steel canyons on Washington, Madison, Adams, Monroe. It’s nice at sunset too, but in my opinion sunrise is better, since you generally have a little more solitude. Well, fewer people, anyway.

My daughter and I were going to get up early and drive downtown, but alas: it was a cloudy day, so we’ll have to settle for sunset.

But I was up early anyway, so I decided to make good use of my time, and move the Dynamics CRM User Group (www.DynamicsCRMUserGroup.com ) from our on-premise MOSS 2007 environment to a hosted platform running the WordPress software.  I’m still a big fan of SharePoint (for Enterprise Content Management and Collaboration you can’t beat it), but for some things WordPress is just way better.

Note: if you’ve read some of the recent articles on the Trick Bag you’ll know I’m a relatively new fan of the hosted model. After all these years of assuming I had to install all the software on my servers, maintain connectivity, worry about configuring firewalls and other stuff like that, it’s liberating not to worry about all that any more. But there’s a learning curve to the hosted model also, so posts like this are only partly because I think you might find them interesting. They’re also for me, so I don’t forget how I did this stuff! 

Anyway, here’s how I did it:

  1. Logged in to Dreamhost web panel.
  2. Went to “manage domains”, and told it I wanted to host dynamicscrmusergroup.com on dreamhost.
  3. Went to networksolutions.com and changed our dns servers to point to ns1.dreamhost.com…ns3.dreamhost.com
  4. Went back to dreamhost web panel, and did the one-click install option to install wordpress to the DynamicsCRMUserGroup.com domain. I had to do the “advanced” version because the “easy” version doesn’t let you change domains, and I had to switch it from dynamicscrmtrickbag.com to dynamicscrmusergroup.com
  5. Did the install, in the advanced option you have to create a new mysql database (I called it dynamicscrmusergroup) and a new host name (called it the same thing). It also wanted to create a new user account or admin account. It said it was done and I’d get an email in 10 minutes to my gmail account. (these settings shown in picture on next page). I was a little worried about creating yet another new account, with yet another new username and password I’d need to remember, but I was relieved when I saw that the username and password were going to be easy to remember. (username = xxxxx and password = ****** — except that the *s are really bullet points, as you can see from the following screenshot. Now I just need to figure out how to enter a bullet point directly from the keyboard and I’m all set!)

Dreamhost Web Panel Settings for new DCRMUG WordPress Site

Comments (2)

Understanding Dynamics CRM “Activity Parties”

Many of the entities in Dynamics CRM are hard to miss: Account, Contact, Opportunity, Case and so forth are all front and center, exposed in the Site Map and Advanced Find and other places. Some are harder to find but still important to know about. “Activity Parties” are in the latter category: a little too well-hidden, but useful nevertheless!
 
The Activity Party entity serves as the “intersection” entity in the many-to-many relationships CRM has between certain Activity entities and the front-and-center ones I mentioned above. For example, look at the Service Activity form and you’ll see a “Customers” field, which if you click on the lookup you’ll see you can select multiple Account or Contact records. Compare this to the standard “Regarding” field, which only lets you select a single value.
 
It’s one thing to select multiple customer records and associate them with a service activity (seminar, training class, user group meeting, soccer game…) but it’s another to do some nice reporting on that afterwards. How can you use Advanced Find or the Report Wizard to see which of your customers attended which events?

Here’s a YouTube video I recorded that demonstrates this using the Service Activity entity. Let me know what you think…and if you know of any way to get better video quality within the constraints imposed by YouTube, please let me know!

Comments (2)

Q&A: Can I Populate Information from a Lead to a converted Opportunity

Question: When I convert a Lead record into an Opportunity, I’ve noticed that CRM associates the Opportunity with the Lead with the ‘Regarding’ field, so I can access the information about the Account or Contact (customer) by clicking the link. But what if I want quicker access to information about the customer? Is there some kind of way I can populate information from the Lead record directly onto the Opportunity record?

Answer: You can definitely do this, but as usual, there are at least a couple of options. First, start by creating an automatic workflow on the Create trigger for the Opportunity entity. Make the first action a Check Condition, and note that for the Opportunity entity, there’s a very handy related entity called ‘Originating Lead’ — this is exactly what you want for the scenario you described, since it will let you check to see whether the Opportunity just created was created by using the Convert action from a Lead record, or ‘from scratch’ (with no originating Lead record).

So what I would do is create that conditional logic, and only if the Originating Lead record’s Topic contains data (Topic is required for Lead, so this will always work), then fill in the fields on Opportunity from their values on the Lead record, which will be accessible from the workflow.

One caveat: I’d advise against creating custom attributes in the Opportunity entity to hold these values, since they already exist elsewhere in your CRM (on the Contact or Account records), and it could be confusing to users since they won’t be in synch if changes are made in one place or the other. What I would do is use the Opportunity record’s ‘Description’ field, and put some text in there describing what information you’re showing them, and then include the fields from the Lead record using Dynamic Values in the workflow UI.

Leave a Comment

How — and Why — to Build a “Redirect” Page

Here’s a trick you can use to make a “redirect” page — that is, a page whose only purpose is to send somebody to another page. This is a handy trick in many situations. I recently ran into a requirement for it when I wanted to push out a Twitter tweet with a link to a Trick Bag subscribe landing page.

Here’s the landing page: https://landingpage.dynamics.com:443/LandingPage.aspx?dl_lpai=41e05435-4218-4a33-ae43-a214bd49c8a5&dl_lpak=1949979038.

[Note: this landing page is generated by the "Lead Capture Pages" wizard in Dynamics CRM Online. If you've read any other recent Trick Bag posts, you may know this is a topic of interest to me. For example, here's a link to an article on the Trick Bag on the topic: http://www.dynamicscrmtrickbag.com/?p=163 ]

Anyway, that’s 117 characters all by itself, which only leaves 23 characters to convince somebody they might actually want to click a nasty-looking URL like that! Not enough characters for my poor persuasive skills, so I decided a shorter URL was in order.  

There are other ways to do this, but the easiest approach I’ve seen is to use Jscript code like this:

<script type=”text/javascript”>
<!–
window.location = “http://www.google.com/”
//–>
</script>

So I need some code like that on a page with a nice short URL. Here’s a SharePoint example:

I created a page in SharePoint, which on my site now has a URL of http://www.imginc.com/pages/linkedintbsubscribe.aspx, much shorter than the other one. I put a Content Editor web part on the page, then put that code in the HTML of the page.

So as long as my SharePoint page has a nice short URL, I can simply link to it instead of directly to the long-URL page, and then the SharePoint page simply runs this code –

<script type=”text/javascript”>
<!–
window.location = “https://landingpage.dynamics.com:443/LandingPage.aspx?dl_lpai=41e05435-4218-4a33-ae43-a214bd49c8a5&dl_lpak=1949979038
//–>
</script>

– and all the user sees is what you get to here: https://landingpage.dynamics.com:443/LandingPage.aspx?dl_lpai=41e05435-4218-4a33-ae43-a214bd49c8a5&dl_lpak=1949979038

Comments (2)

Dynamics CRM 4 Training and Certification Resources

It’s been a while since I posted an “all-up CRM 4 training and certification” article, so without further ado, here it is, starting with the core skills areas:

Applications

Customization

  • Course: Customization and Configuration in Dynamics CRM 4.0
  • Link to MS course page: http://www.microsoft.com/learning/en/us/syllabi/8912a.aspx
  • Certification exam: http://www.microsoft.com/learning/en/us/exams/dynamics/631.mspx
  • Editorial comments: The Customization and Configuration exam is an excellent exam, in my opinion: it’s relatively difficult, but it’s well-written and it tests concepts that you actually need to know to be an effective customizer and configurator (if that’s how you’d say it). The Configuration part is what’s new in the 4.0 exam compared to the 3.0 version: to pass this exam, you need to understand business units and security, system settings, and multi-currency and multi-lingual issues (in addition to the core customization topics).  
  • Here’s an article I posted recently specifically on The Dynamics CRM Customization Platform and Exam 30-631. (But be forwarned: I reveal my true inner geek in the videos linked to from the article) 
  • Links to all of the practice tests can be found on the new Certification Prep page hosted on www.IMGinc.net

Installation

Comments (1)

Mashing up CRM and Twitter, Part 2

The Truth is Out There (in 140 Characters or less!)

If you didn’t read the first part of this “series”, here’s a link to Mashing up CRM and Twitter, Part 1. That article provides a high-level overview of three topics:

  1. What the heck Twitter is, in case you’re new to it
  2. Why you might want to integrate it with Dynamics CRM
  3. Some basics of Twitter Search

To follow up on part 1, I want to cover two main topics here:

  1. How you can implement a managed Twitter search from a Dynamics CRM record
  2. Discuss some of the interesting extensions of the simple example I’ll show, and argue a little more why Twitter search is so important

Implementing a Managed Twitter Search from Dynamics CRM

What I’ll show here is some of the mechanics of doing a contextual Twitter search from a CRM record. These will be similar no matter what entity you’re searching from, so I’m going to show how to customize the Dynamics CRM “Competitor” entity. (In the example I show it will be not for my competitors, but for a group of companies that compete against each other. Same techniques, either way.)

The general technique is to use an IFRAME control on a customized CRM form, and dynamically update the “src” property of the IFRAME with information from the current record. Here’s what the user experience looks like, starting with the Competitor form opened to a specific record, in this case my favorite food company, Kraft:

"Competitor" form open with record selected

Figure 1: Competitor form open with a record selected

This shows a standard Dynamics CRM form, in this case having double-clicked on the “Kraft” record from the Competitors grid. When a user clicks on the Twitter Search tab, what they see is an IFRAME that exposes the results of a Twitter search. What that might look like is shown here:

comp_form2

 

Figure 2: Twitter search results based on CRM data

How to Build it

That’s the user experience. What I’ll show you next is how to build a customization like this — essentially, how to update the “src” property of an IFRAME like that with information from the current record. The idea here is to provide a managed search experience from within CRM, so my brand managers or whoever else might be using this don’t need to worry about Twitter search syntax. To save a little time, I’ll give you a “heuristic” step by step. I’ll post a video shortly where you can see all of the detailed steps, but for now…

…follow these steps:

  1. Customize the Competitors entity, by adding a tab, a section, and an IFRAME; call them all Twitter Search or something like that.
  2. To start out, set the IFRAME’s URL property to http://search.twitter.com . Turn off the “prevent cross-frame scripting” property by unchecking it.
  3. Navigate to the form’s OnLoad event, and add the following  jscript code:

code starts here:

var CRM_FORM_TYPE_CREATE = 1;
var CRM_FORM_TYPE_UPDATE = 2;

var twittersearchURL = “”;

switch (crmForm.FormType)
{
 case CRM_FORM_TYPE_CREATE:
    twittersearchURL = “http://search.twitter.com“;  
   break;

 case CRM_FORM_TYPE_UPDATE:
       // Use Twitter search with this account’s name when updating account
  twittersearchURL = “http://search.twitter.com/search.atom?q=”;
  // Encode the account name and add it to the search string
  twittersearchURL += encodeURIComponent(crmForm.all.name.DataValue)+”&rpp=100&lang=en&tude=:)”; 
  break;
}

// Set the respective IFRAME’s URL
//alert (twittersearchURL);

crmForm.all.IFRAME_twittersearch.src = twittersearchURL; 

end of code

Let me make a couple of comments about this code, in case you want to try it or some variation on it:

  • Notice that the twitter search url uses the “atom” qualifier. This is the way twitter search lets you return results in an RSS format. This is a lot more convenient in many ways than search results returned to an HTML page. In part 1 of this article I discussed Twitter search basics, and included a link to the Twitter search API, which I highly recommend you read if you want to do things like this.
  • Notice the encodeURIComponent function call. In this example, I pass  “crmForm.all.name.DataValue” into that function — this is the value of the “name” field on the Competitor form. If you were doing this for the Account or most other entities, it would be identical, but you might need to change the field name depending on what you want to do. EncodeURIComponent does things like replace spaces with the “%20″ strings you see in URLs; it basically takes text strings and formats them properly as URLs, so get used to this function if you want to do things like this.
  • Also: notice the “&tude=:)” and the other strings I tacked on to the end of the url. If I hadn’t commented out the alert, I’d see a URL like this just before the last line of this OnLoad event code gets run: http://search.twitter.com/search.atom?q=Kraft&rpp=100&lang=en&tude=:) This search query looks for Kraft, then tells Twitter to return up to 100 results per page, then says to only look for English results, and finally says to look for “results with a positive attitude”. Obviously, if I’m a Kraft brand manager and I’m looking at search results for “Oreo Cakesters”, or “mac ‘n cheese”, I’d probably want to look at both “tude=:)” and “tude =:(” results, if you know what I mean!

Refer back to Figure 2 for a second and notice the “Results mood” pulldown list. With very little additional effort (similar jscript to the above, only behind the Change event of the picklist attribute that gets selected) you can build in some flexibility along these lines.

Extensions and the Importance of Twitter Search

Here are some of the more obvious ways this could be extended. (You can probably think of a lot more — let me know if you have some good ones!)

  • If I’m a Kraft brand manager, I’d want to use the Product entity, and add a bunch of my products (see above), and search on them with both :) and :( tude qualifiers, and maybe stack up how I’m doing against my competition.
  • If I really did want to keep track of my competitors, the Competitor entity would work well, but you might want to do this for their products as opposed to just the company name.
  • I think where it really starts to get cool is to store the results and start doing some analysis over time on the search results. You could store off these RSS data, say to a database, and really start to crunch some interesting numbers. For example, suppose you’re launching a new ad campaign for an existing product, and you want to see how it impacts the buzz about your product over time. Or suppose you’re watching to see how your competitors’ campaigns are doing over time. Or suppose you’re managing a product recall or something along those lines and how that impacts discussion of your product over time…

I could go on and on, but you probably get the point by now (if you’ve read this far! in which case, thank you very much). People who dismiss Twitter as a narcissistic time-suck are missing the point. If you’ve got 6 million+ people out there tweeting away about almost any topic you can think of, the chances are good they’re talking about things that matter to you. And if you can aggregate up all those tweets, you can actually learn some interesting things you might not already know.

The Truth is Out There…in the form of millions and millions of 140 character tweets.    

Cheers –

Richard

richardk@imginc.com

Leave a Comment