Impedir grabar una cita en dependencia del valor del tipo en CRM2011
Primeramente vamos a crear una libreria "Apointment_main_libnrary.js" y la vamos a adjuntar a la lista de los archivos que utliza la entidad "Appointment". Dentro de esta libreríoa crearemos la funcion "Form_Onsave" y "Form_Onload" que serán llamadas desde el formulario en los eventos OnSave y OnLoad del formula.rio Main del mismo.

En la figura anterior se muestra como se activa la librería y la llamada al metodo que contiene en el evento OnSave del formulario.
Para el evento OnSave, en el detalle del mismo, en la pantalla de habilitar el evento, marcamos "Pass execution context as first paramenter" debido a que necesitamos saber que el evento OnSave se esta ejecutando en nuestro metodo y poder invalidarlo en caso que nuestras condiciones no se cumplan con la sentencia en javascript "executionObj.getEventArgs().preventDefault(); "

Una vez que realizados los cambios, guardamos el formulario y lo publicamos para que los cambios surtan efecto. Más adelante codificamos nuestra funcion dentro de la libreria anteriormente mencionada tal y como aparece a continuación:
function Form_onsave(executionObj)
{
// En la pantalla del On_Save tiene que estar activo el "Pass execution object as first parameter"
// Autor: lazaro Castro
var invalidType = SaveNoOther();
if (invalidType == true)
{
alert("Appointment cannot has [Other] category. Please change type of appointment category");
executionObj.getEventArgs().preventDefault();
}
}
En la funcion anterior se llama a la funcionSaveNoOther para realice las operaciones en función del estado en que se encuentre el formulario
function SaveNoOther()
// Funcion: En dependencia del estado del formulario se actua para resear los valores del "new_appointmenttype"
// o se impide grabar si el valor tiene codigo 20
{
var CRM_FORM_TYPE_UPDATE = 2;
var CRM_FORM_TYPE_CREATE = 1;
var noOther = false;
var tipoAppointment = Xrm.Page.ui.controls.get("new_appointmenttype");
var options = tipoAppointment.getAttribute().getOptions();
switch (Xrm.Page.ui.getFormType()) {
case CRM_FORM_TYPE_CREATE:
tipoAppointment.clearOptions();
for (var i = 0; i < options.length -2; i++){
if (i != 20){
tipoAppointment.addOption(options[i]);
}
}
break;
case CRM_FORM_TYPE_UPDATE:
if (getValue("new_appointmenttype") == 20){
noOther = true;
}
break;
}
return noOther;
}
En el metodo Form_onLoad() solo introducimos una llamada al metodo SaveNoOther para que resetee la lista desplegable en para los casos de que el fomulario sea nuevo.
function Form_onload()
{
Código anterior…
SaveNoOther();
}
En la pantalla anterior puede observarse que para los nuevos Appointments ya no se muestra el tipo "Other" antiguo, sin embargo si se muestra para los antiguos Appointments que estan clasificados por ese concepto.
