Archive

Archive for March, 2007

Viewing a Logo in Microsoft CRM

March 29, 2007 3 comments

I’m always getting the question on how to view a logo or image in Microsoft CRM.  Well here is a quick customization you can add to your account form and view a logo.   Once you add this script on the ‘OnLoad‘ event of the form, all you need to do is add an image called ‘logo.jpg’ as an attachment and everything will show up properly.   This customization will even work offline.

Script

var Loaded = false;

if(crmForm.FormType ==2 || crmForm.FormType ==3 || crmForm.FormType ==4)
{
    // get the notescontrol object
    var oNotes = document.getElementById("notescontrol");

    // attach an event so we know when the notecontrol is done loading
   oNotes.attachEvent(‘onreadystatechange’, LoadLogo);

   // refresh the notecontrol
   oNotes.Refresh();
}

function LoadLogo()
{
   if (oNotes.readyState != ‘complete’)
      return;

   var oDoc = (oNotes.contentWindow || oNotes.contentDocument);
   if (oDoc.document) oDoc = oDoc.document;
   // attachment use SPAN tags
   var attachments = oDoc.body.getElementsByTagName("SPAN");

   //Iterate through all the attachments.
   for (var i = 0; i < attachments.length; i++)
   {
       // let’s be certain we have an attachment here
       if (attachments[i].attachmentId)
       {
            // is this an image attachment
            if (attachments[i].innerHTML.match(/.*logo\.jpg$/i) && !Loaded)
            {
                  //Get a reference to the table
                 var tr = crmForm.all.name.parentNode.parentNode.parentNode.insertRow();
                 var td = tr.insertCell();
                 td.align="right"
                 td.colSpan=4;
                 td.innerHTML = "<img src=’" + attachments[i].url.concat("?AttachmentType=", attachments[i].attachmentType,                                    "&AttachmentId=", attachments[i].attachmentId) + "’/>"
                  Loaded = true;
             }
       }
    }
}

When your done, your form should look like this.

If you really want to get creative you can go a little further and build a viewer to page through all images that are attached to the record.

 

 

 

This customization may not be supported by Microsoft and is provided as-is with no warranty.

Categories: Uncategorized

Replicating CRM Records to another CRM System

March 29, 2007 1 comment

A friend of mine called me up and asked if it was possible to create records in one CRM system when they are created in another one.  Well here is a quick example of how to do it.   

Assumptions

  • Both CRM Systems have the exact same fields for the records you will copying.
  • All records in the two CRM systems have the same guids for matching records.

If there are discrepencies with the guids in each system, there will be issues with this example.   When the postImageEntityXml is Deserialized into a DynamicEntity, it has the guid of the source system. When it’s created in the target system, it’s created with the same guid. 

For this example I will show you a simple Post Callout to replicate a Create action, but I recommend sending these transactions to a Message Queue and then processing them from there.   It’s also not only limited to Create, the same thing can be done for other actions.

Code

public override void PostCreate(CalloutUserContext userContext, CalloutEntityContext entityContext, string postImageEntityXml)
{
    //Create the Service and connect to remote server.
   CrmService service = new CrmService();
   service.Url = "http://<CRMSERVER>/mscrmservices/2006/crmservice.asmx"

   //build the credentials for access if the current user doesn’t have access.
   service.Credentials = new System.Net.NetworkCredential("username","password","domain");

    DynamicEntity entity = (DynamicEntity)Serialization.DeserializeBusinessEntity(postImageEntityXml);

    TargetCreateDynamic targetCreate = new TargetCreateDynamic();
    targetCreate.Entity = entity;

    CreateRequest request = new CreateRequest();

    request.Target = targetCreate;

    CRMSDK.CreateResponse response = (CRMSDK.CreateResponse) service.Execute(request);
}
private Object DeserializeBusinessEntity( string xml)
{
    XmlTextReader readerText = new XmlTextReader(new StringReader(xml));
    try
    {
    // De-serialize XML stream using .NET XmlSerializer class
    XmlRootAttribute root = new XmlRootAttribute("BusinessEntity");
    root.Namespace = "http://schemas.microsoft.com/crm/2006/WebServices"
    XmlSerializer xmlSerializer = new XmlSerializer(typeof(BusinessEntity), root);
    BusinessEntity entity = (BusinessEntity)xmlSerializer.Deserialize(readerText);

    return entity;
    }
    catch (Exception) { throw; }
}

