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