Como Resolver Problemas de Falla de Script durante la Actualización (Upgrade) de Microsoft Dynamics CRM

Como equipo de soporte deseamos que la actualización (upgrade) a Microsoft Dynamics CRM sea una experiencia agradable para usted. Muestra de ello es la liberación de un paquete acumulativo de actualizaciones para Microsoft Dynamics CRM On-Premise así como la actualización del servicio para Microsoft Dynamics CRM Online el cual incluirá cambios importantes de la aplicación web para que sea soportado con toda una variedad de navegadores,

Este cambio aumentará el número de usuarios y organizaciones que utilizarán Microsoft Dynamics CRM. Representando una oportunidad para quienes ofrecen soluciones que trabajan con Microsoft Dynamics CRM. Esta oportunidad conlleva la responsabilidad de asegurar que aquellas soluciones continuarán funcionando después de aplicar dicha actualización en las organizaciones actualmente utilizadas. Para ayudar a que todos obtengan buenos resultados, quisimos ofrecer un aviso previo acerca de los posibles problemas identificados en una investigación hecha con el uso de scripts así como guías para resolver tales dificultades.

Microsoft Dynamics CRM ofrece una interfaz de programación de aplicaciones (API) para la elaboración de scripts de clientes para extender la interfaz de usuario basada en Internet utilizando EcmaScript/JavaScript. Junto con este beneficio, ofrecemos ejemplos de código y mejores prácticas documentadas para simplificar el desarrollo y facilitar actualizaciones futuras. Cuando se utiliza código JavaScript en Dynamics CRM, es posible que se utilicen métodos no soportados que dejen de funcionar o causen un error durante la actualización. La mejor defensa contra tales situaciones es siempre utilizar APIs soportadas según se documentan en las Herramientas de desarrollo de software para Microsoft Dynamics CRM 2011 y Microsoft Dynamics CRM Online.

Sin embargo, también estamos conscientes de que usted tiene requerimientos comerciales que deben ser cumplidos, y mantenerse dentro de los límites de lo que es soportado a veces requiere el uso de métodos no soportados. En ocasiones, estos métodos funcionarán y continuarán funcionando con versiones de mantenimiento y actualizaciones, pero no hay una garantía. El riesgo que usted corre al hacerlo es que su código pueda depender de la estructura subyacente de la página o métodos que no estaban destinados al uso general, dado que la estructura de la página puede cambiar con una actualización sin previo aviso.

Con la asistencia extendida para navegadores realizamos un gran número de cambios internamente pero tomamos medidas para asegurar que todas las APIs soportadas continúen funcionando. Algún código no soportado que funcionó hasta ahora podrá dejar de funcionar durante esta actualización. Si dispone de un código provisto por un socio o como parte de una solución que adquirió, ahora es el momento de verificar con ellos si lo examinaron para asegurar que funcione correctamente con estos cambios. Si tiene un código que aplicó a su organización, es hora de revisarlo y averiguar si se utilizaron métodos no soportados.

La mejor manera de determinar si existe un problema es examinar su código utilizando la versión beta. La versión beta es principalmente para desarrolladores y socios, pero cualquier persona puede descargar el software.

Previendo la necesidad de revisar el código existente, recientemente realizamos un análisis de las bibliotecas de JScript que utilizan algunos de nuestros clientes de Microsoft Online, e identificando código del que sabemos que generará errores o simplemente no funcionará. La Herramienta de Validación de Códigos Personalizados Microsoft Dynamics CRM 2011 puede ayudar a identificar áreas problemáticas.

Los siguientes elementos representan los tipos de problemas que detectará la herramienta de validación de códigos personalizados. Esta lista no es exhaustiva, simplemente ofrece algunos ejemplos de los tipos más comunes de cosas que pueden presentar problemas.

 

Ejemplos:

  • getElementById
  • Problemas con crmForm:
    • crmForm.SetFieldReqLevel
    • crmForm.SubmitCrmForm
    • crmForm.detachCloseAlert
    • crmForm.IsValid
    • crmForm.<attribute name>.Clear
  • Problemas con crmGrid
    • crmGrid.innerGrid
    • crmGrid.GetParameter
  • Problemas con Lookup Controls
    • LookupControl.AddParam
    • LookupControl.AddItems

 

getElementById

Tal como lo indica el nombre, esta función DOM sirve para tener acceso a un elemento de la página y es utilizado con frecuencia por la mayoría de los desarrolladores de páginas web. Sin embargo, debido a que el modelo de objetos Xrm.Page proporciona la manera soportada de tener acceso a elementos de forma, el uso de la función getElementById debería examinarse con detenimiento.

No hay problema de utilizar getElementById para tener acceso de los elementos en los recursos de HTML para la web. Sin embargo, si este método se utiliza para acceder los elementos de aplicación de Microsoft CRM, no hay garantía de que el valor de atributo ID sea el mismo. Cuando cambia, se daña el código que depende de este método para acceder los elementos de aplicación de Microsoft CRM. Esto puede evitarse utilizando la API Xrm.Page.

 

Problemas con crmForm

Anteriormente, los desarrolladores de Microsoft Dynamics CRM 2011 que crean scripts de forma utilizaban la API crmForm para tener acceso a las propiedades de forma. Con Microsoft Dynamics CRM 2011 se desaprobó el uso de la API crmForm. Esto significa que aún es soportada con versiones anteriores, pero recomendamos que no se utilice al desarrollar nuevo código. Para la siguiente versión, crmForm permanece soportada con versiones anteriores, pero solamente para Internet Explorer.

Para una compatibilidad con otros navegadores, es necesario actualizar su código para utilizar la nueva API Xrm.Page. Para tener información acerca de cómo actualizar su código, consulte el tema de Microsoft CRM SDK Actualización de scripts a Microsoft Dynamics CRM 2011.

