¿Cómo guardar campos calculados en Microsoft CRM 3.0?

Gracias a la capacidad que nos proporciona Microsoft CRM 3.0 para crear campos en una entidad, y a la posibilidad de utilizar Java Script para manejar los eventos de cambio de los campos, resulta bastante sencillo crear un campo calculado en cualquier formulario de entidad personalizable o personalizada de la herramienta.


Vamos a poner un ejemplo para verlo más claro. Imaginad que creamos una entidad que en su formulario principal tiene tres campos: base, impuesto, total. El destino de esos campos será almacenar el importe base, el porcentaje de impuestos a añadir sobre la base y el importe total (impuestos incluidos). Bien, como somos unos buenos personalizadores de Microsoft CRM queremos facilitar la vida a los usuarios y que el importe total se calcule de forma automática en función de los valores introducidos en base e impuesto. Así que decidimos incluir código Java Script en el evento onChange de los campos base e impuesto para que se auto calcule el valor del total al introducir valores en estos campos. Un código tal que así:


Base onChange:


var base = crmForm.all.new_base.DataValue;
var impuesto = crmForm.all.new_impuesto.DataValue;

if(impuesto!=null)

   crmForm.all.new_total.DataValue=base+(base*impuesto/100);
}


Impuesto onChange:


var base = crmForm.all.new_base.DataValue;
var impuesto = crmForm.all.new_impuesto.DataValue;

if(base!=null)

   crmForm.all.new_total.DataValue=base+(base*impuesto/100);
}


Y además, para evitar que los usuarios hagan trampa, ponemos el campo total como deshabilitado y así no podrá ser modificado manualmente.



Parece que ya tenemos todo listo ¿no? Pues nada probarlo, y veréis como hay un pequeño problema.


El Problema y la Solución


Bueno, el problemilla está en que Microsoft CRM, que es muy listo, sólo toma los campos que han sido modificados por el usuario cuando pulsamos guardar, ya que así se ahorra esfuerzo. Y como nuestro campo total no está entre ellos, está deshabilitado, pues no lo guarda. No tenéis más que hacer la prueba. Este problema es extensible a todos los campos que fijemos como inhabilitados en el formulario.


Pero no nos tiremos de los pelos aún… Los chicos del equipo del CRM nos han dejado una forma sencilla de forzar el guardado de un campo aunque este no haya sido modificado por el usuario o se encuentre deshabilitado. No tenemos más que utilizar la propiedad ForceSubmit de los campos, y solucionado. Vamos a ver como lo pondríamos en el código para nuestros campos de ejemplo (crmForm.all.new_total.ForceSubmit=True;):


Base OnChange:


var base = crmForm.all.new_base.DataValue;
var impuesto = crmForm.all.new_impuesto.DataValue;

if(impuesto!=null)

   crmForm.all.new_total.DataValue=base+(base*impuesto/100); 
   crmForm.all.new_total.ForceSubmit=true;
}


Impuesto OnChange:


var base = crmForm.all.new_base.DataValue;
var impuesto = crmForm.all.new_impuesto.DataValue;

if(base!=null)

   crmForm.all.new_total.DataValue=base+(base*impuesto/100); 
   crmForm.all.new_total.ForceSubmit=true;
}



Estas pequeñas cosas son las que hacen grande a una herramienta como Microsoft CRM. ¿Qué os parece? ¿Habéis tenido alguna experiencia traumática con Java Script para personalizar él CRM? Yo personalmente no lo quiero mucho, pero bueno.


Un saludo, Marco Amoedo


PD: He corregido un pequeño problemilla detectado por Stefano Spodek, en vez de True en mayúsculas debería aparecer true todo en minúsculas, maravillas que tiene el copiar código a procesadores de texto. Gracias por el aviso.

9 comentarios en “¿Cómo guardar campos calculados en Microsoft CRM 3.0?”

  1. Hola Stefano,

    Efectivamente hay un pequeño error, donde pone True debería ser true, en minúscula en vez de en mayúscula.

    Ya lo corrijo en el post, muchas gracias por el aviso.

    Un saludo

  2. ¿Has utilizado el código tal cual? ¿Podrías mostrarme el código que utilizas?
    Y comprueba que en el explorer no te sale ningún error de JavaScript (símbolo amarillo en la esquina inferior izquierda).
    Si quieres utiliza el formulario de email del blog, o los foros, que es más cómodo que los comentarios.
    Un saludo.

  3. Hola, Marco

    Cuando utilicé ese código poniendo true o True, me dió un mensaje de error que especificaba que esa función sólo acepta valores numéricos o nulo. Así que probé con 1 para true i funciona correctamente.

    Saludos!

  4. Tienes que forzarlo con forcesubmit.

    Pero yo hice algo paracido pero lo tuve que cambiar por un calculo en un callout debido a que como el calculo se hace en el cliente la configuracion no era la misma y muchas veces alteraba el valor.

    Asi que yo prefiero hacerlo en el callout postcreate o postupdate aunq digan q puede ser lento 😀

  5. Hola! Muchas gracias por tu blog, de muchisima ayuda!

    Una duda respecto a esto.

    Se hacer eventos, y lo he hecho mil veces el sumar, restar, multiplicar campos entre si, pero no se porque estoy teniendo problemas con una entidad, donde al multiplicar dos campos float me sale “NaN” Not a Number.

    Porque sera? como se convierte a numerico?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *