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!

No hay comentarios:

Publicar un comentario