miércoles, 18 de noviembre de 2009

Trabajando con atributos deshabilitados y concatenaciones

En este artículo intentaré comentar como trabajar con atributos deshabilitados en los formularios de CRM.
Para esto lo explicaré con un ejemplo práctico que suele ocurrir mucho en la vida de los proyectos en CRM.
Muchas veces nos vemos en la necesidad de crear entidades para hacer relaciones N-N (entidades intermedias de relación). Un ejemplo sería si tenemos una entidad de "Paises" y queremos relacionar varios paises a las cuentas para determinar el volumen de ventas de cada cliente por paises.
En esta entidad intermendia "Ventas por paises", hay un atributo que es nombre de la entidad "new_name", dicho nombre realmente no tiene mucho sentido, pero es recomendable rellenarlo con algun valor, por ejemplo "Nombre de la cuenta" - "Pais", para que quede algo descriptivo en el nombre del registro.
Para hacer esto deberiamos introducir en el evento "OnChange()":

var oCuenta=crmForm.all.new_accountid.DataValue;
var oPais=crmForm.all.new_paisid.DataValue;

var sCuenta="";
var sPais="";

if (oCuenta!=null) sCuenta=oCuenta[0].name;
if (oPais!=null) sPais=oPais[0].name;

crmForm.all.new_name.DataValue=sCuenta + " - " + sPais;

Además, para dejarlo mas completo, vamos a añadir en el "OnLoad()" y en el "OnSave()" lo siguiente:

crmForm.all.new_pais.FireOnChange();

Adicionalmente, el atributo "new_name" lo vamos a dejar deshabilitado en el formulario.
Esto funcionaría correctamente en la creación, pero si intentamos actualizar el formulario, el atributo "new_name" no se actualiza mas.
Esto ocurre porque los atributos del formulario que estan deshabilitados no son enviados al servidor, aunque hayan sido modificados.

Para solucionar esto, hay que añadir lo siguiente en el evento "OnSave()" del formulario:

if (crmForm.all.new_name.IsDirty)
{
crmForm.all.new_name.ForceSubmit=true;
}

Simplemente estamos preguntando si ese atributo ha sido modificado, y si es así, le decimos al formulario de CRM que envíe la modificación al servidor y actualice el registro.
Mucho cuidado con esto: si ponemos todos los atributos con el ForceSubmit=true, los registros siempre serán actualizados, a pesar de que no haya cambios, lo que provocaría que siempre se disparen los workflows, los plugins relacionados, y actualizaría las fechas de modificación.

Por lo tanto, utilizar el "ForceSubmit", pero con mucho cuidado.

Un saludo!

No hay comentarios:

Publicar un comentario