09 abril 2013

Despliegue de campos Listbox

- Los tipos de datos para campos disponibles en CRM no incluyen tipo de dato list box para marcado de múltiples opciones. Pero es posible desplegar esta funcionalidad mediante scripts en el formulario

- En este ejemplo vamos a generar una lista de múltiple selección para un campo denominado 'Productos de interés' en la entidad Account


- El despliegue incluye los siguientes componentes

- Un campo option set para dinamizar los valores incluidos en la lista

- Un web resource js para desplegar el listbox en el formulario

- Un campo multilínea para almacenar las opciones marcadas en valores separados por coma


- El código en el evento onLoad del formulario para desplegar la lista es el siguiente:

function displayList(optionSet) {

    var allProducts = optionSet.getOptions();

    var tdProducts = document.getElementById('new_productosinteres_d');
    tdProducts.innerHTML = "";
    listProducts = "<div style='overflow-y:auto; height:200px;'>";
    listProducts += "<table>";

    for (var i = 1; i < allProducts.length; i++) {

        listProducts += "<tr><td width='20px'>";
        listProducts += "<input width='20px' 
            + onclick='addProduct(this)' id='product_" + i 
            + "' type='checkbox' value='" + allProducts[i].text + "'>";
        listProducts += "</td><td>";
        listProducts += "<label for='product_" + i + "'>" 
            + allProducts[i].text + "</label>";
        listProducts += "</td></tr>";
    }

    listProducts += "</table></div>";

    tdProducts.innerHTML += listProducts;
}


- Y el código de control para completar el campo multilínea a continuación:

function addProduct(item) {

    var selectedProducts = Xrm.Page.getAttribute("new_productosinteres").getValue();

    if (item.checked) {

        Xrm.Page.getAttribute("new_productosinteres").setValue(selectedProducts
            + "," + item.value);
    }
    else {

        selectedProducts = selectedProducts.replace("," + item.value, "");
        Xrm.Page.getAttribute("new_productosinteres").setValue(selectedProducts);
    }
}


El resultado es el siguiente




Desde Innovar Tecnologías esperamos que este documento les sea de ayuda en su desarrollo

25 marzo 2013

Dynamics CRM Polaris


Os dejo un link a un video muy intresante que hace un recorrido por CRM Polaris. Disponible ya para CRM Online con el RollUp 11 y próximanente disponible para CRM OnPremise.
Version multinavegador y con visión estilo "metro" para tabletas y dispositivos móviles.

Os lo recomiendo!

http://www.youtube.com/watch?feature=player_embedded&v=kjage6envUs

23 marzo 2013

Auditoría de datos

- Microsoft Dynamics CRM admite la auditoría de cambios en los datos de entidades y atributos según la organización, para ello utiliza particiones en SQL Server Enterprise Edition

- La auditoría en CRM incluye las siguientes compatibilidades:

- Auditoría de entidades personalizadas y de sistema
- Auditoría de campos en entidades personalizadas y de sistema
- Auditoría de áreas (ventas, marketing, servicio)
- Auditoría de los cambios de privilegios
- Eliminación del registro de auditoría
- Auditoría de eventos de auditoría
- Auditoría de eventos de creación, eliminación y actualización de registros
- Auditoría de eventos de actualización de campos
- Auditoría de relaciones (1:N, N:1 y N:N)


- Entre las características no compatibles se incluyen las siguientes:

- No se puede registrar quién lee los datos y cuándo. Esto se aplica a la lectura mediante cualquier medio, incluidos los formularios, las vistas, los informes y las exportaciones de datos
- No se puede realizar un seguimiento de los cambios en los metadatos; por ejemplo, en el cambio de nombre de un campo


- La auditoría se habilita en tres niveles en CRM: organización, entidad y campo

- En este ejemplo vamos a iniciar la auditoría para los campos FullName y LastName de la entidad Contacto

- Marcamos el seguimiento de Auditoría a nivel de Campo



- A nivel de Entidad



- Y a nivel de Organización



- Desde el momento de inicio de auditoría, los cambios en los campos auditados serán registrados por CRM, puede realizarse el seguimiento de operaciones sobre entidad y campo desde la Vista Resumen de Auditorías



- Cada registro de Auditoría muestra la siguiente información sobre la operación realizada



Desde Innovar Tecnologías esperamos que este documento les sea de ayuda en su desarrollo

21 febrero 2013

Application Ribbon

