Home

Obtener el contenido de algunos campos de la cuenta relacionada en la ficha del contacto en Microsoft Dynamics CRM 2011

webmaster's picture

Una de las utilidades más frecuentes a la hora de dar de alta a un contacto dentro de Microsoft Dynamics CRM 2011, es copiar los datos de los campos más comunes de la cuenta asociada a la ficha del contacto. Esta utilidad la hemos desarrollado en otros CRM hechos a medida con C#, lo que podría implementarse como plugin aqui,  pero hemos encontrado más fácil la solución utilizando las librerias XrmServiceToolkit - A Microsoft Dynamics CRM 2011 & CRM 2013 JavaScript Library descargadas desde Codeplex y accediendo a los datos a través de una consulta REST que nos devuelva los datos de la cuenta asociada al contacto.

Primeramente la solución queríamos implementarla desde un botón situado en el ribbon del formulario principal de la Entidad "Contacto", que llamara a la función correspondiente dentro de nuestras librerías personalizadas asociadas una solución que estamos desarrollando para dicha entidad. Para añadir un grupo, pestaña o botón a un ribbon de un formulario léa nuestro artículo, "Ribbon personalizados en Microsoft Dynamics CRM 2011. Añadir grupo, pestaña o botón".

Partimos de la base que ya tenemos el botón personalizado en el ribbon del formulario principal de la entdad "Contacto" en cuyo código hemos destacado la acción que hará que será llamar a la librería "new_DatabaseTools" y dentro de ella ejecutar el comando "ImportCuenta"

He aqui el código del customization.xml (solo la sección RibbonDiffXml)

<RibbonDiffXml>
        <CustomActions>
          <CustomAction Id="Mscrm.Form.contact.MainTab.ImportData.CustomAction" Location="Mscrm.Form.contact.MainTab.Groups._children" Sequence="10">
            <CommandUIDefinition>
              <Group Id="Mscrm.Form.contact.MainTab.ImportData" Command="Mscrm.Enabled" Template="Mscrm.Templates.Flexible2" Sequence="100" Title="$LocLabels:Mscrm.Form.contact.MainTab.ImportData.TitleText" Description="$LocLabels:Mscrm.Form.contact.MainTab.ImportData.DescriptionText">
                <Controls Id="Mscrm.Form.contact.MainTab.ImportData.Controls">
                  <Button Id="Mscrm.Form.contact.MainTab.ImportData.AccountData" Command="Mscrm.Form.contact.MainTab.ImportData.AccountData.Command" Sequence="20" ToolTipTitle="$LocLabels:Mscrm.Form.contact.MainTab.ImportData.AccountData.LabelText" LabelText="$LocLabels:Mscrm.Form.contact.MainTab.ImportData.AccountData.LabelText" ToolTipDescription="$LocLabels:Mscrm.Form.contact.MainTab.ImportData.AccountData.Description" TemplateAlias="o1" Image32by32="/_imgs/ribbon/AllRecordsForCurrentImport_32.png" />
                </Controls>
              </Group>
            </CommandUIDefinition>
          </CustomAction>
          <CustomAction Id="Mscrm.Form.contact.MainTab.ImportData.MaxSize.CustomAction" Location="Mscrm.Form.contact.MainTab.Scaling._children" Sequence="10">
            <CommandUIDefinition>
              <MaxSize Id="Mscrm.Form.contact.MainTab.ImportData.MaxSize" GroupId="Mscrm.Form.contact.MainTab.ImportData" Sequence="10" Size="LargeMedium" />
            </CommandUIDefinition>
          </CustomAction>
          <CustomAction Id="Mscrm.Form.contact.MainTab.ImportData.Scale.Popup.CustomAction" Location="Mscrm.Form.contact.MainTab.Scaling._children" Sequence="10">
            <CommandUIDefinition>
              <Scale Id="Mscrm.Form.contact.MainTab.ImportData.Scale.Popup" GroupId="Mscrm.Form.contact.MainTab.ImportData" Sequence="300" Size="Popup" />
            </CommandUIDefinition>
          </CustomAction>
        </CustomActions>
        <Templates>
          <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
        </Templates>
        <CommandDefinitions>
          <CommandDefinition Id="Mscrm.Form.contact.MainTab.ImportData.AccountData.Command">
            <EnableRules />
            <DisplayRules />
            <Actions>
              <JavaScriptFunction Library="$webresource:new_DatabaseTools" FunctionName="ImportCuenta">
              </JavaScriptFunction>
            </Actions>
          </CommandDefinition>
        </CommandDefinitions>
        <RuleDefinitions>
          <TabDisplayRules />
          <DisplayRules />
          <EnableRules />
        </RuleDefinitions>
        <LocLabels>
          <LocLabel Id="Mscrm.Form.contact.MainTab.ImportData.AccountData.Description">
            <Titles>
              <Title languagecode="3082" description="Importar los datos de la cuenta" />
            </Titles>
          </LocLabel>
          <LocLabel Id="Mscrm.Form.contact.MainTab.ImportData.AccountData.LabelText">
            <Titles>
              <Title languagecode="3082" description="Datos de la Cuenta" />
            </Titles>
          </LocLabel>
          <LocLabel Id="Mscrm.Form.contact.MainTab.ImportData.DescriptionText">
            <Titles>
              <Title languagecode="3082" description="Importar datos de otras entidades" />
            </Titles>
          </LocLabel>
          <LocLabel Id="Mscrm.Form.contact.MainTab.ImportData.TitleText">
            <Titles>
              <Title languagecode="3082" description="Import Data" />
            </Titles>
          </LocLabel>
        </LocLabels>
      </RibbonDiffXml>

