Servicio Odata y como traer datos en CRM 2013

function obtenerEntidadAccount(accountId) {

var oDataURI = Xrm.Page.context.getClientUrl()
+ “/XRMServices/2011/OrganizationData.svc/”
+ “AccountSet(guid'” + accountId + “‘)”
+ “?$select=”
+ “vertis_contactoquerecepcionalafactura,”
+ “vertis_fono,”
+ “vertis_direccionparaelenviodelafactura,”
+ “vertis_emailalcualsedebeenviarlafactura”;
var jSonArray;
$.ajax({
type: “GET”,
contentType: “application/json; charset=utf-8”,
datatype: “json”,
url: oDataURI,
async: false,
beforeSend: function (XMLHttpRequest) {
//Specifying this header ensures that the results will be returned as JSON.
XMLHttpRequest.setRequestHeader(“Accept”, “application/json”);
},
success: function (data, textStatus, XmlHttpRequest) {
jSonArray = data;
},
error: function (XmlHttpRequest, textStatus, errorThrown) {
alert(“Error : Ha ocurrido un error al intentar traer la lista de busqueda de notas.”);
}
});

return jSonArray.d;

}

Añadir OwnerId en Dynamics CRM

Un pequeño código para asignar owner id en una entidad en CRM Dynamics en C#

if (serviceProvider == null)
{
throw new ArgumentNullException(“no se ha encontrado el contexto”);
}
try
{
//=====================================================================
IPluginExecutionContext context =
(IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
IOrganizationServiceFactory serviceFactory =
(IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService servicio = serviceFactory.CreateOrganizationService(context.UserId);
//=====================================================================
Guid idEmpresa = context.PrimaryEntityId;
Guid idUsuario = context.UserId;
Account cuenta = servicio.Retrieve(Account.EntityLogicalName, idEmpresa, (new ColumnSet(true))).ToEntity<Account>();

if(cuenta.StateCode.Value.Equals(AccountState.Active))
{
AssignRequest request = new AssignRequest();
request.Target = new EntityReference(Account.EntityLogicalName, idEmpresa);
request.Assignee = new EntityReference(“systemuser”, idUsuario);
AssignResponse response = (AssignResponse)servicio.Execute(request);
}

}
catch (Exception ex)
{
throw new InvalidPluginExecutionException(“Error al ejecutar plugin”, ex);
}

Generic Sql Error en CRM Dynamics y usar SQL profiler para el CRM

Hace unos días me toco hacer un plugin para MS Dynamics CRM y me daba este error, después de googlear un rato di como personalizar el SQL Profiler para leer los errores del CRM de base de datos el link es el siguiente

http://www.avanadeblog.com/xrm/2011/04/troubleshooting-crm-generic-sql-error.html

si bien en mi caso el error era por otra causa, se puede sacar mucha información de lo que dice el Profiler

para mi caso el error sql era el siguiente

Cannot insert duplicate key row in object ‘dbo.EmailSearchBase’ with unique index ‘ndx_for_forward_update’

lo que se resuelve cambiando la forma de hacer el update de la entidad que da problemas

como dice en el siguiente link

http://community.dynamics.com/crm/b/hardworkdays/archive/2012/04/24/mscrm-2011-error-during-creation-of-account-record-system-data-sqlclient-sqlexception-0x80131904-cannot-insert-duplicate-key-row-in-object-dbo-emailsearchbase-with-unique-index-ndx-for-forward-update.aspx#.UiagKTZLNV5

 

mi código quedo de la siguiente forma

Dim target As Entity = DirectCast(context.InputParameters(“Target”), Entity)
Dim updateTarget As Entity = New Entity(target.LogicalName)
updateTarget.Id = target.Id

updateTarget(“new_rutencriptado”) = Encripta(contacto.New_rut)

service.Update(updateTarget)

PD: y para colmo tuve que hacer esto en VB  grrr….

 

FaultException en MS Dynamics

Cuando empecé a trabajar con Dynamics, y empece a configurar mi ambiente de desarrollo varias veces tuve esta excepción, se me daba principalmente cuando trataba de obtener las clases que representaban las entidades con el crmcvsutil.exe o con el PluginRegistrationTools. Así que si las credenciales están correctas, esta puede ser una causa.

La solución a este problema es bastante simple, esta excepción se da porque la máquina no tiene instalado .

http://msdn.microsoft.com/en-US/evalcenter/dd440951.aspx

Basta con instalar y listo. Otra causa que puede generar esta excepción es que la zona horaria de la máquina cliente no corresponda con el servidor, en este caso basta con tener las máquinas en la misma zona horaria.

Llamar al WebService de CRM Dynamics

En mi nueva aventura estoy haciendo desarrollo para el CRM de Microsoft… Dynamics.. su gracia es que tiene una api a modo de WebService que es muy útil pará acceder a los objetos del CRM y poder manipularlos.

Con la siguiente clase generamos un proxy al servicio.

public class CrmUtil

    {

        static public string _deviceId = “”;

        static public string _devicePass = “”;

 

        private static readonly ILog log = LogManager.GetLogger(typeof(CrmUtil));

 

        /// <summary>

        /// Crea un proxy de comunicacion con el servicio web del CRM

        /// ========================================================

        /// </summary>

        /// <returns></returns>

        static public OrganizationServiceProxy CreateOrganization()

        {

            try

            {

                String _userName = ConfigurationManager.AppSettings[“Usuario”];

                String _password = ConfigurationManager.AppSettings[“Pass”];

                String organizationUri = ConfigurationManager.AppSettings[“URL”];

                ClientCredentials cred1 = new ClientCredentials();

                cred1.UserName.UserName = _userName;

                cred1.UserName.Password = _password;

                ClientCredentials cred2 = new ClientCredentials();

                OrganizationServiceProxy obj;

                if (_deviceId.Length > 0)

                    obj = new OrganizationServiceProxy(

                    new Uri(organizationUri),

                    null,

                    cred1,

                    cred2);

                else

                    obj = new OrganizationServiceProxy(

                   new Uri(organizationUri),

                   null,

                   cred1,

                   null);

                return obj;

            }

            catch (Exception ex)

            {

                log.Error(ex.Message);

                return null;

            }

        }

    }

para configurar las credenciales uso un App.config

<?xml version=”1.0″ encoding=”utf-8″ ?>

<configuration>

<appSettings file=””>

<clear />

<add key=”Usuario” value=”Dominio\usuario” />

<add key=”Pass” value=”password” />

<add key=”URL” value=”http://localhost/Interwins/XrmServices/2011/Organization.svc&#8221; />

</appSettings>

</configuration>

y para llamar al servicio uso el siguiente codigo

OrganizationServiceProxy servicio = CrmUtil.CreateOrganization();

Console.WriteLine(“Conectado al CRM”);

servicio.EnableProxyTypes();

Es importante el metodo EnableProxyType y en las propiedades del proyecto debe  quedar en framework de destino .NET Framework 4… por defecto esta en CLient… debes cambiarlo a la opción que te indique.

finalmente estos son los using que deben ir… los estaba olvidando

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using Microsoft.Xrm.Sdk;

using Microsoft.Xrm.Sdk.Query;

using Microsoft.Xrm.Sdk.Client;

using Microsoft.Xrm.Sdk.Discovery;

using Microsoft.Crm.Sdk.Messages;

using System.ServiceModel.Description;

using System.Configuration;

using System.Xml;

using log4net;

log4net lo uso siempre, como configurarlo aqui

suerte.