Here is the information about how to create certain type of entities in Dynamics CRM 3.0 using API. For version 4.0 could be some changes and they will be pointed out specifically.
Create a contact
public Guid CreateContact()
{
CrmService service = new CrmService();
service.Url = ...;
service.Credentials = System.Net.CredentialCache.DefaultCredentials;
Guid gResult = Guid.Empty;
try
{
contact mycontact = new contact();
mycontact.firstname = ...;
mycontact.lastname = ...;
... // provide other attributes
gResult = service.Create(mycontact);
}
catch (System.Web.Services.Protocols.SoapException soapex)
{
...
}
catch (Exception ex)
{
...
}
return gResult;
}
Create a task in regard to the contact
private Guid CreateActivityForContact(Guid gContactId)
{
Guid gResult = Guid.Empty;
CrmService service = new CrmService();
service.Url = ...;
service.Credentials = System.Net.CredentialCache.DefaultCredentials;
try
{
task task = new task();
task.subject = ...;
task.regardingobjectid = new Lookup();
task.regardingobjectid.Value = gContactId;
task.regardingobjectid.type = EntityName.contact.ToString();
gResult = service.Create(task);
}
catch (System.Web.Services.Protocols.SoapException soapex)
{
...
}
catch (Exception ex)
{
...
}
return gResult;
}
Create an email and send it to the contact
private void SendEmailToCustomer(Guid gContactId)
{
CrmService service = new CrmService();
service.Url = ...;
service.Credentials = System.Net.CredentialCache.DefaultCredentials;
try
{
activityparty recipient2 = new activityparty();
recipient2.partyid = new Lookup();
recipient2.partyid.type = EntityName.contact.ToString();
recipient2.partyid.Value = gContactId;
email email = new email();
email.subject = ...;
email.description = ...; // aka Email body
email.to = new activityparty[] { recipient2 };
SendEmailRequest req = new SendEmailRequest();
req.EmailId = service.Create(email);
req.TrackingToken = string.Empty;
req.IssueSend = true;
try
{
SendEmailResponse res = (SendEmailResponse)service.Execute(req); // NOTE: this will cause exception if the calling CRM user doesn't have Email address
}
catch (System.Web.Services.Protocols.SoapException soapex)
{
...
}
}
catch (System.Web.Services.Protocols.SoapException soapex)
{
...
}
}
Create campaign response where the contact is a customer
private void CreateCampaignResponse(Guid gCampaignId, Guid gContactId)
{
CrmService service = new CrmService();
service.Url = ...;
service.Credentials = System.Net.CredentialCache.DefaultCredentials;
try
{
campaignresponse campaignresponse = new campaignresponse();
campaignresponse.responsecode = new Picklist();
campaignresponse.responsecode.Value = 1; // Interested
campaignresponse.regardingobjectid = new Lookup();
campaignresponse.regardingobjectid.Value = gCampaignId;
campaignresponse.regardingobjectid.type = EntityName.campaign.ToString();
activityparty party = new activityparty();
party.partyid = new Lookup();
party.partyid.type = EntityName.contact.ToString();
party.partyid.Value = gContactId;
campaignresponse.customer = new activityparty[] { party };
Guid gResponseId = service.Create(campaignresponse);
}
catch (System.Web.Services.Protocols.SoapException soapex)
{
...
}
catch (Exception ex)
{
...
}
}
SoapException detail reading
In the exception handling area
catch (System.Web.Services.Protocols.SoapException soapex)
{
...
}
we can't just use soapex.ToString() as we would do for Exception type of exceptions :)
Instead we will use soapex.Detail.InnerText which tells us exactly what has happend.
Let's have a look at the code that creates an email in CRM. If we try to set Regarding property to the entity of type Task:
email.regardingobjectid = new Lookup();
email.regardingobjectid.Value = gTaskId;
email.regardingobjectid.type = EntityName.task.ToString();
and then try to create an email we will receive the following exception:
"Server was unable to process request." which actually means - if we look at soapex.Detail.InnerText property - "0x80040205 The parent object is invalid or missing."
Create a contact
public Guid CreateContact()
{
CrmService service = new CrmService();
service.Url = ...;
service.Credentials = System.Net.CredentialCache.DefaultCredentials;
Guid gResult = Guid.Empty;
try
{
contact mycontact = new contact();
mycontact.firstname = ...;
mycontact.lastname = ...;
... // provide other attributes
gResult = service.Create(mycontact);
}
catch (System.Web.Services.Protocols.SoapException soapex)
{
...
}
catch (Exception ex)
{
...
}
return gResult;
}
Create a task in regard to the contact
private Guid CreateActivityForContact(Guid gContactId)
{
Guid gResult = Guid.Empty;
CrmService service = new CrmService();
service.Url = ...;
service.Credentials = System.Net.CredentialCache.DefaultCredentials;
try
{
task task = new task();
task.subject = ...;
task.regardingobjectid = new Lookup();
task.regardingobjectid.Value = gContactId;
task.regardingobjectid.type = EntityName.contact.ToString();
gResult = service.Create(task);
}
catch (System.Web.Services.Protocols.SoapException soapex)
{
...
}
catch (Exception ex)
{
...
}
return gResult;
}
Create an email and send it to the contact
private void SendEmailToCustomer(Guid gContactId)
{
CrmService service = new CrmService();
service.Url = ...;
service.Credentials = System.Net.CredentialCache.DefaultCredentials;
try
{
activityparty recipient2 = new activityparty();
recipient2.partyid = new Lookup();
recipient2.partyid.type = EntityName.contact.ToString();
recipient2.partyid.Value = gContactId;
email email = new email();
email.subject = ...;
email.description = ...; // aka Email body
email.to = new activityparty[] { recipient2 };
SendEmailRequest req = new SendEmailRequest();
req.EmailId = service.Create(email);
req.TrackingToken = string.Empty;
req.IssueSend = true;
try
{
SendEmailResponse res = (SendEmailResponse)service.Execute(req); // NOTE: this will cause exception if the calling CRM user doesn't have Email address
}
catch (System.Web.Services.Protocols.SoapException soapex)
{
...
}
}
catch (System.Web.Services.Protocols.SoapException soapex)
{
...
}
}
Create campaign response where the contact is a customer
private void CreateCampaignResponse(Guid gCampaignId, Guid gContactId)
{
CrmService service = new CrmService();
service.Url = ...;
service.Credentials = System.Net.CredentialCache.DefaultCredentials;
try
{
campaignresponse campaignresponse = new campaignresponse();
campaignresponse.responsecode = new Picklist();
campaignresponse.responsecode.Value = 1; // Interested
campaignresponse.regardingobjectid = new Lookup();
campaignresponse.regardingobjectid.Value = gCampaignId;
campaignresponse.regardingobjectid.type = EntityName.campaign.ToString();
activityparty party = new activityparty();
party.partyid = new Lookup();
party.partyid.type = EntityName.contact.ToString();
party.partyid.Value = gContactId;
campaignresponse.customer = new activityparty[] { party };
Guid gResponseId = service.Create(campaignresponse);
}
catch (System.Web.Services.Protocols.SoapException soapex)
{
...
}
catch (Exception ex)
{
...
}
}
SoapException detail reading
In the exception handling area
catch (System.Web.Services.Protocols.SoapException soapex)
{
...
}
we can't just use soapex.ToString() as we would do for Exception type of exceptions :)
Instead we will use soapex.Detail.InnerText which tells us exactly what has happend.
Let's have a look at the code that creates an email in CRM. If we try to set Regarding property to the entity of type Task:
email.regardingobjectid = new Lookup();
email.regardingobjectid.Value = gTaskId;
email.regardingobjectid.type = EntityName.task.ToString();
and then try to create an email we will receive the following exception:
"Server was unable to process request." which actually means - if we look at soapex.Detail.InnerText property - "0x80040205 The parent object is invalid or missing."
Thanks Slava,
ReplyDeleteYour code snippet helped me create the campaign response programatically using c-sharp.
Other sites were using CrmTypes class for setting up regardingobjectid and that wasn't working for me since last few days.
Bu this one worked perfectly well.
Thanks
Thanks Jawad,
ReplyDeleteGood to know that the code worked for you.
Best wishes,
Slava G