This code isn’t entity specific so it will work for most of the entities in CRM. All the entity information is in the postImageEntityXml and is Deserialized into the DynamicEntity.

Callout Registration

<callout entity="account" event="PostCreate">
      <subscription assembly="Callout.dll" class="Callout.Migrate">
          <postvalue>@all</postvalue>
      </subscription>
</callout>

<callout entity="contact" event="PostCreate">
      <subscription assembly="Callout.Migration.dll" class="Callout.Migrate">
         <postvalue>@all</postvalue>
      </subscription>
</callout>  

There are a lot more things you can do to improve this process.   This is just a simple example.  Some other things to consider adding into your solution is Message Queueing and Exception Handling.

Hope this helps.

A big shout out to Henry who is out in Ohio this week :).

 

This customization may not be supported by Microsoft and is provided as-is with no warranty.

Categories: Uncategorized

Shortcut Buttons in Microsoft CRM

March 28, 2007 Leave a comment

If you want to try to cut down on clicks on CRM forms, one thing you can do is create a ISV button for actions they perform a lot.  For example if users create  appointments from the contact form, they would have to either go to Actions > Add Activity >Appointment in the top menu  or click on Activities > New Activity > Appointment from the menu on the left. 

Here is the shortcut.

Add a ISV button in the isv.config.xml file.

<Entity name="contact">
<ToolBar ValidForCreate="0" ValidForUpdate="1">
<Button Title="New Appointment" ToolTip="Create a new appointment." Icon="/_imgs/ico_16_4201.gif" JavaScript="locAddActTo(4201);" Client="Web" />
</ToolBar>
</Entity>

The text in Red is the same function called when you click new appointment from the menu. Save the changes  and refresh your contact form. 

Hope this helps

 

This customization may not be supported by Microsoft and is provided as-is with no warranty.

Categories: Uncategorized

Custom Lookups in Microsoft CRM

March 28, 2007 1 comment

If you’re like me and don’t like having to do your own custom lookups as an ISV button, then here is a better way of doing it.  This customization will allow you to implement lookup functionality and have it look like the CRM lookups.  It just looks a lot cleaner.

Adding the Button

First you will need to determine which field you want to add the button to and get the id of the input.  For this example I’ll use the country text field on the Contact form which is address1_country. Then add the following code to the ‘OnLoad’ of the Contact Form.

var beforehtml = "<TABLE class=’lu’ style=’TABLE-LAYOUT: fixed’ cellSpacing=’0′ cellPadding=’0′ width=’100%’><TR><TD>"
var afterhtml = "</td><td width=’25’ align=’right’><img src=’/_imgs/btn_off_lookup.gif’ id=’customlookup’ style=’cursor:hand;’ onclick=’CustomLookup();’/></td></TR></TABLE>"

document.getElementById("address1_country").parentElement.innerHTML = beforehtml + document.getElementById("address1_country").parentElement.innerHTML + afterhtml;

The form should look like this after you publish your changes and open the form. 

Notice the button next to the Country/Region field. This is just a text box but it has a button like a lookup. 

Opening the Lookup

Once you have the button in place you will need to add the onclick function to the ‘OnLoad’ of the Form. Add the following script to the form.  You can develop the custom lookup to do anything you like, you could even pass parameters to the lookup and do whatever you want.  I usually try to make my custom lookups have the same look and feel as crm.

this.CustomLookup = _CustomLookup;
function _CustomLookup()
{
var returnval = window.showModalDialog("/Custom/countrylookup.aspx","","dialogWidth:600px;dialogHeight:488px;
dialogLeft=0px;dialogTop=0px;help:0;status:0;scroll:0;center:1;resizeable:yes;");
if(returnval != "" && returnval != "undefined" && returnval != null)
{
document.getElementById("address1_country").value = returnval;
}
}

Once the user has selected a value from you lookup, set the returnvalue of the window and then it will be assigned to your returnval variable.  Then make sure it actually has a value, and then populate the text box.

You’re good to go. Hope this helps.

 

This customization may not be supported by Microsoft and is provided as-is with no warranty.

Categories: Uncategorized