MSCRM 4.0: Lookup falso

16 11 2010

Con la llegada de la versión de MSCRM 4.0 algunos pensamos que ya podíamos olvidarnos definitivamente de lo que llamábamos Lookup falso. Para los que no lo recordéis en la versión MSCRM 3.0, no era posible crear más de una relación 1:n entre dos entidades. Esto suponía que si se quería establecer más de una relación 1:n entre dos entidades se debía crear un lookup falso. La técnica consistía en crear dos atributos de texto en la entidad hija de la relación virtual, uno de los cuales ocultábamos y el otro lo substituíamos con el código HTML de un lookup (mediante el outterHTML).

Pues bien, una vez más debemos retomar esa técnica y actualizarla!!! En MSCRM 4.0 podemos establecer más de una relación 1:n entre dos entidades con lo que aparentemente no nos haría falta crear este tipo de lookups pero, ‘al loro’, que tenemos ciertas entidades a las que no podemos crearles ninguna relación 1:n!!! En concreto me refiero a las entidades de actividades (fax, phone…). Por lo que, si queremos añadir una relación 1:n entre una de esas entidades (por ejemplo, la entidad fax) y una entidad personalizada, debemos recurrir a esa solución.

Recientemente hemos aplicado la solución del lookup falso actualizada para MSCRM 4.0 en el siguiente entorno. En una integración de MSCRM 4.0 integramos un sistema de envío de fax desde MSCRM 4.0. Este nuevo sistema permite enviar fax individuales o de forma masiva (en algún otro artículo explicaré el funcionamiento de este sistema de envío de fax). Los servicios de envío de fax permiten el envío de archivos adjuntos como contenido del fax. En el caso de los fax individuales podríamos utilizar las notas (archivos adjuntos) inherentes a la entidad fax. Sin embargo, para los envíos masivos (a través de una campaña de marketing), MSCRM no nos permite adjuntar archivos!!!. Por tanto, ideamos un sistema en el que el usuario puede crear un documento adjunto (en una entidad personalizada con notas) y asociar ese documento a la plantilla de fax de la actividad de la campaña de marketing. Pero el problema surgió cuando no pudimos crear la relación n1:n entre la entidad de documento adjuntos y la entidad fax. Pues bien en esta situación creamos un lookup falso en el formulario de detalle de la entidad fax que permite que el usuario pueda seleccionar un documento para adjuntar al fax.

Como se observa en la figura, el lookup falso que hemos añadido no se distingue de un lookup ‘verdadero’ fruto de una relación 1:n. En este caso el lookup falso permite seleccionar un registro de la nueva entidad Attachment (con la que no podíamos crear la relación 1:n).

Para implementar este sistema tan sólo ha sido necesario utilizar las funciones siguientes:

SaveLookupValue = function(destinationfieldId, namefieldId)
{
document.getElementById(namefieldId).DataValue = '';
var lookupItem = document.getElementById(destinationfieldId).DataValue;
if (lookupItem != null) {
document.getElementById(namefieldId).DataValue = lookupItem[0].name;
}
}

