Odoo v10 importar datos desde Microsoft SQL mediante ODBC

Importar y sincronizar datos en Odoo

¿Tienes datos en aplicaciones externas que te gustaría importar a Odoo?

¿Te gustaría mantener los datos de Odoo actualizados automáticamente?

Odoo interconexión de bases de datos

En este proyecto detallamos como conseguir sincronizar con Odoo los datos desde una base de datos externa de MSSQL mediante una conexión ODBC.
Para este ejemplo hemos utilizado Odoo v10 en un servidor Ubuntu 16.04

Instalación de módulos

Para el proyecto utilizaremos los siguientes módulos de OCA disponibles para Odoo v10.

Este último módulo para la importación de datos, aún no ha sido migrado por OCA, pero lo podéis encontrar en el siguiente repositorio ya migrado para la v10.

External Database Sources

Nombre Técnico:base_external_dbsource
Dependencias:base

Este módulo permite definir conexiones externas con diferentes bases de datos usando ODBC, Firebird, Oracle o SQLAlchemy.

External Database Source - SQLite

Nombre Técnico:base_external_dbsource_sqlite
Dependencias:base_external_dbsource

Este módulo extiende el modulo ‘base_external_dbsource’, permitiendo conectar con una base de datos SQLite utilizando SQLAlchemy.

Necesitamos instalar en nuestro sistema la librería de Python ‘sqlalchemy’:

# pip install sqlalchemy

External Database Source – MSSQL

Nombre Técnico:base_external_dbsource_mssql
Dependencias:base_extternal_dbsource_sqlite

Este módulo extiende el modulo ‘base_external_dbsource’, permitiendo conectar con bases de datos externas MSSQL usando SQLAlchemy.

Necesitamos instalar las siguientes dependencias en nuestro sistema:

  • Librería de Python pymssql
  • El controlador FreeTDS (con el paquete tdsodbc)
# pip install pymssql
# apt-get install freetds-dev freetds-bin tdsodbc

External Database Source - ODBC

Nombre Técnico:base_external_dbsource_odbc
Dependencias:base_external_dbsource_sqlite

Este módulo extiende el modulo ‘base_external_dbsource’, permitiendo conectar con bases de datos externas mediante ODBC usando la librería de Python PyODBC.


pyodbc

Es un módulo de código abierto para conectar con bases de datos mediante ODBC. La instalación de este módulo requiere la instalación previa de unos componentes para que la compilación sea correcta.

Puedes consultar más información en https://github.com/mkleehammer/pyodbc

En nuestro Ubuntu 16.04 instalamos estos componentes con los siguientes comandos:

# apt-get unixodbc-dev
# pip install pyodbc

Microsoft ODBC Driver for SQL Server on Linux and macOS

Como nuestra intención es conectarnos a una base de datos de Microsoft SQL debemos instalar el driver ODBC adecuado para conectar con dicho motor de bases de datos.

Mas información: Installing the Microsoft ODBC Driver for SQL Server on Linux and macOS

Según la documentación de Microsoft debemos cumplir las siguientes dependencias en nuestro servidor Ubuntu 16.04. Si faltara alguna de ellas, o fuera de una versión inferior a la indicada deberemos instalarla o actualizarla en nuestro sistema.

  • libc6 (>= 2.21)
  • libstdc++6 (>= 4.9)
  • libkrb5-3
  • libcurl3
  • openssl
  • debconf (>= 0.5)
  • unixodbc (>= 2.3.1-1)

Ahora vamos a instalar el driver ODBC de Microsoft descargandolo de la Web el driver mas reciente a fecha de hoy.

Con los siguientes comandos en la consola descargaremos e instalaremos el driver en nuestro sistema:

# cd /opt
# wget https://packages.microsoft.com/ubuntu/16.04/prod/pool/main/m/msodbcsql/msodbcsql_13.1.9.1-1_amd64.deb
# dpkg -i msodbcsql_13.1.9.1-1_amd64.deb

ODBC ficheros de configuración odbc.ini y odbcinst.ini:

En los archivos '.ini' de configuración de ODBC se crea la configuración del driver de Microsoft. Si no conocemos la ubicación de los archivos de configuración las podemos averiguar con el siguiente comando.

# odbcinst -j
  unixODBC 2.3.1
  DRIVERS............: /etc/odbcinst.ini
  SYSTEM DATA SOURCES: /etc/odbc.ini
  FILE DATA SOURCES..: /etc/ODBCDataSources
  USER DATA SOURCES..: /root/.odbc.ini
  SQLULEN Size.......: 8
  SQLLEN Size........: 8
  SQLSETPOSIROW Size.: 8

Editamos el fichero de configuración odbcinst.ini para ver la configuración del driver ODBD Microsoft. El nombre del driver que vemos entre corchetes, es lo que nos interesa para luego realizar la configuración de la conexión.

[ODBC Driver 13 for SQL Server]
Description=Microsoft ODBC Driver 13 for SQL Server
Driver=/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.1.so.9.0
UsageCount=1

Como dato de interés, en el fichero odbc.ini podríamos introducir las conexiones DSN que quisiéramos configurar. En las cuales se configuraría el driver a utilizar y el servidor al que queremos acceder. En nuestro caso no las utilizaremos ya que realizaremos la conexión con todos los parámetros necesarios sin utilizar las DSN.

Si has seguido cuidadosamente todos los pasos anteriores y tienes instalados los módulos y sus dependencias ha llegado el momento de reiniciar el sistema para que los cambios tengan efecto.

Configuración de la conexión con MSSQL

Si todo ha salido bien, dentro de Odoo, podemos realizar la configuración de las conexiones desde:
Configuración > Técnico > Estructura de la base de datos > Database Sources (Crear)
Donde nos deben aparecer todos los tipos de conexiones como muestra la imagen.

desplegable con los tipos de conexión externas a bases de datos

En este caso vamos a conectar con un servidor de bases de datos Microsoft SQL Server. La cadena de conexión para un servidor Microsoft SQL Server tiene la siguiente estructura.

Driver={ODBC Driver 13 for SQL Server};Server=MiServidor;PORT=NºPuerto;Database=MiBD;Uid=MiUsuario;Charset=utf8;

NOTA: Es importante el ‘;’ del final de la cadena de conexión. Esto es porque el modulo en su programación añadirá la parte con la contraseña ‘Pwd=MiContraseña’ y no funcionara si no está separada por ';' del resto de parametros.

Odoo configuración de la conexión con una base de datos MSSQL

locale

Al realizar el test de la conexión puede que nos dé un error por la configuración locale en nuestro sistema. En las pruebas incluso el servicio de Odoo se caía y teníamos que reiniciarlo. Para solucionarlo debemos instalar el paquete ‘locales’ y configurarlo con los siguientes comandos en la consola.

# apt-get install locales
# dpkg-reconfigure locales // seleccionamos los siguientes paquetes! en_US.UTF-8 es_ES.UTF-8

La configuración se ha guardado en '/etc/default/locale'. Reiniciamos el sistema para que la configuración tenga efecto.
Podemos ver la configuración de nuestro sistema con el comando 'locale':

# locale
  LANG=es_ES.UTF-8
  LANGUAGE=
  LC_CTYPE="es_ES.UTF-8"
  LC_NUMERIC="es_ES.UTF-8"
  LC_TIME="es_ES.UTF-8"
  LC_COLLATE="es_ES.UTF-8"
  LC_MONETARY="es_ES.UTF-8"
  LC_MESSAGES="es_ES.UTF-8"
  LC_PAPER="es_ES.UTF-8"
  LC_NAME="es_ES.UTF-8"
  LC_ADDRESS="es_ES.UTF-8"
  LC_TELEPHONE="es_ES.UTF-8"
  LC_MEASUREMENT="es_ES.UTF-8"
  LC_IDENTIFICATION="es_ES.UTF-8"
  LC_ALL=
        

Después de esta configuración ya nos funciona la conexión con la base de datos Microsoft SQL Server.

Odoo mensaje de exito al realizar la conexión

ODoo importación de datos desde MSSQL

Una vez tenemos la conexión configurada y testeada instalamos el último de los módulos.

Import data from SQL and ODBC data sources.

Nombre Técnico:base_external_import
Dependencias:base, base_external_dbsource

Este módulo permite impotar datos directamante desde otras bases de datos.

Realizamo la configuración de las importaciones desde:
Configuración > Técnico > Estructura de la base de datos > Import from SQL (Crear)
En la imagen vemos nuestra configuración como ejemplo de importación de clientes:

configuracióin de la importacion de clientes en Odoo desde SQL

La configuración de la importación es sencilla, lo único que puede tener algo de complejidad es la consulta SQL que debemos desarrollar. Pongo mi ejemplo de consulta, pero aquí cada uno debe tener conocimientos para desarrollar la suya según sus necesidades.

SQL

SELECT Codigo as "ref",
   is_company,
   Razon as "name",
   Nombre as "comercial",
   'True' as "customer",
   Direccio1 as "street",
   Direccio2 as "street2",
   Cpostal as "zip",
   Localida as "city",
   Provincia as "state_id",
   Pais as "country_id",
   Tlfno_1 as "phone",
   Tlfno_2 as "mobile",
   DirEmail as "email",
   DirWeb as "website",
   NIF as "vat",
   comment
 FROM _OdooClientesEmpresas
 WHERE lastmodified >= CAST(? as datetime)
      

Consulta SQL: Detalles técnicos

Valores booleanos Verdadero - Falso

En los campos booleanos pasar la cadena (True o False) no se debe pasar el valor numérico (0 o 1).


referencia interna 'ref'

El campo ref es el más importante y obligatorio.

  • Se utiliza como ‘referencia interna’ en la ficha del partner.
  • Es importante saber que en la importación, este campo también es utilizado para crear el [XML id] del registro, el cual lo referencia internamente con otros modelos de Odoo. Por ejemplo, un cliente con ref ‘001’ se crearía con el XML-id ‘__import__.res_partner_001’ en la tabla de referencias ‘ir_model_data’. De esta forma Odoo lo identifica inequívocamente y no lo duplicaría en futuras actualizaciones de los datos del cliente.
>