Dentro del grupo <CommandDefinitions> hemos establecido la acción para nuestro botón personalizado dentro de la sección <Actions> y la llamada a la librería new_DatabaseTools mediante esta etiqueta <JavaScriptFunction Library="$webresource:new_DatabaseTools" FunctionName="ImportCuenta"></JavaScriptFunction>

Vista del formulario con el Botón personalizado "Datos de la Cuenta"

Posteriormente pasamos a crear la librería Javascript que contiene la función que llamará nuestro botón

1. En la barra de Navegación, vamos hacia laa sección Configuración - Personalización - Soluciones y abrimos la Solución que tenenos creada. Una vez dentro de ella seleccionamos Nuevo - Recurso Web

2. En la pantalla de creación del nuevo Recurso Web introducimos el nombre, nombre para mostrar, la descripción y seleccionamos el tipo de contenido de la lista desplegable Script (JScript).

3. Una vez seleccionado el tipo, se nos habilitará el botón "Editor de texto" situado a la derecha en el que introduciremos el código de todas las funciones Javascript que queremos que tenga nuestra librería. En nuestro caso será la función ImportCuenta().

// To take values from some cuentas fields to active contact
function ImportCuenta() {
    var cuenta_asociada =Xrm.Page.data.entity.attributes.get("parentcustomerid").getValue();
    if (cuenta_asociada==null){ 
  alert("El contacto no tiene cuenta asociada");
  return;
  }
  alert("Se importarán los datos de : " + cuenta_asociada[0].name);
  var direccion; var codpos; var ciudad; var provincia;
  // Utilizaremos la llamada al servicio REST para obtener los datos de la XrmServiceToolkit
  XrmServiceToolkit.Rest.Retrieve(cuenta_asociada[0].id,"AccountSet",null, null, 
  function(datos){
    direccion = datos.Address1_Line1;
    codpos = datos.Address1_PostalCode;
    ciudad = datos.Address1_City;
    provincia = datos.Address1_StateOrProvince; 
    // alert ("Se ha capturado la dirección: " + direccion )
    },
    function (error){
    equal(true, false, error.message);
    },false);
    // Pasamos los valores de las variables devueltas al contenido de los campos del formulario activo.
    Xrm.Page.data.entity.attributes.get("address1_line1").setValue(direccion);
    Xrm.Page.data.entity.attributes.get("address1_postalcode").setValue(codpos);
    Xrm.Page.data.entity.attributes.get("address1_city").setValue(ciudad);
    Xrm.Page.data.entity.attributes.get("address1_stateorprovince").setValue(provincia);

Nota: En el código de la función aparacen llamadas a la librería XrmServiceToolkit que nos servirá para realizar la consulta REST con los parámetros correspondientes dentro de los que se encuentra el cuenta_asociada[0].id que es identificador de la cuenta asociada al contacto en formato Json. En esa misma llamada recogemos los valores de los campos que nos interesan de la entidad "Account" y al final se los adjudicamos a los campos correspondientes del formualrio activo en ese momento.

4. Una Vez introducido el código de nuestra función, Aceptamos y al regresar al formulario de creación del Recurso Web, pulsamos el botón Guardar y paso seguido Publicar. Con esto haremos que se publique en el CRM la nueva librería introducida y esta accesible a cualquier llamada.

Nota: Existe una utilidad llamada ToolBox for Microsoft Dynamics CRM 2011 gratuita y descargable desde CodePlex que se puede utilizar para editar todo el contenido de nuestros Recursos Webs, grabar y publicar de forma más rapida e intuitiva en la que podemos revisar con más claridad nuestro código y realizar cambios más facilmente. Para ver como se usa, léa nuestro artículo "Uso de ToolBox for Microsoft Dynamics CRM 2011"

Adjuntamos las librerias JavaScripts al Formulario principal de "Contacto"

Para que sea efectivo dentro del fomulario principal "Contacto" tenemos que adjuntar tanto la librería new_DatabaseTools como otras tres librerías que componen el XrmServiceToolkit. En el momento de la descarga que puede realizar desde aqui, aparecen Tres ficheros que son jquery.js, json2.js y XrmServiceToolkit.js. 

Crearemos tres Recursos Web de la misma forma que hemos realizado la creación de nuestro new_DatabaseTools y pegaremos integramente el contenido de cada fichero dentro de su correspondiente editor de texto. Al final deberíamos tener dentro de nuestra solución 4 Recursos Web tal y como se muestra en la imagen inferior, que son lo que  tenemos que adjuntar al formulario.

Una vez creados todos los Recursos Webs y publicados, dentro de la misma solución desplegamos Componentes - Entidades - Contactos - Formularios y pulsamos sobre el nombre del formulario principal para editar sus propiedades.

Una vez abierto pulsamos en botón Propiedades de formulario.

Pulsando el botón Agregar, deberá incorporar en la Sección de Bibliotecas de formularios los 4 Recursos Web anteriormente mencionados y colocarlos en el orden en que aparecen en las imágenes. Una vez incorporadas las librerías al formulario, Pulse Aceptar, Grabe todos los cambios y publique todos los cambios realizados desde la ventana de la Solución.

Probando la Solución

Para probar nuesta solución, navegaremos hacia la el Area de Trabajo y abriremos un Contacto. Esto hará que se muestre el formulario principal del contacto. En este caso los campos dirección, ciudad, codigo postal y provincia están vacios. En caso de que el mismo posea una cuenta asociada al pulsar el botón "Datos de la Cuenta" situado a la derecha del Ribbon aparecerá el mensaje de que se importarán los datos de la cuenta asociada.

Aceptamos y los datosde la cuenta asociada aparecerán en los campos correspondientes del contacto.

Guardamos los cambios y queda la ficha completada. El campo Pais no se ha importado porque será objeto de tratamiento en el artículo "Leer y grabar datos en un campo Lookup (Búsqueda) en Microsoft Dynamics CRM 2011 con Javascript" donde ampliaremos la funcion ImportCuenta() de la libreria new_DatabaseTools para incluirlo.

 

Fuente: 

Centro Práctico de LEMURSOLUTION & Knowledge de Comunidad Microsoft Dynamics CRM en Español

Contacto: 
webmaster