Blog

Artículos y noticias relacionadas con el mundo AX3 group

Autor del archivo

PowerApps: ¿Cómo agrupar datos procedentes de varias fuentes?

Para poder tener todo el potencial de los datos distribuidos en todas las fuentes de las que hablamos tenemos que ser capaces de acceder a ellos. Un ejemplo clásico puede ser el hecho de tratar de aunar datos que tenemos en un Excel sin necesidad de cargarlos en un CRM, por ejemplo.

Si nos fijamos, en el detalle de un contacto de Outlook, no existe el campo de país, un dato que puede ser interesante en multitud de escenarios.

Supongamos que ese dato lo tenemos en una tabla de Excel con los países de procedencia de cada contacto y queremos cruzar este dato con los contactos de Outlook.

En este caso, vamos a utilizar como indicador único el nombre del contacto (es suficiente para este ejemplo), el objetivo es aunar en una misma pantalla de cliente la información de ambas fuentes.

Una vez tenemos un cliente seleccionado de una lista, en este caso mediante ContactGallery.Selected obtenemos el acceso a este elemento y con la sentencia:

“First(Filter(Tabla1_1, ContactGallery.Selected.DisplayName=Name)).Pais”

Podemos cruzar ese elemento con la tabla de Excel correspondiente obteniendo el país de la línea cuyo Name coincide con el DisplayName del seleccionado, pudiendo añadir el campo a nuestra pantalla de detalle.

Esperamos que sea de ayuda para entender mejor el mundo de las powerapps y su gran alcance.

¿Cómo crear una PowerApp propia?

Como comentamos en el artículo anterior de esta serie de relacionados con las powerapps, cualquier usuario puede crear sus propias PowerApps para sacarle el máximo partido a todos los datos que le rodean, no obstante hay ciertos aspectos que conviene conocer del entorno que nos vamos a encontrar. Por ello vamos a dar unas pautas para que esta incursión el mundo de las PowerApps sea lo más sencillo posible

Podemos observar como la pantalla principal está dividida en varias secciones: – Parte central tenemos una previsualización del estado actual de la aplicación, – Parte izquierda tenemos un esquema de todas las pantallas y los componentes que la integran en forma de árbol. – Parte derecha observamos el detalle del elemento seleccionado, en esta parte podemos observar sus propiedades de presentación (tamaño, color, posición…). Además de las propiedades del elemento, tenemos las funciones que puede realizar, como se ve en la siguiente figura:

Como se puede ver en la imagen cuando seleccionamos un control, en este caso es símbolo + de la parte superior derecha de nuestra app definimos las acciones de los elementos mediante funciones (fx) en la parte superior de la misma.

Además de las habituales funciones matemáticas y primarias tipo isnull, sum… Al utilizar una u otra fuente de datos se habilitarán opciones como las que vemos en pantalla referidas al Office365 (Outlook en este caso), como borrar un email, crear un contacto… Esto nos abrirá multitud de opciones para customizar aún más nuestra PowerApp. Por último, cabe destacar que en la barra superior el editor de PowerApps nos ofrece gran variedad de controles para insertar.

Cada control tiene sus eventos como en cualquier aplicación de usuario tipo Windows forms o WPF, así pues, encontramos eventos tales como OnSelect, OnChange… que al saltar producen la ejecución de la función asociada. Como se ve en la imagen, las galerías (listas de registros) además pueden presentarse en distintas formas para hacerlo más visual e interesante para el usuario, dependerá del objetivo de la aplicación que queramos darle cada uno. No obstante, dadas todas las plantillas de ejemplo que se tienen disponibles, nuestro consejo es tratar de buscar aquella que se adapte más visualmente a lo que buscamos desde un inicio.

PowerApps, aplicaciones sencillas al alcance del usuario

A medida que pasa el tiempo, aumentan los datos de los que disponemos, este hecho alcanza su máxima expresión con conceptos como Dynamics 365 creado por Microsoft.

Pero realmente, ¿es capaz un usuario final de gestionar estos volúmenes o se ven abrumados? lo que genera, en consecuencia, la necesidad de cierta personalización compleja por parte de técnicos con conocimientos de programación para llegar a aunar la información requerida.