CreateFalseLookup = function(txtboxId, namefieldId, entitySchemaName, entityName, entityCode, custom) {
HideField(namefieldId);
var val = document.getElementById(txtboxId).DataValue;
var txtboxIdComillas = "'" + txtboxId + "'";
var namefieldIdComillas = "'" + namefieldId + "'";
var htmlLookup = '<td id="' + txtboxId + '_d">';
htmlLookup += '<table style="table-layout: fixed" class="ms-crm-Lookup" cellSpacing="0" cellPadding="0" width="100%">';
htmlLookup += '<tbody><tr><td><div style="width: 100%" class="ms-crm-Lookup " ime-mode="auto"></div>';
htmlLookup += '<label class="ms-crm-Hidden-NoBehavior" for="' + txtboxId + '_ledit">' + entityName + '</label>';
htmlLookup += '<input id="' + txtboxId + '_ledit" class="ms-crm-Hidden-NoBehavior" maxLength="1000" ime-mode="auto" {95919BE0-C436-4eab-8083-096E94826667}="" value="" /></td>';
htmlLookup += '<td class="Lookup_RenderButton_td" width="25">';
htmlLookup += '<img style="ime-mode: auto" id="' + txtboxId + '" onchange="SaveLookupValue(' + txtboxIdComillas + ',' + namefieldIdComillas + ');" class="ms-crm-Lookup" title="Haga clic para seleccionar un valor para ' + entityName + '." alt="Haga clic para seleccionar un valor para ' + entityName + '." src=<a href="http://montau.cambrasabadell.org/_imgs/btn_off_lookup.gif&quot;">http://<server>/_imgs/btn_off_lookup.gif</a> resolveemailaddress="0" showproperty="1" autoresolve="1" defaulttype="0" lookupstyle="single" lookupbrowse="0" lookuptypeIcons="/CAMSBD/_Common/icon.aspx?objectTypeCode=' + entityCode + '&iconType=GridIcon&inProduction=1&cache=1" lookuptypenames="' + entitySchemaName + ':' + entityCode + '" lookuptypes="10160" />'; //req="0"
if (custom)
htmlLookup += '<a title="Haga clic para seleccionar un valor para ' + entityName + '." onclick="previousSibling.click();"
href="<a href="http://montau.cambrasabadell.org/CAMSBD/userdefined/edit.aspx?etc=">http://<sever>/<orgname>/userdefined/edit.aspx?etc=</a>' + entityCode + '#"></a>';
else
htmlLookup += '<a title="Haga clic para seleccionar un valor para ' + entityName + '." onclick="previousSibling.click();" href="<a href="http://montau.cambrasabadell.org/CAMSBD/edit.aspx?etc=">http://<server>/<orgname>/edit.aspx?etc=</a>' + entityCode + '#"></a>';
htmlLookup += '</td></tr></tbody><table>';
var obj = document.getElementById(txtboxId);
if (obj != null) {
obj.outerHTML = htmlLookup;
}
var textField = document.getElementById(namefieldId);
if (textField == null) return false;
var lookupData = new Array();
var lookupItem = new Object();
lookupItem.typename = entitySchemaName;
lookupItem.id = val;
lookupItem.name = textField.DataValue;
lookupData[0] = lookupItem;
document.getElementById(txtboxId).DataValue = lookupData;
}

CreateFalseLookup('new_attachmentid', 'new_attachmentidname', 'new_attachment', 'Attachment', '10160', true);

Si bien este código ha sido particularizado para la integración MSCRM que nos ocupaba, entendemos que es de fácil adaptación a cualquier otro entorno que se requiera.





MSCRM 2011: Lookup filtrado

15 11 2010

Por fin, ya está aquí… ya llegó… el esperado lookup filtrado de MSCRM 2011. Como os podréis imaginar ha sido una de las primeras pruebas que he realizado en la versión Beta. Para los que todavía no dan crédito, ahí va un primer ejemplo de configuración del filtro de lookup. El ejemplo que os presento a continuación consiste en filtrar el lookup del atributo contacto principal de la entidad account para que tan solo muestre los contactos que tengan como cuenta principal la cuenta que se está editando. Evidentemente al crear la cuenta nunca mostrará ningún contacto pero, una vez creados los contactos de la cuenta, en el atributo contacto principal solo se mostraran los contactos de la empresa.

Como veréis en la siguiente imagen, al mostrar la selección del lookup sin filtrar, se muestran todos los contactos sean o no de la empresa (funcionamiento idéntico a la versión 4.0):

Como podéis comprobar en la siguiente imagen, la cuenta tan sólo tiene tres contactos asociados:

Para filtrar el lookup he editado la entidad account (lo he editado en una nueva solución… ya os hablaré del tema soluciones en otro post) y, en el formulario principal (ahora podemos tener varios formularios por entidad, también hablaremos de ello en otra ocasión… uffff cuanto trabajo que nos viene). En este caso he editado la propiedades del atributo Contacto principal del siguiente modo:

He activado el filtro Mostrar solo registros donde el Cleinte principal de los contactos contenga el registro actual. He desactivado las opciones de Permitir a los usuarios desactivar el filtro, Mostrar el cuadro de búsqueda y Habilitar la selección de vista en el dialogo de búsqueda para forzar que tan sólo se pueda seleccionar un contacto de la empresa. El resultado, fantástico, al seleccionar el lookup compruebo que tan sólo se muestran los contactos de la empresa… increibleblebleble!!!

Intentando ser un poco ‘malo’, he intentado introducir el nombre de un contacto que a pesar de existir, no pertenece a la cuenta, directamente en el lookup, sin abrir la selección y… funcionó, no encontró ningún contacto:

En fin, como os decía anteriormente, se no viene mucho trabajo encima, por suerte, trabajo agradable visto lo visto. Otras pruebas que he realizado y espero poder compartir con todos vosotros:

· Crear un Proceso de dialogo (novedad de la 2011)

· Crear varios formularios en una misma entidad y asignarlos a distintos roles

· Utilizar un recurso JavaScript en los eventos de los formularios

· Linkar una biblioteca de documentos del QHome a una cuenta

· Crear una nueva entidad con posibilidad de enviar correo electrónico (impresionante!!! En la de lios que nos ha metido esta restricción en versiones anteriores…)