¿Errores internos en Dataports? Pues vayamos a ciegas!

Últimamente parece que me caen expedientes X a diario. Hoy he descubierto que es posible hacer el dataport más tonto del mundo para exportar el contenido de una tabla y (sí) puedes morir en el intento:

El tema es que he creado un dataport con un dataitem de una tabla no demasiado grande (sin demasiados campos ni demasiados registros). En la pantalla de dataport fields he añadido todos los campos de la tabla. Ejecuto la exportación de los datos y me encuentro con esto:

La longitud del origen excede del tamaño del búfer de destino. Error raro y ceño fruncido. Lo había visto otras veces al trabajar con XML cuando todavía no existían los XMLPorts, pero nunca en un dataport. Lo primero que he pensado es que quizás había información en algún campo que interfería de alguna forma extraña con el dataport. Así que he quitado todos los campos de la sección dataport fields y he vuelto a ejecutar. El resultado: El mismo! 🙁

Como me estaba empezando a impacientar, he cambiado la tabla y la he cambiado por un entero. Internamente recorría los registros guardando los campos en las variables. A partir de ahí ningún problema. He conseguido exportar los datos sin problemas sin saber cual era el origen del problema.

Al crear otro dataport para importar estos datos en otra base de datos he vuelto a intentar utilizar la tabla destino asignando los campos en la sección dataport fields. Mi gran sorpresa ha sido ver una especie de error de sobrepasamiento que decía que no podía insertar la cadena en un text de 80. Lo más asombroso de todo es que en esta tabla no existe ningún campo de esa longitud y en el dataport tampoco existe ningúna variable. ¿De que se estaba quejando NAV?

La solución: He desactivado la propiedad ShowStatus y todo ha ido como la seda. ¿Que significa esto? Pues significa que en la ventana de proceso hay una barra de proceso que se basa en las líneas que tiene el fichero y luego tiene un campo de nombre registro que muestra los valores que conforman la clave. Es una pena que los boys de NAV no hayan tenido en cuenta que los valores que componen una clave pueden ocupar concatenados más de 80 caracteres!

Así que ya sabéis, si vais a hacer dataports que ataquen a tablas con muchos campos en la clave, desactivad ShowStatus o id tirando el peine a la basura.

Estas asignaciones nunca fallan

SOBREPASAMIENTO: ¿A quién no le ha pasado alguna vez lo siguiente? Te piden hacer un proceso “sencillo” para importar información en Navision. Como buen experto que eres lo tienes listo en unos pocos minutos y, para asegurarte, haces unas cuantas pruebas y compruebas que realmente funciona. Te aseguras de que el proceso detecta los duplicados, no estropea datos, es estable, etc. Para acabar de probarlo bien, pides un fichero de pruebas que funciona sin problemas. Al cabo del tiempo, llega el día D y la hora H, necesitas lanzar el proceso y de repente…

SOBREPASAMIENTO. Bien!! No pasa nada, esto no daña tu imagen, pero… a nadie le gusta llevar una mancha en la camisa y… esta te la has colgado en el desayuno (campeón)… Es un error tan tonto y tan básico que incluso la persona que tienes al lado dice “¿no cabe?” a lo que respondes “prfff… más o menos”. No va mal encaminado pues es cierto que “algo no cabe en algún sitio” hasta ahí llegamos todos… Ahora el problema es que hay que encender el debbuger y esperar a que la barrita se vuelva a poner en el 95%. De esto hablaremos otro día pero está comprobado que la probabilidad de que una importación falle viene indicada en la propia barra de proceso y que cuando llegas al 100 es que Navision te ha perdonado la vida.

Volvamos a la parte técnica: Evidentemente, el problema es que hemos intentado almacenar una cadena de caracteres en un campo o variable donde no puede caber. Existe un pequeño truco que nos permite cubrirnos las espaldas ante esto:

variableDestino := COPYSTR(variableOrigen,1,MAXSTRLEN(variableDestino));

Con MAXSTRLEN obtenemos la longitud máxima de la variable destino y con COPYSTR seleccionamos solamente esos primeros caracteres. Con esto conseguimos que el proceso no desate un error, aunque hay que advertir al usuario que el proceso truncará aquellos datos que se excedan de los límites admitidos.

En el caso de los dataports, acostumbro a utilizar variables de anchos generosos (XXL) sobre los que volcar la información para después pasarlo a los campos de las tablas. Es, en el paso de variable a campo, dónde utilizo este trozo de código. Es una forma de asegurarme que no existan sobrepasamientos y de ofrecer una tarea más sencilla a un futuro debbugador del proceso.