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