viernes, 24 de octubre de 2014

Migración de Movimientos



En la migración de los movimientos se realiza por fechas de la mas antigua a la mas reciente.

De una forma que por lo general inserta el nuevo movimiento y hace un cambio en el saldo de la cuenta.

Dentro de los errores encontrados están que habían saldos que quedaban negativos perjudicando los datos.

También se encontró problemas de incompatibilidad de datos. Esto se soluciono haciendo unos cast y convert.




-----------------------------------------------------------------------------------------------------------------------

-- Verifica si el procedure existe, para eliminarla
IF OBJECT_ID ( N'MG_SP_MIGRAR_DATOS_MOVIMIENTOS', N'P' ) IS NOT NULL 
    DROP PROCEDURE MG_SP_MIGRAR_DATOS_MOVIMIENTOS;
GO

-- Create procedure for read file
CREATE PROCEDURE [dbo].[MG_SP_MIGRAR_DATOS_MOVIMIENTOS]
AS
BEGIN
 BEGIN TRY
  -- Declaracion de variables del procedure 
  DECLARE @counter int,@max int; -- Contador del while y max
  DECLARE @TipoOperacion nvarchar(255);

  -----------------------------------------------------------------------------------------
  -- INICIO DATOS MOVIMIENTOS
  -- Set de datos 
  DECLARE @FK_Movimiento INT;
  DECLARE @FK_Banco INT;
  DECLARE @FK_TipoGestion INT;
  DECLARE @FK_TipoMovimiento int
  DECLARE @Nombre varchar(50)
  SET @counter = 1;
  SET @max = (SELECT COUNT(*) FROM dbo.FileMovimientos fm)+1;

  BEGIN TRANSACTION 
   --Inicio del ciclo de while
   WHILE @counter < @max
   BEGIN
    -- Busca el tipo de operacion a ejecutar
    SET @TipoOperacion = (SELECT d.TipoOperacion FROM dbo.FileMovimientos  d WHERE d.ID = @counter);

    -- Inicio del IF
    IF @TipoOperacion = 'MovimientoInteres'         -- Movimiento Interes
    BEGIN
     -- Declaracion de tipos
     SET @FK_TipoMovimiento = 0
     SET @FK_TipoMovimiento = (SELECT FK_TipoMovimiento FROM dbo.FileMovimientos fm WHERE ID = @counter);
     IF((SELECT ID FROM [CuentasAhorroDB].[dbo].[CA_TipoMovimientoInteres] 
     WHERE CuentasAhorroDB.dbo.CA_TipoMovimientoInteres.Nombre = 'Credito') = @FK_TipoMovimiento)
     BEGIN
      -- Insert New Movimiento Intereses
      INSERT INTO [CuentasAhorroDB].[dbo].[CA_MovimientosIntereses]
      (FK_Cuenta,FK_TipoMovimientoInteres, Fecha, Monto)
      SELECT FK_Cuenta, FK_TipoMovimiento, Fecha, Monto 
      FROM dbo.FileMovimientos fm
      WHERE ID = @counter

      -- Actualizar cuenta
      UPDATE [CuentasAhorroDB].[dbo].[CA_Cuenta]
      SET
      SaldoIntereses = SaldoIntereses+fm.Monto
      FROM dbo.FileMovimientos fm
      WHERE fm.ID = @counter
      
      PRINT 'Insert Movimiento Interes(Credito).'
     END
     ELSE IF((SELECT ID FROM [CuentasAhorroDB].[dbo].[CA_TipoMovimientoInteres] 
     WHERE CuentasAhorroDB.dbo.CA_TipoMovimientoInteres.Nombre = 'Debito') = @FK_TipoMovimiento)
     BEGIN
      -- Insert New Movimiento Intereses
      INSERT INTO [CuentasAhorroDB].[dbo].[CA_MovimientosIntereses]
      (FK_Cuenta,FK_TipoMovimientoInteres, Fecha, Monto)
      SELECT FK_Cuenta, FK_TipoMovimiento, Fecha, Monto 
      FROM dbo.FileMovimientos fm
      WHERE ID = @counter

      -- Actualizar cuenta
      UPDATE [CuentasAhorroDB].[dbo].[CA_Cuenta]
      SET
      SaldoIntereses = SaldoIntereses+fm.Monto
      FROM dbo.FileMovimientos fm
      WHERE fm.ID = @counter

      PRINT 'Insert Movimiento Interes(Debito).'
     END
    END
    ELSE IF @TipoOperacion = 'MovimientoPendiente'       -- Movimiento Pendiente
    BEGIN
     -- Declaracion de tipos
     SET @FK_TipoMovimiento = 0
     SET @FK_TipoMovimiento = (SELECT FK_TipoMovimiento FROM dbo.FileMovimientos fm WHERE ID = @counter);
     IF((SELECT ID FROM [CuentasAhorroDB].[dbo].[CA_TipoMovimientoPendiente] 
     WHERE CuentasAhorroDB.dbo.CA_TipoMovimientoPendiente.Nombre = 'Credito') = @FK_TipoMovimiento)
     BEGIN
      -- Insert New Movimiento
      INSERT INTO [CuentasAhorroDB].[dbo].[CA_MovimientoPendiente]
      (FK_Cuenta, FK_TipoMovimientoPendiente, Monto, FechaHora)
      SELECT FK_Cuenta, FK_TipoMovimiento,Monto,Fecha 
      FROM dbo.FileMovimientos fm
      WHERE ID = @counter

      -- Actualizar cuenta
      UPDATE [CuentasAhorroDB].[dbo].[CA_Cuenta]
      SET
      SaldoPendiente = SaldoPendiente+fm.Monto
      FROM dbo.FileMovimientos fm
      WHERE fm.ID = @counter

      PRINT 'Insert Movimiento Pendiente(Credito).'
     END
     ELSE IF((SELECT ID FROM [CuentasAhorroDB].[dbo].[CA_TipoMovimientoPendiente] 
     WHERE CuentasAhorroDB.dbo.CA_TipoMovimientoPendiente.Nombre = 'Debito') = @FK_TipoMovimiento)
     BEGIN
      -- Insert New Movimiento
      INSERT INTO [CuentasAhorroDB].[dbo].[CA_MovimientoPendiente]
      (FK_Cuenta, FK_TipoMovimientoPendiente, Monto, FechaHora)
      SELECT FK_Cuenta, FK_TipoMovimiento, Monto, Fecha
      FROM dbo.FileMovimientos fm
      WHERE ID = @counter

      -- Actualizar cuenta
      UPDATE [CuentasAhorroDB].[dbo].[CA_Cuenta]
      SET
      SaldoPendiente = SaldoPendiente-fm.Monto
      FROM dbo.FileMovimientos fm
      WHERE fm.ID = @counter

      PRINT 'Insert Movimiento Pendiente(Debito).'
     END
     
    END
    ELSE IF @TipoOperacion = 'MovimientoEntreBancos'      -- Movimiento Entre Bancos
    BEGIN
     -- Declaracion de tipos
     SET @FK_TipoMovimiento = 0
     SET @FK_TipoMovimiento = (SELECT FK_TipoMovimiento FROM dbo.FileMovimientos fm WHERE ID = @counter);
     IF((SELECT ID FROM [CuentasAhorroDB].[dbo].[CA_TipoMovimiento] 
     WHERE CuentasAhorroDB.dbo.CA_TipoMovimiento.Nombre = 'Credito') = @FK_TipoMovimiento)
     BEGIN
      -- Insert New Movimiento
      INSERT INTO [CuentasAhorroDB].[dbo].[CA_Movimiento] 
      (FK_Cuenta, FK_TipoMovimiento, FK_TipoMedio, FechaHora,Monto)
      SELECT FK_Cuenta, FK_TipoMovimiento, FK_TipoMedio, Fecha, Monto 
      FROM dbo.FileMovimientos fm
      WHERE ID = @counter

      SET @FK_Movimiento = 0;
      SET @FK_Banco = 0;
      SET @FK_Movimiento = (SELECT TOP 1 Id FROM [CuentasAhorroDB].[dbo].[CA_Movimiento] C ORDER BY Id DESC);
      SET @FK_Banco = (SELECT FK_Banco FROM dbo.FileMovimientos fm WHERE ID = @counter)

      -- Insert MovimientoXBanco
      INSERT INTO [CuentasAhorroDB].[dbo].[CA_MovCajeroAut]
      ( FK_Banco, FK_Movimiento)
      VALUES
      (@FK_Banco,@FK_Movimiento)

      -- Actualizar cuenta
      UPDATE [CuentasAhorroDB].[dbo].[CA_Cuenta]
      SET
      SaldoReal = SaldoReal+fm.Monto
      FROM dbo.FileMovimientos fm
      WHERE fm.ID = @counter

      PRINT 'Insert Movimiento Entre Bancos(Credito).'
     END
     ELSE IF((SELECT ID FROM [CuentasAhorroDB].[dbo].[CA_TipoMovimiento] 
     WHERE CuentasAhorroDB.dbo.CA_TipoMovimiento.Nombre = 'Debito') = @FK_TipoMovimiento)
     BEGIN
      -- Insert New Movimiento
      INSERT INTO [CuentasAhorroDB].[dbo].[CA_Movimiento] 
      (FK_Cuenta, FK_TipoMovimiento, FK_TipoMedio, FechaHora,Monto)
      SELECT FK_Cuenta, FK_TipoMovimiento, FK_TipoMedio, Fecha, Monto 
      FROM dbo.FileMovimientos fm
      WHERE ID = @counter

      SET @FK_Movimiento = 0;
      SET @FK_Banco = 0;
      SET @FK_Movimiento = (SELECT TOP 1 Id FROM [CuentasAhorroDB].[dbo].[CA_Movimiento] C ORDER BY Id DESC);
      SET @FK_Banco = (SELECT FK_Banco FROM dbo.FileMovimientos fm WHERE ID = @counter)

      -- Insert MovimientoXBanco
      INSERT INTO [CuentasAhorroDB].[dbo].[CA_MovCajeroAut]
      ( FK_Banco, FK_Movimiento)
      VALUES
      (@FK_Banco,@FK_Movimiento)

      -- Actualizar cuenta
      UPDATE [CuentasAhorroDB].[dbo].[CA_Cuenta]
      SET
      SaldoReal = SaldoReal-fm.Monto
      FROM dbo.FileMovimientos fm
      WHERE fm.ID = @counter

      PRINT 'Insert Movimiento Entre Bancos(Debito).'
     END
     
    END
    ELSE IF @TipoOperacion = 'MovimientoGestion'       -- Movimiento Gestion
    BEGIN
     -- Declaracion de tipos
     SET @FK_TipoMovimiento = 0
     SET @FK_TipoMovimiento = (SELECT FK_TipoMovimiento FROM dbo.FileMovimientos fm WHERE ID = @counter);
     IF((SELECT ID FROM [CuentasAhorroDB].[dbo].[CA_TipoMovimiento] 
     WHERE CuentasAhorroDB.dbo.CA_TipoMovimiento.Nombre = 'Credito') = @FK_TipoMovimiento)
     BEGIN
      -- Insert New Movimiento
      INSERT INTO [CuentasAhorroDB].[dbo].[CA_Movimiento] 
      (FK_Cuenta, FK_TipoMovimiento, FK_TipoMedio, FechaHora,Monto)
      SELECT FK_Cuenta, FK_TipoMovimiento, FK_TipoMedio, Fecha, Monto 
      FROM dbo.FileMovimientos fm
      WHERE ID = @counter

      SET @FK_Movimiento = 0;
      SET @FK_TipoGestion = 0;
      SET @FK_Movimiento = (SELECT TOP 1 Id FROM [CuentasAhorroDB].[dbo].[CA_Movimiento] C ORDER BY Id DESC);
      SET @FK_TipoGestion = (SELECT FK_TipoGestion FROM dbo.FileMovimientos fm WHERE ID = @counter)

      -- Insert Gestion
      INSERT INTO [CuentasAhorroDB].[dbo].[CA_Gestion]
      (FK_Movimiento,FK_TipoGestion,Descripcion)
      VALUES
      (@FK_Movimiento,@FK_TipoGestion,'Movimiento Gestion')

      -- Actualizar cuenta
      UPDATE [CuentasAhorroDB].[dbo].[CA_Cuenta]
      SET
      SaldoReal = SaldoReal+fm.Monto
      FROM dbo.FileMovimientos fm
      WHERE fm.ID = @counter

      PRINT 'Insert Movimiento Gestion(Credito).'
     END
     ELSE IF((SELECT ID FROM [CuentasAhorroDB].[dbo].[CA_TipoMovimiento] 
     WHERE CuentasAhorroDB.dbo.CA_TipoMovimiento.Nombre = 'Debito') = @FK_TipoMovimiento)
     BEGIN
      -- Insert New Movimiento
      INSERT INTO [CuentasAhorroDB].[dbo].[CA_Movimiento] 
      (FK_Cuenta, FK_TipoMovimiento, FK_TipoMedio, FechaHora,Monto)
      SELECT FK_Cuenta, FK_TipoMovimiento, FK_TipoMedio, Fecha, Monto 
      FROM dbo.FileMovimientos fm
      WHERE ID = @counter

      SET @FK_Movimiento = 0;
      SET @FK_TipoGestion = 0;
      SET @FK_Movimiento = (SELECT TOP 1 Id FROM [CuentasAhorroDB].[dbo].[CA_Movimiento] C ORDER BY Id DESC);
      SET @FK_TipoGestion = (SELECT FK_TipoGestion FROM dbo.FileMovimientos fm WHERE ID = @counter)

      -- Insert Gestion
      INSERT INTO [CuentasAhorroDB].[dbo].[CA_Gestion]
      (FK_Movimiento,FK_TipoGestion,Descripcion)
      VALUES
      (@FK_Movimiento,@FK_TipoGestion,'Movimiento Gestion')

      -- Actualizar cuenta
      UPDATE [CuentasAhorroDB].[dbo].[CA_Cuenta]
      SET
      SaldoReal = SaldoReal-fm.Monto
      FROM dbo.FileMovimientos fm
      WHERE fm.ID = @counter

      PRINT 'Insert Movimiento Gestion(Debito).'
     END

    END
    ELSE IF @TipoOperacion = 'Movimiento'         -- Movimiento
    BEGIN
     -- Declaracion de tipos
     SET @FK_TipoMovimiento = 0
     SET @FK_TipoMovimiento = (SELECT FK_TipoMovimiento FROM dbo.FileMovimientos fm WHERE ID = @counter);
     IF((SELECT ID FROM [CuentasAhorroDB].[dbo].[CA_TipoMovimiento] 
     WHERE CuentasAhorroDB.dbo.CA_TipoMovimiento.Nombre = 'Credito') = @FK_TipoMovimiento)
     BEGIN
      -- Insert New Movimiento
      INSERT INTO [CuentasAhorroDB].[dbo].[CA_Movimiento] 
      (FK_Cuenta, FK_TipoMovimiento, FK_TipoMedio, FechaHora,Monto)
      SELECT FK_Cuenta, FK_TipoMovimiento, FK_TipoMedio, Fecha, Monto 
      FROM dbo.FileMovimientos fm
      WHERE ID = @counter

      -- Actualizar cuenta
      UPDATE [CuentasAhorroDB].[dbo].[CA_Cuenta]
      SET
      SaldoReal = SaldoReal+fm.Monto
      FROM dbo.FileMovimientos fm
      WHERE fm.ID = @counter

      PRINT 'Insert Movimiento(Credito).'
     END
     ELSE IF((SELECT ID FROM [CuentasAhorroDB].[dbo].[CA_TipoMovimiento] 
     WHERE CuentasAhorroDB.dbo.CA_TipoMovimiento.Nombre = 'Debito') = @FK_TipoMovimiento)
     BEGIN
      -- Insert New Movimiento
      INSERT INTO [CuentasAhorroDB].[dbo].[CA_Movimiento] 
      (FK_Cuenta, FK_TipoMovimiento, FK_TipoMedio, FechaHora,Monto)
      SELECT FK_Cuenta, FK_TipoMovimiento, FK_TipoMedio, Fecha, Monto 
      FROM dbo.FileMovimientos fm
      WHERE ID = @counter

      -- Actualizar cuenta
      UPDATE [CuentasAhorroDB].[dbo].[CA_Cuenta]
      SET
      SaldoReal = SaldoReal-fm.Monto
      FROM dbo.FileMovimientos fm
      WHERE fm.ID = @counter

      PRINT 'Insert Movimiento(Debito).'
     END
    END
    PRINT @counter
    SET @counter = @counter + 1;
   END
  IF @@TRANCOUNT > 0
   COMMIT TRANSACTION;  -- Commit transaction 
  PRINT 'Commit transaction.';
  RETURN 1;
 END TRY
 BEGIN CATCH --ERROR in the transaction 
  EXEC MG_SP_GetErrorInfo;
  IF @@TRANCOUNT > 0
   ROLLBACK TRANSACTION; -- ROLLBACK of trasaction
  PRINT 'Error: Rolling back transaction.';
  RETURN @@ERROR*-1;
 END CATCH;
END
GO


Horas Trabajadas: 3.5 hora
Autor: Edward Ovares Villegas

No hay comentarios:

Publicar un comentario