Blog

Artículos y noticias relacionadas con el mundo AX3 group

Adxstudio aka Dynamics 365 Portals

El 28 de septiembre del 2015 Microsoft anunciaba la adquisición de Adxstudio Inc. Con esta operación Microsoft dejó claro que las organizaciones de hoy en día están buscando nuevas y diferentes maneras de conectar, apoyar y comprometerse con sus clientes. Adxstudio se convertía de esta forma en un componente de Microsoft Dynamics y no solo en un proveedor de software independiente (ISV).

Esta adquisición surgió por la creciente necesidad de los clientes de CRM de poder conectar sus sitios web directamente a sus sistemas CRM. En este sentido existen varias herramientas de integración que pueden configurarse para transferir datos desde CRM a las bases de datos del sitio web en cuestión, incluso existen aplicaciones web que pueden ser modificadas para leer y escribir directamente en CRM siguiendo varios métodos. Sin embargo, Adxstudio ofrece una solución diferente. Con Adxstudio no partes de un sitio web que tienes que conectar al CRM del cliente, sino que el punto de partida es el propio CRM, y desde él, se construye el portal de manera nativa.

Anteriormente, Microsoft Dynamics CRM solo permitía que los usuarios con licencia accedieran a la aplicación y a sus datos específicos, pero ahora, usando el portal, es posible compartir información de tu CRM con otros potenciales clientes e inversores sin necesidad de que tengan una licencia. De esta forma, un usuario tiene la alternativa de iniciar sesión en el portal y una vez iniciada, la gestión de acceso al sitio y de los contenidos que el usuario puede ver se hace mediante la configuración del portal.

Otra ventaja que tiene Adxstudio es que ofrece la posibilidad de acceder al código de todo el proyecto, de manera que podemos editarlo y desarrollar soluciones personalizadas. Además, Adxstudio incorpora la posibilidad de usar código Liquid, que nos permite personalizar el portal de una manera más sencilla que modificando el proyecto del portal a través de Visual Studio.

El código Liquid permite acceder al modelo de objetos de CRM pudiéndolo usar con el propio código HTML de un Web Page o un Web Template. Además, en la página oficial de Adxstudio tenemos mucha documentación bien estructurada sobre código Liquid y sobre todas las entidades y objetos que podemos usar para crear nuestro portal.

https://community.adxstudio.com/products/adxstudio-portals/documentation

Otro aspecto muy interesante que ofrece Adxstudio es que, al personalizar nuestras páginas desde el editor de código HTML, disponemos del marco necesario para aplicar estilos CSS, JavaScript e incluso podemos utilizar Bootstrap para modificar la apariencia general del portal con sólo subir un archivo.

En agosto de 2018 Microsoft dejará de actualizar y dar soporte a Adxstudio para continuar ofreciendo el mismo servicio a través de otro producto, Dynamics 365 Portals. Aunque los 2 sistemas están coexistiendo actualmente, con el paso del tiempo los nuevos portales acabarán sustituyendo a Adxstudio. Aun así, creemos que es importante analizar el concepto y la tecnología que hay detrás de Adxstudio ya que Dynamics 365 Portals, aunque presenta algunas diferencias con Adxstudio, hereda tanto la apariencia como toda su idea del desarrollo.

Con el cambio de Adxstudio a Dynamics 365 Portals, se espera que Microsoft vaya mejorando y aumentando las características de los portales para que sean cada vez mejores y cuenten con más características.

En este sentido ya se ha mejorado en varios aspectos. Por ejemplo, en la implementación de diferentes idiomas en un mismo portal sin la necesidad de crear portales diferentes para cada uno de ellos. Esta mejora difiere significativamente a la solución que daba Adxstudio a la plataforma multiidioma. Ahora disponemos de una nueva entidad que se llama Website Languajes que añade una nueva capa, de manera que ya no tenemos que duplicar la web entera como hacíamos antes con la herramienta que copiaba la web.

También tenemos nuevas extensiones Liquid que podemos usar en nuestras plantillas para mejorar esta funcionalidad. Así tenemos: website.languajes que proporciona la colección de los idiomas que tenemos disponibles, pages.languajes que es una lista con los idiomas disponibles para la página que se está usando, o website.selected_languaje, que identifica qué idioma está mostrando la web en ese momento.

Otra de las mejoras que ya se han llevado a cabo es la posibilidad de incrustar un gráfico directamente en la web con una nueva extensión Liquid. Además, ahora contamos con una nueva web template llamada “Partner Dashboard”, que proporciona un ejemplo de cómo embeber varios gráficos, entity lists y otros componentes en una única página para dar mayor riqueza al portal.

Estaremos pendientes de las nuevas actualizaciones que Microsoft va a ir llevando a cabo en Dynamics CRM Portals para estar al día de las nuevas características y mejoras que se puedan implantar. Por otro lado, a los que sigan usando Adxstudio, a partir de agosto del 2018, Microsoft dejará de soportar el producto y será un buen momento para plantearse si migrar a CRM 2016 online o a CRM 365 online.

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.

