Error de desbordamiento aritmético al convertir expression al tipo de datos datetime en sql server

publicado por: Anonymous

Tengo el siguiente procedimiento almacenado, con el cual pretendo clasificar los vencimientos de saldos por dias, en 30,60,90 dias y mayores a 91

 USE [database]
    GO

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [Reporte].[Credito_CarteraActivaGeneral]
        @id_tercero_cliente numeric(18,0),
        @fechaFinal DATE
    AS
    BEGIN
        SET NOCOUNT ON;             

        truncate table temp_cartera_consolidado

        DECLARE @credito TABLE
        (
            [id_credito] [numeric](18, 0),
            [valor] [decimal](19, 4),   
            [codigo] [numeric](18, 0),
        /*  [id_tercero_cliente] [numeric](18, 0),*/
            [id_municipio] [numeric](18, 0)
        );

        INSERT INTO 
            @credito 
        SELECT [id_credito],[valor],[codigo],[id_municipio]FROM credito
        WHERE [email protected]_tercero_cliente
        and id_credito not in (select id_credito from CierreCreditos)   
        and [dbo].[ObtenerSaldoCredito]([id_credito]) > 0
        and id_forma_pago in (1,3)

        DECLARE @IdCredito numeric(18,0)

        DECLARE registro_cursor CURSOR FOR select [id_credito] from @credito
        OPEN registro_cursor

        FETCH NEXT FROM registro_cursor INTO @IdCredito

        --Recorre los abonos
        WHILE @@FETCH_STATUS = 0
        BEGIN       
            EXEC [Reporte].[Credito_ConsolidarMora] @IdCredito,@fechaFinal
            FETCH NEXT FROM registro_cursor INTO @IdCredito
        END

        CLOSE registro_cursor;
        DEALLOCATE registro_cursor;

        DECLARE @mora TABLE
        (
            [id_credito] [numeric](18, 0),
            [abono] money,  
            [sin_vencimiento] money,    
            [30_dias] money,    
            [60_dias] money,    
            [90_dias] money,    
            [91_dias] money,
            [saldo] money
        );  

        INSERT INTO 
            @mora 
        SELECT t.id_credito, sum(abono), 
        sum(case when mora = 0 then saldo else 0 end),
        sum(case when mora = 30 then saldo else 0 end),
        sum(case when mora = 60 then saldo else 0 end),
        sum(case when mora = 90 then saldo else 0 end),
        sum(case when mora = 91 then saldo else 0 end),
        sum(saldo)
        from temp_credito_consolidado t
        inner join @credito c on t.id_credito = c.id_credito
        group by t.id_credito

            select mu.nombre municipio,c.id_credito,c.codigo,c.valor,terc.nombre,terc.nro_identificacion,
        m.[abono],m.[sin_vencimiento],m.[30_dias],m.[60_dias],m.[90_dias],m.[91_dias],m.saldo
        from @mora m
        inner join @credito c on m.id_credito = c.id_credito
    /*  inner join tercero cl on c.id_tercero_cliente = cl.id_tercero*/
        inner join municipio mu on mu.id_municipio = c.id_municipio
    /*  inner join entidad e on e.id_entidad = c.id_entidad*/
        inner join credito credi on credi.id_credito = c.id_credito
        left join tercero terc on terc.id_tercero = credi.id_tercero_cliente

    END

llamo aun segundo procedimiento en el cual obtengo los dias de mora

USE [database]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [Reporte].[Credito_ConsolidarMora]
    @IdCredito int,
    @fechaCorte Date
