Cómo crear una extensión para Dynamics NAV con Visual Studio Code

septiembre 28, 2017
Categoría: Tutorial

En este artículo vamos a crear nuestra primera extensión para Dynamics NAV desarrollada íntegramente en el nuevo entorno de desarrollo para Navision: Visual Studio Code (en adelante VSCode).
Vamos a ver primero el requerimiento funcional y el análisis técnico de la extensión que desarrollaremos, y nos ponemos después manos a la obra.

Requerimiento funcional

El requerimiento funcional para la primera extensión que desarrollaremos es el siguiente:

En Dynamics NAV es posible especificar y utilizar distintas direcciones de envío al hacer pedidos de venta a los clientes.
Al crear un pedido de venta, un usuario puede seleccionar la dirección de envío a la que debe hacerse la entrega del pedido.

Sin embargo, no es posible especificar una dirección de envío predeterminada para un cliente. Eso obliga a los usuarios que crean pedidos de venta a tener que recordar y seleccionar de forma manual la dirección de envío de aquellos clientes que siempre utilizan una misma dirección de envío.

Se solicita la posibilidad de poder especificar una dirección de envío predeterminada en la ficha de los clientes, de modo que en el caso de existir una dirección de envío por defecto, sea el propio sistema el que lo informe automáticamente en los documentos de venta.

Análisis técnico

Para cumplir con el requerimiento funcional, deberemos realizar los siguientes desarrollos:

  1. Crear un nuevo campo en la tabla de Clientes, llamado “Dirección Envío predeterminada”, relacionado con la tabla “Dirección Envío”
  2. Mostrar el campo creado en el punto anterior en la ficha del Cliente
  3. Al seleccionar un cliente en la cabecera de un documento de venta, revisar si dicho cliente tiene una dirección de envío predeterminada, y en caso afirmativo, informar automáticamente el campo “Cód. Dirección Envío” del documento de venta

Desarrollo de la Extensión en VSCode

Lo primero que debemos hacer es tener instalado el entorno, crear un proyecto y vincularlo con la base de datos de Navision adecuada. Puedes seguir los pasos en este artículo.

Vamos a continuar con el desarrollo una vez tengamos un proyecto creado. El proyecto por defecto que nos crea el sistema es un HelloWorld como este:

A continuación, lo modificaremos para obtener la extensión que nos interesa. Empezaremos con el punto 1 del análisis técnico.

Desarrollo 1. Creación de un nuevo campo en la tabla de clientes

El primer punto del análisis técnico consiste en crear un nuevo campo en la tabla de Clientes, llamado “Dirección Envío Predeterminada”, relacionado con la tabla “Dirección Envío”.

