🎃Especial Halloween👻: “hexadecimal value 0x02, is an invalid character” en un XML generado con un GER

Seguimos con la edición de fórmulas desde los informes electrónicos. Esta vez, vamos a ver dos formas que tenemos disponibles desde el Diseñador de los formatos para reemplazar caracteres, con un ejemplo de una película de terror (basada en una historia real): Un carácter destructor de XMLs, y la imposibilidad de generar los elementos de mensajes electrónicos para enviar las transacciones a Hacienda.


Y si… un día me tenía que pasar a mí:

“hexadecimal value 0x02, is an invalid character” en un XML generado con un GER

Comencemos desde el origen del universo, sabemos que nuestro D3FO no trabaja con caracteres especiales y si en un campo se informa un carácter inválido, el sistema lo convierte en hexadecimal.

El gran problema que viene después: qué pasa cuando necesitamos, por ejemplo, generar un elemento de mensaje electrónico, un reporte/informe o un archivo basado en un GER.

Les cuento mi caso como ejemplo, teníamos un montón de facturas de servicio que provenían de una integración y en el texto de la transacción de alguna de ella venía uno de estos caracteres inválidos.

Al momento de generar el GenerateMessageCI el sistema emitía este error:

La buena noticia es que (con ayuda del soporte de MS) pudimos solucionarlo sin necesidad de desarrollo o modificar el código del sistema, sólo realizando una transformación en el GER.

Les voy contando los pasos y explicando cada parte:

🌱Comenzamos con la funcionalidad de Transformaciones.

  1. Siempre siempre siempre, empezamos duplicando el GER sobre el que vamos a trabajar:

Y una vez creado el nuevo GER, accedemos al

2. Como lo que necesitamos es transformar un dato que proviene de un origen de datos para que pueda enviarse como parte del proceso de generación del documento electrónico, vamos a utilizar la funcionalidad de ‘Transformaciones’ (y luego lo vinculamos al mismo componente).

Para ello, desde el diseñador de formato, nos posicionamos sobre el nodo que está enlazado con el campo que contiene estos caracteres hexadecimales:

Sobre el margen derecho, tenemos que posicionarnos sobre ‘Transformaciones’ para poder crear una nueva transformación de datos:

👉🏻Les dejo el DOC de MS que lo explica:

https://learn.microsoft.com/es-es/dynamics365/fin-ops-core/dev-itpro/analytics/general-electronic-reporting-formula-designer?context=%2Fdynamics365%2Fcontext%2Fcommerce

3. Ingresamos un nombre identificativo, el tipo de parámetro String y vamos a editar la fórmula:

4. Y ahora ingresamos la función REPLACE.

Texto: Parámetro

Expresión: Lo más importante es ingresar la siguiente expresión para convertir cualquiera de los caracteres hexadecimales en el carácter que especifiquemos en la fórmula (por ejemplo “_”):

«(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F\uFEFF\uFFFE\uFFFF]»

👉🏻Les dejo el DOC de MS con la sintaxis del REPLACE: https://learn.microsoft.com/es-es/dynamics365/fin-ops-core/dev-itpro/analytics/er-functions-text-replace#example-1

5. Una vez guardado todo, volvemos al Formato del nodo y asociamos nuestra nueva transformación:

🌱Y ahora, si bien ya no es necesario para convertir estos valores, también se puede agregar un campo calculado en el origen de datos con el mismo REPLACE:

  1. Volvemos a posicionarnos sobre el nodo, y accedemos al apartado Asignación.
  2. Seleccionamos ‘Agregar raíz > Funciones > Campo calculado’:

3. Ingresamos el Nombre y vamos a editar la fórmula:

4. La diferencia en ésta fórmula de REPLACE es que tenemos que ingresar el origen del campo en el apartado del texto (en vez de indicar un parámetro):

REPLACE(model.’$Invoices’.Invoice.TransactionDescription, «(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F\uFEFF\uFFFE\uFFFF]», «_», true)

Y listo!

🌱Con este ejemplo:

Pasamos de esto:

A esto 🤩:


Podemos utilizar la funcionalidad ‘Prueba’ para testear la fórmula que estamos configurando, tanto desde las funcionalidades de Editar fórmula, las transformaciones o el campo calculado:

Espero que les sea útil 😊


Deja una respuesta