Ir al contenido

Sincronización Automática entre Profit Plus Contable y Administrativo

Importar Datos de Contabilidad a Administrativo con el patrón "1 Motor, 3 Interruptores"

​Las empresas que cuentan con el sistema Profit Plus Administrativo y Contabilidad integrados, tienen una debilidad: la dependencia de transferencias manuales de datos de un sistema a otro. Es una escena repetida: cuando el equipo contable actualiza el plan de cuentas, agrega un centro de costos o crea una nueva cuenta de gasto en el módulo de Contabilidad, de inmediato su trabajo se detiene al quitarle la posibilidad de usar el nuevo registro en el sistema Administrativo, viendose obligado a contactar a alguien de Sistemas para que realice la importación desde el servidor usando la fasoma "Herramienta de Administracion de Profit Plus".


​Esta interrupción genera frustración en el flujo del area contable de la empresa, ademas de retrasar cierres y reportes para la toma de desiciones, en algunos casos hasta genera un gasto para la empresa, al tener que pagar a alguien de sistemas para que simplemente importen los datos del contable al administrativo. 


​Como Ingenieros nuestra meta es que el sistema trabaje para el usuario, no que el usuario trabaje para el sistema. Para eliminar este obstáculo de forma 100% transparente, te presento una arquitectura de Scripts basado en un procedimiento almacenado y tres interruptores, que hara que la Contabilidad no se detenga nunca más cuando un contador cree un nuevo registro.




Nuestra arquitectura lo resuelve separando las responsabilidades:

  • 1 Motor Central: Un Procedimiento Almacenado independiente (pExportarDatosContAdmi) que contiene toda la inteligencia de sincronización y el manejo de errores (TRY...CATCH).
  • 3 Interruptores Simples: 3 Triggers de una sola línea en cada tabla (scCuenta, scCentro, scGastos), cuya única función es "encender" el motor de forma automática cada vez que el contador guarda un cambio.

A continuacion los Script a usar:


Componente 1: El Motor Central 

(Stored Procedure)


​Este código se ejecuta en la base de datos Contable. Detecta automáticamente el destino (la base Administrativa) a través de la tabla par_emp. Gracias al bloque TRY...CATCH, si el esquema del destino cambia o hay un error, el proceso se detiene silenciosamente sin interrumpir la labor del contador.


USE [Nombre_BD_Contable] 
GO

