People have asked that question and I don't know why, but it's been a very long time since I've actually looked at the numbers behind the JavaScript conversion process that the CRM Migration Assistant performs.  I was using an internal timer as part of the development process but the data was never exposed.

So today I got to thinking about it and after moving around a small bit of code, I have some numbers.

This is from a real-life CRM project that I worked on for almost two years:

Files: 144, Lines of JavaScript: 7,408, Conversion time: 00:00.65

This is for the actual conversion process itself, not for any work related to extracting customizations or writing those customizations back to disk.

And yes, that is 0.65 seconds.

The reason I hadn't bothered with the timing is because just about any conversion I've ever run has always taken one minute or less so I never worried about it.

I'll be adding more of this type of information to the product documentation but in the mean time, if you are having to justify the cost, just look those numbers over one more time then ask yourself if you can afford not to have a tool like this in your back pocket. Or thumb drive, etc.  ( You get the idea. )

CRM 2011 includes a Developer Resources page which provides additional information and tools for the CRM developer.

You find the page by navigating to: Settings, Customizations, Developer Resources, where the following page is display:

image

So, how can I use this information?

 

Organization Unique Name

The Unique Name for an organization is the internal name or the database name that was assigned when you created the organization. This name is sometimes required by applications that connect to your CRM organization to perform operations.

Note: This screen shot is from one of my CRM Online organizations. The Organization Unique Name for an on-premise installation will be more human-readable.

Windows Azure AppFabric Issurer Certificate

If you will be performing any work using the Windows Azure AppFabric, you’ll need to install a certificate that used during the authentication process.

 

Developer Center

In the CRM Development Center you can find links to tools, training materials, blogs, and the community forums. In a nutshell, it is the central location to find all things CRM-developer-related.

 

Discovery Service Endpoint

If you will be working with multiple CRM organizations, you’ll need to establish a connection to the CRM Discovery service which will return to you a list of organizations that your security credentials have access to.  More information may be found here.

 

Organizational Service Endpoint

The Organizational Service is the main API for interacting programmatically with CRM 2011. This is what you connect to in order to perform any create, read, update, delete, or other operation against the CRM data.  More information may be found here.

 

Organizational Data Service

The Organizatoin Data Service is similar to Organizational Service but it is restricted to Create, Read, Update, and Delete operations only.  More information may be found here.

,

Updated: 9/30/2011. Version 1.1

Occasionally I find the need to extract a plugin from the CRM database. This could be caused by a variety of reasons:

  • The person or vendor who wrote the program is no longer working with your company and you have no idea what the plugin does ( believe me, this happens ).
  • You are having issues with a plugin and you need to review the code of the plugin that has been registered to verify that it was built the way you intended.
  • You are preparing to move to Dynamics CRM 2011 and you need to verify that your plugin assemblies will work well in CRM 2011.

 

Usage:

CRMExtractPlugins [serverurl] [organizationName] /L

It uses the security credentials of the currently logged-in user so you must be a CRM system administrator for it to work properly.

the /L parameter will extract just the names of the plugins within the system and place them into a file called [organizationName]-plugins.txt which can be found inside the folder that is created by the export process.

 

Examples:

CRMExtractPlugins http://crm contoso

CRMExtractPlugins http://crm contoso /L

 

You may download it here.

,

I use Windows Live Writer (WLW) to compose my blog posts and quite frankly, it is the main reason I write such detailed articles.  It connects directly to my WordPress-based blog and uploads posts, along with their associated images, with a single button-click.

One of the things that I like about the combined WLW/WordPress is the ability to publish articles in the future.

A bit of background

One of the interesting things about this blog is that most of my readers visit during the work week, as you can see from this graph:

image

Given that set of circumstances, I decided to not publish blog articles on the weekends, unless something extraordinary occurred. I also try to only post one article per day, if I can help it.

So my usual practice is to make note of article ideas then take some time out of one of my days to create several articles an set their publish date to sometime in the future.

The problem

Future publishing is all well and good, but it sometimes becomes hard to track what days I already have articles scheduled.

I have to open up the blog, go to the Posts section of the administrative interface, and review what is publishing when.

The solution

There had to be a better solution that didn’t require any manual labor.  That solution, it turns out, was to create a Windows Live Writer plugin that would create a calendar appointment whenever I published an article for future release.

Let us walk through the solution, step by step.

Step 1: Configuring Outlook

The first thing you need to do is create a custom category for your blog.

1) Open your calendar.

2) Click the Categorize button

3) Select All Categories.

