sábado, 31 de mayo de 2014

Nueva herramienta de migración de configuraciones (SP1)

Con la nueva versión del SP1 de CRM 2013, se ha publicado también una nueva versión de nuestra querida SDK que puede ser descargada de aquí: http://www.microsoft.com/en-us/download/details.aspx?id=40321
Una de la herramientas que mas me gustan que la nueva versión trae es la herramienta de migración de configuraciones o “DataMigrationUtility”.
Esta herramienta permite básicamente mover entidades de configuración, son sus registros manteniendo los GUIDs de los registros.
Esta herramienta está disponible en la carpeta de la SDK “\Tools\ConfigurationMigration\DataMigrationUtility.exe”, y lo que voy a hacer a continuación en enseñar un ejemplo de funcionamiento de esta nueva herramienta con un ejemplo.
En prácticamente todos los proyectos en los que trabajo, al hacer la puesta en marcha o instalación en los entornos de Test, Pre, Integración, producción, etc. necesito mover datos de configuración en registros de CRM. Un ejemplo que enseñaré ahora será con una entidad de “Provincias”, pero también lo he probado con entidades del sistema como Unidades de negocio o Equipos, y les puedo asegurar que funciona!
Este movimiento de datos es muy importante, ya que al mantener los mismos GUIDs (códigos internos de CRM), cualquier workflow o referencia a estos registros, los seguirá manteniendo de la misma manera al ser importados.
Para el ejemplo en cuestión, voy a empezar con una entidad de Provincias como la siguiente:
image
Entonces ejecuto la aplicación “DataMigrationUtility.exe” y vamos a crear un esquema:
image
Nos conectamos al entorno de origen:
image
Se conecta:
image
Seleccionamos la entidad de Provincias y la añado:
image
Guardamos el esquema en un fichero:
image
Una vez guardado, nos pregunta si queremos exportar los datos:
image
Aquí selecciono el nombre de fichero a generar y le decimos lo cree:
image
Resultado de la exportación de datos:
image
Ahora que tenemos creados el esquema de origen con sus datos, vamos a Importar datos:
image
Nos pide conectarnos contra el entorno de destino:
image
Conectándose con el destino:
image
Seleccionamos el fichero de datos a importar:
image
Y…Sorpresa!, un error. Lo que ocurre es que en el destino no tengo creada la entidad de provincias, por lo que me da un error de esquema.
image
Después de importar las personalizaciones de la entidad de Provincias, la importación va como la seda:
image
En la importación de provincias he probado también el eliminar una provincia (me la vuelve a crear correctamente) y modificar el nombre de una provincia (me la actualiza correctamente).
También he probado mover Unidades de negocio:
image
Y equipos (ojo aquí, ya que importa también los miembros del equipo):
image
En resumen, si bien muchos de nosotros ya nos habíamos creado soluciones para realizar este tipo de movimientos de datos, ahora la SDK nos facilita la vida aportando una herramienta muy buena.
Un abrazo!

domingo, 25 de mayo de 2014

6.1.0.55 ya esta aquí! (“Leo” o “SP1”)

image

Buenas, como todos habrán escuchado, leído investigado y algunos probado, se viene el Service Pack 1 de CRM 2013 y voy a empezar a publicar contenido acerca de esto.

Lo primero, voy a aclarar unos temas, que son un poco complicados porque cambian la manera en que Microsoft y el equipo de producto de CRM, publica y maneja las Releases.

La nueva versión (Service pack 1) será la 6.1.0.55. Sí, como habréis visto, con el nuevo service pack, empiezan a contarse los Update Rollups desde cero. Por esto, ya estamos a la espera del próximo CRM 2013 SP1 Update Rollup 1 (esto no termina nunca con una nueva release, je).

Personalmente, llevo un tiempo probando y estoy encantado con los resultados y con las nuevas funcionalidades, he leído mucho contenido por ahí además de mucho contenido que ha salido del Convergence, pero imagino que muchos de ustedes nunca vieron “LEO” en español, ya que la mayor parte del contenido hasta ahora es en ingles (prácticamente todo en realidad).

