Few hours ago Microsoft has released CRM juicy Update Rollup 7. Now, somebody please tell me what’s wrong with this picture:

Bing is no match for Google

Bing does not return direct link to a rollup download on the first 10 (ten) pages. Until Bing team refocuses their attention from selecting warm and fuzzy pictures to actually delivering relevant and timely search results, Google will stay as my default search engine.

Yahoo! performed equally bad with the link not found on the first few pages:

Dismal Yahoo! attempt

Unfortunately, two wrongs don’t make it right.

Cheers.

Currently rated 3.0 by 1 people

  • Currently 3/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Ctrl-Alt-Del

Posted on October 23, 2009 10:24 by George Doubinski

‘Nuff said.

Currently rated 5.0 by 1 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Not so long Microsoft has released Update Rollup 2. Some fixes were just too tempting to pass on so we duly deployed the rollup on the server. Some strange message about failure to update a report (which it did not actually try to update) aside, it all went well and, thanks to AutoUpdate feature, deploying update to the Outlook client was going to be a snap, according to the Implementation Guide and Eric Newell.

We followed this instructions and, indeed, Outlook prompted and successfully updated itself, as advertised. Just to make sure, we tried CRM->Check for Updates command and, to our surprise, Outlook decided to download and install the update again. In fact, it decided to prompt us every time it started. Which turned out to be not only extremely annoying but made it plain impossible to run Outlook client on Terminal Server as normal users do not have administrative privileges to run any update.

To cut the long story short, PatchID {9EA7FDEB-9D7E-4278-8CD1-94ACEFA40D3F} mentioned in the instructions turned out to be incorrect and the correct ID is {84EBD2D4-7530-47DA-B7C5-72E4F4FA5AE5}. However, simply changing patch ID after the fact would not work as we still need to remove erroneous ID first using <Delete> “instruction”. The correct configuration XML is as following:

<ClientPatches>
   <Create>
      <!-- *** UR2 PATCH -->
      <ClientPatchInfo>
         <PatchId>{84EBD2D4-7530-47DA-B7C5-72E4F4FA5AE5}</PatchId>
         <Title>Update Rollup 2 for Microsoft Dynamics CRM 4.0 (KB 959419) Jan-09</Title>
         <Description>Update Rollup 2 for Microsoft Dynamics CRM 4.0 (KB 959419) Jan-09</Description>
         <!-- *** This will teach users! -->
         <IsMandatory>true</IsMandatory>
         <IsEnabled>true</IsEnabled>
         <ClientType>OutlookLaptop, OutlookDesktop</ClientType>
         <LinkId>140023</LinkId>
      </ClientPatchInfo>
   </Create>
   <Delete>
      <PatchId>{9EA7FDEB-9D7E-4278-8CD1-94ACEFA40D3F}</PatchId>
   </Delete>
</ClientPatches>

Tried both default Url (to download update from Microsoft site using numeric LinkId) and custom AutoUpdateUrl (to download update from the custom location using file name as LinkId), both work fine.

Note: unlike Rollup 1, files in Update Rollup 2 are language-specific meaning that PatchId and LinkId would need to be changed for languages other than English. PatchId for Spanish version, for example, is  {A090EBC0-F3EC-414F-9E0A-02DABFB07618}. At this point in time I have no idea how to find correct LinkId, the workaround is to use custom download URL as documented here.

By the way, Groundhog Day and Update Rollup 2 release are both in February. Coincidence? I don’t think so.

 

Currently rated 3.3 by 4 people

  • Currently 3.25/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

As part of my regular fitness regime, I tend to watch a lot of tennis. So, there I was at 1am, observing the flogging Venus Williams was delivering to the next victim and raking my junk mail to see if there are any good replica watches on offer. And here it was:

Dear George Doubinski,

Congratulations! We are pleased to present you with the 2008 Microsoft® MVP Award! The MVP Award is our way to say thank you for promoting the spirit of community and improving people’s lives and the industry’s success every day.

...

"Improving people's lives"? This certainly never crossed my mind but having it as a side-effect certainly tickles the ego.

But, all in all, I feel honoured and privileged to be even considered in the same league as some other MVPs you might already know.

Ah, yes, the blogging, you might ask. I've been absolute slack extremely busy last couple months - we went online as a Hosted Microsoft Dynamics CRM Partner (don't get me started on what's involved) as well as had the financial year wrapped up.

Now I'm back and yes, I owe more parts on scripting. Stay tuned.

Currently rated 4.2 by 6 people

  • Currently 4.166667/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

With virtually unlimited customisation capabilities of Microsoft CRM, vertical markets always represent infinite opportunities for developing new business. As Bob Walsh mentioned in Micro-ISV: From Vision to Reality:

...one in twenty of all the left-handed accountants in firms of fewer than ten people will do quite nicely for your bank accounts for starters.

After some unorthodox research followed  by a long and lonely but by no means tedious development, we are proud to announce the release of our first vertical Microsoft Dynamics CRM schema. And it looks like it hit the sweet spot and users are already raving about it:

It’s a piece of work... They can focus on whacking other problems now. And the boss got no beef with the Report Wizard telling it like it is.

Read the full announcement on AlexaCRM site.

Currently rated 4.0 by 2 people

  • Currently 4/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Programming happy birthday

Posted on March 26, 2008 13:13 by George Doubinski

 

May not any of your wishes come false

 

I think I got it right. Have been programming for too long. Sigh.

Currently rated 3.3 by 6 people

  • Currently 3.333333/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

CRM and jQuery, Part 1

Posted on March 10, 2008 03:04 by George Doubinski

My biggest grievance about client-side development in CRM is that it mandates this vicious  "write some script-paste to form-publish-receive a bomb-review-sprinkle alerts-tweak the code-publish-receive an error-write some script-..." cycle. Verbose, lengthy, difficult to develop, difficult to debug. I do not like developing in Javascript.

Correction.

I did not like developing in Javascript until I discovered jQuery. There is certainly a number of Javascript libraries available with Prototype and jQuery leading the pack. Choosing between the two is not unlike C# vs. VB or Peach vs. Grapefruit. I see the main distinctive feature of either library not so much as a neat and concise code but as the ability to express Programmer Intent extremely well (incidentally, this post uses Ruby as an example; combined with the fact that Ruby on Rails is a driving force behind Prototype, it all starts to make sense). And while Prototype does a fantastic job in encouraging OOP and has a spectacular Script.aculo.us effects library, jQuery won me over with its size, documentation, elegant syntax and method chaining.

What can it do? Well, how about planets revolving around the Sun. Convinced? Read good introduction to jQuery for Javascript programmers and let's move on. More...

Currently rated 4.8 by 12 people

  • Currently 4.75/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Associated views have always been a sore subject in CRM. When CRM 3 was released, they did not include inactive records and, despite the ever present Activate menu item, there was no any way to actually show all associated records not just active ones. People complained. Then rollup 2 changed the behaviour. People complained. Then there was a hotfix for custom entities. People complained that it should be available for system entities as well. CRM 4 is released and hotfix no longer works. People complain.

Plug-ins to the rescue

The good news is that CRM 4 plug-in model is flexible enough to solve this problem once and for all. The idea is to intercept RetrieveMultiple message and modify its query so that all associated records are returned. And the code is surprisingly simple:

using Microsoft.Crm.Sdk;
using Microsoft.Crm.Sdk.Query;

namespace Acme.Plugins
{
    public class AssociatedViewPlugin : IPlugin
    {
        public void Execute(IPluginExecutionContext context)
        {
            if (context.InputParameters.Contains(ParameterName.Query))
            {
                QueryExpression qe = context.InputParameters[ParameterName.Query] as QueryExpression;
                // If it's RetrieveMultiple multiple with two conditions
                if (qe.EntityName == context.PrimaryEntityName
                      && qe.Criteria != null
                      && qe.Criteria.Conditions != null
                      && qe.Criteria.Conditions.Count == 2)
                {
                    // If first condition is a statecode filter for inactive entities
                    ConditionExpression ce = qe.Criteria.Conditions[0] as ConditionExpression;
                    if (ce != null
                        && ce.AttributeName == "statecode"
                        && ce.Operator == ConditionOperator.Equal
                        && ((int)ce.Values[0]) == 0)
                    {
                        // Remove statecode filter
                        qe.Criteria.Conditions.Remove(ce);
                    }
                }
            }
        }
    }
}

Installation

  1. Compile the code and sign the assembly.
  2. Using Plug-in Registration Tool register the plug-in.
  3. Register execution step for the entity that you'd like to show all records in associated views. Note that we use PreStage (a.k.a. BeforeMainOperationOutsideTransaction) and Synchronous execution mode. For example, to always show inactive contacts in associated view:
    image
  4. Optionally add Status column to the associated view for the entity not to confuse users.
  5. Rinse and repeat 3-4 for other entities.

The result for the Contacts associated view inside account entity:

image

At long last Activate menu command makes sense.

Note: this code is a sample only and is included "AS IS" without any warranties whatsoever. In Real Life™ more stringent tests would have to be performed to ensure that RetrieveMultiple message indeed originated from the associated view and was not sent by your poor fellow co-worker complaining (or, worse still, raising support request with Microsoft) about filtering state code not working.

Currently rated 3.7 by 9 people

  • Currently 3.666667/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Everyone agrees that Microsoft CRM integration with maps is very attractive. And there are ways to do it with either Live Maps or MapPoint or Google maps. However, as John O'Donnell mentioned in comments:

Virtual Earth is free for development purposes but will require licensing for production systems.

While the statement is not, strictly speaking, correct (production system != commercial), both Microsoft and Google place non-commercial use restriction on their free services.

From Virtual Earth™ Platform API Terms of Use, non-commercial use section:

Your Application and content in your Application must be available publicly without restriction (for example, login or password must not be required).

Google Maps API Terms of Service is a bit more vague but still:

The API may be used only for services that are generally accessible to consumers without charge. Accordingly, You may not use the API for any service that requires a subscription or other restricted access, or for which a fee is charged.

User access to Microsoft CRM is restricted and does require a login so using either mapping service in your CRM deployment without appropriate licensing is in violation of respective terms and conditions. Commercial licensing is available from both Virtual Earth and Google Maps but, as with any product where pricing information is not publicly available, do not expect it to be cheap. Do the right thing and advise your customers that, while there may be a plethora of free lunches available, commercial use of mapping services ain't one of them.

Currently rated 2.0 by 2 people

  • Currently 2/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Synchronous plugins want localhost

Posted on February 22, 2008 16:55 by George Doubinski

Yesterday I was working on some plug-in code which was working fine earlier. I changed pipeline to synchronous and started to get consistent "404 - Not Found" error from calls to CrmService. I reduced the problem to something like this:

public class MyPlugin: IPlugin
{
    public void Execute(IPluginExecutionContext context)
    {
        ICrmService service = context.CreateCrmService(true);
        account a = new account();
        a.name = "test";
        service.Create(a);      // this line fails with 404
    }
}

And it just was not working. We all know about very "informative" SoapException which would have been fine but I was getting simple http-level 404. Something was pointing somewhere it shouldn't have... More...

Currently rated 4.0 by 6 people

  • Currently 4/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5