10 enero 2012

Consulta a entidades CRM mediante llamadas REST

Innovar Tecnologías ©

El objetivo de este ejemplo
es consultar asíncronamente la entidad “Actividades” con opciones de consulta personalizables



Este ejemplo hace uso de los siguientes recursos web:


· HTMLPage.htm
· restDataRetrieve.js
· json2.js
· SDK.REST.js


Lo primero que haremos será crear una sencilla página html para subirla a nuestro servidor de Dynamics CRM como recurso web

- La página web constará de los siguientes elementos:

- 1 elemento Select con 3 childNodes Option para seleccionar qué tipo de Actividad que deseamos recuperar

- 2 elementos de radio excluibles entre sí para seleccionar el estado de las Actividades que buscamos

- 2 elementos de texto para indicar el intervalo de fechas de las actividades que deseamos recuperar

- 1 elemento de texto para indicar el número máximo de registros que deseamos recuperar

A continuación subiremos la página .htm a nuestra biblioteca de recursos web de nuestro servidor de Dynamics

Seguidamente
subiremos las siguientes librerías necesarias para nuestro proyecto:

- ClientGlobalContext.js.aspx : esta librería nos dan acceso al contexto global de la sesión activa

- new_json2.js : esta librería habilita el uso de notación json

- new_sdkrest.js : en esta librería está implementada la función parametrizada SDK.REST.retrieveMultipleRecords

Edición del HTML en servidor para añadir las referencias a las librerías utilizadas:



Observe los nombres mediante los cuales referenciamos a las librerías, todos comienzan con el prefijo new_, pues es como de hecho están almacenados en el servidor, accesibles en todo momento en la ruta:


- [nuestroservidordynamics]/WebResources/new_{nuestroarchivo}.js


Ahora es el momento para codificar nuestro archivo de JavaScript principal, restDataRetrieve.js

Este archivo se compone de las siguientes funciones:

- Función in line para el manejo del evento de carga completa del documento, document.onreadystatechange

- Función getIdUsuario(), para utilizar el método de contexto getUserId, que devuelve el guid del usuario actual

- Función bringActivities(), la cual comprobará las opciones de consulta marcadas, creará una consulta de rest dinámica, y llamará a la función parametrizada de la librería SDK.REST.js SDK.REST.retrieveMultipleRecords

Y de las siguientes variables globales:

- bringButton: es el botón que realizará la llamada

- tableSpan: es el span que contendrá el elemento table que crearemos dinámicamente

- tabla: es la tabla en sí creada dinámicamente

- userid: es el id del usuario activo en la sesión

Vayamos paso a paso en la implementación del código de este archivo:

document.onreadystatechange = function () {
      if (document.readyState == "complete") {
         bringButton = document.getElementById("btnBring");
         bringButton.onclick = bringActivities;

         tableSpan = document.getElementById("tableSpan");

         getUserId();
      }
}


=> en el momento en que el documento se haya cargado completamente, asignaremos valores a las variables bringButton, al cual también añadiremos su manejador onclick, y a la variable tableSpan
=> es en este momento cuando identificamos al usuario activo llamando a nuestra función getIdUsuario

function getIdUsuario() {
  var context = GetGlobalContext();
  userid = context.getUserId();
}