image

This will display the Color Categories dialog:

image

4) Create a new category by clicking the New button.

5) Enter the name of the Category and choose a color:

image

The Category Name needs to be the exact name of your blog, as defined within WLW.

6) Click OK twice, to save the new category.

Note: if you look at my categories, you will notice that I have one category for each of the blogs that I own. This allows me to differentiate the blog posts by color and name. ( I’ll show you how later ).

 

Step 2: Install the Windows Live Writer plugin

 

Requirements:

You must have Windows Live  Writer 2011 and Microsoft Outlook installed on the same machine for this process to work correctly. 

I am using Outlook 2010, but I think it will work equally as well with Outlook 2007. But, I have no way to test it, so if it doesn’t work, then please let me know.

To help me with this process, I have created a WLW plugin, that will automatically create a calendar appointment.

1) Download and unzip the Create Calendar Item plugin.

2) Exit WLW if you have it running.

3) Assuming a default installation location, place the plugin WLWCreateCalendarItemPlugin.dll into the following folder:

C:\Program Files\Windows Live\Writer\Plugins

4)  Start WLW.

5) Click the Blog Account tab.

6) Click the Blog options button

7) Click Plug-ins to display the list of plugins:

image

8) Make sure the checkbox beside Add to Outlook Calendar is checked.

9) Click OK.

 

Verify your work

1) Create a blog post, then set the post date and time. If you’ve never noticed, it is the dropdown in the upper-right corner of the editing window:

image

2) Publish your post.

Note: A calendar appointment will not be created if the article is being published on the date it was written.

3) After the post has been published, open your Outlook calendar and navigate to the date you specified in step 1. You should see an appointment that looks like this:

image

4) Open the appointment that was created and you should see something like this:

image

The appointment has the following characteristics:

  • The category is listed at the top of the appointment showing both the category color and name.  The name is, of course, the name of your blog.
  • The subject is the blog article title
  • The appointment is an all-day event
  • The time of the appointment is shown as Free. This denotes a reminder more than something to do.

 

Conclusion

I think this small addition to WLW will make my blogging life much easier – especially since I now have several blogs to maintain. 

If you end up installing and using it, please let me know your experiences.

While I will probably write another blog article on how I created the WLW plugin, my wife thinks I should sell the source code for $20.  I’m still debating that one. Smile

Myself and several of my fellow MVPs will be conducting a roundtable as part of the Decisions Spring 2011 virtual conference.  You should stop by, if you have some free time.

Decisions Spring 2011

The Dynamics CRM Day program at Decisions Spring 2011 is filled with strategic and technical insight and an amazing lineup of industry experts. It is a great opportunity for the CRM community to discover, learn, and ask questions from true leaders in their field.

http://decisions.msdynamicsworld.com/content/dynamics-crm-day-program

I am proud to announce version 1.1 of the CRM Migration Assistant, our JavaScript conversion tool.

In this release, we’ve added the following major features:

  • Enhanced documentation on the conversion process
  • Additional JavaScript conversions have been added to correct issues found by customers or our own research
  • Conversion of JavaScript files from a folder
  • The ability to upload converted JavaScript directly into CRM 2011

 

For more information, and to download the trail version, visit our product page here.

While updating the documentation for my JavaScript conversion too, the CRM Migration Assistant, it occurred to me that people might like to see the end product of the conversion process.

So, I uploaded a complete set of files generated by the conversion process in case you want to take a deep dive into the output. You will find the following:

  • Visual Studio 2010 solution containing both the CRM 4.0 and CRM 2011 versions of the JavaScript
  • An event list worksheet that shows what events were found within what entities
  • The conversion report worksheet that outlines the following:
    • List of all attributes found in use during the conversion
    • List of all user-defined functions
    • List of all iFrames
    • List of instances where ActiveX controls are used
    • Any conversion issues
    • The location where the object was found
      • Entity
      • Attribute
      • Event
      • Tab
      • Section

For those that only want a high-level overview, I also added the Conversion Report worksheet as a separate download.

Visit the CRM Migration Assistant product page here to get both.

 

Stay Tuned

We're shipping a new version of the Migration Assistant this week that has some major enhancements.

,

I’ve been working with solutions and web resources a lot lately so this next series of articles will focus on Solutions and Web Resources.

Importing an object into the Default/Active solution

Let’s pretend for a moment that you’re writing a utility that maybe converts your JavaScript from the CRM 4.0 object model into the CRM 2011 object model. Someone, at some point, is going to want to have that newly-converted code reside inside of CRM 2011 without a lot of manual labor.