/******
Creado por: www.elingenierodesistemas.com
Descripción: Motor central de sincronización Contable -> Administrativo.
******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE OR ALTER PROCEDURE [dbo].[pExportarDatosContAdmi]
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @destino NVARCHAR(100);
    DECLARE @db_origen NVARCHAR(100) = DB_NAME();
    DECLARE @sql NVARCHAR(MAX);

    -- 1. Obtener destino (Administrativo) desde parámetros
    IF OBJECT_ID('par_emp', 'U') IS NOT NULL
    BEGIN
        SELECT TOP 1 @destino = RTRIM(emp_imp_name) FROM par_emp;
    END

    -- 2. Validaciones Fail-Safe
    IF @destino IS NULL OR @destino = '' OR @destino = @db_origen RETURN;
    IF NOT EXISTS (SELECT 1 FROM sys.databases WHERE name = @destino) RETURN;

    -- 3. Ejecución protegida
    BEGIN TRY
        SET @sql = '
            -- Sincronizar Cuentas Activas
            IF OBJECT_ID(''[' + @destino + '].dbo.scCuenta'', ''U'') IS NOT NULL
            BEGIN
                DELETE FROM [' + @destino + '].dbo.scCuenta;
                INSERT INTO [' + @destino + '].dbo.scCuenta (
                    co_cue, des_cue, detalle, aj_islr, me_islr, aj_dpc, me_dpc, opciones,
                    saldo_ini, saldan, centro_co, moneda_adi, man_aux, tipoaux, man_doc, man_fecdoc,
                    cue_gasto, co_gas, man_adi, co_tab, man_adi2, co_tab2, man_adi3, co_tab3,
                    co_us_in, fe_us_in, co_us_mo, fe_us_mo, inactivo, fec_inac,
                    campo1, campo2, campo3, campo4, campo5, campo6, campo7, campo8,
                    revisado, trasnfe, co_cuepadre, tipo_pat, flujo_efe, afecta_pm, tipo_inv,
                    ipc_islr, ipc_dpc, exc_pat, meses_rotacion
                )
                SELECT
                    co_cue, des_cue, detalle, aj_islr, me_islr, aj_dpc, me_dpc, opciones,
                    saldo_ini, saldan, centro_co, moneda_adi, man_aux, tipoaux, man_doc, man_fecdoc,
                    cue_gasto, co_gas, man_adi, co_tab, man_adi2, co_tab2, man_adi3, co_tab3,
                    co_us_in, fe_us_in, co_us_mo, fe_us_mo, inactivo, fec_inac,
                    campo1, campo2, campo3, campo4, campo5, campo6, campo7, campo8,
                    revisado, trasnfe, co_cuepadre, tipo_pat, flujo_efe, afecta_pm, tipo_inv,
                    ipc_islr, ipc_dpc, exc_pat, meses_rotacion
                FROM [' + @db_origen + '].dbo.scCuenta WHERE detalle = 1 AND inactivo = 0;
            END

            -- Sincronizar Centros de Costo
            IF OBJECT_ID(''[' + @destino + '].dbo.scCentro'', ''U'') IS NOT NULL
            BEGIN
                DELETE FROM [' + @destino + '].dbo.scCentro;
                INSERT INTO [' + @destino + '].dbo.scCentro (co_cen, des_cen, co_us_in, fe_us_in, co_us_mo, fe_us_mo)
                SELECT co_cen, des_cen, co_us_in, fe_us_in, co_us_mo, fe_us_mo FROM [' + @db_origen + '].dbo.scCentro;
            END

            -- Sincronizar Catálogo de Gastos
            IF OBJECT_ID(''[' + @destino + '].dbo.scGastos'', ''U'') IS NOT NULL
            BEGIN
                DELETE FROM [' + @destino + '].dbo.scGastos;
                INSERT INTO [' + @destino + '].dbo.scGastos (co_gas, des_gas, co_us_in, fe_us_in, co_us_mo, fe_us_mo)
                SELECT co_gas, des_gas, co_us_in, fe_us_in, co_us_mo, fe_us_mo FROM [' + @db_origen + '].dbo.scGastos;
            END
        ';
        EXEC sp_executesql @sql;
    END TRY
    BEGIN CATCH
        -- Error silencioso para no bloquear la transacción contable
        PRINT 'Error en transferencia automática: ' + ERROR_MESSAGE();
    END CATCH
END;
GO


Componente 2: Los Interruptores (Triggers)


​Estos disparadores se instalan en la base de datos Contable. Su única responsabilidad es ejecutar el procedimiento anterior tras cualquier cambio en los registros contables.

USE [Nombre_BD_Contable] 
GO


/****** Creado por: www.elingenierodesistemas.com ******/
CREATE OR ALTER TRIGGER [dbo].[ExportarCuentasAlAdministrativo] ON [dbo].[scCuenta]
AFTER INSERT, UPDATE, DELETE AS BEGIN
    EXEC [dbo].[pExportarDatosContAdmi];
END;
GO

/****** Creado por: www.elingenierodesistemas.com ******/
CREATE OR ALTER TRIGGER [dbo].[ExportarCentrosAlAdministrativo] ON [dbo].[scCentro]
AFTER INSERT, UPDATE, DELETE AS BEGIN
    EXEC [dbo].[pExportarDatosContAdmi];
END;
GO

/****** Creado por: www.elingenierodesistemas.com ******/
CREATE OR ALTER TRIGGER [dbo].[ExportarGastosAlAdministrativo] ON [dbo].[scGastos]
AFTER INSERT, UPDATE, DELETE AS BEGIN
    EXEC [dbo].[pExportarDatosContAdmi];
END;
GO


El Resultado: Continuidad para Contabilidad

Al implementar esta arquitectura diseñada logramos:


  • Fluidez Contable: El contador ya no se detiene. Los datos viajan al módulo Administrativo en milisegundos de forma automática.
  • Mantenimiento Limpio: Todo el código reside en un solo lugar (el Motor).
  • Estabilidad de Producción: El diseño "Fail-Safe" protege la base de datos de bloqueos, garantizando que el sistema sea siempre funcional.


Automatiza de manera inteligente y permite que tu equipo contable se enfoque en lo que realmente importa.