function bringActivities() {

  userSpan.innerHTML = userid;

  var numActivities = document.getElementById("txtNumero").value;
  var tipo;
  switch (document.getElementById('Select1').selectedIndex) {
    case 0:
      tipo = "task";
      break;
    case 1:
      tipo = "phonecall";
      break;
    case 2:
      tipo = "opportunityclose";
      break;
  }

  var open;
  if (document.getElementById('RadioButtonList1_0').checked)
    open = "1";
  else
    open = "0";
 
  var fechaDesde = document.getElementById('txtDesde').value;
  var fechaHasta = document.getElementById('txtHasta').value;
 
  var consulta;
 
  consulta = "$select=OwnerId,ActivityTypeCode,StateCode,CreatedOn";
  consulta += "&$filter=ActivityTypeCode%20eq%20'" + tipo + "'";
  consulta += "%20and%20StateCode/Value%20eq%20" + open;
  consulta += "%20and%20CreatedOn%20ge%20datetime'" + fechaDesde + "'";
  consulta += "%20and%20CreatedOn%20le%20datetime'" + fechaHasta + "'";
  consulta += "%20and%20OwnerId/Id%20eq%20(guid'" + userid + "')";
  consulta += "&$top=" + numActivities;
  consulta += "&$orderby=CreatedOn%20desc";
 
  tabla = "<TABLE><TR><TD>OwnerId.Id";
  tabla += "</TD><TD>OwnerId.Name</TD>";   
  tabla += "<TD>ActivityTypeCode</TD><TD>";
  tabla += "StateCode.Value</TD><TD>CreatedOn";
  tabla += "</TD></TR>";

  SDK.REST.retrieveMultipleRecords(
    "ActivityPointer",
    consulta,
    function (resultados) {
      var actividades= resultados;
      for (var i = 0; i < numActivities; i++) {
        if (actividades[i]) {
        tabla = tabla + "<TR><TD>";
        tabla = tabla + actividades[i].OwnerId.Id;
        tabla = tabla + "</TD><TD>";
        tabla = tabla + actividades[i].OwnerId.Name;
        tabla = tabla + "</TD><TD>";
        tabla = tabla + actividades[i].ActivityTypeCode;
        tabla = tabla + "</TD><TD>";
        tabla = tabla + actividades[i].StateCode.Value;
        tabla = tabla + "</TD><TD>";
        tabla = tabla + actividades[i].CreatedOn;
        tabla = tabla + "</TD></TR>";
      }
    }
  },
  function () {
    alert("error en bring activities");
  },
  function bringComplete() {
    tabla = tabla + "</TABLE>";
    tableSpan.innerHTML = tabla;
  });
}


- Una vez tenemos los valores que usaremos en la llamada de rest, procedemos a crear el valor de la llamada rest en sí:

La llamada rest de nuestro ejemplo se compone de 4 cláusulas:


· select
· filter
· top
· orderby


- Cláusula select: para la proyección de la consulta

- Cláusula filter: equivalente a la cláusula where en dialectos sql

- Las cláusulas top y orderby, limitan el número de registros devueltos y los ordenan, respectivamente

- La siguiente línea asigna el valor inicial a la variable tabla, para su posterior inserción en la variable tableSpan, iniciada con la carga del documento en el punto anterior, esta línea crea la tabla y sus columnas de cabecera

A continuación iniciamos la llamada en sí, mediante la llamada a la función retrieveMultipleRecords de la librería SDK.REST.js, La firma de este método es la siguiente:

SDK.REST.retrieveMultipleRecords(
  "nombreEsquemaEntidad", 
  "llamadaREST", 
  función successCallBack, 
  función errorCallBack, 
  función OnCompleteCall);



Una vez codificado nuestro archivo restDataRetrieve.js, procedemos a incluirlo en nuestro servidor de Dynamics CRM como recurso web, y añadiremos su referencia en nuestra página HTMLPage.htm



_


Desde la comunidad de developers de Dynamics CRM, queremos agradecer sus contribuciones a los creadores de los siguientes blogs y sitios web:

- Gareth Tucker, de Microsoft CRM blog

http://gtcrm.wordpress.com/2011/02/22/adding-selection-criteria-to-rest-queries/

- Siva´s Dynamics CRM 2011 blog

http://dynamicscrm2011.wordpress.com/tag/crm-2011-web-resource

- Y a los siguientes sitios web de documentación oficial sobre CRM 2011

http://msdn.microsoft.com/en-us/library/gg309461.aspx


Desde Innovar Tecnologías
esperamos que este documento les sea de ayuda en su desarrollo

Web de la empresa

No hay comentarios:

Publicar un comentario