Click here to Skip to main content
15,883,986 members
Articles / Programming Languages / Javascript
Article

Microsoft Dynamics CRM Vista Sidebar Gadget

Rate me:
Please Sign up or sign in to vote.
4.18/5 (8 votes)
27 Mar 20073 min read 121.8K   714   44   18
Accessing Microsoft Dynamics CRM information from a Sidebar Gadget
Screenshot - 2_small.jpg

Introduction

Microsoft Dynamics CRM is a powerful program, and what sets it apart from the many other choices in the CRM application space is its tight integration to the Microsoft platform. When Vista shipped, I immediately started looking for new and exciting ways to demonstrate the value of Microsoft CRM and the Microsoft platform, and the first interesting area I discovered is gadgets. Being a true propeller head, my favorite gadget is the CPU utilization meter, and I also love the pictures slideshow gadget. I decided to create a gadget that can display the accounts and contacts from Microsoft Dynamics CRM on the user desktop.

Note that this article assumes familiarity with developing gadgets for Windows Vista. If you're new to gadgets, I suggest first reading the article: http://microsoftgadgets.com/Sidebar/DevelopmentOverview.aspx

Image 2

About CRM and the gadget

While a properly implemented CRM system can be a very powerful tool, a complaint heard often is that there is so much information in the system, it is impossible to make any sense of it. The tools provided with Microsoft CRM can be designed so that the users can quickly access the important information stored in the system, and the MSCRM gadget is designed to make this process even faster.