Actually, it would be really neat if the tool could just import it directly as part of the post-conversion process.

This is actually not a huge issue since JavaScript Web Resources are database records like any other record within CRM.

The issue lies in the fact that Web Resources reside inside of a Solution, so you must know which solution to either query against or write to.

Normally, this would require you to query the solutions within an Organization to locate the solution you wish to use.  But what if you want to use the Default solution?

Lucky for us, it turns out the Default solution actually has a consistent SolutionId which will be the same across any CRM installation.

I found this little nugget in the CRM 2011 SDK, here. Let’s review the data:

We actually have two pre-defined SolutionIds:

Name Default
SolutionId

{FD140AAF-4DF4-11DD-BD17-0019B9312238}

Description

The Default solution does not contain any solution components. It contains references to all the managed and unmanaged solution components in the system.

   
Name Active
SolutionId

{FD140AAE-4DF4-11DD-BD17-0019B9312238}

Description

The Active solution represents the current published unmanaged customizations that define the behavior of the application.

 

The Default SolutionId, in all honesty, is mostly for reference, or so it seems to me.

The Active SolutionId is the one that you would use as a reference to query or insert objects into the Default solution.

Once an object, say a Web Resource, has been installed in the Default solution, can you always add it to other solutions using the Add Existing functionality of the solution explorer.

This may not seem like much, but it will save you at least one query to get the Default SolutionId and any time you can reduce the amount of code you have, the better.

Besides being in the company of some great folks, we occasionally receive really cool rewards.

Today I received a disk to add to my MVP award to signify that I have been an CRM MVP for 5 years:

image

 

It may not mean a lot to many, but it is pretty dang cool to me!

( Now if I can just get disks for the other three years. )

You may find it here.

Again, great work from the SDK team.  Here’s a list of what’s new in the 5.0.4 release:

New and updated topics

Description of changes

Microsoft_Dynamics_CRM_2011_SDK_Readme.htm

Updated the readme with new information.

SDK\Bin

Updated the assemblies for Microsoft Dynamics CRM Update Rollup 2. For Microsoft Dynamics CRM Online, updates are installed for you. For other deployment types, you can get update rollups from the Microsoft Download Center or from Microsoft Update.

SDK\Resources\ExportedRibbonXml

Moved the location of the exported ribbon definitions from SDK\SampleCode\CS\Client\Ribbon\ExportRibbonXml\ExportedRibbonXml to SDK\Resources\ExportedRibbonXml.

Updated the following topics to reflect this change:

· Ribbons Available in Microsoft Dynamics CRM

· Export Ribbon Definitions

· Walkthrough: Add a Custom Button to an Existing Group for a Specific Entity

· Walkthrough: Add a Custom Group to an Existing Tab for a Specific Entity

· Walkthrough: Add a Custom Button to an Existing Group for all Entities

· Walkthrough: Hide Ribbon Elements

SDK\Resources\Images

Added new images to this folder, which are available for use in customized applications.

SDK\Walkthroughs\Portal

Updated all three portal developer guide walkthrough solutions. For a complete list of changes, see the SDK readme file: Microsoft_Dynamics_CRM_2011_SDK_Readme.htm.

HelperCode\SystemUserProvider.cs

\VisualizationsAndDashboards\
AssignDashboardToUser.cs

\VisualizationsAndDashboards\
AssignVisualizationToUser.cs

\GeneralProgramming\EarlyBound\
BasicContextExamples.cs

\GeneralProgramming\Authentication\
ImpersonateWithOnBehalfOfPrivilege.cs

\BusinessDataModel\Marketing\
MarketingAutomation.cs

\BusinessDataModel\Goals\
OverrideGoalTotalCount.cs

\BusinessDataModel\
ScheduleAndAppointment\
QueryScheduleOfMultipleUsers.cs

\FieldSecurity\RetrieveSecuredFieldsForAUser.cs

\BusinessDataModel\Goals\ RollupAllGoalsForCustomPeriodAgainstTargetRevenue.cs

\BusinessDataModel\Goals\ RollupAllGoalsForFiscalPeriodAndStretchedTargetRevenue.cs

\GeneralProgramming\EarlyBound\SharingRecords.cs

\BusinessDataModel\Goals\UsingQueriesToTrackGoals.cs

\BusinessDataModel\BusinessManagement\
WorkingWithNegativePrices.cs

