Integrating CRM 2011 and SharePoint 2013 using BCS (WCF Service – CRUD Operation)


Create a new WCF Service Application in Visual Studio with .NET Framework version as 4.0 (since we will be using CRM 2011’s assembly that are in version 4.0).

Please go through this MSDN article first to get a clear understanding on the BCS Service

http://msdn.microsoft.com/en-us/library/office/ff953200(v=office.14).aspx

Define the Service Contract and the Date Contract in the following manner. Here we would be performing CRUD operation on Date of Birth and Last Name field of the Contact Entity.

Add references to the following assemblies

Microsoft.BusinessData can be found at

C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\ISAPI on the SharePoint Server.


[ServiceContract]
 public interface IService1
 {
 [OperationContract]
 IEnumerable<ContactEntity> ReadList();

[OperationContract]
 ContactEntity ReadItem(Guid contactId);

[OperationContract]
 ContactEntity Create(ContactEntity newContact);

[OperationContract]
 void Update(ContactEntity contact);

[OperationContract]
 void Delete(Guid contactId);
 }

 [DataContract]
 public class ContactEntity
 {
 [DataMember]
 public Guid ContactId { get; set; }

[DataMember]
 public DateTime? DateOfBirth { get; set; }

[DataMember]
 public string LastName { get; set; }
 }


Implement the Service Contract


