Displaying a lookup with related entity fields

by Phil Adams 31. March 2009 22:53

As you all know a CRM lookup displays its related entity primary field. Although this can not be changed using existing customizations; in most cases that suffices. However, there are occasions where you want to display more information in order to avoid opening the related entity form. One solution which I posted about was the lookup preview which builds a preview window for each lookup DataValue. I personally think it’s a great solution and we also have a wizard that facilitates the creation of the preview for us. This post offers a different solution which utilizes a plug-in that retrieves the extra information you wish to display and injects it inside the lookup text. The drawback of this solution is that the lookup can only occupy a certain amount of space. So you should consider expanding the lookup colspan before you use it.

The solution makes use of the post retrieve message on the incident entity. My goal in this demo is to show how to extend the customer lookup on the incident form so if you select an account the customer lookup will display the account name , number and primary contact and if you select a contact then the customer lookup displays the salutation , job title and company fields.

The solution is static but might give you a head start when other requirements of similar nature are in need.

using System; 
using System.Collections.Generic;
using System.Text;
using Microsoft.Crm.Sdk;
using Microsoft.Crm.SdkTypeProxy;
using Microsoft.Crm.Sdk.Query;


namespace LookupTextPlugIn
{

public class LookupRetrieveHandler : IPlugin
{
#region IPlugin Members 
public void Execute(IPluginExecutionContext context)
{
  try
  {
    LookupRetrieveProxy plugin = new LookupRetrieveProxy(context);
    plugin.Execute();
  }
  catch
  {
  }
}
#endregion 

}



public class LookupRetrieveProxy
{
private IPluginExecutionContext Context;
private Customer Customer;
private DynamicEntity CustomerInfo;
public LookupRetrieveProxy(IPluginExecutionContext context)
{
this.Context = context;
}


public void Execute()
{
if (!Context.OutputParameters.Contains(ParameterName.BusinessEntity))
{
return;
}

DynamicEntity entity = (DynamicEntity)Context.OutputParameters[ParameterName.BusinessEntity];
if (!entity.Properties.Contains("customerid"))
{
return;
}

this.Customer = (Customer)entity.Properties["customerid"];

if ((this.CustomerInfo = RetrieveCustomer()) != null)
{
this.Customer.name = ChangeCustomerName();
}

}

private DynamicEntity RetrieveCustomer()
{
ColumnSet customerColumns = new ColumnSet();
switch (this.Customer.type)
{
case "account":
customerColumns.AddColumn("accountnumber");
customerColumns.AddColumn("primarycontactid");
customerColumns.AddColumn("telephone1");
break;

case "contact":
customerColumns.AddColumn("salutation");
customerColumns.AddColumn("jobtitle");
customerColumns.AddColumn("parentcustomerid");
break;
}

ICrmService Service = this.Context.CreateCrmService(true);
TargetRetrieveDynamic targetRetrieve = new TargetRetrieveDynamic();
targetRetrieve.EntityId = this.Customer.Value;
targetRetrieve.EntityName = this.Customer.type;
RetrieveRequest retrieveRequest = new RetrieveRequest();
retrieveRequest.ColumnSet = customerColumns;
retrieveRequest.ReturnDynamicEntities = true;
retrieveRequest.Target = targetRetrieve;

RetrieveResponse retrieveResponse = (RetrieveResponse)Service.Execute(retrieveRequest);
return retrieveResponse.BusinessEntity as DynamicEntity;
}

private string ChangeCustomerName()
{
StringBuilder lookupText = new StringBuilder();
lookupText.Append(this.Customer.name).Append(" ");

switch (this.CustomerInfo.Name)
{
case "account":
lookupText.Append(this.GetProperty("accountnumber")).Append(", ");
lookupText.Append(this.GetProperty("primarycontactid")).Append(", ");  
 lookupText.Append(this.GetProperty("telephone1"));   
break;   

case "contact":   
     lookupText.Append(this.GetProperty("salutation")).Append(", ");   
     lookupText.Append(this.GetProperty("jobtitle")).Append(", ");   
     lookupText.Append(this.GetProperty("primarycustomerid"));   
break;   
   }   

return lookupText.ToString();   
  }   

private String GetProperty(string propName)   
{   
if (!this.CustomerInfo.Properties.Contains(propName))   
   {   
return "";   
   }   
   Object property = this.CustomerInfo.Properties[propName];   

if (property is String)   
   {   
return property.ToString();   
   }   
else if (property is Customer)   
   {   
return ((Customer)property).name;   
   }    
else if (property is Lookup)   
   {   
return ((Lookup)property).name;  
}

//not supported 
return String.Empty;     
}
}
}

Tags: ,

mscrm4 | CRM | MSCRM | CRM Plugin

Comments (1) -

Navision United States
7/6/2010 6:32:21 AM #

Thanks!  This is very helpful.  Had a similar requirement with an instance of CRM that was partially integrated with Dynamics Nav / Navision, your post was just the ticket to fix it.  Much appreciated!

Reply

Add comment

  Country flag

biuquote
  • Comment
  • Preview
Loading

About Phil

Phil has been working with CRM since the BETA of CRM v1.0 and has seen a lot of the problems arising from installation, maintenance and Development.

Phil specializes in the ISV area of CRM; Creating Add-Ons and Plugins for various clients.

Phil currently works as a Microsoft Dynamics CRM Consultant and Developer for Cambridge Online Systems Ltd In the UK.

Phil also has several Microsoft Certifications in .NET and CRM

Month List

RecentComments

Comment RSS