Asimismo, existen herramientas de terceros que se pueden utilizar para actualizar scripts. Por ejemplo, las herramientas de Dynamics XRM incluyen un convertidor de JavaScript CRM4 a CRM 2011.

Existen otros problemas asociados con crmForm en donde los desarrolladores utilizan propiedades de crmForm no documentadas. A continuación se presentan los problemas de código de los que hemos descubierto fallan, incluso si se está utilizando el Internet Explorer:

 

crmForm.SetFieldReqLevel

Este es el ejemplo de código más común que dejará de funcionar con la siguiente versión. Este método podía utilizarse para crear un campo requerido en Microsoft Dynamics CRM 4.0. La solución es utilizar el método setRequiredLevel con el modelo de objetos Xrm.Page.

 

crmForm.SubmitCrmForm

Este método fue utilizado para guardar registros en CRM 4.0. El método soportado que debe utilizarse es Xrm.Page.data.entity.save. Si desea controlar la manera en la que se guardan los atributos, puede utilizar el método setSubmitMode del objeto de atributos.

 

crmForm.detachCloseAlert

Este método fue utilizando para suprimir el mensaje Guardar cambios al cerrar una forma en donde los datos se modificaron pero no se guardaron. El método getDirty puede utilizarse tanto al nivel de Xrm.Page.data.entity como también por consultar cada atributo. La única manera soportado para suprimir el mensaje Guardar cambios es utilizar el método attribute.setSubmitMode para establecer el modo de enviar a ‘never’ (nunca) para cada atributo que es ‘dirty’ (sin guardar).

 

crmForm.IsValid

Este método se utilizó para revisar si todos los campos requeridos contenían datos. Este método ya no es parte de la aplicación. La solución consiste en utilizar métodos soportados para lograr la misma funcionalidad. Por ejemplo:

 var requiredAttributesWithNullValues = [ ];

   Xrm.Page.data.entidad.attributes.forEach(

   function (attribute, index) {

    if (attribute.getValue() == null && attribute.getRequiredLevel() == "required")

    {
       requiredAttributesWithNullValues.push(attribute);   
    } 
   }  
 );

  
if (requiredAttributesWithNullValues.length > 0) {   
  var message = "The following fields cannot be null:\n";   
  for (var i = 0; i < requiredAttributesWithNullValues.length; i++) {    
   message += requiredAttributesWithNullValues[i].controls.get(0).getLabel() + "\n";   
}   
alert(message);
}

 

crmForm.<attribute name>.Clear

Este método se utilizó para eliminar datos de un atributo. La forma soportada de hacerlo es Xrm.Page.getAttribute("<attribute name>").setValue(null);

 

Problemas con crmGrid

El objeto crmGrid representa un control de cuadrícula (grid). Nunca ha habido funciones soportadas que se pueden llamar directamente sobre este objeto.

Existe tres tipos de cuadrículas (grids):

  • Cuadrículas (grids) de página principal (‘Homepage’) : Estas aparecen en el panel de navegación principal cuando se visualizan listas de registros.
  • Cuadrículas (grids) contextuales: Estas aparecen cuando se utiliza la navegación de forma para ver registros relacionados
  • Subcuadrículas (subgrids) : Estas se encuentran incorporadas dentro de una forma.

 

El único método soportado para cuadrículas (grids) consiste en hacer referencia a un control de subgrid (subcuadrícula) dentro de una forma y utilizar el método refresh (actualizar). No hay una manera soportada para actualizar las cuadrículas (grids) de página principal (‘Homepage’) o contextuales.

 

crmGrid.InnerGrid

Se utiliza para tener acceso a propiedades y métodos de innerGrid (cuadrícula interna). El propósito de este código no soportado parece ser la obtención de texto de campos o contabilización de las filas de una cuadrícula (grid).

La forma soportada para tener acceso a información de los registros en una cuadrícula (grid) aplica al escenario en donde se está agregando un control en el “ribbon” de opciones para realizar alguna acción en los registros en la cuadrícula (grid), eso se logra a través del elemento <CrmParameter> (RibbonDiffXml), el cual puede pasarse a una regla o función JavaScript que controla el comportamiento de un control en el “ribbon” de opciones. Si usted está utilizando crmGrid.innerGrid para tener acceso a los contenidos de una cuadrícula (grid) con el propósito de realizar ciertas acciones en los registros, debería convertir su código para ser ejecutado desde un control del “ribbon” de opciones capaz de capturar estos datos de manera soportado.

 

crmGrid.GetParameter

Hemos encontrado personas que utilizan esta función interna para tener acceso a parámetros para una cuadrícula (grid). Si usted lo está utilizando, debería evaluar cuáles son los datos necesita y si hay maneras alternativas, soportados para lograrlo. Usar <CrmParameter> (RibbonDiffXml) para pasar datos acerca del estado de la cuadrícula (grid) a un comando en el “ribbon” puede ser la solución.}

 

Problemas con Lookup Controls

Algunos ejemplos en donde se utilizan métodos para trabajar con los lookup controls (controles de búsqueda) son los siguientes:

LookupControl.AddParam

Algunas veces se utiliza el método AddParam para agregar parámetros a una búsqueda. La manera soportada de hacerlo es utilizar el método addCustomView.

 

LookupControl.AddItems

El método AddItems se utilizó para añadir elementos a un control de la forma de búsqueda. La manera correcta de hacerlo es utilizando el método setValue. El SDK proporciona un ejemplo de esto. Consulte Set Lookup Attribute Value (establecer el valor del atributo de la búsqueda).

 

 Saludos,

 

Claudia Cisneros

Dynamics CRM Sr. Support Engineer