Monday, March 16, 2009

Enabling Lookup Fields in eService Accelerator

By default lookup fields are not enabled in eService accelerator. I have modified the code to provide the support for lookup fields. You need to do following steps:

Step 1 : Add a new class under app_code\eService\LookUpData.cs

public class LookUpData
{
public LookUpData()
{
}
private String lookupId;
private String lookupText;
public String LookupId
{
get { return lookupId; }
set { lookupId = value; }
}
public String LookupText
{
get { return lookupText; }
set { lookupText = value; }
}
}

Step 2 : Modify AttributeData.cs and following code towards the end

public sealed class LookupAttributeData : AttributeData
{
private List lookupOptions;
public List LookupOptions
{
get { return lookupOptions; }
set { lookupOptions = value; }
}
}

Step 3 : Modify MetadataUtility.cs and add following method

public static List GetLookUpDataByEntity(MetadataService service, String entityName, CrmService crmService)
{
EntityMetadata entityMetadata = GetEntityMetadata(service, entityName);
String primaryAttribute = entityMetadata.PrimaryField;
String primaryKeyName=entityMetadata.PrimaryKey;
List results = new List;
QueryExpression query = new QueryExpression();
query.EntityName = entityName;
query.AddOrder(primaryAttribute, OrderType.Ascending);
ColumnSet columns = new ColumnSet();
columns.AddColumns(new String[] { primaryAttribute });
query.ColumnSet = columns;
ConditionExpression condition1 = new ConditionExpression();
condition1.AttributeName = "statecode";
condition1.Operator = ConditionOperator.Equal;
condition1.Values = new object[] { 0 };
query.Criteria = new FilterExpression();
query.Criteria.FilterOperator = LogicalOperator.And;
query.Criteria.AddCondition(condition1);
RetrieveMultipleRequest request = new RetrieveMultipleRequest();
request.Query = query;
request.ReturnDynamicEntities = true;
RetrieveMultipleResponse response = (RetrieveMultipleResponse)crmService.Execute(request);
foreach (BusinessEntity item in response.BusinessEntityCollection.BusinessEntities)
{
DynamicEntity entity = (DynamicEntity)item;
if (entity.Properties.Contains(primaryAttribute))
{
LookUpData lkp = new LookUpData();
lkp.LookupText=((String)entity.Properties[primaryAttribute]);
lkp.LookupId = ((Key)entity.Properties[primaryKeyName]).Value.ToString();
results.Add(lkp);
}
}
return results;
}

Step 4: Modify the DynamicEntityUtility and Modify following function in this class

public static List GetAttributeDataByEntity

Step 5: Add following code just after Case statement AttributeType.Lookup:

case AttributeType.Lookup:
LookupAttributeData lookupData = new LookupAttributeData();
String relatedEntityName=((LookupAttributeMetadata)metadata).Targets[0].ToString();
lookupData.LookupOptions=MetadataUtility.GetLookUpDataByEntity(metadataService, relatedEntityName, service);
data = lookupData;
break;

Step 6 : Now goto Controls\EntityEditor.ascx

You need to modify following function
private WebControl GetPopulatedControl(AttributeData attributeData, String defaultValue)

Add following code within switch statement


case AttributeType.Lookup:
LookupAttributeData lookuplistAttributeData = attributeData as LookupAttributeData;
DropDownList listLookup = new DropDownList();
listLookup.ID = attributeData.SchemaName;
listLookup.CssClass = "msa-Global-SelectList";
listLookup.Attributes.Add("attributeType", lookuplistAttributeData.AttributeType.Value.ToString());
listLookup.Attributes.Add("defaultValue", (lookuplistAttributeData.ActualValue ?? 0).ToString());
listLookup.Items.Add(new ListItem());

foreach (LookUpData option in lookuplistAttributeData.LookupOptions)
{
listLookup.Items.Add(new ListItem(option.LookupText, option.LookupId));
}
if (!String.IsNullOrEmpty(lookuplistAttributeData.DisplayValue))
{
listLookup.Items.FindByText(lookuplistAttributeData.DisplayValue).Selected = true;
}
return listLookup;

Step 7 : Modify following function
public void SaveEntity()

Add following code within switch statement


case AttributeType.Lookup:
DropDownList lookuplist = (DropDownList)control;
string selectedlkpValue ="";
if (lookuplist.SelectedItem != null)
{
selectedlkpValue = lookuplist.SelectedItem.Value;
}
if (selectedlkpValue != "")
{
LookupProperty prop = new LookupProperty();
prop.Name = attribute;
prop.Value = new Lookup();
prop.Value.Value = new Guid(selectedlkpValue);
entity.Properties.Add(prop);
}
break;

By doing the above steps you should be able to display Lookup data in eService Accelerator and save back the changes.

Monday, February 23, 2009

Using Assign Message in CRM 4.0 Plugin

Assign message is very usefull if you want to store history of all owners of a record with Start and End Date. Following code sample can be used to do this:


public void Execute(IPluginExecutionContext context)
{
if (context.InputParameters.Properties.Contains("Target") && context.InputParameters.Properties["Target"] is Moniker)
{
Moniker moniker = (Moniker)context.InputParameters.Properties["Target"];
Guid id = moniker.Id;
ICrmService crmService = context.CreateCrmService(true);
DynamicEntity PreImage = null;
DynamicEntity PostImage = null;
//Get the Pre and Post Images
if (context.PreEntityImages.Properties.Contains("Images") && context.PreEntityImages.Properties["Images"] is DynamicEntity)
{
PreImage = (DynamicEntity)context.PreEntityImages.Properties["Images"];
}
if (context.PostEntityImages.Properties.Contains("Images") && context.PostEntityImages.Properties["Images"] is DynamicEntity)
{
PostImage = (DynamicEntity)context.PostEntityImages.Properties["Images"];
}
if (PreImage != null && PostImage != null)
{
Guid? keyWorkerIdPre = Utils.GetOwnerId(PreImage, "ownerid");
Guid? keyWorkerIdPost = Utils.GetOwnerId(PostImage, "ownerid");
if (keyWorkerIdPre != keyWorkerIdPost)
{
//Close previous involvement records for this user
if (keyWorkerIdPre.HasValue)
{
CloseKeyWorkerRecord(id,keyWorkerIdPre.Value, crmService);
}
if (keyWorkerIdPost.HasValue)
{
CreateKeyWorkerHistoryRecord(id, keyWorkerIdPost.Value, crmService);
}
}
}
}
}


//GetOwnerId function


public static Guid? GetOwnerId(DynamicEntity entity, string attributeName)
{
attributeName = attributeName.ToLower();
if (entity.Properties.Contains(attributeName))
{
return ((Owner)entity.Properties[attributeName]).Value;
}
else
{
return null;
}
}