19 July 2011

CRM 4 Out of Memory When Creating Organisation

I ran into a problem when trying to create a new organisation in CRM 4 today. The error that was thrown was: Insufficient memory to continue the execution of the program.

I did the usual of checking the event logs on the CRM Application Server and the SQL server but nothing really jumped out at me. I was then told how to fix it by adding the a new DWORD registry value

1. Open Regedit and navigate to: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters

2. Add a new DWORD value called: MaxTokenSize

3. Enter the following decimal value: 65535.



Note: Changing the registry can be dangerous, take reasonable care and backups! - If you stuff up your machine it's your fault not mine.

12 July 2011

Remove CRM 4.0 IFrame Whitespace

In CRM 4.0 it's often a requirement to display a list view in an IFrame on a form. This is quite a simple task of using the IE Developer Toolbar to determine the URL of the list view and then injecting the URL into the IFrame src property through JavaScript.

However when you do this you may notice that the list view doesn't stretch take up the whole IFrame, it leaves some whitespace around it:



In the past I've used various JavaScript to remove the whitespace and have settled on a method supplied by Andrew Zimmer's blog (http://blogs.inetium.com/blogs/azimmer/archive/2010/01/14/crm-displaying-related-entity-in-iframe-slightly-improved.aspx).

The following method should be called after setting the src value:

function FixStylingInFrameSource(iframeID)
{
// Check the content window's ready state
if (document.getElementById(iframeID).contentWindow.document.readyState != "complete")
{
// Re-run this function in 10 ticks
window.setTimeout(function () { FixStylingInFrameSource(iframeID) }, 2);
}
// Content window is ready
else
{
// Change the background color
document.getElementById(iframeID).contentWindow.document.body.style.backgroundColor = "#eef0f6";
// Remove the left border
document.getElementById(iframeID).contentWindow.document.body.all(0).style.borderLeftStyle = "none";
// Remove padding
document.getElementById(iframeID).contentWindow.document.body.all(0).all(0).all(0).all(0).style.padding = "0px";

// Make the cell the full width of the IFRAME
document.getElementById(iframeID).contentWindow.document.body.all(0).style.width = "102%"

// Show the IFrame
document.getElementById(iframeID).style.display = "block";
}
}


After using this script the IFrame looks a lot nicer:

08 July 2011

CRM 2011 Change SubGrid FetchXML - Updated for rollup 5

Subgrids are new feature to CRM 2011 and allow records that are linked to a record to be shown on the form. By default the linking is limited to records which are related to parent.

I had a requirement to show a list of leads which have the same company name as the current lead. A subgrid seemed to be the way forwards, in CRM 4.0 I'd have added an IFrame displaying an advanced find list, but the limitation of only displaying related records added something of a stumbling block.

With a bit of, unsupported, scripting I managed to work around this issue. Here's how:

1. Add a subgrid to the Lead form showing all leads. Take a note of the subgrid name.

2. Generate the FetchXML that you want to inject into the subgrid (Advanced Find is your friend here).

3. The following JScript method demonstrates changing the FetchXml for a subgrid called "RelatedLeads"


function UpdateSubGrid()
{
var leadGrid = document.getElementById("RelatedLeads");

//If this method is called from the form OnLoad, make sure that the grid is loaded before proceeding //Included extra null check as a rollup 5 fix
if (leadGrid ==null || leadGrid.readyState != "complete")
{
//The subgrid hasn't loaded, wait 1 second and then try again
setTimeout('UpdateLeadSubGrid()', 1000);
return;
}

//Update the fetchXML that will be used by the grid.
var fetchXml = "";
fetchXml += " ";
fetchXml += " ";
fetchXml += " ";
fetchXml += " ";
fetchXml += " ";
fetchXml += " ";
fetchXml += " ";
fetchXml += " ";
fetchXml += " ";
fetchXml += " ";
fetchXml += "
";
fetchXml += "
";
fetchXml += "
";

//Inject the new fetchXml
leadGrid.control.setParameter("fetchXml", fetchXml);
//Force the subgrid to refresh
leadGrid.control.refresh();
}


4. As a minimum the method can be called from the OnLoad event but it's probably best to call it from the OnChange event of any attributes that are used to generate the FetchXML