Novedades Junio 2016 en Lifecycle Services (LCS)

Microsoft Dynamics Lifecycle Services Ya está disponible la revisión mensual de Microsoft Dynamics Lifecycle Services (LCS). Los cambios más importantes son sin duda las primeras funcionalidades disponibles para el manejo de diferentes versiones del nuevo Microsoft Dynamics AX.
  • Se pueden desplegar directamente entornos de Desarrollo o Build y pruebas (habrá más y mejores cambios en futuras versiones)
  • Mejoras en el manejo de las metodologías (adjuntar una metodología a otra existente; añadir fases y tareas)
  • Actualizada la hoja Excel Subscription estimator (otra vez, es un permanente work-in-progress). A partir de ahora la utilización de esta hoja es obligatoria para implementar proyectos.
  • Las herramientas de diagnóstico y monitorización han sido publicadas a través de LCS (podía verse cierta monitorización genérica antes a través del portal de Azure, pero la disponible en LCS es específica para AX, incluyendo las métricas de SQL Insights).
  • ¡Integración de las tareas de procesos de negocio con Work Items de TFS (en realidad, con VSTS)! (esta funcionalidad está todavía en preview por lo que hay que activarla especificamente).
  • Ahora se pueden añadir requerimientos a los procesos de negocio.
Puedes ver todas las notas y ejemplos de estas novedades en el siguiente enlace: Y los cambios de la actualización anterior aquí
Leer Más >>

Cumulative Update 11 para Microsoft Dynamics AX 2012 R3

Microsoft Dynamics Ya está disponible la siguiente actualización acumulativa para Microsoft Dynamics AX 2012 R3, la CU11 (6.3.4000.127). Esta actualización está disponible para instalación mediante el módulo Updates de Lifecycle Services, como viene siendo habitual desde la revisión R3. Información sobre las mejoras sobre el proceso de instalación se puede encontrar en la guía de instalación enlazada más abajo, incluyendo la página de TechNet que detalla los cambios de esta revisión. La documentación del parche: Descarga y detalle de cambios en: Vale la pena echar un vistazo a los cambios realizados en los modulos de almacén y cadena de suministro detallados en este post del equipo de SCM. Y como pequeño offtopic comentar el anuncio de que el soporte extendido para AX 2012 R3 ha sido extendido hasta 2023, supongo para garantizar las inversiones de AX 2012 como versión de on-premise hasta que el nuevo AX esté disponible fuera de Azure. Supongo que veremos algo más el mes que viene durante la conferencia anual de partners en Toronto.
Leer Más >>

PowerShell para la administración automática de Dynamics AX 2012 (PS-II)

En la primera entrega de esta serie sobre PowerShell y DevOps para Microsoft Dynamics AX 2012  hablábamos sobre los principios más básicos de PowerShell y su sintaxis. También vimos en post anteriores como PowerShell se puede usar de formas bastante creativas. Keyboard Esta vez vamos a ver los comandlets específicos para la administración de Microsoft Dynamics AX 2012, que podemos separar en varias familias:

Gestión de Modelos y la Model Store

Estos comandlets son muy importantes y van a ser la base de nuestra estrategia DevOps, combinada con los procesos builds automáticos que tendremos configurados en nuestro TFS, si es que los utilizamos. La combinación de estos componentes va a permitirnos diseñar procesos que actualicen automáticamente nuestros entornos, orientando nuestros procesos hacia la integración o el despliegue continuo de nuestros entornos, especialmente entornos de desarrollo y/o pruebas. Hablaremos sobre esto en los siguientes posts de esta serie. Estos son los que normalmente utilizamos para estas tareas, aunque vale la pena echar un vistazo a la referencia completa porque todos pueden ser útiles para tareas concretas o para scripts que automaticen tareas más completas:

Modelos

Comando Descripción
New-AXModel  Crea un nuevo modelo en la Model Store
Uninstall-AXModel  Elimina un modelo de la Model Store
Install-AXModel  Importa un modelo (desde un fichero) en la Model Store
Export-AXModel  Exporta un model de la Model Store a un fichero .axmodel
Move-AXModel  Mueve los objetos de un modelo a otro modelo, combinando todos los objetos en este último.

Model Store

Comando Descripción
Import-AXModelStore  Importa una Model Store (desde un fichero)
Export-AXModelStore  Exporta una Model Store a un fichero fichero .axmodelstore
Initialize-AXModelStore  Inicializa una model store para ser utilizada.  Es recomendable utilizar este comando después de algunas tareas de mantenimiento.
Optimize-AXModelStore  Optimiza y reindexa la model store para mejorar su rendimiento.  Es recomendable utilizar este comando después de algunas tareas de mantenimiento.
Set-AXModelStore  Asigna a la Model Store ciertos flags que indican las acciones que se han realizado sobre ella. Estos flags van a influir, por ejemplo, en si se muestra o no la cabina de actualización de modelo al iniciar un cliente, y son:
  • -InstallMode (mostrar cabina);
  • -NoInstallMode (no mostrar cabina)

Gestión y despliegue de informes y Reporting Services

La gestión de informes es otra de las tareas que podemos automatizar dentro de nuestras builds o scripts de despliegue. Aquí dejo los comandos más utilizados pero hay muchos más, consultad la referencia completa para verlos todos:
Comando Descripción
Publish-AXReport  Publica un informe desde el AOS hacia el Report Rerver de SSRS.  Es recomendable revisar la documentación de este comando porque tiene varios parámetros muy interesantes para desplegar informes de manera optimizada.
Test-AXReportServerConfiguration  Comprueba la configuración y la conectividad entre el AOS y el Report Server. Este comando es útil si tenemos problemas con el despliegue o la impresión de informes, para detectar posibles configuraciones erróneas o qué partes del sistema pueden estar fallando.
Get-AXReportServerConfiguration  Muestra la configuración actual, incluyendo la mostrada en el formulario correspondiente en Dynamics AX 2012 y algunos parámetros extra.
Get-AXReport  Muestra información sobre el informe como la fecha de creación/modificación, el usuario que lo ha modificado, la lista de diseños, el correspondiente proyecto de Visual Studio en el AOT, etc. Este comando es muy útil sobre todo cuando se usa en scripts de despliegue pero a veces es útil también utilizado directamente en la consola para obtener información de cualquier informe que esté dando problemas.

Gestión de usuarios y artefactos de seguridad

Otra tarea que es muy propia de su utilización tanto en consola como en scripts de automatización de tareas es la gestión de usuarios, y en el caso de AX, también de roles de seguridad. Cabe recordar que como veremos, PowerShell no se limita al manejo de AX sino que incluye todas las funcionalidades de Windows, con lo que estos comandos se pueden utilizar junto a los propios de la gestión de Active Directory para la creación, mantenimiento y supervisión automática de los usuarios en AX en base a los cambios en el dominio.

Usuarios

Comando Descripción
New-AXUser  Crea un nuevo Usuario
Disable-AXUser  Desactiva un Usuario
Get-AXUser  Devuelve una lista con todos los Usuarios  Este comando devuelve, entre otras informaciones útiles sobre cada usuario, su SID en Active Directory, por lo que resulta el punto de enlace ideal entre la seguridad de Dynamics AX y los usuarios del dominio.

Roles

Comando Descripción
New-AXSecurityRole  Crea un Rol de seguridad
Remove-AXSecurityRole  Elimina un Rol de seguridad
Add-AXSecurityRoleMember  Añade un Usuario a un Rol
Get-AXSecurityRole  Devuelve una lista con los Roles que tiene asignado un Usuario
Get-AXSecurityRoleMember  Devuelve una lista con los Usuarios asignados a un Rol
Get-AXSecurityRoleInfo  Devuelve información sobre todos los Roles existentes en el sistema
Debo insistir en revisar la referencia completa, no tiene sentido reproducir aquí la toda la lista de comandos disponibles por eso he puesto sólo los más relevantes, pero hay muchos más y es interesante conocerlos:

No sólo de AX vive el hombre