Las PowerApps facilitan al usuario final la gestión y presentación de datos; de esta manera, se puede crear una aplicación que se adapta a las necesidades y a los procesos más habituales de los usuarios.

Estas aplicaciones son fáciles de crear por parte de los usuarios finales y editables para adaptarlo de forma sencilla según los requerimientos que se vayan necesitando. Pueden crearse a partir de cero o partiendo de una serie de plantillas tipo para facilitar la personalización de las mismas.

Nos aporta la capacidad de disponer de un gran número de aplicaciones de manera muy accesible, únicamente instalando la app móvil.

Entrando en la app móvil de PowerApps y haciendo el login con nuestra cuenta de 365 podemos ver todas aquellas aplicaciones que estén dadas de alta en el menú de 365 pudiendo filtrar según la necesidad de cada momento.

Estas aplicaciones tienen un aspecto muy interesante y es la capacidad de compartirse entre unos y otros usuarios, de esta forma podemos llegar a otros usuarios mejorando una aplicación propia para nuestra empresa a modo open source.

El potencial que tienen las powerapps es increíble, uno de sus puntos fuertes es la inclusión de flujos de trabajo permitiendo integraciones más complejas, realizar acciones al crear un contacto en Dynamics CRM, al recibir un correo… pero esto profundizaremos más en un futuro.

Esperamos que os sea de ayuda para perder el miedo a adentraros en el mundo de las powerapps, en este blog les daremos consejos para sacarles el máximo partido.

Importación de datos en Dynamics CRM con varios lookup

Es bastante habitual que cuando realizamos una importación de datos con el asistente del que dispone CRM ocurran errores al resolver los lookups por motivo de dependencias. Esto requeriría tener que realizar tantas importaciones como referencias a una entidad distinta dispongamos, con la consecuente pérdida de tiempo.

Pongamos el ejemplo de los registros demográficos de ciudad, comunidad autónoma y país. En el caso de querer dar de alta una ciudad de un país que no se encuentra en CRM deberíamos en principio realizar tres importaciones independientes en orden (país, comunidad autónoma y ciudad). El estado previo a la importación es el siguiente:

Pero aquí es donde CRM es capaz de facilitarnos la labor, siguiendo los pasos siguientes:

  • Se generan todos los archivos de las entidades que queremos importar con los campos necesarios
Excels
  • Agrupamos todos los archivos de importación en un mismo .zip
Zip
  • Mapeamos cada uno de los archivos del zip con su entidad equivalente.
AsignacionFicheros
  • En cada una de las entidades, asignamos las columnas al campo que corresponda (incluyendo los lookup)
AsignacionCampos

En el ejemplo, la ciudad que queremos añadir es Turín, de la cual no tenemos cargada la comunidad autónoma (Piamonte) ni el país (Italia), por ello tenemos que agrupar los tres archivos en un mismo .zip (Cities, Counties, Countries). Entonces, el proceso de importación buscará dentro de la BBDD de CRM un campo que resuelva cada uno de los lookup (se puede ver que a mayor número de referencias, más tiempo tarda en importar). En caso de no encontrarse en la BBDD se buscará en los ficheros de las entidades relacionadas importados al mismo tiempo; pudiendo resolver las referencias y añadiendo cada registro con los lookups relacionados como se ve en la imagen.

CiudadesAfter

Esperamos que os sea de ayuda y ahorre tiempo en sus migraciones de datos.

Hasta la próxima.

USD: Navegar a otra pestaña con un único click

IC835513

Unified Service Desk (USD) es una aplicación que busca facilitar el trabajo de los usuarios de call centers gracias a la integración con aplicaciones externas, telefonía IP y el propio CRM.

Por ello se busca una ágil transición entre pantallas para poder facilitar la extracción de los datos. Para ello USD tiene instaurado un modelo de pestañas, al fin y al cabo no deja de ser un navegador embebido en la aplicación y como tal se comporta como las páginas que aloja.

Cuando clickamos sobre un lookup o hacemos doble click sobre un registro en un grid en CRM, automáticamente se navega al registro asociado a ese lookup “perdiendo” la información sobre el registro del que veníamos (puede ser habitual querer ver un registro como puede ser una llamada asociado a un cliente en concreto). Para poder ver ambos registros, debemos abrirlo en otra pestaña como vemos en la siguiente imagen:

