.Net interop

Este el nuestro primer artículo sobre una de las interesantes novedades de NAV 2009 R2: La interoperabilidad con .Net. Vamos a explicar un ejemplo sencillo sobre cómo poder desarrollar nuestra propia funcionalidad en C# e integrarla en NAV.

Todo lo usado aquí y las demos que vimos en el Webcast del 31 de Mayo podréis encontrarlo adjunto al final de este artículo.

1. Lo primero que tenemos que hacer es crear nuestro proyecto en Visual Studio (versión gratuita en Visual Studio 2010 Express). Vamos a "New Project" y seleccionamos "Visual C# -> Windows -> Class Library". Le damos el nombre que queramos (en el ejemplo usaremos "NAVTesters") y muy importante asegurarnos que esté seleccionado .Net Framework 3.5 o anterior:

 2. Una vez tenemos nuestro proyecto, podemos crear tantas clases como necesitemos (para crear una nueva clase click derecho sobre el proyecto "NAVTesters-> Add -> Class"). Para este ejemplo simple en realidad sólo necesitamos crear una clase que llamaremos "DNITesters" con una función "ValidarDNI":

La función ValidarDNI recibe dos parámetros: el número de DNI de tipo int (= Integer en NAV) y la letra del DNI de tipo string (= Text en NAV). Lo que hace esta función es comprobar si la letra es válida para un número de DNI.

Para ello calcula el número en módulo 23 (resto de la división entera), mira en la posición que indica el resultado anterior dentro de la lista "TRWAGMYFPDXBNJZSQVHLCKE", y comprueba si dicha letra es igual a la letra de DNI que le hemos pasado a la función. Si es igual, el DNI es válido y la función nos devolverá true, mientras que si no es así nos devolverá false.

3. Tras compilar, si nos vamos a la carpeta del proyecto encontraremos nuestra dll y la copiamos. La ruta por defecto, salvo que lo cambiáramos al crear el proyecto, es "%HOMEPATH%\Documents\Visual Studio 2010\Projects\NAVTesters\NAVTesters\bin\Release" o "...\bin\Debug" dependiendo de la configuración de build del proyecto que tengamos:

4. Pegamos nuestra dll en las carpetas de Add-ins de NAV que corresponda:  

Cliente Clásico Microsoft Dynamics NAV\60\Classic\Add-ins
NAV Server

Microsoft Dynamics NAV\60\Service\Add-ins

RTC

Microsoft Dynamics NAV\60\RoleTailored Client\Add-ins

Tenemos dos opciones a al hora de ejecutar: en el NAV Server o en el RTC. Podremos usar variables de tipo DotNet para nuestro código en el Cliente Clásico, pero no ejecutar. El rendimiento es mayor en el NAV Server, pero si necesitamos tener una interfaz de usuario donde haya interacción con el mismo entonces querremos ejecutar en el cliente. Esto lo podemos indicar con la propiedad "RunOnClient" de nuestra variable DotNet, que veremos un poco más adelante. En nuestro ejemplo, copiaremos nuestra dll a la carpeta del CC para desarrollar desde ahí y a la carpeta de NAV Server.

5. Ahora abrimos nuestro Cliente Clásico. Lo primero sería tener una tabla con contactos y campos para el DNI. Para nuestro ejemplo simplemente añadiremos dos campos a la tabla "Contacts":

Enabled  Field No.  Field Name  Data Type  Length
Yes  50001  Numero DNI  Integer  
Yes  50002  Letra DNI  Text 

6. Ahora vamos al Designer de la página "Contact List", al "Page Actions" y añadimos un nuevo Action (F3). A este Action le damos las siguientes propiedades (Shift + F4):

Caption Validar DNI
Image Confirm
Promoted Yes
PromotedCategory Process
PromotedIsBig Yes

En "Image" podemos elegir la imagen que queramos para el icono de nuestro nuevo Action (podemos encontrar una lista de imágenes aquí). "Promoted" hace que nuestra imagen aparezca en el "Actions Pane" con la categoría que prefiramos (New, Process, Report, etc) y que nuestro icono aparezca grande activando "PromotedIsBig".

7. Ahora nos vamos al código de nuestro Action (F9) y desde "View -> C/AL Locals -> Variables" creamos una nueva variable "dnv" de tipo "DotNet" y subtipo la clase "DNITesters" de nuestra dll "NAVTesters".

Al acceder al subtipo nos listará los assemblies del GAC en la pestaña ".Net" y los assemblies que hayamos copiado en la carpeta Add-Ins en la pestaña "Dynamics NAV". En nuestro caso seleccionamos la dll "NAVTesters:

Y ahora nos muestra la lista de clases de dicha dll, y seleccionamos "DNITesters":

Ahora que ya tenemos nuestra variable DotNet podemos modificar sus propiedades (Shift + F4). En nuestro caso dejaremos "RunOnClient" a "No" dado que queremos ejecutar en el NAV Server:

 8. Ahora volvemos al código. Si abrimos el Symbol Menu (F5) veremos que para nuestra variable "dnv" nos muestra sus funciones, propiedades y constructores:

Lo primero es llamar a su constructor, y dado que al escribir nuestro código no especificamos ningún constructor llamaremos al constructor vacío. Ahora ya podemos llamar a la función "ValidarDNI" y mostrar un mensaje dependiendo de si el DNI es válido o no. Nuestro código C/AL quedaría así:

(Sería conveniente hacer otras comprobaciones en el código de nuestra función como es que numDNI sea un número válido, que letraDNI sólo contenga una letra, etc. Pero por simplicidad vamos a usar este código y en archivo adjunto a este artículo podéis encontrar un código algo más completo).

9. Guardamos (Ctrl+S), compilamos nuestra página y abrimos el RTC. Ahora si accedemos a "Contact List" nos aparecerá un icono "Validar DNI", y haciendo click sobre el mismo tras seleccionar uno de los contactos NAV nos dirá si el DNI es correcto o no:

 

Si os habéis quedado con ganas de más NAV con .Net, podéis encontrar varios ejemplos en nuestro blog de equipo de NAV, información en msdn y por supuesto en próximos artículos que iremos publicando en este blog.

---

Juliet R. Moreiro Bockhop

Dynamics NAV Support Engineer

Los ejemplos aquí expuestos se proporcionan sólo como ejemplo ilustrativo y en ningún caso el autor se hace responsable del contenido ni efectos que pueda tener su uso.

Demos.rar