Para empezar una serie de posts relacionado con la nueva release de “Primavera”, empezaré con algunos pantallazos de la nueva versión en español, que además servirá para resumir parte de lo nuevo que viene dentro de nada.

Uno de los temas mas interesantes, es que la política de actualización de versiones en CRM Online cambia. Por ejemplo antes, se planificaba tu “upgrade”, podías modificar un poco tu fecha, pero finalmente te migraban.

Ahora es distinto, ya que lo primero que hacen es actualizarte (la versión de tu CRM aumenta), pero las nuevas funcionalidades del SP1 se pueden activar manualmente cuando uno quiera accediendo aquí:

image

Para ver un resumen de todas las novedades, se puede acceder a este enlace: http://www.microsoft.com/en-us/dynamics/crm-customer-center/what-s-new.aspx

Hay una zona nueva en la configuración, donde configurar toda la funcionalidad de Servicio al cliente:

image

image

Lo nuevo de las transiciones razón para el estado:

image

image

La vuelta de la funcionalidad de detección de duplicados en la actualización de registros (incluso funciona con la creación rápida):

image

Las barras de comando ya traen 7 botones, en lugar de los 5 que había antes como máximo:

image

Otra de las cosas nuevas y muy vistosas son estos iconos que aparecen en el listado de Casos (dependiendo del campo “Origen”):

image

El detalle de la nueva botonera en Casos:

image

Bueno, intentaré entonces a partir de ahora, ir publicando algo mas de detalle y testing de todo esto nuevo.

Recomendación: empezar a moverse con todo esto, que hay mucho mucho con que “jugar”.

un saludo!

domingo, 11 de mayo de 2014

Utilizando la nueva librería Sdk.Soap.js

Avatar of Microsoft Dynamics CRM SDK Documentation Team
Hola, hoy voy a hablar acerca de la nueva librería para Dynamics CRM publicada recientemente en el Blog del equipo de Dynamics CRM: http://blogs.msdn.com/b/crm/archive/2014/04/28/new-microsoft-crm-sdk-sample-sdk-soap-js.aspx
El equipo de documentación de Dynamics CRM, lleva unos meses trabajando sobre esta solución, y la verdad que el resultado es excelente.
La idea de esta librería es ofrecer funcionalidades pre construidas y sencillas de reutilizar, para trabajar con los web services SOAP de Dynamics CRM desde javascript.
Otro de los objetivos es que la sintaxis a utilizar, sea muy similar a la que se utiliza al trabajar con la SDK desde C#, por lo tanto, gente que no conozca jQuery o no sea experto en Javascript pero que trabajen con C#, pueden trabajar con la misma.
Si entramos en profundidad en la documentación, podemos dividirla en 4 partes:
1) Sdk.Soap.js: Contiene el núcleo de esta nueva librería, que por sí sola ya permite ser utilizada.
2) Sdk.Soap.js Entity Class Generator: Para generar una clase en Javascript para trabajo con “early-bound”, similar al utilizado en C# “CRMSvcUtil.exe”. Como no trabajo con “early-bound” y sinceramente no lo recomiendo, no lo he probado.
3) Sdk.Soap.js Action Message Generator: Para la generación de “proxys” para las llamadas a las Acciones personalizadas (Custom Actions)
4) Sdk.Soap.js Samples: Ejemplos de utilización de la librería.
Ok, una vez realizada esta introducción, os voy a mostrar y compartir una solución basada en los ejemplos disponibles, pero simplificados, ya que son un poco mas complejos.
Los ejemplos que trae por defecto son muy completos, pero después hay que montarlos en CRM, por ejemplo en un WebResource, por esto, os planteo un ejemplo sencillo. Voy a crear, consultar (retrieve), actualizar y eliminar una Cuenta utilizando esta librería. Intentaré explicar paso a paso como lo he realizado y explicaré partes del código.
Primero os voy a enseñar lo que contiene mi solución y como se ejecuta:
image
Mi solución solo contiene:
  • new_Sdk.Soap.min.js: Contiene el “core” de esta solución, disponible para su descarga desde los enlaces anteriores
  • new_SdkSoapLibrary_Test.html: Es el HTML del web resource que he creado
  • new_Testing.js: Mi código javascript que realiza las llamadas CRUD para este ejemplo