Para ello puedes seguir estos pasos:

  1. Elimina el archivo HelloWorld.al
  2. Crea un nuevo archivo y llámalo “DireccionEnvioPredeterminada_Cliente.al”
  3. En este archivo, queremos extender la tabla de clientes para añadir nuestro propio campo.
    Utiliza el snippet ttableext. Para ello, puedes empezar a escribir ttableext y el sistema mostrará un desplegable desde el que podrás seleccionar el snippet
  4. El snippet nos habrá creado la siguiente estructura
  5. Ahora vamos a realizar nuestros cambios
    id = 70000000
    MyExtension = “Direccion Envio Predeterminada”
    MyTargetTable = Customer
    También borraremos la sección var. Esta sección sirve para crear variables globales en este objeto, pero en este caso, no lo necesitamos.
    En este punto, nuestro código debería ser el siguiente:

    tableextension 70000000 "Direccion Envio Predeterminada" extends Customer  {      fields      {          // Add changes to table fields here      }  }
  6. Dentro de la sección fields, vamos a crear nuestro campo con el snippet tfield
    El snippet nos ha creado el siguiente trozo de código
    Vamos a crear el campo con los siguientes valores:
    id = 70000000
    MyField = “Default Ship-To Address”
    Type = Code[20]Y tal y como haríamos en el entorno de desarrollo clásico de Navision, en este caso especificaremos 3 propiedades:
    CaptionML = ENU=’Default Ship-To Address’,ESP=”Dirección Envío Predeterminada”
    TableRelation = “Ship-to Address”.Code WHERE (“Customer No.”=FIELD(“No.”))
    ValidateTableRelation = true

    De modo que el código ahora mismo se debería parecer a esto:

    tableextension 70000000 "Direccion Envio Predeterminada" extends Customer  {      fields      {          field(70000000;"Default Ship-To Address";Code[20])          {              CaptionML=ENU='Default Ship-To Address',ESP='Dirección Envío Predeterminada';              TableRelation="Ship-to Address".Code WHERE ("Customer No."=FIELD("No."));              ValidateTableRelation=true;          }      }  }

    Ya tenemos el campo creado. Puedes guardar ahora el archivo y continuar con la siguiente parte del desarrollo.

Desarrollo 2. Mostrar el campo en la ficha del cliente

El segundo punto del análisis técnico consiste en mostrar el campo creado en el punto anterior en la ficha del cliente.

Sigue estos pasos para conseguirlo:

  1. Crea un nuevo archivo y llámalo “DireccionEnvioPredeterminada_FichaCliente.al”
  2. En este archivo, queremos extender la ficha del cliente.
    Utiliza el snippet tpageext, que creará el siguiente código
  3. Ahora vamos a realizar nuestros cambios:
    id = 70000000
    MyExtension = “Direccion Envio Predeterminada”
    MyTargetPage = Customer CardBorra la sección actions. Esta sección sirve para definir acciones en una página, pero en este caso, no lo necesitamos.
    También puedes borrar la sección var, puesto que no necesitamos ninguna variable global.
  4. Dentro de la sección layout, debemos especificar primero en qué punto de la página queremos que se muestre nuestro campo.
    Para ello, podemos utilizar las opciones addafter, addbefore, addfirst o addlast, tal y como se muestra en la siguiente imagen

    En este caso, por ejemplo, queremos que el campo “Dirección Envío Predeterminada” se muestre al final de la pestaña Envío de la ficha del cliente.
    Así que utilizaremos la opción addlast, y entre paréntesis indicaremos la sección en la que queremos que el campo se añada al final, en este caso, será addlast(Shipping).
  5. Dentro de la sección addlast(Shipping), indicaremos el campo que queremos mostrar.
    El código final debería ser el siguiente:

    pageextension 70000000 "Direccion Envio Predeterminada" extends "Customer Card"  {      layout      {          addlast(Shipping)          {              field("Default Ship-To Address";"Default Ship-To Address")                 {                               }          }      }  }

En este punto ya hemos completado la segunda parte del desarrollo.

Ahora podríamos crear y publicar la extensión en nuestra base de datos para ver que lo que hemos desarrollado hasta el momento funciona y que efectivamente somos capaces de ver este nuevo campo en la ficha del cliente.

Al final del artículo se explica cómo crear y publicar la extensión.

Por ahora vamos a continuar con la tercera parte del desarrollo.

Desarrollo 3. Informar de la dirección de envío en los documentos de ventas

Estamos ya en el punto final del desarrollo de nuestra primera extensión.

El análisis técnico dice lo siguiente: Al seleccionar un cliente en la cabecera de un documento de venta, revisar si dicho cliente tiene una dirección de envío predeterminada, y en caso afirmativo, informar automáticamente el campo “Cód. Dirección Envío” del documento de venta.

En un entorno de desarrollo tradicional, utilizaríamos el trigger OnValidate() del campo “Sell-To Customer No.” de “Sales Header” para escribir nuestro código.

Sin embargo, cuando desarrollamos extensiones, y más si lo hacemos desde VSCode, ésta ya no es una opción. Ahora estamos obligados a utilizar los Eventos que hay disponibles en Dynamics NAV. Si no estás familiarizado con los eventos, te recomiendo que sigas el Curso de desarrollo con eventos. En él explicamos qué son los eventos, para qué sirven, qué tipos de eventos existen, y como los podemos utilizar al hacer nuestros desarrollos.

Y ahora es el momento de poner en práctica el tema de los eventos.

No podemos escribir nuestro código en el trigger OnValidate() del campo “Sell-To Customer” de “Sales Header”, pero sí podemos suscribirnos al evento que precisamente hay disponible para este trigger. Y esto es precisamente lo que vamos a hacer.

Sigue los siguientes pasos:

    1. Crea un nuevo archivo y llámalo “DireccionEnvioPredeterminada_CabeceraVenta.al”
    2. En este archivo, queremos crear un objeto de tipo codeunit.
      Utiliza el snippet tcodeunit, que creará el siguiente código
    3. Realiza ahora los siguientes cambios:
      id = 70000000
      MyCodeunit = “Direccion Envio Predeterminada”Y borra la sección var, porque no vamos a necesitar ninguna variable global
    4. Crea un nuevo procedimiento utlizando el snippet tprocedure, que creará el siguiente código:

      En lugar de MyProcedure, escribe el nombre que le quieres dar a la función. En este caso, puedes utilizar el nombre InformarDireccionEnvio
    5. Justo encima de la definición del procedimiento, debemos especificar que esta función queremos que esté suscrita a un Evento, y para ello, escribiremos lo siguiente:
      EventSubscriber(ObjectType::Table,36,'OnAfterValidateEvent','Sell-to Customer Name',true,true)]

      En EventSubscriber debemos especificar:

      • El tipo de objeto
      • El Nº de objeto
      • El evento al que nos subscribimos
      • El elemento al que nos subscribimos
      • Si se debe omitir la ejecución de la función en caso de no tener licencia
      • Si se debe omitir la ejecución de la función en caso de no tener permisos
    6. Como parámetros de la función que hemos definido, debemos especificar los parámetros que recibiremos del evento.
  1. Desgraciadamente, el Intellisense de VSCode todavía no ha llegado hasta este punto. Por ahora, para saber qué parámetros debemos definir no nos queda otro remedio que ir al entorno de desarrollo clásico de Navision, crear una codeunit, crear una función y especificar que la función debe suscribirse a este mismo evento. En este caso, Dynamics NAV sí que nos crea automáticamente los parámetros, que podemos copiar y pegar en nuestro proyecto VSCode.
    Un poco cutre por el momento, pero supongo que todo llegará.Esta es la función creada en C/SIDE
    Así que estos son los parámetros que vamos a utilizar en VSCode.

    Hasta el momento, el código de esta codeunit que estamos desarrollando debería ser el siguiente:

    codeunit 70000000 "Direccion Envio Predeterminada"  {      trigger OnRun();      begin      end;           [EventSubscriber(ObjectType::Table,36,'OnAfterValidateEvent','Sell-to Customer Name',true,true)]         local procedure InformarDireccionEnvio(VAR Rec : Record "Sales Header";VAR xRec : Record "Sales Header";CurrFieldNo : Integer);      var          myInt : Integer;      begin               end;  }
  2. Ya solo nos queda escribir el código de la función
    • Crea una variable local llamada Customer, de la tabla Customer
    • Escribe el código necesario para informar de la dirección de envío predeterminada en el caso en que ésta esté informada en la ficha del cliente

El código debería parecerse al siguiente:

codeunit 70000000 "Direccion Envio Predeterminada"  {      trigger OnRun();      begin      end;           [EventSubscriber(ObjectType::Table,36,'OnAfterValidateEvent','Sell-to Customer Name',true,true)]         local procedure InformarDireccionEnvio(VAR Rec : Record "Sales Header";VAR xRec : Record "Sales Header";CurrFieldNo : Integer);      var          Customer : Record Customer;      begin          if Customer.Get(Rec."Sell-to Customer No.") then          begin              if Customer."Default Ship-To Address" <> '' then                  Rec.Validate("Ship-to Code",Customer."Default Ship-To Address");          end;       end;  }

Cómo publicar la extensión

Hemos acabado la extensión y ya solo nos queda publicarla.

Para ello, solo debemos darle a Depurar – Iniciar sin depurar (o Ctrl+F5) y el sistema se encarga de crear la extensión (un archivo .navx) y publicarla en el servicio de Dynamics NAV especificado en el archivo launch.json.

Probar la extensión

Si abrimos el cliente de Dynamics NAV y abrimos la ficha de un cliente, deberíamos ver el nuevo campo que hemos creado y deberíamos poder informarlo.

Posteriormente, deberíamos poder crear un pedido de venta para este cliente y comprobar que efectivamente el sistema ha informado automáticamente de la dirección de envío en la cabecera del documento de venta.

Comentarios