j.a.estevan

Si no eres parte de la solución, eres parte del problema

Error: Concurrent number of AOS for this application exceeds the licensed number

Otro error recurrente al mover o copiar entornos o bases de datos es referente al número máximo de AOS que podemos ejecutar en una misma instalación por cuestiones de licencia. Esto ocurre en diferentes versiones y revisiones pero en mi caso me lo estoy encontrando sobre todo en AX 2012:

Object Server 01:  Concurrent number of AOS' for this application exceeds the licensed number AX 2012

Para solucionarlo, podemos ejecutar esta sentencia en la base de datos que hemos copiado:

UPDATE dbo.SysServerSessions SET Status = 0 WHERE Status = 1;

Esto liberará las sesiones que hayan quedado almacenadas en la base de datos antes de copiarla, permitiendo conectarle un AOS diferente, lo que es totalmente válido para una licencia normal y bastante típico al copiar bases de datos de producción para refrescar entornos de pruebas o desarrollo.

NOTA: Ejecutar sentencias SQL directamente sobre la base de datos siempre supone un riesgo. Ejecutar con precaución y en entornos de testeo.

16-12-2014 | deja un comentario

Microsoft Dynamics AX 2012 R3 CU8 Demo VM V1

Microsoft Dynamics AX 2012 R3

Ya se ha publicado la máquina virtual demo de la también recién publicada Microsoft Dynamics AX 2012 R3 CU8. Esta máquina virtual viene, como de costumbre, actualizada con las últimas versiones de todo el software y con datos de prueba de las nuevas funcionalidades:

Se puede descargar de PartnerSource y CustomerSource:

Recordar la posibilidad que tenemos desde la revisión R3 de desplegar estas máquinas virtuales directamente en Azure desde , como ya comenté hace un tiempo :)

12-12-2014 | hay 1 comentario

En busca de la tabla perdida… herencia de tablas en AX 2012

Si alguien ha creado o mantiene un desarrollo que acceda directamente a la base de datos de Microsoft Dynamics AX 2012 (por ejemplo, algún sistema externo de Business Intelligence), se habrá encontrado con el fenómeno de la “tabla fantasma“. Hay muchos casos, pero analicemos por ejemplo la tabla OMOperationUnit. Esta tabla existe en el AOT, podemos explorarla desde Dynamics AX y ver los datos que contiene, por lo que esos datos deben estar almacenados en alguna parte. Sin embargo la tabla no existe en la base de datos SQL Server subyacente. Entonces, ¿Dónde están los datos?

En primer lugar hay que fijarse que este fenómeno sucede siempre en tablas heredadas o que soportan herencia, por ejemplo:

Tablas heredadas en Microsoft Dynamics AX 2012

Como la tabla existe y almacena datos en el AOT, es obvio que la tabla debe existir en la base de datos. Una buena herramienta de la que disponemos en X++ es la función getSQLStatement que podemos usar en variables de tipo buffer o en consultas, de esta forma:

static void Job43(Args _args)
{
    OMOperatingUnit tabla;

    select generateOnly tabla;

    info(tabla.getSQLStatement());
}

Esta función nos devuelve el SQL que se enviará a la base de datos para obtener los datos que se requieren desde X++. Aquí tenemos la explicación al problema de la tabla fantasma:

Consulta SQL de tablas heredadas en Microsoft Dynamics AX 2012

Si analizamos bien el SQL obtenido, incluso si lo probamos directamente contra la base de datos SQL Server, descubrimos la estructura interna que el AOT ha desarrollado en la base de datos para almacenar los datos de las tablas heredadas:

Consulta SQL de tablas heredadas en Microsoft Dynamics AX 2012

En este caso, la tabla heredada obtiene los datos de tablas totalmente diferentes mediante algunos filtros. Dependiendo del tipo de tabla heredada, las tablas físicas pueden tener otra forma, pero en cualquier caso de esta forma obtenemos una consulta válida que podemos utilizar para acceder a los datos desde un sistema externo, o podemos crear una vista con esa consulta para simular la existencia de la tabla, si fuera necesario.

09-12-2014 | deja un comentario

Cumulative Update 8 para Microsoft Dynamics AX 2012 R3

Microsoft Dynamics

Aunque se ha hecho esperar un poco más de lo acostumbrado, ya tenemos disponible la siguiente actualización acumulativa para Microsoft Dynamics AX 2012 R3, que será la CU8 (6.3.1000.309) siguiendo el orden de numeración que se estableció en la última CU7 (Esta es la primera CU para R3, no hay CU1, 2, etc. para esta versión).

Como de costumbre desde hace algunas revisiones, además de todos los hotfixes publicados con anterioridad de manera acumulativa, incluye algunos cambios funcionales y, en este caso, escasos cambios a nivel técnico. El más importante a tener en cuenta es que a partir de la versión AX 2012 R3 CU8 la versión de Visual Studio necesaria para trabajar con AX  será Visual Studio 2013 de manera obligatoria. Sera necesario desinstalar el antiguo Visual Studio 2010 (cuyo soporte oficial termina el próximo mes de Julio) ya que no está soportada la instalación de ambas versiones en el mismo equipo. Sin embargo, para el diseño y visualización de informes necesitaremos las Data Tools (antiguo BIDS) de Microsoft SQL Server 2012.

Más información sobre todos estos temas en los siguientes enlaces:

Descarga en:

Esta actualización también incluye mejoras respecto a LCS, y está disponible para instalación mediante el módulo Updates de Lifecycle Services, pero sobre LCS hablaremos en el próximo post ;)

 

20-11-2014 | deja un comentario

¡Enhorabuena MVP de Microsoft 2014!

Un año más he renovado como MVP de Microsoft en la especialidad técnica Microsoft Dynamics AX.

MVP 2014

Ya van 3 y tanto las ganas como el orgullo de pertenecer a este increíble grupo no han descendido lo más mínimo.

01-10-2014 | deja un comentario

Errores de caché tras migración a Microsoft Dynamics AX 2012 R3

Este es uno de esos post que escribo para mi propia referencia. Tras una reciente migración de 2012 RTM a 2012 R3 hemos estado experimentando unos errores bastante extraños. Los objetos compilaban perfectamente tanto en X++ como en CIL, no estaban modificados por lo que ejecutaban lógica estándar, y sin embargo estaban fallando a un nivel de profundidad en el core estándar que hacia peligrar la salud mental de quien intentaba depurarlo.

Mediante esta depuración todo parecía apuntar a un problema de caché al deserializar ciertos objetos, no funcionaron las funciones típicas de limpieza de cachés disponibles en el cliente de desarrollo ni los datos de uso, así que investigando di con un post de la comunidad Dynamics que ofrecía una solución tan sencilla como efectiva: la ejecución del siguiente Job:

static void ResetClientCacheGuid(Args _args)
{
    #AiF
    SysSQMSettings settings;

    ttsbegin;

    update_recordset settings
        setting GlobalGUID = str2Guid(#EmptyGuidString);

    ttscommit;
}

Gracias a Ali Raza Zaidi, compañero MVP, por el código que funciona perfectamente.

30-09-2014 | deja un comentario