Si abro el web resource HTML y lo ejecuto ve lo siguiente:
image
El HTML es muy sencillo y es el siguiente:
<html>
<head>
    <title>Ejemplo Late Binding</title>
    <script src="ClientGlobalContext.js.aspx" type="text/javascript"></script>
    <script src="new_Sdk.Soap.min.js"></script>
    <script src="new_Testing.js"></script>
    <script type="text/javascript">
        function Ejemplo() {
            document.getElementById("messages").innerHTML = "";
            writeToPage("Ejecutando Ejemplo Late Binding ");
            createAccount();
        }
    </script>
     <style>
            body {font-family: "Segoe UI";}
            table, th, td {border: solid 1px black;border-collapse: collapse;}
        </style>
</head>
<body>
    <button id="start" onclick="Ejemplo()">Ejecutar Ejemplo</button>
    <ol id="messages" />
</body>
</html>



Lo básico es la llamada a “createAccount” que es el que llama a mi código Javascript dentro de new_Testing.js.


Para el desarrollo con esta librería, recomiendo añadir en los ficheros Javascript la siguiente referencia, que permite trabajar y tener disponible el IntelliSense de toda la funcionalidad:


image


Si quiere trabajar con “entidades” con “late-bound”, dispongo de un objeto “Entity”, y es muy posible que a partir de aquí ya les empiecen a sonar temas ya que es lo casi mismo que con C#:

var account = new Sdk.Entity("account");

Si quiere crear una Cuenta con algunos datos, lo puedo hacer primero creando los datos de la entidad:

    account.addAttribute(new Sdk.String("name", name));
    account.addAttribute(new Sdk.Boolean("creditonhold", false));
    account.addAttribute(new Sdk.Double("address1_latitude", 47.638197));
    account.addAttribute(new Sdk.Double("address1_longitude", -122.131378));
    account.addAttribute(new Sdk.Int("numberofemployees", 100000));
    account.addAttribute(new Sdk.String("description", "This is a description. \n It has several lines. \n This is the third line."));
    account.addAttribute(new Sdk.Money("creditlimit", 2000000));
    account.addAttribute(new Sdk.OptionSet("accountcategorycode", 1)); //Preferred Customer

Esto es un poco “molesto”, ya que para cada tipo de dato, hayq eu añadir el “SDK.<type>” para crear los objetos. La librería nos ofrece una forma para poder simplificar esto, en donde, primero me defino los metadatos con los que trabajar, y luego mediante un método llamado “initializeEntity”, podemos trabajar de la siguiente manera:

    account.setValue("name", "Sample Account 001");
    account.setValue("creditonhold", false);
    account.setValue("address1_latitude", 47.638197);
    account.setValue("address1_longitude", -122.131378);
    account.setValue("numberofemployees", 100000);
    account.setValue("description", "This is a description. \n It has several lines. \n This is the third line.");
    account.setValue("creditlimit", 2000000.00);
    account.setValue("accountcategorycode", 1); //Preferred Customer

Es hacer lo mismo, pero de dos formas diferentes. Obviamente, la segunda parece ser algo mas limpia para mi gusto ya que trabajamos directamente con los tipos nativos de Javascript.

Luego ya la funcionalidad es sencilla, ya que una vez definidos estos objetos podemos hacer la llamadas a lo que necesitemos por ejemplo:

Create:

Sdk.Async.create(
     account,
     retrieveAccount);

Retrieve:

Sdk.Async.retrieve(
     "account",
     createdAccountId,
     getColumnSet(accountColumns),
     updateAccount );

Delete (se llama “del” ya que delete puede ser una palabra reservada de Javascript):

Sdk.Async.del("account", createdAccountId,
        deletedAccount_End);
Toda la solución, la dejo compartida como no administrada aquí.
Espero les sirva como introducción ya que la librería es muy completa, un abrazo!