public class Service1 : IService1
 {
 private readonly IOrganizationService _orgService = GetOrganizationService();

public ContactEntity ReadItem(Guid contactId)
 {
 try
 {
 var cols = new ColumnSet(new[] {"lastname", "birthdate"});
 ContactEntity contactRecord = null;
 Entity entity = _orgService.Retrieve("contact", contactId, cols);
 if (entity != null)
 {
 contactRecord = new ContactEntity();
 contactRecord.ContactId = contactId;
 if (entity.Contains("lastname"))
 {
 contactRecord.LastName = entity.Attributes["lastname"].ToString();
 }
 if (entity.Contains("birthdate"))
 {
 contactRecord.DateOfBirth = (DateTime) entity.Attributes["birthdate"];
 }
 }

return contactRecord;
 }
 catch (InvalidOperationException)
 {
 throw new ObjectNotFoundException(
 "Unable to read data for the conatct with ID = " +
 contactId.ToString() +
 ". The contact no longer exists.");
 }
 catch (Exception generalException)
 {
 throw new RuntimeException(
 "There was a problem reading contact data.",
 generalException);
 }
 }

public IEnumerable<ContactEntity> ReadList()
 {
 try
 {
 var queryExpression = new QueryExpression("contact");
 var conditionExpression = new ConditionExpression("statuscode", ConditionOperator.Equal, 1);
 queryExpression.ColumnSet = new ColumnSet(new[] {"contactid", "lastname", "birthdate"});
 queryExpression.Criteria.AddCondition(conditionExpression);

EntityCollection contactCollection = _orgService.RetrieveMultiple(queryExpression);
 var lstContactType = new List<ContactEntity>();
 ContactEntity contactRecord;
 foreach (Entity entity in contactCollection.Entities)
 {
 contactRecord = new ContactEntity();
 contactRecord.ContactId = new Guid(entity.Attributes["contactid"].ToString());
 if (entity.Contains("lastname"))
 {
 contactRecord.LastName = entity.Attributes["lastname"].ToString();
 }
 if (entity.Contains("birthdate"))
 {
 contactRecord.DateOfBirth = (DateTime) entity.Attributes["birthdate"];
 }

lstContactType.Add(contactRecord);
 }

return lstContactType;
 }
 catch (Exception generalException)
 {
 throw new RuntimeException(
 "There was a problem reading contact data.",
 generalException);
 }
 }

public ContactEntity Create(ContactEntity newContact)
 {
 try
 {
 var returnContact = new ContactEntity();
 returnContact.ContactId = Guid.NewGuid();
 returnContact.DateOfBirth = newContact.DateOfBirth;
 returnContact.LastName = newContact.LastName;

var contactRecord = new Entity();
 contactRecord.LogicalName = "contact";
 contactRecord.Attributes["lastname"] = returnContact.LastName;
 contactRecord.Attributes["contactid"] = returnContact.ContactId;
 contactRecord.Attributes["birthdate"] = returnContact.DateOfBirth;
 newContact.ContactId = _orgService.Create(contactRecord);

return returnContact;
 }
 catch (Exception generalException)
 {
 throw new RuntimeException(
 "There was a problem creating a new contact.",
 generalException);
 }
 }


 public void Update(ContactEntity updateContact)
 {
 try
 {
 var contactRecord = new Entity();
 contactRecord.LogicalName = "contact";
 contactRecord.Attributes["lastname"] = updateContact.LastName;
 contactRecord.Attributes["contactid"] = updateContact.ContactId;
 contactRecord.Attributes["birthdate"] = updateContact.DateOfBirth;

_orgService.Update(contactRecord);
 }
 catch (InvalidOperationException)
 {
 throw new ObjectNotFoundException(
 "Unable to update the contact with ID = " +
 updateContact.ContactId.ToString() +
 ". The contact no longer exists.");
 }
 catch (Exception generalException)
 {
 throw new RuntimeException(
 "There was a problem updating the lawyer with ID = " +
 updateContact.ContactId.ToString() + ".", generalException);
 }
 }

public void Delete(Guid contactId)
 {
 try
 {
 _orgService.Delete("contact", contactId);
 }
 catch (InvalidOperationException)
 {
 throw new ObjectNotFoundException(
 "Unable to delete the contact with ID = " +
 contactId.ToString() +
 ". The contact no longer exists.");
 }
 catch (Exception generalException)
 {
 throw new RuntimeException(
 "There was a problem lawyer the customer with ID = " +
 contactId.ToString() + ".", generalException);
 }
 }

public static IOrganizationService GetOrganizationService()
 {
 var organizationUri = new Uri("http://crmserver/orgname/XRMServices/2011/Organization.svc");
 Uri homeRealmUri = null;
 var credentials = new ClientCredentials();
 credentials.Windows.ClientCredential = new NetworkCredential("username", "password", "domain");
 var orgProxy = new OrganizationServiceProxy(organizationUri, homeRealmUri, credentials, null);
 IOrganizationService _service = orgProxy;
 return _service;
 }

 

Host the Service in the IIS.

Open SharePoint Designer 2013 and connect to the site where we want to create an external content type based on our WCF Service.

Create a new External Content Type

Specify name for the content type and click on the link for defining operations

Click on Add Connection and specify WCF Service as the connection type

Specify the url of the WCF service

For each of the Web Methods, specify the corresponding operation.

For each of the operations define ContactId as Identifier

Once defined, select Create Lists and Form button

Open the SharePoint site and open the list created

Corresponding contact records in CRM

Hope it helps.

Fixed: The form cannot be rendered. This may be due to a misconfiguration of the Microsoft SharePoint Server State Service error for InfoPath in SharePoint 2013.


Hi,

We had configured the InfoPath Form Services in our SharePoint server.

Now after creating and publishing an InfoPath form to a form library, while creating a new document we got the below error

To fix this, here first we need to check if the state service is up and running

Central Administration à Application Management à Manage Service Applications

The state service was up and running in our case.

So the next thing to look out for was the Service Application Association i.e. whether our current web application is associated with the service or not.

Central Administration à Application Management à Configure Service Applications Associations

As it was in our case it wasn’t associated. After configuring the same, the error got resolved.

Hope it helps.

“You must provide a value for Potential Customer” error while creating opportunity record through Create Step in Process in CRM 2011 Online


Hi,

Got the below error message while defining the Create Step in Workflow in CRM 2011 online instance. It seems like it is a bug in new online environment that have UR 13 applied.

Check out this thread

http://social.microsoft.com/Forums/en-US/crm/thread/51a63a3e-bd81-471e-a9d8-617bfe033271/

The workaround would be to remove the requirement level, edit and publish the workflow and the set the requirement level back.

Bye.

Fixed: Application Server Administration job failed for service instance Microsoft.Office.Server.Search.Administration.SearchServiceInstance error in SharePoint 2013


Hi,

We were getting the below error in the event log every time we were clicking on Populate Containers button while creating a new synchronization connection for User Profiles.


Error :

Application Server Administration job failed for service instance Microsoft.Office.Server.Search.Administration.SearchServiceInstance (90579710-4ed5-47e9-a3d8-de997f96262e).

Reason: An update conflict has occurred, and you must re-try this action. The object SearchDataAccessServiceInstance was updated by CONTOSO\administrator, in the OWSTIMER (2720) process, on machine CRM2011. View the tracing log for more information about the conflict.

Stopping the Timer Service, clearing the Configuration Cache and restarting the Timer Service helped us to fix the issue.

http://www.social-point.com/sharepoint-2010-event-id-6482-application-server-administration-job-failed-for-service-instance-microsoft-office-server-search-administration-searchserviceinstance

Bye.

Advertisements

CRM 2011 Bug – Team Security Roles


Nice post on Team and Security Role. Do check the comments.

crmdeveloper's avatarcrm2011stuff

This appears to be a bug with Security Roles and Teams.  To duplicate the problem, follow these steps:

  1. Create a Custom Entity
  2. Create a Security Role in CRM 2011 to access the Custom Entity
  3. Create a new Team in CRM
  4. Assign the new Security Role to the new Team
  5. Create a new user
  6. Add the user to the Team as a member

Now the new user is supposed to have the permissions granted by the security role assigned to the Team.  Testing will show that you can access everything but the form.

  1. Now assign the new Security Role directly to the new user
  2. Have the new user log in and access the form for the Custom Entity

If you test at this point, everything will work.  Be sure to access the form at least once. 

  1. Remove the role from the new user
  2. Assign the role back to the Team

Now the…

View original post 24 more words

List of Error Codes in CRM 2011


Hi,

Was wondering where we can get the list of error codes in CRM 2011.

For CRM 4.0 we used to have the following link (page in SDK)

http://msdn.microsoft.com/en-in/library/cc151248.aspx

In CRM 2011, we can get it in SDK at the following path

\sdk\samplecode\cs\helpercode

Do check this post as well

http://mscrmuk.blogspot.com/2009/01/crm-error-codes.html

Bye.

Advertisements