Skip to main content

Dynamics CRM API - Essentials

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."


Comments

  1. Thanks Slava,

    Your 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

    ReplyDelete
  2. Thanks Jawad,

    Good to know that the code worked for you.

    Best wishes,

    Slava G

    ReplyDelete

Post a Comment

Popular posts from this blog

Setting up External Content Type for SQL Server database using SQL Server authentication - SharePoint 2010 Foundation

This post is a follow up on the issues that I have got setting up External Content Type (ECT) on SharePoint 2010 Foundation that was going to connect to remote SQL Server database for information. I cannot use my SharePoint user accounts to access SQL Server. According to the information I have discovered ECT and Business Connectivity Services are available in the SharePoint 2010 Foundation, but there are some issues if you want to use authentication methods in your external connections that are different from Windows Identity or Current User Identity. This is because there is no Secure Store Service in SharePoint 2010 Foundation which serves as an impersonation hub and is only available in SharePoint 2010 Server edition. The issues are coming from the fact that you can actually create ECT in SharePoint Designer 2010 providing just Secure Store ID and system would ask you for credentials and here you go, but when you try to use your ECT in External Lists or as a lookup columns you w...

SharePoint 2013 Development and Consulting - Laptop & Conferencing Experience with Lync

Have just jumped on a brand new SharePoint 2013 massive Intranet project and because of specific working conditions have found some items that required addressing almost immediately in order to continue the job. Maybe this will be interesting to someone else who is about to start SharePoint 2013 development to have an idea of what might be necessary. I started working with SharePoint using my own infrastructure in 2009. I used iMac with 320GB HDD and 4GB RAM running VMWare Fusion to virtualise Windows  environment ( SQL Server 2008, standalone SharePoint 2007, Visual Studio 2008, Office 2007). It was all-in-one virtual machine. A bit slow, but enough for any SharePoint work that I had at that time. For communication with colleagues and partners we used GoToMeeting . Great tool that worked (and still works) without any problems. Voice, video, screen-sharing - all worked well using built-in audio/video hardware. In 2010 I got a MacBook Pro  with 500GB HDD and 8GB ...

InfoPath 2013 Preview - URL not valid error when publishing

In InfoPath 2010 there is a problem when you try to publish a Form to a SharePoint site that doesn't have root site collection. You will get an error message "The following url is not valid". It's described here:   http://support.microsoft.com/kb/981854 The solution is to create root site collection for the Web application. Same problem is with InfoPath 2013: In my situation I didn't create the root site collection initially, but used "/sites" managed path instead for all site collections. To solve the problem with InfoPath I had to create it. Used a new site template "Project Site". Will get a chance to research that too. :)