Una vez que se ha realizado la instalación y configuración del Inalambrik Sync y que la base de datos está conectada y funcionando correctamente, se puede comenzar con el proceso de configuración de las diferentes tablas que serán enviadas para la sincronización desde el ERP hacia Inalambrik (ej. Productos, Listas de Precios, Clientes, Inventarios, etc.)


Para lograr esto se realizarán las siguientes tareas:

  1. Desarrollar los scripts o queries de toma de datos del ERP de la empresa (los desarrolla el cliente con asesoría de Inalambrik)
  2. Configurar tablas para sincronización.
  3. Confirmar los procesos de carga de cada tabla.


1. Desarrollo de los Scripts SQL que Extraen Datos.

El primer paso está a cargo del cliente, el cual consiste en desarrollar los Queries que obtienen los datos del ERP de la empresa. Para realizar esto, el cliente debe tener creada una cuenta en Inalambrik y contar con un usuario de tipo Administrador para acceder al portal https://pedidos.inalambrik.com.ec. Si no cuenta aún con las credenciales mencionadas por favor envíenos un correo a soporte@inalambrik.com.ec


Desde el portal de Pedidos Móviles nos dirigimos a la opción Sincronización /  Panel del Desarrollador.


Del lado izquierdo se podrá visualizar una columna con todas las tablas que pueden ser sincronizadas.


Es recomendable que se haga una revisión de todas las tablas en conjunto con el responsable técnico del lado del cliente para que se familiarice con las estructuras disponibles. Luego de esto, es tarea del cliente realizar la creación de los queries que sincronizarán los datos de cada una de las tablas. 

Se puede hacer la revisión de las tablas en cualquier orden pero se sugiere ir tabla por tabla en el orden en el que se presentan en el portal, y revisar si es necesario o no la sincronización de dicha tabla. Adicionalmente, se debe revisar en cada tabla, para cada campo, si tiene otra relación con otra tabla y confirmar que se ha configurada la tabla referenciada (Foreign Key).


Para empezar con el desarrollo de cada query, se debe ingresar a la tabla respectiva dando clic en la descripción. Esto desplegará la siguiente pantalla (se ha tomado el ejemplo de la tabla "Vendedores"


En la primera pestaña se muestra la estructura de la tabla junto con el tipo de datos y su descripción (diccionario de datos). El siguiente paso es ir a la pestaña de Sincronización.




En esta pestaña se puede visualizar un query de ejemplo y en la parte inferior se habilitará un campo para ingresar el query personalizado para tomar los datos de la empresa. En este query se deberán reemplazar los valores null por los campos de la tabla respectiva y se debe reemplazar la tabla SalesPerson por la tabla del cliente. En este punto es importante que no queden campos con valor "null", por lo que se debe enviar un valor vacío según el tipo de dato visto en la pestaña anterior. También se debe considerar que este query se ejecutará usando la base InalambrikSync, por lo que las tablas deben tener la referencia de la base de datos de donde se obtienen lo registros.


Es recomendable que el cliente desarrolle los queries en su editor de SQL, los pruebe y luego los pegue en el campo respectivo. Finalmente se debe presionar el botón "Guardar y Generar Código de Carga" esto desplegará un cuadro de diálogo para descargar el archivo, el cual deberá ser guardado en la ruta "C:/InalambrikSync/queries".


Este proceso se debe repetir para todas las tablas que se deseen sincronizar. Para aquellas estructuras que no se van a sincronizar se debe ingresar a la pestaña "Estado" y desmarcar la opción "¿Utilizada en el Proceso de Sincronización?"


Si el proceso anterior se ha realizado correctamente, las tablas a sincronizar tendrán un ícono "X" rojo mientras que las que no se van a sincronizar, tendrán un ícono de un círculo tachado de color gris.

La tarea anterior, como se mencionó, es en gran parte desarrollada por el cliente, con el soporte de Inalambrik. A partir de este punto las tareas son realizadas por Inalambrik y se contactará al cliente para consultas puntuales.


2. Configurar las Tablas que serán Sincronizadas


Para que el sincronizador pueda operar con las tablas que se desean sincronizar, es necesario realizar una instalación de los procesos que utilizará cada tabla. Para esto ingresaremos a las tablas que tengan el ícono de la "X" roja, presionaremos la pestaña de "Sincronización" y luego presionaremos el botón "Generar Código de Instalación". Este proceso descargará un archivo con extensión .ZIP que contiene 5 archivos de tipo SQL numerados del 2 al 5. Estos archivos deben ser ejecutados desde el SQL Management Studio en el orden que indica el archivo comenzando con el número 2. Si alguno de los procesos no se ejecuta con normalidad por favor contactarnos a soporte@inalambrik.com.ec


Al finalizar la ejecución de los archivos, diríjase al portal a la pestañá Estado y marque el recuadro ¿Sincronización Configurada? lo cual cambiará el indicador de la tabla en la columna de la izquierda por un visto verde.


Este proceso se debe repetir por cada tabla que tenga la "X" roja, y al finalizar, la columna de tablas del lado izquierdo de la pantalla deberá tener todos los íconos en verde o gris y ninguno en rojo.


3. Confirmar los procesos de carga de cada tabla


Según lo realizado en la tarea 1, se debió crear una carpeta en la siguiente ruta "C:/InalambrikSync/queries". En esta carpeta deberán existir todos los procesos de carga de las diferentes tablas definidas por el cliente. El propósito de estos procesos es tomar la data de las tablas respectivas de la base de datos del cliente e ingresarla en la base de datos InalambrikSync y dejarla lista para su envío hacia el portal.


Cada proceso debe ser ejecutado para confirmar que no existan errores en los queries. De existir un error se deberá volver al paso 1 para la tabla requerida y verificar todos los pasos. 


Estos procesos deben ser ejecutados constantemente para mantener al día los datos según los requerimientos del usuario. Esto se verá en el siguiente capítulo.


4. Personalización del Script de Sincronización (opcional)


En ciertas ocasiones se requiere la ejecución de algún código SQL (ej: un stored procedure)   antes del comando SELECT o antes de actualizar los registros a publicar.


Para estos escenarios se encuentran disponibles los tokens <BEFORE_SELECT></BEFORE_SELECT> y <BEFORE_UPDATE></BEFORE_UPDATE> 


Por ejemplos, si estamos preparando el script que publicará la lista de bancos que utiliza la empresa y queremos ejecutar un SELECT antes de extraerlos, deberíamos definir así el script de carga:


<BEFORE_SELECT>
SELECT * from Temporal
</BEFORE_SELECT>

SELECT 
BANKGROUPID as BankCode, 
NAME as BankName, 
'A' as BankStatus
FROM   MicrosoftDynamicsAX.dbo.BankGroup 


Al generar el script de carga y descargarlo, veríamos así el código final:


SET NOCOUNT ON
DECLARE @STARTED_AT DATETIME
DECLARE @SECONDS_ELAPSED NUMERIC
DECLARE @MSG VARCHAR(200)
DECLARE @Rows int

-- Comment out this line if you need to force synchronization of this table.
-- DELETE FROM InalambrikSync.dbo.SyncBank

-- Delete temporary table if exist
IF OBJECT_ID('InalambrikSync.dbo.temp_Bank', 'U') IS NOT NULL
  DROP TABLE InalambrikSync.dbo.temp_Bank; 

-- Custom code before SELECT statement  

SELECT * from Temporal

  
-- Select source data from source
RAISERROR('Selecting source records ...',0,1) WITH NOWAIT

SET @MSG =Convert( varchar(20), SYSDATETIME(),21) + ' Selecting source records from table Bank ...'
RAISERROR(@MSG,0,1) WITH NOWAIT

SET @STARTED_AT = SYSDATETIME()
SELECT * INTO InalambrikSync.dbo.temp_Bank FROM ( 


SELECT 
BANKGROUPID as BankCode, 
NAME as BankName, 
'A' as BankStatus
FROM 
  MicrosoftDynamicsAX.dbo.BankGroup 
) source_data
SELECT @Rows=@@ROWCOUNT
SET @SECONDS_ELAPSED = DATEDIFF(SECOND,@STARTED_AT,SYSDATETIME())
SET @MSG =LTRIM(STR(@Rows))+' records selected in '+LTRIM(STR(@SECONDS_ELAPSED))+' secs' 
RAISERROR(@MSG,0,1) WITH NOWAIT
  
-- If table InalambrikSync.dbo.temp_Bank is created
IF @@ERROR = 0
BEGIN
  

  RAISERROR('Building indexes ...',0,1) WITH NOWAIT
  SET @STARTED_AT = SYSDATETIME()
  CREATE NONCLUSTERED INDEX temp_InalambrikSync_SyncBank_Index ON InalambrikSync.dbo.temp_Bank ( BankCode );

  -- Create an index on target table to improve performance
  IF NOT EXISTS(SELECT * FROM InalambrikSync.sys.indexes WHERE name = 'InalambrikSync_SyncBank_Index' )    
     CREATE NONCLUSTERED INDEX InalambrikSync_SyncBank_Index ON InalambrikSync.dbo.SyncBank ( BankCode );
  SET @SECONDS_ELAPSED = DATEDIFF(SECOND,@STARTED_AT,SYSDATETIME())
  SET @MSG =LTRIM(STR(@SECONDS_ELAPSED))+' secs' 
  RAISERROR(@MSG,0,1) WITH NOWAIT


  -- Delete duplicate keys if exist this field on select: ROW_NUMBER() OVER (  ORDER BY BankCode, BankName, BankStatus ) RECORD_NUMBER
  IF EXISTS(SELECT 1 FROM sys.columns WHERE Name = N'RECORD_NUMBER'  AND Object_ID = Object_ID(N'InalambrikSync.dbo.temp_Bank'))
    BEGIN    
    RAISERROR('Deleting duplicate keys on table SyncBank ...',0,1) WITH NOWAIT
    SET @STARTED_AT = SYSDATETIME()
    DELETE s FROM InalambrikSync.dbo.temp_Bank s JOIN InalambrikSync.dbo.temp_Bank t ON t.BankCode COLLATE DATABASE_DEFAULT = s.BankCode AND t.RECORD_NUMBER < s.RECORD_NUMBER
    SELECT @Rows=@@ROWCOUNT
    SET @SECONDS_ELAPSED = DATEDIFF(SECOND,@STARTED_AT,SYSDATETIME())
    SET @MSG =LTRIM(STR(@Rows))+' records deleted in '+LTRIM(STR(@SECONDS_ELAPSED))+' secs' 
    RAISERROR(@MSG,0,1) WITH NOWAIT
  END
  
  -- Custom code before UPDATE statement  
  

  
  -- Update record on table SyncBank when key fields are found and data fields are different
  RAISERROR('Updating modifed records on table SyncBank ...',0,1) WITH NOWAIT
  SET @STARTED_AT = SYSDATETIME()
  UPDATE t SET t.BankName = substring(isnull(s.BankName,''),1,60), t.BankStatus = substring(isnull(s.BankStatus,''),1,1) FROM InalambrikSync.dbo.SyncBank t 
    INNER JOIN InalambrikSync.dbo.temp_Bank s ON t.BankCode COLLATE DATABASE_DEFAULT = s.BankCode
  WHERE t.BankName COLLATE DATABASE_DEFAULT <> substring(isnull(s.BankName,''),1,60) or t.BankStatus COLLATE DATABASE_DEFAULT <> substring(isnull(s.BankStatus,''),1,1)
  SELECT @Rows=@@ROWCOUNT
  SET @SECONDS_ELAPSED = DATEDIFF(SECOND,@STARTED_AT,SYSDATETIME())
  SET @MSG =LTRIM(STR(@Rows))+' records updated in '+LTRIM(STR(@SECONDS_ELAPSED))+' secs' 
  RAISERROR(@MSG,0,1) WITH NOWAIT

  -- Insert record on table SyncBank when key fields are not found
  RAISERROR('Inserting new records on table SyncBank ...',0,1) WITH NOWAIT
  SET @STARTED_AT = SYSDATETIME()
  INSERT INTO InalambrikSync.dbo.SyncBank ( BankCode, BankName, BankStatus )
      SELECT s.BankCode, substring(isnull(s.BankName,''),1,60), substring(isnull(s.BankStatus,''),1,1) FROM InalambrikSync.dbo.temp_Bank s 
        LEFT JOIN InalambrikSync.dbo.SyncBank t ON t.BankCode COLLATE DATABASE_DEFAULT = s.BankCode
        WHERE t.BankCode IS NULL   
  SELECT @Rows=@@ROWCOUNT
  SET @SECONDS_ELAPSED = DATEDIFF(SECOND,@STARTED_AT,SYSDATETIME())
  SET @MSG =LTRIM(STR(@Rows))+' records inserted in '+LTRIM(STR(@SECONDS_ELAPSED))+' secs' 
  RAISERROR(@MSG,0,1) WITH NOWAIT
      
  -- Set record as deleted when is not found on source table 
  RAISERROR('Deleting records not found on source ...',0,1) WITH NOWAIT
  SET @STARTED_AT = SYSDATETIME()
  UPDATE t SET t.BankStatus = 'X' FROM InalambrikSync.dbo.SyncBank t LEFT JOIN InalambrikSync.dbo.temp_Bank s ON t.BankCode COLLATE DATABASE_DEFAULT = s.BankCode WHERE s.BankCode IS NULL AND t.BankStatus <> 'X'
  SELECT @Rows=@@ROWCOUNT
  SET @SECONDS_ELAPSED = DATEDIFF(SECOND,@STARTED_AT,SYSDATETIME())
  SET @MSG =LTRIM(STR(@Rows))+' records set as deleted in '+LTRIM(STR(@SECONDS_ELAPSED))+' secs' 
  RAISERROR(@MSG,0,1) WITH NOWAIT


    
  DROP TABLE InalambrikSync.dbo.temp_Bank;   
END



5. Como Funcionan los Scripts de Sincronización


El código generado básicamente realiza lo siguiente:


  1. Crea una tabla temporal conteniendo los registros resultantes del SQL SELECT proporcionado por el cliente.
  2. Se hace una comparación de los registros de la tabla temporal contra la tabla local para identificar cuales han cambiado y deben ser actualizados.
  3. Luego se verifican los registros que están en la tabla temporal y que no están en la tabla local. Los registros faltantes son insertados en la tabla local.
  4. Por último se verifican los registros que están en la tabla local pero ya no se encuentran en la tabla temporal. Estos registros son marcados como eliminados ( status = 'X')
  5. Se elimina la tabla temporal


Consideraciones:


  • Las tablas locales empiezan con la palabra Sync (ej: SyncCustomer, SyncProduct, etc.)
  • Cada actualización a la tabla local ejecuta un trigger que coloca en la bandeja de salida los registros que deben sincronizarse en el servidor.
  • La comparación de los registros siempre se hace usando los campos llave de la tabla.
  • Los registros devueltos por el SQL SELECT del cliente no deberían arrojar registros con llaves duplicadas.