Hasta aquí he hablado sólo de los comandlets disponibles dentro de las herramientas de administración de Dynamics AX 2012. Pero no debemos limitarnos a esto. Para realizar tareas de automatización complejas vamos a necesitar integrarnos con el resto del sistema y utilizar no sólo los comandos genéricos de PowerShell sino los que vienen con el resto de productos que utilicemos como Analysis Services, Sharepoint, Active Directory, SQL Server, servicios de Azure, ... cualquier producto de Microsoft tiene su correspondiente módulo de PowerShell para interactuar con sus componentes. Por ejemplo, hace un tiempo mostré como obtener información la información de los usuario susuarios en Active Directory desde X++, esto mismo se puede hacer desde PowerShell para ser reutilizado rápidamente por los administradores sin necesidad de abrir AX; También mostré hace tiempo cómo utilizar PowerShell para asignar nuestro usuario activo a una base de datos de AX que hemos restaurado desde otro dominio para hacernos administradores, como ejemplo de uso del módulo de SQL Server. Y así podríamos seguir... Ejemplos de módulos que vamos a utilizar: El uso de estos módulos es bastante intuitivo, tras importar el módulo correspondiente con Import-Module podemos utilizar los comandlets que ya vimos en nuestra introducción a PowerShell tales como Get-Command y Get-Help para obtener cuales son los comandos disponibles y cómo utilizarlos. PowerShell - Import-Module

Reutilizar es la clave

Como sucede con el resto de consolas y lenguajes de script, siempre hay que intentar evitar reinventar la rueda desarrollando scripts que muy probablemente alguien haya hecho antes que nosotros. Buscando en internet se pueden encontrar scripts para realizar prácticamente cualquier tarea de administración usando PowerShell. Además, hay varias iniciativas para publicar scripts específicos para el uso con Microsoft Dynamics AX 2012, el más notable creo yo es el paquete de scripts publicado por Martin Dráb en codeplex y que incluye acciones para casi todas las fases de un despliegue automático. Prácticamente podemos montar un sistema de builds y actualización de entornos utilizando sólo PowerShell. Puede que este paquete te sirva o puede que no, pero en cualquier caso se puede aprender mucho de ese código y es una buena base para desarrollar los tuyos propios, ya que incluye buenas ideas específicas para conectar a servidores AX. Se puede descargar aquí:

Extra

Como nota final voy a comentar un artículo que, más que por su utilidad real, vale la pena revisar por sus posibilidades. Recordemos que desde PowerShell se pueden utilizar ensamblados de .NET y eso incluye por supuesto el .NET Business Connector de AX. En este artículo nos enseñan un ejemplo de esta utilización, tenga sentido o no 😉 Y hasta aquí esta segunda parte, que tras la primera introducción va a ser el punto de partida para desarrollar nuestros scripts de ¡DevOps para AX 2012!
Leer Más >>

Unit Testing X++ code in Visual Studio (AX 2012) [EN]

