Thumbnail image

Manejar Enumerados De Dynamics AX en SQL Server (SSIS, SSRS, SSAS, ...)

!
Warning: This post is over 365 days old. The information may be out of date.

Manejar los valores de campos de tipo BaseEnum de Microsoft Dynamics AX en la base de datos (ya sea en T-SQL, en SSRS, SSIS, SSAS, …) puede ser complicado si se intenta hacer manualmente. El valor de los enumerados se guarda en la base de datos como el número del elemento pero cuando hay que presentar ese valor al usuario (en un informe, un cubo, etc…) hay que mostrar la descripción, el Label del campo, no el número que hay en la tabla, pero este valor no está disponible en AX de manera inmediata así que ¿Cómo hacerlo?

Afortunadamente, Microsoft ha solucionado ese problema para su propia integración con informes de Reporting Services y esa solución es fácilmente adaptable a nuestros requerimientos:

Durante la instalación de las Extensiones de Bussines Intelligence de Microsoft Dynamisc AX se actualiza automáticamente, dependiendo de la configuración elegida, la tabla del sistema SRSANALYSISENUMS con los valores y descripciones, por idioma, de todos los enumerados utilizados en todas las tablas que pertenecen a una Perspectiva.

Si a posteriori se quiere relanzar esta configuración para añadir nuevas tablas o nuevos idiomas, es posible hacerlo utilizando el Asistente para proyecto de SQL Server Analysis Services y seleccionando la opción Configurar:

Suponiendo que esta configuración ya está realizada, y suponiendo que lo que queremos es “traducir” las cadenas de texto en el idioma que corresponda a su valor numérico desde SQL Server Integration Services (el procedimiento se puede aplicar a otras áreas como SSAS o vistas de SQL por ejemplo) he optado por crear un procedimiento almacenado que realice la consulta de una manera reutilizable:

[cc_tsql]CREATE PROCEDURE [Staging].[ax_EnumValues] ( @enumName NVARCHAR(60), @languageId nvarchar(7) = NULL ) AS IF @languageId IS NULL SELECT ENUMITEMVALUE, ENUMITEMLABEL, LANGUAGEID FROM SRSANALYSISENUMS WHERE ENUMNAME = @enumName ELSE SELECT ENUMITEMVALUE, ENUMITEMLABEL, LANGUAGEID FROM SRSANALYSISENUMS WHERE ENUMNAME = @enumName AND LANGUAGEID = @languageId GO[/cc_tsql]

Procedimiento almacenado EnumValues

De esta manera en SSIS se puede incluir una transformación de tipo Lookup (Full cache para que se ejecutare sólo una vez para cada valor del enumerado que se utilice):

y utilizar este procedimiento almacenado como origen de datos del Lookup:

El idioma se puede pasar al procedimiento directamente o se puede incluir en el Data Flow para hacerlo configurable, como es este caso. De manera que esta transformación añada una nueva columna conteniendo la descripción que buscábamos en el idioma que viene de los datos e incluso podríamos añadir diversas columnas para cada idioma si, por ejemplo, nuestro cubo estubiera traducido:

Espero que sea útil :)