The gadget displays the list of accounts and contacts associated with the currently logged on user (made possible by MSCRM's integration with Active Directory) and then if the user clicks an item in the list, the MSCRM record will load in a browser window.

Image 3

Please note that in order to use this gadget, you must have access to a functioning MSCRM installation, and you must know the URL of your MSCRM server.

Using the code

The code itself consists of three HTML files: index.htm, accounts.html, and contacts.html. The working machinery is all JavaScript, made possible by JavaScript's ability to instantiate and access ActiveX objects. The index.html file uses JavaScript to implement a tabbed interface, one tab for Accounts, one tab for Contacts.

JavaScript
// Index.html
// The JavaScript for the tabs
<script type="text/javascript">
var stl=""
var bChecked=false
function handlelink(aobject)
{
  stl=aobject.href
  bChecked=(document.tabcontrol && document.tabcontrol.tabcheck.checked)? true : false
  if (document.getElementById && !bChecked)
  {
    var theTab=document.getElementById("tablist")
    var theTablinks=theTab.getElementsByTagName("A")
    for (i=0; i<theTablinks.length; i++)
      theTablinks[i].className=""
    aobject.className="current"
    document.getElementById("tabiframe").src=stl
    return false
  }
  else
    return true
}
</script>

Microsoft Dynamics CRM provides a very powerful web services API which provides access to the underlying system. So the basic idea behind this gadget was to instantiate a Microsoft.XMLHTTP ActiveX object, and then use that object to call into the MSCRM web services to retrieve the account and contact information. The challenge is that the call is not as simple as a SQL query like "select * from Accounts". We need to build an actual SOAP message. In order to do this I cheated a bit and enabled logging on my MSCRM server, made a call to the web services to retrieve the accounts and contacts, and then parsed the resulting log file to find the call I needed. For those interested, the log file is included with the downloadable source files for this project.

I then built the message thus:

JavaScript
// Accounts.html
// The JavaScript to build the SOAP message

// The following line must be changed to match the users MSCRM server URL
var serverUrl = "http://danubecrm:5555/mscrmservices/2006";

var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.open("POST", serverUrl + "/crmservice.asmx", false);
xmlhttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8")
xmlhttp.setRequestHeader("SOAPAction", 
    "http://schemas.microsoft.com/crm/2006/WebServices/RetrieveMultiple")
xmlhttp.send("<?xml version='1.0' encoding='utf-8'?>"+"\n\n"+"<soap:Envelope"+
' xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"'+
' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'+
' xmlns:xsd="http://www.w3.org/2001/XMLSchema">'+
' <soap:Body>' +
' <query xmlns:q1=http://schemas.microsoft.com/crm/2006/Query 
' xsi:type="q1:QueryExpression" xmlns="http://schemas.microsoft.com/crm/2006/WebServices">'+
' <q1:EntityName>account</q1:EntityName>' +
' <q1:ColumnSet xsi:type="q1:ColumnSet">' +
' <q1:Attributes>' +
' <q1:Attribute>accountid</q1:Attribute>' +
' <q1:Attribute>name</q1:Attribute>' +
' </q1:Attributes>' +
' </q1:ColumnSet>' +
' <q1:Distinct>false</q1:Distinct>' +
' </query>'+
' </soap:Body>'+
' </soap:Envelope>')

The next step is to parse the XML returned by the CRM web services call and separate the returned entities. The code below also prints out the returned entities inside HTML anchors so they are clickable.

JavaScript
var result = xmlhttp.responseXML.xml;
var BEs= result.split("<BusinessEntities>");
var BE = BEs[1].split("<BusinessEntity");
for (i = 0; i < BE.length; i++)
{
firstname = BE[i].indexOf("<name>")+6;
secondname = BE[i].indexOf("</name>");
firstid = BE[i].indexOf("<accountid>")+11;
secondid = BE[i].indexOf("</accountid>");
  if (BE[i].substring(firstid,secondid).length > 0 )
  {
    // The URL below must also be changed to the users MSACRM server URL
    document.writeln("<a href=\"http://danubecrm:5555/sfa/accts/edit.aspx?id=" + 
    BE[i].substring(firstid,secondid) + "\" target=\"new\"><font size=\"2px\"" +
    "name=\"verdana\">" + BE[i].substring(firstname,secondname) + "</font></a><BR>");
  }
} 

The body of the Accounts.html file is straightforward, we must call the JavaScript function we created. I called my function AccessCrmWebServices() but of course the name does not matter.

HTML
<body bgcolor="#eff3f7">
<script language="JavaScript" type="text/javascript">
AccessCRMWebServices() ;
</script>
</body> 

And that's pretty much it! Now we just deploy the gadget files to the Vista machine as described in the overview article referenced in the beginning of this article, and the gadget will be available.

History

  • v1: March 26, 2007

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralHelp with Access Denied message Pin
cenvia200223-Mar-09 9:17
cenvia200223-Mar-09 9:17 
GeneralRe: Help with Access Denied message Pin
cenvia200223-Mar-09 9:35
cenvia200223-Mar-09 9:35 
GeneralMentioned in the book Pin
LakshmiChava17-Dec-08 8:59
LakshmiChava17-Dec-08 8:59 
Generalaccess problem in sidebar (msxml3.dll) Pin
mrv7927-Oct-08 6:54
mrv7927-Oct-08 6:54 
QuestionCRM 4.0 changes? Pin
Mike Bailey8-May-08 6:49
Mike Bailey8-May-08 6:49 
AnswerRe: CRM 4.0 changes? Pin
John.Straumann31-May-08 12:01
John.Straumann31-May-08 12:01 
AnswerRe: CRM 4.0 changes? Pin
Member 32068271-Dec-08 4:12
Member 32068271-Dec-08 4:12 
GeneralVery nice article Pin
Raj Lal3-Sep-07 9:36
professionalRaj Lal3-Sep-07 9:36 
GeneralHelp for CRM Vista Gadget install Pin
Hans Veldman28-Jun-07 20:43
Hans Veldman28-Jun-07 20:43 
General0x80040216 soap:Server Server was unable to process request Pin
inferano22-Jun-07 0:16
inferano22-Jun-07 0:16 
QuestionWhat about operators Pin
Gorillaman3-Apr-07 14:27
Gorillaman3-Apr-07 14:27 
AnswerRe: What about operators Pin
John Straumann3-Apr-07 14:45
John Straumann3-Apr-07 14:45 
GeneralRe: What about operators Pin
Gorillaman3-Apr-07 14:52
Gorillaman3-Apr-07 14:52 
GeneralRe: What about operators Pin
Gorillaman3-Apr-07 14:54
Gorillaman3-Apr-07 14:54 
' <q1:Attributes>'+
' <q1:Attribute>name</q1:Attribute>'+
' </q1:Attributes>'+
' <q1:Values>'+
' <q1:Value xsi:type="xsd:string">Banks Ltd.</q1:Value>'+
' </q1:Values>'+
Generalsystem is undefined Pin
phgordon28-Mar-07 5:28
phgordon28-Mar-07 5:28 
AnswerRe: system is undefined Pin
John Straumann28-Mar-07 7:44
John Straumann28-Mar-07 7:44 
GeneralRe: system is undefined Pin
twinsen8321-May-07 4:44
twinsen8321-May-07 4:44 
GeneralRe: system is undefined Pin
John Straumann21-May-07 8:34
John Straumann21-May-07 8:34 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.