AS
    delete from temp_credito_consolidado where id_credito = @IdCredito

    -- Si el crédito esta cerrado el saldo en mora es 0 
    IF(SELECT id FROM CierreCreditos where id_credito = @IdCredito) IS NOT NULL
        return

        DECLARE @ValorPagado MONEY

    DECLARE @credito TABLE
    (
        [id_credito] [numeric](18, 0),
        [fecha] [datetime],
        [valor] [decimal](19, 4),   
        [cuotas] [int],
        [valor_cuota_inicial1] [decimal](19, 4),
        [fecha_cuota_inicial1] [datetime],
        [valor_cuota_inicial2] [decimal](19, 4),
        [fecha_cuota_inicial2] [datetime]
    );
    INSERT INTO 
        @credito 
    SELECT 
        [id_credito],
        [fecha],
        [valor],    
        [cuotas],
        [valor_cuota_inicial1],
        [fecha_cuota_inicial1],
        [valor_cuota_inicial2],
        [fecha_cuota_inicial2]
    FROM 
        credito
    WHERE 
        id_credito = @IdCredito

    DECLARE @NoCuota int = 0
    DECLARE @Saldo money = (select [valor] from @credito)
    DECLARE @Fecha datetime = (select fecha_cuota_inicial1 from @credito)
    DECLARE @Valor datetime = (select ISNULL(valor_cuota_inicial1,0) from @credito)

    IF @Valor > 0
    BEGIN
        SET @NoCuota = @NoCuota+1

        INSERT INTO temp_credito_consolidado (NoCuota,Fecha,SaldoCuota,ValorCuota,id_credito)
        SELECT @NoCuota,fecha_cuota_inicial1,@Saldo,valor_cuota_inicial1,@IdCredito FROM @credito

        SET @Saldo = @Saldo - (select valor_cuota_inicial1 from @credito)       
        SET @Valor = (select ISNULL(valor_cuota_inicial2,0) from @credito)

        IF @Valor > 0
        BEGIN
            SET @Fecha = (select fecha_cuota_inicial2 from @credito)
            SET @NoCuota = @NoCuota+1       
            INSERT INTO temp_credito_consolidado (NoCuota,Fecha,SaldoCuota,ValorCuota,id_credito)
            SELECT @NoCuota,fecha_cuota_inicial2,@Saldo,valor_cuota_inicial2,@IdCredito FROM @credito
            SET @Saldo = @Saldo - (select valor_cuota_inicial2 from @credito)
        END
        ELSE SET @Fecha = (select fecha_cuota_inicial1 from @credito)   

    END
    ELSE SET @Fecha = (select fecha from @credito)  

    IF @Saldo > 0
    BEGIN
        DECLARE @ValorCuota money = @Saldo/(select cuotas from @credito)

        WHILE @Saldo > 0
        BEGIN
            SET @NoCuota = @NoCuota+1       
            SET @Fecha = (SELECT DATEADD(month, 1, @Fecha))

            INSERT INTO temp_credito_consolidado (NoCuota,Fecha,SaldoCuota,ValorCuota,id_credito)
            SELECT @NoCuota,@Fecha,@Saldo,@ValorCuota,@IdCredito FROM @credito

            SET @Saldo = @Saldo - @ValorCuota
        END
    END
    --

    SELECT  @ValorPagado = SUM(Valor)
    from    abono
    WHERE   id_credito = @IdCredito
    and fecha_pago <= @fechaCorte

    SET @NoCuota = 0
    WHILE @ValorPagado > 0
        BEGIN
            SET @NoCuota = @NoCuota+1                               

            SELECT  @ValorCuota = ValorCuota
            from    temp_credito_consolidado
            WHERE   NoCuota = @NoCuota 
            and id_credito = @IdCredito

            SET @Saldo = ISNULL(IIF((@ValorPagado - @ValorCuota) < 0,@ValorPagado ,@ValorCuota ), 0)            

            update temp_credito_consolidado set Abono = @Saldo where NoCuota = @NoCuota and id_credito = @IdCredito

            SET @ValorPagado = @ValorPagado - @ValorCuota

        END

    update temp_credito_consolidado set Abono = 0 where Abono is null and id_credito = @IdCredito   

    select @NoCuota = min(NoCuota) from temp_credito_consolidado where ValorCuota-Abono > 0 and id_credito = @IdCredito
    DECLARE @NoCuotas int = (select max(NoCuota) from temp_credito_consolidado where id_credito = @IdCredito) 

    WHILE @NoCuota <= @NoCuotas
        BEGIN           
            update temp_credito_consolidado set Mora = datediff(d,Fecha,@fechaCorte) where NoCuota = @NoCuota   and id_credito = @IdCredito         
            SET @NoCuota = @NoCuota+1                               
        END

    update temp_credito_consolidado set DiasMora = mora where id_credito = @IdCredito
    update temp_credito_consolidado set FechaCorte = @fechaCorte where id_credito = @IdCredito
    update temp_credito_consolidado set Mora = 0 where mora is null or mora < 0 and id_credito = @IdCredito
    update temp_credito_consolidado set Mora = 30 where mora between 1 and 30 and id_credito = @IdCredito
    update temp_credito_consolidado set Mora = 60 where mora between 31 and 60 and id_credito = @IdCredito
    update temp_credito_consolidado set Mora = 90 where mora between 61 and 90 and id_credito = @IdCredito
    update temp_credito_consolidado set Mora = 91 where mora > 90 and id_credito = @IdCredito
    update temp_credito_consolidado set Saldo = ValorCuota-Abono where id_credito = @IdCredito

mi problema radica en que al ejecutar el procedimiento me genera este error:
introducir la descripción de la imagen aquí

pero obtengo los datos que necesito
introducir la descripción de la imagen aquí

esta es la estructura de mi tabla

ALTER TABLE [dbo].[temp_cartera_consolidado](
    [id_credito] [numeric](18, 0) NULL,
    [NoCuota] [int] NULL,
    [Fecha] [date] NULL,
    [SaldoCuota] [money] NULL,
    [ValorCuota] [money] NULL,
    [Abono] [money] NULL,
    [Saldo] [money] NULL,
    [Mora] [int] NULL,
    [DiasMora] [int] NULL,
    [FechaCorte] [date] NULL
) ON [PRIMARY]

No se en que puedo estar fallando

solución

Resuelta, todo implica en la estructura que está definida para los campos en los cuales se pretende actualizar la información.

Si algún tipo de dato de la tabla en donde se requiere hacer la inserción es diferente al que está definido en la tabla de donde proviene el dato este generara error.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *