Business Central/Dynamics NAV: Conexión con base de datos externa

0
370
BBDD externas en BC y NAV

Desde NAV2016 se introdujo de forma nativa la posibilidad de sincronizar los datos de una tabla ajena a la aplicación con una tabla «creada» dentro de la aplicación.
Esta sincronización permite utilizar tablas externas como si propiamente de la aplicación fueran permitiendo consultar, modificar, eliminar y crear registros y también permitiendo la inclusión de código para implementar una lógica en esa tabla externa a través de la aplicación. Estas tablas externas pueden estar en el mismo servidor y/o instancia o no que la base de datos de BC.

Esta sincronización puede llevarse a cabo con la versión OnPremise, no así con SaaS.

Tenemos la siguiente tabla, en este caso, en el mismo servidor y en la misma instancia de SQL que la de Business Central:

Se tiene que realizar una conexión externa desde BC para poder modificar y consultar los datos de dicha tabla.

Lo primero que debemos crear es la tabla en BC. Esta tabla no generará una tabla nueva en la BBDD de BC puesto que se trata de una tabla ajena, es decir, no se duplican los datos.

Las propiedades de la tabla son «TableType», «ExternalName» y «External Schema».

A la hora de realizar los campos de la tabla debemos tener en cuenta que:

El tipo de los campos, correspondientes a la tabla externa, se corresponderá con la siguiente conversión:

La propiedad «ExternalName» de los campos solo es necesaria si el nombre de la tabla para BC no coincide con el nombre de la de SQL. En el caso que estoy utilizando hay un missmatch entre idiomas por lo que se tiene que cumplimentar la propiedad «ExternalName» de los campos.

También he añadido lógica a la tabla de forma que cuando se modifique, desde BC, el código rellene la descripción.

Ahora vamos con la realización de la conexión. Dependiendo de la forma en la que se desee trabajar esto se puede hacer desde una codeunit suscrita a «LogInManagement» o desde la propia página en el momento que se abre.

El código sería:

IF HASTABLECONNECTION(TABLECONNECTIONTYPE::ExternalSQL, 'MyTableConnection1') THEN
    UNREGISTERTABLECONNECTION(TABLECONNECTIONTYPE::ExternalSQL,'MyTableConnection1'); 
REGISTERTABLECONNECTION(TABLECONNECTIONTYPE::ExternalSQL, 'MyTableConnection1', 'Data Source=MyDatabaseServer\NAVDEMO;Initial Catalog=MyExternalTable;Integrated Security=SSPI;');
SETDEFAULTTABLECONNECTION(TABLECONNECTIONTYPE::ExternalSQL,'MyTableConnection1');

Las dos primeras líneas sirven para no registrar varias veces la conexión ya que daría lugar a error.

Dependiendo de la forma en la que se realice la conexión con la base de datos externa se utilizará una cadena de conexión u otra de forma que:

Windows Login:
REGISTERTABLECONNECTION(TABLECONNECTIONTYPE::ExternalSQL, 'MyTableConnection1', 'Data Source=MyDatabaseServer\NAVDEMO;Initial Catalog=MyExternalTable;Integrated Security=SSPI;');  (Realmente es opcional en este caso añadir "Integrated Security=SSPI;")
SQL Login:
REGISTERTABLECONNECTION(TABLECONNECTIONTYPE::ExternalSQL, '<TableConnectionName>', 'Data Source=<DatabaseServer>\<DatabaseServerInstance>;Initial Catalog=<DatabaseName>;User ID=<username>;Password=<password>'); 
AZURE SQL:
REGISTERTABLECONNECTION(TABLECONNECTIONTYPE::ExternalSQL, 'MyAzureTableConnection1', 'Server=myazureserver.database.windows.net;Initial Catalog=MyAzureDatabase;User ID=admin;Password=P@ssword123!;');

En este ejemplo se va a realizar mediante una suscripción al evento de la codeunit «LogInManagement» «OnAfterCompanyOpen»:

Y he creado una página para poder ver y modificar los datos:

Y un report de proceso. Este report es posible su ejecución porque es en el momento de abrir BC donde se establece la conexión con la BBDD:

Vamos a comprobar el resultado.

Al abrir la página:

Añadiendo un nuevo código automáticamente se nos añade la descripción por el código establecido en el «OnValidate» de la tabla:

Ejecución del proceso preparado, veremos el mensaje y las descripciones modificadas:

Para finalizar, vamos a comprobar el resultado en la propia tabla de la BBDD externa:

Como hemos comprobado, esta es una utilidad muy potente ya que permite integrar tablas de bases de datos externas dentro de la aplicación permitiendo consultar, modificar, crear y eliminar registros y además pudiendo añadir lógica mediante código.

El código establecido en la codeunit podría realizarse a nivel de proceso o de página de forma que no se establezca la conexión al iniciar la aplicación y de esta forma evitar conexiones externas innecesarias.