- La ribbon de aplicaciones contiene los tabs y grupos de botones comunes a todas las entidades en CRM


- Si tenemos que personalizar el despliegue de alguna de sus secciones o botones debemos tener en cuenta que además de las reglas custom que incluyamos, estos ya tienen además las suyas propias, con lo que debemos añadir en lugar de sobrescribir las propiedades de display, enable y custom actions

- En este ejemplo vamos a incluir una DisplayRule para el botón Búsqueda Avanzada

- El primer paso será crear una solución que incluya la ribbon de aplicaciones y exportarla



- El xml de customizaciones es mostrado a continuación

<ImportExportXml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Entities></Entities>
  <Roles></Roles>
  <Workflows></Workflows>
  <FieldSecurityProfiles></FieldSecurityProfiles>
  <Templates />
  <RibbonDiffXml>
    <CustomActions />
    <Templates>
      <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
    </Templates>
    <CommandDefinitions />
    <RuleDefinitions>
      <TabDisplayRules />
      <DisplayRules />
      <EnableRules />
    </RuleDefinitions>
    <LocLabels />
  </RibbonDiffXml>
  <EntityMaps />
  <EntityRelationships />
  <OrganizationSettings />
  <optionsets />
  <Languages>
    <Language>3082</Language>
  </Languages>
</ImportExportXml>


- Para implementar el nuevo despliegue del botón Advanced Find, haremos uso del recurso de SDK applicationribbon.xml, y haremos una búsqueda para encontrar el valor del atributo Command de este botón, en este caso Mscrm.OpenGridAdvancedFind

- Conociendo el Command que localiza en la ribbon nuestro botón, implementaremos la siguiente CommandDefinition en su sección correspondiente CommandDefinitions

    <CommandDefinitions>
      <CommandDefinition Id="Mscrm.OpenGridAdvancedFind">
        <EnableRules/>
        <DisplayRules>
          <DisplayRule Id="Mscrm.OpenGridAdvancedFind.Display" />
        </DisplayRules>
        <Actions>
          <JavaScriptFunction FunctionName="Mscrm.RibbonActions.openAdvancedFind" 
             Library="/_static/_common/scripts/RibbonActions.js">
            <CrmParameter Value="SelectedControl" />
          </JavaScriptFunction>
        </Actions>
      </CommandDefinition>
    </CommandDefinitions>


- Observe que en nuestra customización hemos vuelto a incluir el tag Actions definido en el archivo de SDK applicationribbon.xml

- La implementación de la regla de display Mscrm.OpenGridAdvancedFind.Display es la siguiente

    <DisplayRule Id="Mscrm.OpenGridAdvancedFind.Display">          
      <EntityRule AppliesTo="SelectedEntity" 
           Context="HomePageGrid" EntityName="contact" />
    </DisplayRule>


- Guardaremos los cambios e importaremos la solución customizada, y publicaremos los resultados



- El resultado de este despliegue es que el botón Búsqueda Avanzada se muestra sólo para la entidad seleccionada Contacto
Puede consultar una lista completa de las DisplayRules en el sitio oficial de Microsoft

Desde Innovar Tecnologías esperamos que este documento les sea de ayuda en su desarrollo

08 febrero 2013

Secure Configuration en Plugins

- En CRM es posible enviar información parametrizada a un plugin para ser utilizada durante su ejecución, haciendo uso de los espacios Secure y Unsecure en la configuración durante el registro del plugin

- En este ejemplo vamos a desarrollar un plugin que envíe un email al Contacto principal de una cuenta cuando esta es modificada

- Para ello implementaremos el constructor del plugin que incluye los espaciós de configuración como parámetros

public class Plugin : IPlugin
{
    private IPluginExecutionContext context;
    private IOrganizationServiceFactory factory;
    private IOrganizationService service;
    protected string TextoEmail;

    public Plugin(string unsecureConfig, string secureConfig)
    {
        TextoEmail = secureConfig;
    }

