Trabajando con recordRefs y fieldRefs

El uso de los tipos recordRef y fieldRef no es muy común en el código de NAV y su uso se reduce prácticamente a funcionalidades que afectan de forma muy globalizada en todo el sistema como por ejemplo la funcionalidad de Log de Cambios.

A mi, personalmente, me gusta utilizarlas cuando veo que una sección de código puede ser útil en varias entidades distintas de la base de datos. Recuerdo un desarrollo que hice ya hace un tiempo en que una función construía el XML necesario para la exportación de facturas, albaranes, abonos, etc. Enseguida detecté que la mayoría de campos eran los mismos y que estaba a punto de cuadriplicar mucho código que realmente hacía lo mismo. En este caso utilicé fieldRefs y recordRefs para apuntar a los registros y campos necesarios dado que estas tablas comparten prácticamente los mismos campos y que, además, están dispuestos con el mismo ID (núm. de campo) fue muy rápido y muy sencillo.

En el siguiente ejemplo os voy a mostrar un ejemplo documentado de una función que utiliza este tipo de variables para hacer de otra forma el acceso a las dimensiones que hace NAV desde los distintos documentos de venta:

Si os fijáis bien, en el Form 132, 130, 134, etc. se utiliza un valor constante en la propiedad RunFormLink del botón dimensiones indicando el número de la tabla asociada. A su vez, en el caso de las líneas, existe una función copiada y pegada que muestra las dimensiones relacionadas.

En este caso vamos a utilizar una función para la visualización de las dimensiones asociadas a documentos de forma que pueda ser invocada sin prestar atención al número de la tabla. Esta función podría incorporarse a la Codeunit 408 y sería ella misma la que determinaría el tipo de dato que la llama y pasaría los datos al formulario. Veréis que esta forma no es mejor y quizás no sea necesario el uso de recordRefs y fieldRefs pero pienso que es un ejemplo bastante didáctico para entender correctamente el uso de este tipo de variables. La función necesaria tendría este aspecto:

Una vez hecho esto procederemos a modificar la función ShowDimensions de la tabla 111, de forma que apunte a la nueva función que acabamos de desarrollar en el anterior punto:

Después de esto, modificaremos el Form 130 dónde añadiremos una nueva opción para mostrar las dimensiones del documento asociadas a la cabecera a través de nuestro nuevo método:

En su interior, escribiremos el siguiente código:

Como podemos ver, tanto el acceso desde las líneas como desde la cabecera funciona correctamente. Ahora sólo queda hacer lo mismo con el resto de documentos de venta:

Espero que os haga gustado y que os sirva de mucha ayuda. Podéis descargar este ejemplo a través del siguiente enlace: Descarga (Cuidado: la importación de éste objeto puede sobreescribir desarrollos. Se recomienda importar en una base de datos de pruebas).

Formulario con acceso a datos temporales

En algunas ocasiones puede ser necesario el uso de formularios con acceso a datos que realmente no existen propiamente en la base de datos. En este post paso a explicar las principales directrices que hay que seguir para conseguir esto.

El primer paso es crear un formulario con acceso a la tabla que queremos mostrar. En el ejemplo he creado un nuevo formulario con Wizard de Navision accediendo a la tabla entero.

El siguiente paso es crear una variable de tipo record con acceso a la misma tabla. En las propiedades de esta tabla indicaremos que se trata de una variable temporal.

Ahora lo que hay que hacer es “engañar” a Navision, de manera que cuando quiera encontrar el primer registro de la tabla, obtenga el primer registro de la tabla temporal y cuando quiera el siguiente, obtenga el siguiente de la tabla temporal. Para ello tenemos que modificar dos disparadores del formulario: OnFindRecord y OnNextRecord.

Por último, para probar el ejemplo, he insertado tres registros en la tabla temporal, al iniciar el formulario.

El resultado de la ejecución es el siguiente:

Si os dais cuenta, no he inventado nada. Esto existe en formularios estándar de Navision como “Navigate” (#344).

Si queréis, os podéis descargar el formulario de ejemplo: Descarga

Comandos para la instalación de nuevo NAS

Durante la instalación de Navision Application Server que vimos hace unos días, comenté que automáticamente se instalaban dos servicios de windows: Uno para NAV nativo y otro para NAV SQL. En este artículo, veremos las diferentes secuencias de comandos disponibles para instalar y desinstalar nuevas instancias a nuestro antojo.

Es muy sencillo. Si queremos instalar una nueva instancia de nas abriremos el editor de comandos (inicio -> ejecutar -> cmd) y nos situaremos sobre la carpeta donde tengamos instalado Navision Application Server. Normalmente la tendremos en C:Program FilesMicrosoft Business Solutions-NavisionApplication Server. Despues ejecutaremos el siguiente comando:

Si utilizamos NAV SQL:
nassql.exe appservername=NOMBRE_SERVICIO, NETTYPE=TCP, servername=NOMBRE_SERVIDOR,database=NOMBRE_BASE_DATOS, company=”Mi empresa S.A. “, nettype=tcp, startupparameter=”PARAM_NAS”, objectcache=40000, installasservice

Si utilizamos NAV Nativo:
nas.exe appservername=NOMBRE_SERVICIO, NETTYPE=TCP, servername=NOMBRE_SERVIDOR,company=”Mi empresa S.A. “, nettype=tcp, startupparameter=”PARAM_NAS”, objectcache=40000, installasservice

Después de esto, veremos el servicio instalado desde el listado de servicios de windows, y también podremos modificar su parametrización a través de Navision Application Server Manager. Sólo nos queda indicarle al servicio con que usuario de windows tiene que iniciarse, configurar este usuario en NAV y arrancar. Tenéis más info sobre estos pasos aquí: Todo sobre NAS.

Uno rapidito: Una función muy útil

No sé si le habrá pasado a alguien más, pero en alguna ocasión he necesitado retornar un valor decimal forzado a dos decimales. Lo que a priori puede parecer que se soluciona con un ROUND acaba conviertiéndose en un dolor de cabeza cuando el número es un entero.

Por ejemplo: “ROUND(1.91,0.01)” nos devuelve “1.91” pero “ROUND(1.90,0.01)” nos devuelve “1.9”. Cuando estamos utilizando esto para exportar datos, los valores nos quedan desordenados y mal tabulados. La solución para mi ha sido utilizar esta línea:

format(round(NUMERO,0.01),0,'<Precision,2:2><Standard Format,0>’);

La versión 2 de ésto ha sido esta útil función que hace lo mismo pero permitiéndole indicar el número de posiciones decimales que quiero:

Todo sobre NAS

Navision Application Server es, en pocas palabras, un cliente de navision sin entorno gráfico. Esto significa que podemos disponer de un cliente que se puede conectar de forma automática si lo instalamos como servicio de windows sin necesidad de ni siquiera iniciar la sesión de forma manual. Al no ofrecer un entorno gráfico, todos los procesos y acciones que se llevan a cabo son “invisibles” a los ojos de alguien que pueda estar utilizando el servidor donde se aloja.

¿Y ésto para que lo quiero? Los usos que ésto tiene son muy variados, pero entre ellos destacan la gestión de sincronización de datos con bases de datos externas, la gestión sobre peticiones externas de datos o la ejecución de procesos almacenados en navision.

Vale… Te lo compro… ¿Cómo me lo instalo? Pensaba que ibas a preguntar algo difícil. Es muy sencillo y sólo necesitas el CD de navision. Una vez dentro hay que buscar la carpeta NAS y ejecutar su setup.exe. Recomiendo utilizar la instalación personalizada para que el proceso nos indique el nombre de los servicios que se van a instalar.

¿Cómo lo conecto a mi base de datos? Para que NAS pueda acceder a una base de datos utilizando un login, necesitamos configurar dos cosas: el acceso a la base de datos y un login :P. Tranquilo, esto no es la ayuda del programa PADRE de AEAT… yo quiero ayudarte: Antes de hacer nada, necesitamos saber si nuestra base de datos es nativa o SQL ya que configuraremos la instancia de nas.exe o nassql.exe respectivamente. Para configurar el servicio utilizaremos Navision Application Server Manager. Al entrar al programa simplemente clickaremos con el botón derecho sobre Navision Application Server Manager, seleccionamos la opción nuevo -> Application Server. En el cuadro que nos aparece indicaremos el nombre que hayamos indicado en la instalación de NAS. Si no habéis modificado el propuesto debería ser NOMBRE_MAQUINA-CLASSIC para nas.exe y NOMBRE_MAQUINA-SQL para nassql.exe.

Si por el motivo que sea, tienes problemas para acceder a Application Server Manager, puedes configurar NAS con comando escritos manualmente. Puedes consultar más información consultando este link: Comandos para instalación de un nuevo NAS. En la parte izquierda del programa apareceran los campos que hay que configurar. Hay que indicar los mismos valores que ponemos en nuestro cliente de navision para conectarnos a la base de datos. En el campo Startup Parameter indicaremos “NAS1”. El valor de este campo lo trataremos en el código de la codeunit 1 de Navision para identificar al NAS que se ha conectado a la base de datos. Esto sólamente es útil cuando utilizamos varios NAS en una misma base de datos que comparten un mismo login. Así por ejemplo podriamos tener a NAS1 que se encarga de la ejecucion de una serie de procesos y a NAS2 que se encarga de una gestión de peticiones online que pudiera hacerle un supuesto portal de negocio o B2B. Cuando acabemos de rellenar el formulario le damos a “Apply changes” y lo encendemos.

Ahora viene cuando te preguntas: “¿Ya está? ¿NAS está dentro de Navision?… ¡¡¿Y que c*ño me estará haciendo?!! Mierda!!”. Tranquilo. Lo más seguro es que haya petado, no diga nada y tampoco esté haciendo nada. ¿Por que? Porque Navision nos pide un usuario y una contraseña para entrar y nosotros no le hemos indicado ninguna. Tenemos que ir a los servicios de Windows para indicarle al servicio qué usuario va a utilizar en su intento de conexión a Navision. Para llegar a esa pantalla iremos a Panel de Control -> Herramientas Administrativas -> Servicios. Ahí tenemos que buscar nuestro “Navision Application Server NOMBRE_MAQUINA-CLASSIC” o parecido según nuestra versión de Navision. Cuando lo tengamos localizado le damos a botón derecho -> Propiedades y entramos en la pestaña de inicio de sesión. Aquí indicaremos el usuario que utilizará NAS para entrar en Navision. Recomiendo utilizar un usuario específico del dominio al cual podemos llamar “NAS” o la cuenta de administrador del dominio al comienzo para descartar algún posible problema de credenciales. Ahora, sólo nos queda abrir Navision y comprobar que este usuario de windows existe en la opción de Windows Logins. Nuevamente, y para descartar errores es recomendable otorgar a este usuario un rol tipo “SUPER” o parecido. Una vez hecho esto ya podemos reiniciar el servicio.

¿Cómo puedo saber si está todo bien? Como ya hemos comentado antes, NAS no tiene entorno gráfico. Esto significa que si en las rutinas de ejecución se encuentra con un FORM.RUNMODAL, por ejemplo, NAS da un error y se para. La forma que tiene NAS de enseñarnos este error, es a través del Visor de sucesos. Podemos acceder al visor de sucesos mediante Panel de control -> Herramientas administrativas -> Visor de sucesos -> Aplicación. Los mensajes que nos dan miedo son los amarillos mientras que los blancos son nuestros chivatos (MESSAGE) que se encuentre NAS en el camino. Si hemos seguido los pasos correctamente y hemos sido buenos, tendremos una especie de mensaje por ahí diciendo que Navision se ha podido conectar sin problemas y nos mostrará los datos que hemos configurado en el Application Server Manager. Cualquier otra cosa, me ponéis un comentario y os lo contesto “mu mablemente”. También podéis ver en las sesiones de la base de datos si está el usuario dentro de navision.

Sigo aterrorizado… ¿que está haciendo esto en mi navision? Seguramente nada de nada. Prácticamente todo el mundo sabe o supone que una de las primeras cosas que se ejecuta cuando accedemos a navision es la función “opencompany” de la codeunit 1. Pero NAS, que es muy listo, ejecuta la función “NASHandler” cuyo parámetro es precisamente el NAS Parameter que habíamos configurado antes. Eso quiere decir que ahí es donde va a empezar nuestra odisea, nuestras rutinas para hacer que NAS haga lo que nosotros queramos: un planificador de tareas, un sistema de alertas, un gestor de sincornizacion, un gestor de peticiones, etc. Os voy a contar un secreto: Si exportáis la codeunit 1 en modo texto veréis que NASHandler es la funcion 99 SIEMPRE. Si no es la 99, NAS no funciona.

Soy una máquina. Ya he empezado a hacer mis cositas con NAS pero siempre estoy duplicando funciones y muchisimas líneas de código para evitar encontrarme con CONFIRMS, FORMS, DIALOGS, etc, etc… Fácil. Si miras una codeunit estandar veras que los DIALOG estan protegidos por una línea que los precede que dice “IF GUIALLOWED THEN”. GUIALLOWED es una función que está en navision, la vemos, no la entendemos y nos da igual. Sólo el ser humano puede hacer estas cosas. GUIALLOWED nos indica si el usuario que esta ejecutando esta línea es capaz de proporcionar entorno gráfico o no. En resumen “IF GUIALLOWED THEN” = “IF NOT ERES_EL_NAS THEN”. Acordaros de ésta función porque seguro que váis a tener que colocar muchas a partir de ahora.

Optimizar procesos evitando lecturas a disco

Navegando por mibuso.com he encontrado un artículo de Alain Krikilion que me ha parecido muy interesante. Se trata del uso de una serie de funciones propias para el acceso que muchas veces hacen los procesos recurrentes a datos maestros. La idea principal de estas funciones es controlar el número de accesos a disco volcando la información ya consultada sobre instancias temporales de variables tipo rec. De esta forma, se consigue que la siguiente consulta al mismo registro se haga contra memoria en vez de hacerlo contra disco. El resultado es en la mayoría de los casos espectacular… tengo ganas de ponerlo en práctica en alguno de mis pesados procesos… En el artículo, describe el caso concreto de un proceso testeado con entornos de Navision nativo y Navision SQL. Los resultados muestran como procesos que utilizaban unos tiempos de 12 minutos pasan 10 en SQL y 8 minutos a 4 nativo. Pensemos ahora que pasaría con procesos que consumen varias horas teniendo en cuenta que la mayoría de ellos contienen un GET reiterativo contra algúna tabla maestra. El link en cuestión lo tenéis aquí: http://www.mibuso.com/howtoinfo.asp?FileID=14

Leyendas de bitmaps en Navision

El control image tiene una propiedad llamada bitmap donde acostumbramos a poner la ruta de una imagen de mapa de bits. Existe también la opción de escribir un número entre el 0 y el 44. Cada número corresponde con una imagen diferente. El siguiente report, muestra todas estas imagenes a modo de leyenda para consultarla cuando nos sea necesario.

Resulta muy útil imprimirlo y utilizarlo como guía para tener a mano. Lo utilizaremos en muy pocas ocasiones pero ganaremos mucho tiempo si lo tenemos cerca. Podéis hacer click con el botón derecho y guardarlo para cuando os haga falta.

Numeración de colores en Navision

Como ya sabemos existen varias propiedades en algunos controles de Navision que nos permiten añadir colores. Estas propiedades se informan con un valor numérico no fácil de entender. En este post he diseñado un formulario con algunos colores básicos, así como una sencilla función RGB que permite obtener el valor decimal de cualquier RGB. Como vemos, la función es muy sencilla y resulta muy útil cuando queremos utilizar colores que tenemos identificados en otras aplicaciones. Tan sólo necesitamos declarar una función con los tres parámetros de tipo Integer y devolver el resultado también en formato Integer:

En la siguiente imagen podemos ver un ejemplo con varias llamadas a la función con distintos valores…

…y el resultado de la ejecución: