lunes, 6 de agosto de 2012

DynamicForm 2.1: Selección múltiple de Lookups

En Microsoft Dynamics CRM 2011, como sabrán existen algunos campos de tipo Lookup en los que se pueden seleccionar varios valores, pero esta funcionalidad no es genérica y solo está habilitada para algunos campos por ejemplo los partylist (como los de asistentes de una cita o destinatarios de un Email, etc.).
Bien, la idea de hoy es añadir una funcionalidad genérica, que permita de manera sencilla seleccionar varios valores de una tabla relacionada.
El resumen de la entrega de hoy:
Formulario: Cuenta
Evento: OnLoad()
Atributos: (new_paises).
Funcionalidad: Al cargar el formulario, en un IFRAME se crea dinámicamente un listado de checkboxes con los valores de los países disponibles. Mientras se van seleccionando o eliminando los valores de los checkboxes, en un campo ntext, se concatenan los valores seleccionados con sus Guids y sus nombres. 
Todo este ejemplo estará como siempre disponible en Codeplex:
http://elblogdedynamicscrm.codeplex.com/documentation
En el XML, he añadido una nueva acción:
   1: <action type="multipleselect" attributename="new_paises" entityname="new_pais" 

   2:  entityid="new_paisid" entityattributename="new_name" iframename="IFRAME_paismultiple"/>

La nueva acción se llama “multipleselect” y como su nombre lo indica. Los atributos son los siguientes (iguales al de las versiones anteriores de lookuptocombo y lookuptoradio): 
  • attributename: nombre del campo de tipo ntext en donde se concatenan los valores en el formulario
     
  • entityname: nombre de la entidad a donde apuntan los checkboxes
     
  • entityid: nombre del campo clave de la entidad
     
  • entityattributename: campo nombre de la entidad que será utilizado para enseñar los valores del desplegable.
     
  • iframename: nombre del iframe donde se incluirá el listado de checkboxes dinámicamente.
He creado un nuevo método que realiza las acciones que se llama MultipleSelect:

   1: function MultipleSelect(attributename,entityname,iframename,entityid,entityattributename)

   2: {
   3:     var result=RetrieveEntitiesByFilter (entityname, "statecode", "Active", entityid+","+
   4:         entityattributename, false, "");
   5:     var i=0;
   6:     var svalue="";
   7:     var svalue=getValue(attributename);
   8:     if (!svalue)
   9:     {
  10:         svalue="";
  11:     }
  12:     var HTMLselect="<form style='font-size:11Px;font-family:Segoe UI, Tahoma, Arial;'>";
  13:     for (i=0;i<result.recordCount;i++)
  14:     {
  15:         var selected="";
  16:         var name=eval("result[i]."+entityattributename);
  17:         var id=eval("result[i]."+entityid);
  18:         
  19:         if (svalue.indexOf(id)!=-1)
  20:         {
  21:             selected="CHECKED";
  22:         }
  23:        
  24:         var js="onclick='parent.ActualizoSelects(document,"+result.recordCount+",
  25:                     document.all.attributename.value);'"
;
  26:         HTMLselect+="<input "+js+" type='checkbox' name='opt"+i+"' id='opt"+i+
  27:                 "' nombre='"+name+"' value='"+id+"' "+selected+" /> "+name+"<br />";
  28:     }
  29:     HTMLselect+="</form> ";
  30:     HTMLselect+="<input type='hidden' id='entityname' name='entityname' 
  31:         value='"
+entityname+"'/><input type='hidden' id='attributename'
  32:         name='attributename' value='"
+attributename+"'/>";
  33:     var myIframe=document.getElementById(iframename);
  34:     myIframe.contentWindow.document.body.innerHTML = HTMLselect;
  35:     myIframe.contentWindow.document.body.style.margin="0px;";
  36: }

El funcionamiento es muy similar a los looktocombo y lookuptoradio pero en este caso cambia un poco el funcionamiento en cuanto a la función que se llama para realizar los cálculos que es “ActualizoSelects()”:


   1: function ActualizoSelects(doc,cant, attributename)
   2: {

   3:     var str='';var i=0;
   4:     for (i=0;i<cant;i++)
   5:     {        
   6:         if (doc.getElementById('opt'+i).checked)
   7:         {
   8:             if (i!=0)
   9:             {
  10:                 str+="\n";
  11:             }
  12:             str+=doc.getElementById('opt'+i).value+';'+doc.getElementById('opt'+i).nombre;
  13:         }
  14:     }
  15:     setValue(attributename,str);
  16: }
Esta función recorre todos los checkboxes y se genera un “string” concatenando los valores con sus ids y nombres en formato .csv.

El ejemplo y la solución completa funcionando la he dejado como siempre en CodePlex.

En el formulario la funcionalidad sería como lo siguiente:

image


La idea es que en el campo “new_paises” se concatena esa cadena de caracteres en formato .csv. De esta manera, se puede utilizar también este campo en las búsquedas avanzadas.

No hay comentarios:

Publicar un comentario