No aparece botón ‘+’ en subgrid de Quick Form View en CRM 2016

Recientemente observé cómo en un CRM 2016 de un cliente, a la hora de añadir un registro en un subgrid dentro de un Quick View Form, no aparecía el icono con el signo ‘+’ que permite añadirlo.

Después de darle muchas vueltas descubrimos que se trata de un problema que se da en la carga del formulario y que tiene que ver con el uso del nuevo motor de renderizado de formularios. Por lo tanto, para solucionarlo debemos activar la opción: “Use legacy form rendering”, a la que accedemos desde Settings – Administration – System Settings – Use legacy form rendering.

Una vez hecho esto, refrescamos nuestro entorno CRM y los iconos para añadir registros vuelven a aparecer.

¿Pero, qué ocurre cuando activamos o desactivamos esta opción?

En abril del 2015, Microsoft lanzó un nuevo motor de renderizado de formularios (también llamados “Turbo Forms”), que mejoraba el rendimiento del sistema y agilizaba la carga de éstos. Sin embargo, este cambio podía provocar comportamientos inesperados en formularios que habían sufrido modificaciones mediante código, como el comportamiento que hemos visto al no aparecer el icono de ‘+’ en el subgrid.

Afortunadamente, Microsoft permite que podamos elegir entre usar el nuevo motor de renderizado (Turbo forms) y el que ya había (Legacy form rendering). Usando Turbo Forms conseguimos más rapidez, pero corremos el riesgo de que se produzcan anomalías, por otro lado, si usamos Legacy form rendering, ganamos en estabilidad pero perdemos en rapidez. Por este motivo, activando el uso de este tipo de renderizado conseguimos solucionar el problema de la desaparición del icono ‘+’ en el subgrid del formulario.

Otra cosa importante a tener en cuenta es que esta opción es temporal y se espera que Microsoft la elimine en la próxima versión principal de CRM. Por lo tanto, si necesitas usarla y tienes previsto actualizar a la siguiente versión, piensa en desactivarla para comprobar los scripts de personalización que estés usando y modificar lo que sea necesario para que tu solución sea compatible con los Turbo Forms.

La importancia de especificar las columnas en una query en CRM

Hace poco, os hablaba de buenas prácticas en el desarrollo de plugins en Dynamics CRM, en este caso y en relación a las buenas prácticas, vamos a hablar de la importancia que tiene seleccionar únicamente las columnas que vamos a usar a la hora de hacer una consulta.

Siempre que se haga una query a CRM bien por QueryExpression o por FetchXml es importante especificar únicamente aquellas columnas que queremos recuperar.

Para que veáis el impacto que esto puede tener, he preparado un pequeño ejemplo donde se puede apreciar la diferencia entre especificar las columnas o recuperarlas todas.

En este primer ejemplo voy a recuperar todos los registros de la entidad estándar account con todas sus columnas. En este caso concreto, la entidad tiene más de 130.000 registros, pero como sabéis solo se recuperan 5000.

1
2
3
4
5
6
            var qe = new QueryExpression("account")
            {
                NoLock = true,
                ColumnSet = new ColumnSet(true)
            };
            var entityCollection = service.RetrieveMultiple(qe);

Vamos a añadir un Stopwatch para ver cuanto tiempo tarda en recuperar esa información con todas sus columnas. Veamos cuanto tarda…

1
2
3
4
5
6
7
8
9
10
11
            var watch = System.Diagnostics.Stopwatch.StartNew();
 
            var qe = new QueryExpression("account")
            {
                NoLock = true,
                ColumnSet = new ColumnSet(true)
            };
            var entityCollection = service.RetrieveMultiple(qe);
 
            watch.Stop();
            Console.WriteLine("{0} Segundos [AllColumns = true]", watch.ElapsedMilliseconds / 1000);

Ahora haremos lo mismo pero esta vez especificando algunas columnas

1
2
3
4
5
6
7
8
9
10
11
            var watch = System.Diagnostics.Stopwatch.StartNew();
 
            var qe = new QueryExpression("account")
            {
                NoLock = true,
                ColumnSet = new ColumnSet("accountid", "name", "emailaddress1", "emailaddress2")
            };
            var entityCollection = service.RetrieveMultiple(qe);
 
            watch.Stop();
            Console.WriteLine("{0} Segundos [Columns (accountid, name, emailaddress1, emailaddress2)]", watch.ElapsedMilliseconds / 1000);

Como veis, la diferencia es importante, en este caso estamos hablando de 83 segundos de diferencia. Bien es cierto que estamos ante un ejemplo muy extremo, en cualquier caso SIEMPRE se deben de especificar las columnas que vayamos a usar. Incluso, si quisiésemos obtener todas las columnas, también debemos especificarlas, ya que si en el futuro se añaden nuevas, estas se obtendrían penalizando el rendimiento.

Hasta la próxima

AX3