    public void Execute(IServiceProvider serviceProvider)
    {
        context = (IPluginExecutionContext)
           serviceProvider.GetService(typeof(IPluginExecutionContext));
        factory = (IOrganizationServiceFactory)
           serviceProvider.GetService(typeof(IOrganizationServiceFactory));
        service = factory.CreateOrganizationService(context.UserId);

        try
        {
            if (context.PostEntityImages["account"].Contains("primarycontactid"))
            {
                Guid primaryContactId = ((EntityReference)
                   context.PostEntityImages["account"]["primarycontactid"]).Id;

                Email email = new Email();

                ActivityParty fromParty = new ActivityParty();
                fromParty.PartyId = 
                   new EntityReference(SystemUser.EntityLogicalName, context.UserId);
                ActivityParty toParty = new ActivityParty();
                toParty.PartyId = 
                   new EntityReference(Contact.EntityLogicalName, primaryContactId);

                email.From = new ActivityParty[] { fromParty };
                email.To = new ActivityParty[] { toParty };
                email.Description = TextoEmail;
                email.Subject = "Su cuenta " + 
                   context.PostEntityImages["account"]["name"].ToString() + 
                   " ha sido modificada ";

                Guid emailId = service.Create(email);

                SendEmailRequest sendReq = new SendEmailRequest();
                sendReq.IssueSend = true;
                sendReq.TrackingToken = "";
                sendReq.EmailId = emailId;

                service.Execute(sendReq);
            }
        }
        catch (InvalidPluginExecutionException)
        {
            throw;
        }
        catch (Exception ex)
        {
            throw new InvalidPluginExecutionException(ex.Message);
        }
    }
}


- Al realizar el registro del plugin incluiremos datos de Configuración Segura, como se indica a continuación



- Para el desarrollo de este ejemplo registraremos una PostEntityImage con los dos siguientes atributos



- El resultado de una actualización y la ejecución del plugin es el siguiente





- Con el uso de esta configuración en el plugin conseguimos dinamizar los valores de los parámetros durante la ejecución del plugin

Desde Innovar Tecnologías esperamos que este documento les sea de ayuda en su desarrollo


http://www.fotografodebodasbarcelonafg.com

20 enero 2013

Dynamics CRM Mobile

- La integración de CRM con dispositivos móviles es un paso imprescindible para toda red comercial independientemente del volumen de la empresa

- En este apartado exponemos las características de Resco Mobile CRM, una de las herramientas más versátiles a la hora de implementar conexión mobile



- Para una integración de primer nivel, utilizaremos la herramienta Resco Woodford, consistente en un entorno extensión de nuestro CRM, mediante el cual crearemos y publicaremos un Proyecto Mobile

- Para ello conectamos Woodford a nuestro CRM



- Y creamos un nuevo Proyecto Mobile



- En este proyecto incluiremos nuestra entidad custom new_proveedor, incluida en la lista de entidades disponibles, la habilitaremos para su despliegue. Seguidamente marcaremos los campos custom para el proyecto



- Para que el despliegue de la entidad en los distintos dispositivos sea funcionalmente completo, crearemos un formulario de edición de datos, y una vista personalizada de los datos



- Para que la entidad custom despliegue con un icono predeterminado, incluiremos un fichero .png con el nombre de nuestra entidad, en este caso new_proveedor.png, en un fichero zip, y pulsaremos la opción Add Images en la ribbon de Woodford



- En este punto publicaremos el proyecto mobile y sincronizaremos nuestro dispositivo con el entorno CRM



- El resultado desde un dispositivo móvil Windows Phone es el siguiente



- Vista de Calendario Mobile



- Una entidad Account desplegará las siguientes opciones



- La edición de datos de una entidad Contact desplegará del siguiente modo



- Los cambios realizados se sincronizarán bidireccionalmente con la base de datos según la configuración establecida


- Para más información consulte el sitio web oficial de Resco Mobile CRM

Desde Innovar Tecnologías esperamos que este documento les sea de ayuda en su desarrollo

06 enero 2013

Aplicando filtros a campos Lookup

- Dynamics CRM 2011 introdujo el concepto de restricción de lookups para mostrar sólo los registros necesarios basándose en un criterio predefinido, pudiendo así definir desde qué conjunto de registros queremos seleccionar, facilitando la selección

- En este ejemplo vamos a filtrar el campo lookup Contacto Principal de la entidad Cuentas, para que muestre sólo los Contactos que tienen por Cliente primario al registro activo

- Para editar las propiedades de filtrado accedemos al formulario de la entidad Cuentas en modo diseño



- Seleccionamos el campo Contacto primario y editamos sus propiedades:

- En el grupo 'Filtrado de registros seleccionados' activamos el checkbox 'Mostrar sólo los registros donde'



- Seguidamente, en el grupo 'Propiedades adicionales', establecemos las siguientes opciones



- El resultado con la configuración establecida es el siguiente




Desde Innovar Tecnologías esperamos que este documento les sea de ayuda en su desarrollo