Problemas de sincronización en Microsoft Dynamics AX 2012

A veces al sincronizar la base de datos de Microsoft Dynamics AX 2012 obtenemos errores sin sentido. En mi ejemplo, estoy recibiendo un error indicando que no se puede cambiar el tipo de dato de un campo en una tabla. Pero ese campo ni siquiera existe en esa tabla, el mismo mensaje de error indica que intenta convertir un campo de una tabla en otro campo de otra tabla… absurdo.

ndb-sync-001

Este es un signo claro de que un conflicto de IDs en la tabla o en los campos está ocurriendo. Desafortunadamente no tenemos herramientas apropiada en AX para gestionar estos conflictos, así que voy a recurrir directamente a la base de datos.

Me encanta el olor a UPDATE SQLDICTIONARY por las mañanas

Por supuesto, todo lo que voy a contar no está para nada recomendado y conlleva un grave riesgo de pérdida de datos y de generar más problemas de los que se intenta solucionar con ellos si no se hace con cuidado. Probarlo siempre antes en entorno de test y, si es posible, intenta solucionarlo de otra forma.

Dicho esto, para empezar voy a ver el estado de sincronización de la tabla original, la tabla a la que está asociado el error en el log de sincronización. en el AOT podemos ver el nombre de la tabla y su ID, el ID que tiene asociado en los metadatos de AX.

ndb-sync-002

Vamos a ver si esta información está bien sincronizada en la base de datos utilizando la tabla del sistema SQLDICTIONARY, que almacena el estado de los objetos del diccionario de datos en la base de datos SQL Server, permitiendo al sistema detectar cambios y corregirlos con el proceso de sincronización.

Al buscar la tabla por nombre y por ID vemos que por nombre no encuentra nada, y por ID encuentra otra tabla que no es la que buscamos (es la que indica el error de sincronización original).

ndb-sync-003

Volvemos a AX y buscamos esta tabla y su ID…

ndb-sync-004

… y repetimos la búsqueda en SQLDICTIONARY para ese ID también. Voilà! Aquí podemos ver que el nombre de la tabla no es coherente con el ID que se muestra en el AOT, y además tenemos dos tablas con el mismo ID… algo no va bien.

Aquí es donde podemos (bajo nuestra responsabilidad) hacer un UPDATE en los datos y cambiar el TABLEID de estos registros al ID que deberían tener, el que muestra el AOT para esta tabla, teniendo cuidado de no actualizar ningún otro registro, hasta dejar la tabla y sus campos en el ID correcto:

ndb-sync-005

Después de esto la tabla sincroniza sin errores y todo vuelve a la normalidad.

ndb-sync-006

Y tras la sincronización se crea la tabla que daba errores y los campos que faltaban en la tabla SQLDICTIONARY:

ndb-sync-007

Debería haber una herramienta para solucionar estas incoherencias, pero mientras tanto podemos arreglárnoslas de esta forma, con cuidado 😉