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.