I'm pretty sure everybody who has tried will agree with me that the Unit Testing framework included in the AX 2012 development environment (aka MorphX) has some limitations. Sometimes such limits become so impacting that makes the framework almost useless when the code you need to test starts growing (let's discuss design problems in a separate post :)). But I'm not going to talk here about limitations, but about what we actually can do, and one of such things is to use X++ proxy classes to write our unit tests in Visual Studio, and use the native testing framework included here with all its possibilities. Let's see how it works with an easy example. I wrote this simple X++ class in order to have something to test:
/// 
/// Dummy fluid class for testing purposes
/// 
class DEVDummyTestCalcClass
{
    real value;
}
public void new(real _value)
{
    value = _value;
}
public real Value()
{
    return value;
}
public DEVDummyTestCalcClass Add(real _value)
{
    return new DEVDummyTestCalcClass(value + _value);
}
public DEVDummyTestCalcClass Substract(real _value)
{
    return new DEVDummyTestCalcClass(value - _value);
}
public DEVDummyTestCalcClass Multiply(real _value)
{
    return new DEVDummyTestCalcClass(value * _value);
}
public DEVDummyTestCalcClass Divide(real _value)
{
    return new DEVDummyTestCalcClass(value / _value);
}
First of all, go to the Visual Studio 2010 instance we all have in our AX 2012 development environments and create a new Test Project. (I've chosen C# but it should work in Visual Basic if that's your preferred choice): AX 2012 X++ Unit Test Add this new project to AOT. By doing so, Visual Studio will add the Interop assembly to the project, allowing us to run our X++ code from this CIL project, automatically creating all needed proxy classes: AX 2012 X++ Unit Test Show the Application Explorer panel so we can see AOT objects from the Visual Studio editor: AX 2012 X++ Unit Test Choose the class (or classes) you want to test and add them to the project. This will automatically create all required proxy classes: AX 2012 X++ Unit Test Now remove the TestMethod1 method in the default class or create your own test classes at your convenience. For instance, for testing the X++ simple class shown above, we can write some test methods like these ones:
[TestMethod]
public void TestConstruct()
{
	using (Session axSession = new Session())
	{
		axSession.Logon(null, null, null, null);

		Assert.AreEqual(0, new DEVDummyTestCalcClass(0).Value());
		Assert.AreEqual(-1, new DEVDummyTestCalcClass(-1).Value());
	}
}

[TestMethod]
public void TestSum()
{
	using (Session axSession = new Session())
	{
		axSession.Logon(null, null, null, null);

		Assert.AreEqual(10, new DEVDummyTestCalcClass(0).Add(10).Value());
		Assert.AreEqual(10, new DEVDummyTestCalcClass(0).Add(5).Add(5).Value());
	}
}

[TestMethod]
public void TestDivide()
{
	using (Session axSession = new Session())
	{
		axSession.Logon(null, null, null, null);

		Assert.AreEqual(10, new DEVDummyTestCalcClass(20).Divide(2).Value());
	}
}

[TestMethod]
[ExpectedException(typeof(Microsoft.Dynamics.AX.ManagedInterop.NumericException))]
public void TestDivideByZeroException()
{
	using (Session axSession = new Session())
	{
		axSession.Logon(null, null, null, null);

		new DEVDummyTestCalcClass(100).Divide(0).Value(); // Exception
	}
}
Finally, we can run our test cases as a regular Visual Studio test project, to be sure our X++ class works as expected: 00500-ax2012-xpp-unittests How cool is that? Isn't it easy? If this is an interesting topic I'll publish more about it, including more complicated and close-to-real scenarios. In the meantime, please feel free to comment or get in touch via twitter! 🙂
Leer Más >>

Test Unitarios de código X++ en Visual Studio (AX 2012)

Creo que todo el que lo haya intentado estará de acuerdo en que el framework para Unit Testing integrado en el propio entorno de desarrollo de Microsoft Dynamics AX 2012 (del nuevo Dynamics AX, AX 7, hablaremos otro día) es bastante limitado. Tan limitado que resulta prácticamente inutilizable en cuanto quieres probar algo más o menos serio. Pero hoy no quiero hablar de limitaciones sino de lo que podemos hacer, y entre estas cosas está la posibilidad de utilizar classes proxy del código X++ para poder escribir las pruebas unitarias en el propio Visual Studio, y utilizar así sus posibilidades y su flexibilidad. Veamos un ejemplo sencillo. Voy a intentar probar una clase que he hecho en X++ específicamente para esto, con este código:
/// 
/// Dummy fluid class for testing purposes
/// 
class DEVDummyTestCalcClass
{
    real value;
}
public void new(real _value)
{
    value = _value;
}
public real Value()
{
    return value;
}
public DEVDummyTestCalcClass Add(real _value)
{
    return new DEVDummyTestCalcClass(value + _value);
}
public DEVDummyTestCalcClass Substract(real _value)
{
    return new DEVDummyTestCalcClass(value - _value);
}
public DEVDummyTestCalcClass Multiply(real _value)
{
    return new DEVDummyTestCalcClass(value * _value);
}
public DEVDummyTestCalcClass Divide(real _value)
{
    return new DEVDummyTestCalcClass(value / _value);
}
En el Visual Studio 2010 que todos tenemos en nuestros entornos de desarrollo de Microsoft Dynamics AX 2012, creamos un nuevo proyecto de tipo Test Project (yo he elegido C# pero supongo que también funcionarán en Visual Basic): AX 2012 X++ Unit Test Añadimos este proyecto al AOT. Esto es necesario para que se añada al proyecto la referencia al ensamblado que nos va a permitir el Interop entre X++ y CIL que necesitamos para que se generen las clases proxy: AX 2012 X++ Unit Test Si no lo tenemos visible, mostramos el Application Explorer para poder acceder a los objetos del AOT desde Visual Studio: AX 2012 X++ Unit Test Elegimos la clase (o clases) que queremos probar, y las añadimos al proyecto, lo que efectivamente generará la clase proxy automáticamente: AX 2012 X++ Unit Test Ahora, en la clase de pruebas creada por defecto en el proyecto, o en otra clase cualquiera que hayamos creado, sustituimos el método TestMethod1 por métodos de pruebas como estos (aplicables a la clase X++ que puse más arriba):
[TestMethod]
public void TestConstruct()
{
	using (Session axSession = new Session())
	{
		axSession.Logon(null, null, null, null);

		Assert.AreEqual(0, new DEVDummyTestCalcClass(0).Value());
		Assert.AreEqual(-1, new DEVDummyTestCalcClass(-1).Value());
	}
}

[TestMethod]
public void TestSum()
{
	using (Session axSession = new Session())
	{
		axSession.Logon(null, null, null, null);

		Assert.AreEqual(10, new DEVDummyTestCalcClass(0).Add(10).Value());
		Assert.AreEqual(10, new DEVDummyTestCalcClass(0).Add(5).Add(5).Value());
	}
}

[TestMethod]
public void TestDivide()
{
	using (Session axSession = new Session())
	{
		axSession.Logon(null, null, null, null);

		Assert.AreEqual(10, new DEVDummyTestCalcClass(20).Divide(2).Value());
	}
}

[TestMethod]
[ExpectedException(typeof(Microsoft.Dynamics.AX.ManagedInterop.NumericException))]
public void TestDivideByZeroException()
{
	using (Session axSession = new Session())
	{
		axSession.Logon(null, null, null, null);

		new DEVDummyTestCalcClass(100).Divide(0).Value(); // Exception
	}
}
A continuación ya podemos ejecutar estos Test y verificar que nuestra clase funciona como se espera de ella: 00500-ax2012-xpp-unittests Fácil, ¿Verdad? Si este tema interesa a más gente seguiré publicando artículos para escenarios más complicados. Digamos, más cerca de lo que serían unas pruebas de objetos reales. Mientras tanto, probablemente te interese mi serie de artículos sobre gestión del ciclo de vida de aplicaciones AX 2012. 🙂
Leer Más >>

Novedades Mayo 2016 en Lifecycle Services (LCS)

Microsoft Dynamics Lifecycle Services Ya está disponible la revisión de Mayo de Microsoft Dynamics Lifecycle Services (LCS). Los cambios más importantes son sin duda las primeras funcionalidades disponibles para el manejo de diferentes versiones del nuevo Microsoft Dynamics AX, cuya primera actualización fue publicada ayer, como comentaba en este otro post:
  • Al desplegar nuevos entornos en Azure desde LCS para desarrollo o Demo, podemos elegir la versión original (RTM) o la versión de Mayo (Update 1):
Microsoft Dynamics AX RTW Update 1
  • Es posible cambiar la configuración de versión de un proyecto de implementación de cliente existente y desplegar nuevos entornos en la nueva versión.
  • La biblioteca de activos ahora permite copiar elementos directamente desde el interfaz.
  • Actualizada la hoja Excel Subscription estimator. Nuevas pestañas, nuevo cuestionario y mejores validaciones.
Puedes ver todas las notas y ejemplos de estas novedades en el siguiente enlace: Y los cambios de la actualización anterior aquí
Leer Más >>