Changed the code in SystemUserProvider so that it does not attempt to create a user if the client application is connected to Microsoft Dynamics CRM Online. The changes to the SystemUserProvider class required changes to all the C# and VB samples that use that class. Only the changed C# samples are shown here for brevity. All changes are in the folders SDK\SampleCode\CS or SDK\SampleCode\VB.

SDK\SampleCode\JS\SOAPForJScript\SOAPForJScript\
Scripts\SDK.MetaData.js

Updated the SDK.MetaData.jsJScript library to address three issues:

· The DefaultFormValue property of option set attributes returned a Boolean rather than the integer value.

· The State property for StatusOptionMetadata was not returned.

· The StateOptionMetadataDefaultStatus and InvariantName properties were not returned.

SDK\SampleCode\VB\*

Added VB.NET versions of the existing C# samples.

SDK\Tools\MetadataBrowser\
MetadataBrowser_1_0_0_2_managed.zip

Updated the Metadata Browser to reflect changes to the SDK.MetaData.jsJScript library.

Active Directory and Claims-Based Authentication

Added information about the lifespan of a security token and how to refresh the token in applications that take a long time to run.

Create Custom Get Started Pane Content

Included a note that customizing the application Help content for Microsoft Dynamics CRM 2011 (On Premises) is not supported.

Create Early-Bound Entity Classes with the Code Generation Tool (CrmSvcUtil.exe)

SDK\SampleCode\CS\CrmSvcUtilExtensions

Added a sample extension for the CrmSvcUtil program that generates early-bound types for custom entities.

CrmSvcUtil.exe Extension Usage and Command-line Parameters

Removed documentation for an invalid command-line parameter for the servicecontextprefix extension.

Customize Entity Forms in Microsoft Dynamics CRM

Added Microsoft Dynamics CRM for Microsoft Office Outlook Reading Pane section to describe how form customizations apply to the reading pane.

Privileges by Entity

Privileges by Message

Added detailed reference information for each entity and message, describing the privileges required. A small percentage of these topics are still marked as coming soon.

Quick Start: A Simple Program

Helper Code: ServerConnection Class

SDK\SampleCode\CS\HelperCode\CrmServiceHelpers.cs

SDK\SampleCode\VB\HelperCode\CrmServiceHelpers.vb

Added support for saving and re-using server configurations, making it easier to run the sample code repeatedly with minimal prompts.

Sample: Invoke Duplicate Detection for Creating and Updating Records

SDK\SampleCode\CS\DataManagement\DuplicateDetection\ InvokeDuplicateDetectionForCreateAndUpdate.cs

SDK\SampleCode\VB\DataManagement\DuplicateDetection\ InvokeDuplicateDetectionForCreateAndUpdate.vb

Added a new sample demonstrating how to invoke duplicate detection in create and update operations.

Sample: Instantiate an E-mail Using a Template

SDK\SampleCode\CS\BusinessDataModel\Templates\
createemailusingtemplate.cs

SDK\SampleCode\VB\BusinessDataModel\Templates\
createemailusingtemplate.vb

Added a new sample demonstrating the use of the InstantiateTemplateRequest message.

Sample: Send an E-mail

SDK\SampleCode\CS\BusinessDataModel\
Activities\SendEmail.cs

SDK\SampleCode\VB\BusinessDataModel\
Activities\SendEmail.vb

Added a new sample demonstrating the use of the SendEmailRequest message.

Sample: Use LINQ with Late Binding

SDK\SampleCode\CS\Queries\
UseLinqWithLateBinding.cs

SDK\SampleCode\VB\Queries\
UseLinqWithLateBinding.vb

Added a new sample that shows how to use LINQ with late bound entities.

Troubleshooting Tips

Added a tip about a common exception when using the CrmSvcUtil.exe program.

Use Messages (Request and Response Classes) with the Execute Method

Pass Optional Parameters in Messages

Run Duplicate Detection

Indicated that passing the CalculateMatchCodeSynchronously optional parameter is not required any longer. The change was implemented in the Microsoft Dynamics CRM 2011 Update Rollup 1 and Microsoft Dynamics CRM Online April Service Update.

Use the REST Endpoint with Ajax and JScript Web Resources

Corrected information in the Working with Dates section and provided new information about additional tasks related to working with dates.

Write a Custom Azure-aware Plug-in

SDK\SampleCode\CS\Azure\Plug-ins

Clarified that a service endpoint ID must be passed to the plug-in at run time through the unsecured configuration parameter of the constructor.

Sign up for our new KnowledgeBits service and get news, tips and tricks and more, delivered straight to your inbox.