Thumbnail image

[Be]ERDays Madrid 2019

Hace unos días me invitaron a participar en el encuentro [Be]ERDays organizado por los amigos de El Rincón Dynamics en la Torre de Cristal de Madrid.

Fue una tarde muy interesante donde pude compartir mi visión sobre la idea One Version en Microsoft Dynamics 365 for Finance and Operations y los cambios en procedimientos y cultura, tanto de clientes como de partners, que todos vamos a necesitar para adaptarnos a este cambio de filosofía del producto en la nube.

Leer más
Thumbnail image

Microsoft Certified Trainer (MCT)

Por fin obtuve mi Microsoft Certified Trainer (MCT). Estos días estoy impartiendo muchos workshops para clientes y ya iba siendo hora.

No es como el kit de MVP pero, en fin, nunca es demasiado swag :)

Publicado primero en LinkedIn, déjame un comenario para saber tu opinión!

Acceptance Test Libraries (#ATL) para Dynamics 365 for Finance and Operations

Uno de los anuncios más emocionantes de los últimos meses (y no es poco decir, con lo rápido que avanzamos tras el OneVersion) para programadores de Microsoft Dynamics 365 for Finance and Operations es la ATL. Esta es la librería que el equipo de producto utiliza para desarrollar sus propios test (unitarios o, mejor, de integración) funcionales.

El framework de Unit Testing existe desde hace tiempo en Dynamics AX, pero era complicado utilizarlo debido a la complejidad de mantener los datos necesarios para la ejecución de las pruebas y permitir la creación de pruebas deterministas.

Leer más
Thumbnail image

Dynamics 365 Saturday - Madrid 2019

El pasado sábado 25 de mayo tuvo lugar el Dynamics 365 Saturday - Madrid 2019 en las oficinas de Microsoft.

Tras la buena experiencia del año pasado, no podía perdérmelo. El crecimiento del evento ha sido impresionante, con más de 400 asistentes es uno de los 365 Saturday más grandes del mundo, y tanto la calidad de las ponencias como la repuesta de los asistentes ha sido alucinante.

Comparto como siempre mi sesión sobre OneVersion y actualización continua, un tema muy interesante tras el lanzamiento de la versión de Abril de Dynamics 365, que sigue evolucionando rápidamente.

Leer más
Thumbnail image

Publica tus paquetes de Dynamics 365 for Finance and Operation en LCS con Azure DevOps Pipelines

La primera tarea de automatización para cerrar el ciclo de integración continua en Dynamics 365 for Finance and Operations con Azure DevOps pipelines fue publicada recientemente, como se describe en el anuncio oficial.

Estas son algunas instrucciones a alto nivel para configurarlo mientras se publica la documentación oficial:

Prerrequisitos

Para simplificar, estos prerrequisitos deben estar preparados antes de comenzar este proceso:

  • Necesitas una compilación en ejecución de Dynamics 365 Finance and Operations, y por tanto un proyecto de LCS vinculado a esta instancia de DevOps. Este artículo asume que tienes una compilación configurada desplegando una máquina virtual de topología de compilación desde LCS como se explica aquí.
  • Instala la extensión Dynamics 365 Unified Operations Tools desde el Visual Studio Marketplace en este enlace: https://marketplace.visualstudio.com/items?itemName=Dyn365FinOps.dynamics365-finops-tools  También prepara:
  • Un usuario con permisos suficientes en tu proyecto de LCS (debes conocer el usuario y la contraseña). Considera usar una cuenta de servicio cuya contraseña no expire y que no use 2FA.
  • Acceso a la administración de Azure Active Directory de tu organización, con permisos suficientes para registrar una nueva Aplicación en AAD (esto solo debe hacerse una vez), como se explica en el siguiente paso.

1. Registrar una Aplicación en AAD (Nueva versión)

Para autorizar a Azure DevOps Pipelines a conectarse con la nueva API de Lifecycle Services (LCS), debe crearse una aplicación en el Azure Active Directory de la organización (Se requieren permisos elevados para esta operación).

Leer más
Thumbnail image

Dynamics 365 Saturday - Madrid 2018

El pasado sábado 19 de mayo tuvo lugar el Dynamics 365 Saturday - Madrid 2018 en las oficinas de Microsoft donde pudimos pasar el día rodeados de la comunidad y compartiendo conocimientos y conversaciones.

Foto con el resto de ponentes.

Es la primera vez que acudía a uno de estos eventos y seguro que repetiré porque la experiencia ha sido realmente buena. Compartí una sesión sobre extensiones en X++ que comparto más abajo, basada en el contenido que ya publiqué en estos artículos:

Leer más
Thumbnail image

Adopta la mentalidad de extensiones con Dynamics 365 for Finance and Operations #2 – Framework SysExtension

En mi publicación anterior Adopta la mentalidad de extensiones con Dynamics 365 for Finance and Operations reflexionamos sobre algunos de los patrones que podemos aprovechar para crear nuestras personalizaciones utilizando solo cambios no intrusivos, basándonos en un ejemplo real: Añadir una nueva Secuencia de Números a un módulo estándar.

En particular, discutimos:

  • Extensiones de Metadatos — para añadir un nuevo valor de Enum en un Base Enum estándar.
  • Extensiones de Clase — para añadir un nuevo método a una clase estándar.
  • Chain-of-Command — para añadir un bloque de código a un método existente de una clase estándar.
  • Suscripción a Event-Handler — para suscribir nuestro propio método a un delegate estándar existente proporcionado como punto de extensión. Si aún no has leído esa publicación, por favor hazlo ahora. Si ya lo hiciste (¡gracias!), continuemos con otro patrón que debemos considerar: Framework SysExtension (también SysPlugin, que es bastante similar). Este patrón nos permite crear nuevas subclases para métodos de fábrica sin ningún over-layering ni acoplamiento con la jerarquía original. Por lo tanto, podemos añadir nuevas subclases en nuestros propios paquetes sin modificaciones intrusivas y reemplazar un patrón muy común, ampliamente utilizado en toda la aplicación, como este (tomado de AX 2012 R3):
static SalesCopying construct(SalesPurchCopy salesPurchCopy)
{
    switch(salesPurchCopy)
    {
        case SalesPurchCopy::CreditNoteHeader       : return new SalesCopying_CreditNote();
        case SalesPurchCopy::CreditNoteLines        : return SalesCopyingCreditNoteLine::construct();

        case SalesPurchCopy::CopyAllHeader          :
        case SalesPurchCopy::CopyAllLines           :
        case SalesPurchCopy::CopyJournalHeader      :
        case SalesPurchCopy::CopyJournalLines       : return new SalesCopying();

        // 
        case SalesPurchCopy::VoidFiscalDocument_BR  : return new SalesCopying_VoidFiscalDocument_BR();
        // 

        default                                     : throw error(strFmt("@SYS19306",funcName()));
    }

    throw error(strFmt("@SYS19306",funcName()));
}

Este patrón tiene muchos problemas para ser extensible. El más obvio es probablemente el throw error en el caso default, que hace imposible que una clase de extensión se suscriba al Post event del método para añadir nuevos casos. Pero incluso eliminando esta sentencia throw (que de hecho ha sido eliminada en muchos métodos estándar como una forma rápida de hacerlos extensibles), el patrón en sí sigue siendo un problema. Si una nueva personalización de cliente o partner, o incluso un nuevo módulo estándar, necesita un nuevo caso, esta clase debe ser modificada y todo el paquete recompilado y desplegado. Sin embargo, tener este patrón de Fábrica es útil, así que los frameworks SysExtension (y SysPlugin) nos permiten crear el mismo comportamiento con un solo constructor pero sin todo el acoplamiento creado por la sentencia switch-case. El framework SysExtension utiliza una clase atributo para identificar la jerarquía y decidir su comportamiento particular, y este atributo es usado por un constructor genérico (la Fábrica) para instanciar la subclase correcta dependiendo de los parámetros del constructor. El SysExtensionIAttribute nos guía sobre cómo implementar nuevas subclases. Dichas clases atributo tendrán estas relaciones:

Leer más
Thumbnail image

Libro: Clean Code

Hace mucho que no comento libros. Lo más curioso es que el libro que os traigo hoy siempre fue, en mi cabeza, el primero que debí haber traído. Esa fue la idea originalmente, pero después decidí omitirlo porque, aplicado al desarrollo de puro X++ no tenia tanto sentido. Lo tenía, de hecho, pero sólo podía apreciarse después de leerse el libro, así que era un mal aliciente para fomentar su lectura.

Leer más
Thumbnail image

AX Performance Monitor 101 - Consejos y trucos para tratar con archivos de contadores de rendimiento

En mi publicación anterior del blog, expliqué cómo configurar Performance Monitor (PerfMon) para capturar proactivamente datos de rendimiento mientras se eliminan archivos antiguos para mantener el espacio en disco bajo control. Este es, digamos, nuestro escenario ideal, pero a veces la configuración no es tan específica y necesitamos tratar con archivos subóptimos que contienen los datos de rendimiento que necesitamos analizar:

  • Tenemos demasiados archivos
  • Tenemos muy pocos archivos
  • Tenemos algún archivo enorme que hace que el análisis o procesamiento sea demasiado lento
  • Tenemos archivos capturados en diferentes idiomas Veamos una breve descripción de cómo podemos tratar algunas situaciones presentando un par de herramientas pequeñas pero útiles:

PAL - Performance Analysis of Logs

PAL es una herramienta pequeña pero realmente útil creada por Clint Huffman que toma un archivo de contador de PerfMon y crea un bonito informe HTML con gráficos y descripciones que pueden usarse como punto de partida para el análisis de rendimiento. No es que la herramienta reemplace un análisis manual en profundidad de cualquier problema potencial, pero ayuda dando algunos consejos que pueden usarse para empezar a buscar algo más.

Leer más
Thumbnail image

AX Performance Monitor 101 - Configurar Perfmon para monitorización continua con archivos rotativos

Windows Performance Monitor (PerfMon) es probablemente la herramienta más útil (junto con nuestro paquete DynamicsPerf) para monitorizar y diagnosticar problemas de rendimiento relacionados con tu infraestructura de Microsoft Dynamics AX y, en general, para cualquier software que se ejecute en sistemas operativos Windows. Dada su importancia, sorprende cuánta gente no la utiliza correctamente o, peor aún, no la utiliza en absoluto.

Voy a explicar brevemente cómo configurar PerfMon para recopilar contadores de rendimiento en todos los servidores para una monitorización continua, creando archivos de registro por día, comprimiendo y eliminando archivos antiguos para minimizar el espacio en disco, junto con algunos consejos y trucos durante el proceso:

Leer más