Mostrando entradas con la etiqueta Jscript. Mostrar todas las entradas
Mostrando entradas con la etiqueta Jscript. Mostrar todas las entradas

sábado, 11 de diciembre de 2010

Reordenar NavBar de entidad

Es conocido que para ordenar ítems del navBar existe una opción llamada “Orden de visualización”

No obstante, esta opción sólo está habilitada para las relaciones personalizadas y no para las que son OOTB o para los ítems que creamos por el ISV.

Para estos casos se puede hacer uso de un JScript en el OnLoad y utilizar la función "insertBefore". Este script requiere de los ID de los ítems del NavBar de la entidad (este ID lo podremos obtener utilizando herramientas como IEDevTollbar o simplemente buscando en el código fuente del formulario). En este ejemplo trabajaremos con los ítems Actividades e Historial de la entidad Contactos. En el OnLoad copiar lo siguiente:
var _ActivitiesNavItem = document.getElementById("navActivities").parentNode;
var _ActHistoryNavItem = document.getElementById("navActivityHistory").parentNode;
_ActHistoryNavItem.insertBefore(_ActivitiesNavItem);
Y Esto sería el antes y el después.

CrmForm Jscript con intellisense generator

En ciertas ocasiones hemos deseado o necesitado un editor que cuente con intellisense para desarrollar nuestros JS. Aquí les muestro de un tool que les servirá de mucha ayuda, MS CRM Javascript Intellisense Generator que lo puedes descargar de aquí.

Una vez descargado y ejecutado, nos parecerá una pantalla de conexión.

Una vez conectado, en la parte inferior nos mostrará el nombre de la organización y al lado derecho se mostrará el listado de entidades. (Si seleccionamos una serie de características asociadas a la entidad).
Hacemos clic en el botón “Save” para generar una carpeta con el contenido de características de todas las entidades existentes.

Colocamos la carpeta generada dentro de una solución de Visual Studio y procederemos a abrir el archivo relacionado a la entidad en la cual queramos generas nuestro JScript.

En la parte inferior del archivo abierto ya podremos comenzar a desarrollar nuestros JS con intellisense.

 

domingo, 19 de septiembre de 2010

Limitar el número de registros asociados a una entidad

Partamos del siguiente ejemplo:
Se tiene la entidad personalizada jlc_documento la cual está asociada a las entidades contact y account. Siendo contact y account las entidades que tengan la vista asociada y jlc_documento los lookups. (El lookup creado de la relación contact-jlc_documento es jlc_documentocontactid y el lookup creado de la relación account-jlc_documento es jlc_documentoaccountid)
Se desea poder registrar como máximo 10 jlc_documentos por cada registro de contact y account.
La solución a este problema podría ser la siguiente:

var clienteId;
var nroRegistros;
var authenticationHeader;
var xml;
if (crmForm.FormType == 1) {
    if (crmForm.all.jlc_documentoaccountid.DataValue[0].id != null || crmForm.all.jlc_documentocontactid.DataValue[0].id != null) {
        if (crmForm.all.jlc_documentoaccountid.DataValue[0].id != null) {
            clienteId = crmForm.all.jlc_documentoaccountid.DataValue[0].id;
        }
        else {
            clienteId = crmForm.all.jlc_documentocontactid.DataValue[0].id;
        }

        authenticationHeader = GenerateAuthenticationHeader();
        //Prepare the SOAP message.
        xml = "<?xml version='1.0' encoding='utf-8'?>" +
        "<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'" +
        " xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'" +
        " xmlns:xsd='http://www.w3.org/2001/XMLSchema'>" +
        authenticationHeader +
        "<soap:Body>" +
        "<Fetch xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>" +
        "<fetchXml>&lt;fetch mapping='logical'&gt;" +
        "&lt;entity name='jlc_documento'&gt;" +
        "&lt;filter type='or'&gt;" +
        "&lt;condition attribute='jlc_documentoaccountid' operator='eq' value='" + clienteId + "'/&gt;" +
        "&lt;condition attribute='jlc_documentocontactid' operator='eq' value='" + clienteId + "'/&gt;" +
        "&lt;/filter&gt;" +
        "&lt;/entity&gt;" +
        "&lt;/fetch&gt;</fetchXml>" +
        "</Fetch>" +
        "</soap:Body>" +
        "</soap:Envelope>";

        //Prepare the xmlHttpObject and send the request.
        var xHReq = new ActiveXObject("Msxml2.XMLHTTP");
        xHReq.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);
        xHReq.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/Fetch");
        xHReq.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
        xHReq.setRequestHeader("Content-Length", xml.length);
        xHReq.send(xml);
        //Capture the result
        var resultXml = xHReq.responseXML;
        //Check for errors.
        var errorCount = resultXml.selectNodes('//error').length;
        if (errorCount != 0) {
            var msg = resultXml.selectSingleNode('//description').nodeTypedValue;
            alert(msg);
        }
        //Process and display the results.
        else {

            //Capture the result and UnEncode it.
            var resultSet = new String();
            resultSet = resultXml.text;
            resultSet.replace('&lt;', '<');
            resultSet.replace('&gt;', '>');

            // Create an XML document that you can parse.
            var oXmlDoc = new ActiveXObject("Microsoft.XMLDOM");
            oXmlDoc.async = false;
            // Load the XML document that has the UnEncoded results.
            oXmlDoc.loadXML(resultSet);
            //Display the results.
            var results = oXmlDoc.getElementsByTagName('result');
            nroRegistros = results.length;
            if (nroRegistros == 10) {
                alert("Se han registrado el número máximo de asociaciones");
                window.close();
            }
        }
    }
}


miércoles, 8 de septiembre de 2010

Ejecutar OnChange sin perder el foco

El evento OnChange de los campos de un formulario de Dync CRM tienen una peculariedad ... el evento se ejecuta cuando se pierde el foco. Este detalle podría crearnos ciertas dificultades para lo cual tendríamos que forzar a que dicho evento se ejecute inmediatamente después de cambiar su valor y no después que se haya perdido el foco del campo. Veamos el siguiente ejemplo:
ESCENARIO
Se tiene el campo checkbox "valor" y un campo de caja de texto "descripcion". El campo "descripcion" deberá estar deshabilitado a menos que se haya seleccionado el campo "valor".

SOLUCION FALLIDA
En el evento OnChange de "valor" colocar:
if(crmForm.all.valor.DataValue==true)
   crmForm.all.descripcion.Disabled=false;
La opción arriba mencionda funciona sí y sólo sí luego de haber colocado un check en el campo "valor" se da un clic en cualquier otra parte del formulario o si se presiona la tecla TAB.

Para lograr nuestro cometido emplearemos "attachEvent" y que se ejecute en el momento que se haga check en "valor"
SOLUCION CORRECTA
En el evento OnLoad del formulario colocaremos lo siguiente 
function MiFuncion(){
   if(crmForm.all.valor.DataValue==true)
      crmForm.all.descripcion.Disabled=false;
}
crmForm.all.valor.attachEvent('onclick',MiFuncion);

viernes, 13 de agosto de 2010

crmForm.que?

Este post está orientado a personas que recién están empezando a realizar códigos de javascripts para los formularios y campos de CRM. Al menos cuando yo empecé en este mundo lo primero que me mandaron hacer fue justamente esto y en muchas ocasiones ignoraba de las propiedades y métodos que permitirían realizar rápidamente mi trabajo... en fin. Para que no les pase como a mí, les voy a dejar un listado de propiedades y métodos:
Variables Globales
SERVER_URL Nos proporciona una cadenta de texto con el nombre del servidor
USER_LANGUAGE_CODE Proporciona el codigo del lenguaje seleccionado por el usuario
ORG_LANGUAGE_CODE Proporciona el codigo del paquete de lenguaje dela organización
ORG_UNIQUE_NAME Proporciona el nombre de la organización

Propiedades crmForm
crmForm.all Nos permite acceder a todos los campos del formulario
crmForm.IsDirty Retorna un booleando. True si el campo ha sido modificado
crmForm.FormType Obtiene un entero según el modo en el que se encuentre el formulario. Como valores
válidos tenemos:

-Undefined Form Type = 0

-Create Form = 1

-Update Form = 2

-Read Only Form = 3

-Disabled Form = 4

-Quick Create Form = 5

-Bulk Edit Form = 6
crmForm.ObjectId Retorna un string que muestra el GUID del registro abierto. En caso que el
formulario sea de tipo"Create Form" el vaslor será null.
crmForm.ObjectTypeCode Obtiene el código de la entidad del formulario abierto.
crmForm.ObjectTypeName Obtiene el nombre de la entidad del formulario abierto.

Lookup Multientity - (como el de cliente)

En ocasiones hemos necesitado de un lookup el cual nos permita manejar tanto Cuentas como Contactos (similar al que hay en el formulario de Casos) o lookups como los "Referente a". Si bien es cierto que es una funcionalidad propia de CRM, en este ejempplo (que tiene como base este post) vamos a emular un lookup multi-entidad el cual nos permita hacer el registro de un contacto o cuenta.
Supongamos que tienen una entidad personalizada llamaba: jl_entidad. Deberán crear relaciones con la entidad account y contact donde éstas son las entidades principales. Agregar los campos de tipo lookup jl_accountid y jl_contactid en el formulario de jl_entidad.
Ahora en el evento OnLoad, copiar el siguiente código:
var accountLookup = crmForm.all.jl_accountid;
var contactLookup = crmForm.all.jl_contactid;
accountLookup.lookuptypes = "1,2";
accountLookup.lookuptypenames = "account:1,contact:2";
accountLookup.lookuptypeIcons = "/_imgs/ico_16_1.gif:/_imgs/ico_16_2.gif";
if (contactLookup.DataValue != null) {
   accountLookup.DefaultValue = contactLookup.DataValue;
   accountLookup.DataValue = contactLookup.DataValue;
   if (typeof (accountLookup.DataValue[0].data) != "undefined") {
      accountLookup.DefaultValue[0].data = accountLookup.DataValue[0].data;
   }
}
En el evento OnSave copiar lo siguiente:
var accountLookup = crmForm.all.jl_accountid;
var contactLookup = crmForm.all.jl_contactid;
if (accountLookup.DataValue == null) {
   contactLookup.DataValue = null;
}
else {
   var customer = accountLookup.DataValue[0];
   if (customer.type == "1") {
      contactLookup.DataValue = null;
   }
   else {
      contactLookup.DataValue = accountLookup.DataValue;
      accountLookup.DataValue = null;
   }
}

miércoles, 11 de agosto de 2010

Personalizando FULLNAME

Como ya sabemos podemos personalizar el FULLNAME mediante la Configuración del sistema, pero este medio es un poco limitante ya solo nos da la oportunidad de elegir uno de los siguientes formatos:
  • Apellidos, Nombre
  • Nombre Apellidos
  • Apellidos, Nombres Iniciales
  • Nombres Iniciales Apellidos
  • Apellidos, Nombre Segundo nombre
  • Nombre Segundo nombre Apellidos
  • Apellidos Nombre
  • ApellidosNombre
Pero qué pasaría si tenemos el apellido paterno y el apellido materno por separado y queremos que éste forme parte del FULLNAME
Para ello crearemos 2 nuevos campos: jc_apellidopaterno y jc_apellidomaterno.
No utilizamos el atributo lastname ya que lo emplearemos para la concatenación de los atributos que creamos. Por último implementaremos la siguiente porción de JScript:
En el evento OnLoad
//Ocultar el campo lastname que viene por defecto
crmForm.all.lastname.style.visibility='hidden';
crmForm.all.lastname_c.style.visibility='hidden';
En el evento OnSave:
//Concatenación de campos
crmForm.all.lastname.DataValue=crmForm.all.jc_apellidopaterno.DataValue+' '
+ crmForm.all.jc_apellidomaterno.DataValue;
Con esto el campo FULLNAME mostrará el nombre, el apellido paterno y el apellido materno.

Inventario de jscripts crmForm