AbrirVentanaNueva

Tenemos que clickar en el botón derecho y abrir en una nueva ventana, esto empeora la experiencia de usuario puesto que hace menos ágil la navegación. Así bien, para poder abrir una pestaña nueva en USD tenemos que realizar la creación de ciertos registros en CRM, estos son:

  • Entity Type: se debe crear un registro con nombre de la entidad que queremos abrir en una nueva pestaña.
  • Action Call: su objetivo es cambiar el valor mediante la UII action  SetReplacementParameter del Hosted Control Debugger la url del hosted control a  “”.
ActionCall
  • Evento: BrowserDocumentComplete se trata de un evento que se ejecuta una vez que ha cargado la página en cuestión alojada en un hosted control , al cual asociamos la action call anteriormente citada.
EventoBrowserDocumentComplete
  • Regla de navegación de ventana: establecemos la condición en la cual se ejecutará o no la navegación como está definida. El campo From lo dejamos vacío para que reaccione desde cualquier entidad.
WindowNavigatioRule1 WindowNavigatioRule2 WindowNavigatioRule3

¿Qué conseguimos con esto?: la regla de navegación cumple la condición recogiendo que el tipo de navegación sería “In place”, y al ser el atributo del Control Hospedado url = “” lo abre en una pestaña diferente, la cual le hemos indicado en los campos de la windows navigation rule.

Cabe destacar evidentemente que todos estos registros deben ser asociados a la configuración del usuario correspondiente para que sean operativos cuando este usuario inicie sesión.

Espero que os haya ayudado y lo utilicéis para mejorar la experiencia de usuario.

Hasta la próxima.

CRM: Eventos asociados a un SubGrid

Dynamics 365

Resulta habitual querer realizar acciones asociadas a la inclusión de registros dentro de un grid tales como: actualizar datos, ocultar campos y/o botones del Ribbon… Si bien es cierto que podemos hacer esto mediante un plugin, como hemos mencionado en anteriores artículos es código ejecutado en servidor y se debe minimizar su uso ya que puede generar problemas de rendimiento.

Por este motivo se recomienda utilizar javascript en la medida de lo posible para la gestión de los eventos asociados a un subgrid incrustado en un formulario. Así pues la solución que se plantea para poder actualizar campos al agregar o quitar un registro de un grid es la siguiente:

  1. Debemos de acceder al grid mediante
    1
    
     var grid = Xrm.Page.getControl(gridName);
  2. Dado que un grid puede contener un número elevado de registros se pueden tener registros, éste puede tardar en cargar, por ello, se espera si es necesario un tiempo hasta que este haya cargado para acceder a su contenido.
    1
    2
    3
    
     setTimeout(function () { 
          AddEventToGridOnLoad(gridName, functionToCall); 
         }, 1000);
  3. Añadimos el evento onload el cual producirá la llamada a la función que a su vez añade el evento refresh (evento que se lanza cada vez que el grid es modificado por inserción o eliminación algún registro del mismo). El motivo de asociarlo al evento refresh es debido a que el onload del grid se ejecuta antes, por ejemplo y no son accesibles las líneas del mismo.
  4. Cada una de las líneas del grid es considerada como un registro de tipo lookup al cual podemos acceder a sus atributos como se ve en el extracto siguiente:
    1
    2
    3
    4
    5
    
    Xrm.Page.getControl(gridName).getGrid().getRows().forEach(function (row, i) {
        var data = row.getData().getEntity().getEntityReference();
        var id = data.id;
        var name = data.name;
    });
  5. Finalmente para modificar el campo en cuestión, se llama a la instrucción setValue, y para que los cambios se guarden ejecutamos
    1
    
    Xrm.Page.data.save()
    .

Es importante destacar que se trata de un proceso incremental que no actualiza los campos de todos los registros, sino solamente de los que vayamos modificando mediante acciones de los usuarios que disparan el evento refresh del grid.

Esperamos que les sea de ayuda en sus desarrollos futuros.

Hasta la próxima.

AX3