A quien no le ha pasado que como parte de los entregables de los diferentes proyectos con Dync CRM nos han solicitado realizar un inventario de los scripts desarrollados para los diferentes formularios y atributos de las diferentes entidades :S Bueno esto puede volverse una tarea muy engorrosa (especialmente si uno no ha desarrollado dichos scripts). Felizmente contamos con herramientas que nos pueden facilitar la vida. En esta oportunidad les comento sobre una herramienta que nos va a servir de mucho: FormJavascriptManager que lo puedes descargar haciendo click aquí.
Para utilizar esta herramienta deberemos crear una conexión al servidor de CRM de la siguiente manera:

(Primero hacer click en el botón [...] y luego en [new connection])

En la siguiente ventana le pondremos un nombre a la conexión, escogeremos el tipo de autenticación e ingresaremos información correspondiente al servidor de CRM

Finalmente aparecerá una ventana donde podremos apreciar las entidades personlizables de donde podremos seleccionar aquellas que querramos analizar. Por cada entidad que selecciones nos permitirá visualizar los métodos OnChange, OnSave y OnLoad de los atributos y formularios respectivamente.

sábado, 27 de febrero de 2010

Integrando Google Maps con CRM 4.0

Muchas veces las empresas que cuentan con CRM 4.0 necesitan visualizar las locaciones de sus clientes para brindar sus servicios de una manera más rápida y eficiente por lo que necesitan de un mapa de referencia dentro de las fichas.
En esta oportunidad mostraremos como conseguir este objetivo. Adicionalmente a esto, crearemos un botón el cual me permita mostrar y ocultar el mapa ya que este ocupa un tamaño considerable.
Primero deberemos crear un IFrame, al cual llamaremos Mapa, dentro de la entidad Account (también puede ser dentro de la entidad contact).




Ahora que ya tenemos la lógica, deberemos crear el botón en el formulario de la entidad account y ahí colocaremos el extracto de Jscript, para esto deberemos modificar el sitemap de la siguiente manera:

<Entity name="account">
<ToolBar ValidForCreate="0" ValidForUpdate="1">
<Button Icon="/_imgs/ico_16_4414.gif" JavaScript="var displ=crmForm.all.IFRAME_Mapa.style.display; if(displ=='none') crmForm.all.IFRAME_Mapa.style.display=''; else crmForm.all.IFRAME_Mapa.style.display='none';" PassParams="1" WinParams="" WinMode="0">
<Titles>
<Title LCID="1033" Text="Mapa" />
</Titles>
</Button>
<ToolBarSpacer />
</ToolBar>
</Entity>
Luego importamos el ISV modificado y verificamos los resultados.
Debemos quitar el check para no Restringir scripting entre marcos .
En el evento Onload del formulario obtendremos los valores que sean referentes al nombre de la calle, distrito, departamento y país y luego lo concatenaremos de la siguiente manera. Cabe resaltar que para el registro de estos campos no he utilizado los que vienen de caja sino que he creado lookups por temas de ubigeo.
var url= "http://maps.google.com/maps?q=" + 
crmForm.all.jc_paisid.DataValue[0].name+ "," + 
crmForm.all.jc_departamentoid.DataValue[0].name + "," + 
crmForm.all.jc_distritoid.DataValue[0].name + "," + 
crmForm.all.jc_calle.DataValue;
crmForm.all.IFRAME_Mapa.src=url;

Ahora que el mapa es se muestra en el formulario, crearemos un botón el cual nos permita ocultarlo y/o visualizarlo según nuestra necesidad. Para lograr esto primero debemos tener en cuenta el jscript que nos permitirá esta fucnionalidad.
var displ=crmForm.all.IFRAME_Mapa.style.display;
if(displ=='none') crmForm.all.IFRAME_Mapa.style.display='';
else crmForm.all.IFRAME_Mapa.style.display='none';
NOTA:El código mostrado arriba nos permite esta funcionalidad. Lo más recomendable es que el IFRAME se encuentre en una sección diferente para ocultar la sección en lugar de ocultar el IFRAME ya que si hacemos esto último se mostrará un espacio vacío.