Ajuste de fechas
Publicado por Javier Medina (3 intervenciones) el 10/12/2008 16:59:10
Tengo un codigo que a partir a una fecha de expedicion, calcula y genera otras fechas que pertenecen a un recibo
Ejemplo, se hizo expedicion de poliza el 2008-01-30, su primer recibo seria 2008-01-30 hasta 2008-02-29. Asi sucesivamente hasta llegar a diciembre y recrear los nuevos recibos.
El problema es que cuando intento recrear las fechas para ajustar el error de la data, hay polizas que arrojan overflow por fecha, claro hay que tomar en cuenta la periodicidad de la misma
Aqui les dejo el codigo
En espera de comentarios
BEGIN TRAN
DECLARE
@NUMEROPOLIZA VARCHAR(13),
@CODIGOPERIODO INT,
@FECHAEXPEDICION DATETIME,
@FECHAINICIOPERIODO DATETIME,
@FECHAFINPERIODO DATETIME,
@INTERVALO INT,
@CONTADOR INT,
@PERIODO INT,
@NUMERO INT,
@INTERVALOANUAL INT,
@FEHCAMAXIMA DATETIME
DECLARE CURSORPOLIZAS CURSOR FOR
SELECT DISTINCT MMPOLIZA.NUMEROPOLIZA,MMPOLIZA.FECHAEXPEDICION,MMPOLIZA.CODIGOPERIODO--,MMRECIBO.NUMERO
FROM MMPOLIZA INNER JOIN MMRECIBO ON MMPOLIZA.IDPOLIZA = MMRECIBO.IDPOLIZA
WHERE CODIGOPOLIZA2 = '41'
AND DAY(MMPOLIZA.FECHAEXPEDICION) != DAY(MMRECIBO.FECHAEXPEDICION)
AND MMPOLIZA.NUMEROPOLIZA = '3690190001135'
OPEN CURSORPOLIZAS
FETCH NEXT FROM CURSORPOLIZAS INTO @NUMEROPOLIZA, @FECHAEXPEDICION, @CODIGOPERIODO--, @NUMERO
WHILE @@FETCH_STATUS = 0
BEGIN
IF(@CODIGOPERIODO = 1)
BEGIN
SET @PERIODO = 12
-- PRINT 'ANUAL'
END
IF(@CODIGOPERIODO = 2)
BEGIN
SET @PERIODO = 6
-- PRINT 'SEMESTRAL'
END
IF(@CODIGOPERIODO = 3)
BEGIN
SET @PERIODO = 3
-- PRINT 'TRIMESTRAL'
END
IF(@CODIGOPERIODO = 4)
BEGIN
SET @PERIODO = 2
-- PRINT 'BIMESTRAL'
END
IF(@CODIGOPERIODO = 5)
BEGIN
SET @PERIODO = 1
-- PRINT 'MENSUAL'
END
SET @INTERVALO = 0
SET @INTERVALOANUAL = 0
SET @CONTADOR = 0
DECLARE CUSORRECIBO CURSOR FOR
SELECT NUMERO FROM MMRECIBO WHERE CODIGOPOLIZA = @NUMEROPOLIZA ORDER BY FECHAINICIOPERIODO
OPEN CUSORRECIBO
FETCH NEXT FROM CUSORRECIBO INTO @NUMERO
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE MMRECIBO
SET FECHAEXPEDICION = DATEADD(YEAR, @INTERVALOANUAL, @FECHAEXPEDICION),
FECHAINICIOPERIODO = DATEADD(MONTH, @INTERVALO, @FECHAEXPEDICION),
FECHAFINPERIODO = DATEADD(MONTH,@INTERVALO + @PERIODO,@FECHAEXPEDICION)
WHERE NUMERO = @NUMERO
-- PRINT @NUMEROPOLIZA
-- PRINT CAST(@NUMERO AS VARCHAR(MAX)) + ' -- ' + CAST(@FECHAEXPEDICION AS VARCHAR(MAX)) + ' -- ' + CAST(@FECHAINICIOPERIODO AS VARCHAR(MAX)) + ' -- ' + CAST(@FECHAFINPERIODO AS VARCHAR(MAX))
SET @INTERVALO = @INTERVALO + @PERIODO
SET @CONTADOR = @CONTADOR + 1
IF(@CONTADOR >= 12)
BEGIN
SET @INTERVALOANUAL = @INTERVALOANUAL +1
SET @CONTADOR = 0
END
FETCH NEXT FROM CUSORRECIBO INTO @NUMERO
END
CLOSE CUSORRECIBO
DEALLOCATE CUSORRECIBO
SELECT @FEHCAMAXIMA = FECHAFINPERIODO FROM MMRECIBO WHERE CODIGOPOLIZA = @NUMEROPOLIZA
UPDATE MMPOLIZA
SET FECHAVENCIMIENTO = @FEHCAMAXIMA,
FECHAULTIMARENOVACION = DATEADD(YEAR,-1,@FEHCAMAXIMA)
WHERE NUMEROPOLIZA = @NUMEROPOLIZA
FETCH NEXT FROM CURSORPOLIZAS INTO @NUMEROPOLIZA, @FECHAEXPEDICION, @CODIGOPERIODO--, @NUMERO
END
CLOSE CURSORPOLIZAS
DEALLOCATE CURSORPOLIZAS
ROLLBACK
Ejemplo, se hizo expedicion de poliza el 2008-01-30, su primer recibo seria 2008-01-30 hasta 2008-02-29. Asi sucesivamente hasta llegar a diciembre y recrear los nuevos recibos.
El problema es que cuando intento recrear las fechas para ajustar el error de la data, hay polizas que arrojan overflow por fecha, claro hay que tomar en cuenta la periodicidad de la misma
Aqui les dejo el codigo
En espera de comentarios
BEGIN TRAN
DECLARE
@NUMEROPOLIZA VARCHAR(13),
@CODIGOPERIODO INT,
@FECHAEXPEDICION DATETIME,
@FECHAINICIOPERIODO DATETIME,
@FECHAFINPERIODO DATETIME,
@INTERVALO INT,
@CONTADOR INT,
@PERIODO INT,
@NUMERO INT,
@INTERVALOANUAL INT,
@FEHCAMAXIMA DATETIME
DECLARE CURSORPOLIZAS CURSOR FOR
SELECT DISTINCT MMPOLIZA.NUMEROPOLIZA,MMPOLIZA.FECHAEXPEDICION,MMPOLIZA.CODIGOPERIODO--,MMRECIBO.NUMERO
FROM MMPOLIZA INNER JOIN MMRECIBO ON MMPOLIZA.IDPOLIZA = MMRECIBO.IDPOLIZA
WHERE CODIGOPOLIZA2 = '41'
AND DAY(MMPOLIZA.FECHAEXPEDICION) != DAY(MMRECIBO.FECHAEXPEDICION)
AND MMPOLIZA.NUMEROPOLIZA = '3690190001135'
OPEN CURSORPOLIZAS
FETCH NEXT FROM CURSORPOLIZAS INTO @NUMEROPOLIZA, @FECHAEXPEDICION, @CODIGOPERIODO--, @NUMERO
WHILE @@FETCH_STATUS = 0
BEGIN
IF(@CODIGOPERIODO = 1)
BEGIN
SET @PERIODO = 12
-- PRINT 'ANUAL'
END
IF(@CODIGOPERIODO = 2)
BEGIN
SET @PERIODO = 6
-- PRINT 'SEMESTRAL'
END
IF(@CODIGOPERIODO = 3)
BEGIN
SET @PERIODO = 3
-- PRINT 'TRIMESTRAL'
END
IF(@CODIGOPERIODO = 4)
BEGIN
SET @PERIODO = 2
-- PRINT 'BIMESTRAL'
END
IF(@CODIGOPERIODO = 5)
BEGIN
SET @PERIODO = 1
-- PRINT 'MENSUAL'
END
SET @INTERVALO = 0
SET @INTERVALOANUAL = 0
SET @CONTADOR = 0
DECLARE CUSORRECIBO CURSOR FOR
SELECT NUMERO FROM MMRECIBO WHERE CODIGOPOLIZA = @NUMEROPOLIZA ORDER BY FECHAINICIOPERIODO
OPEN CUSORRECIBO
FETCH NEXT FROM CUSORRECIBO INTO @NUMERO
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE MMRECIBO
SET FECHAEXPEDICION = DATEADD(YEAR, @INTERVALOANUAL, @FECHAEXPEDICION),
FECHAINICIOPERIODO = DATEADD(MONTH, @INTERVALO, @FECHAEXPEDICION),
FECHAFINPERIODO = DATEADD(MONTH,@INTERVALO + @PERIODO,@FECHAEXPEDICION)
WHERE NUMERO = @NUMERO
-- PRINT @NUMEROPOLIZA
-- PRINT CAST(@NUMERO AS VARCHAR(MAX)) + ' -- ' + CAST(@FECHAEXPEDICION AS VARCHAR(MAX)) + ' -- ' + CAST(@FECHAINICIOPERIODO AS VARCHAR(MAX)) + ' -- ' + CAST(@FECHAFINPERIODO AS VARCHAR(MAX))
SET @INTERVALO = @INTERVALO + @PERIODO
SET @CONTADOR = @CONTADOR + 1
IF(@CONTADOR >= 12)
BEGIN
SET @INTERVALOANUAL = @INTERVALOANUAL +1
SET @CONTADOR = 0
END
FETCH NEXT FROM CUSORRECIBO INTO @NUMERO
END
CLOSE CUSORRECIBO
DEALLOCATE CUSORRECIBO
SELECT @FEHCAMAXIMA = FECHAFINPERIODO FROM MMRECIBO WHERE CODIGOPOLIZA = @NUMEROPOLIZA
UPDATE MMPOLIZA
SET FECHAVENCIMIENTO = @FEHCAMAXIMA,
FECHAULTIMARENOVACION = DATEADD(YEAR,-1,@FEHCAMAXIMA)
WHERE NUMEROPOLIZA = @NUMEROPOLIZA
FETCH NEXT FROM CURSORPOLIZAS INTO @NUMEROPOLIZA, @FECHAEXPEDICION, @CODIGOPERIODO--, @NUMERO
END
CLOSE CURSORPOLIZAS
DEALLOCATE CURSORPOLIZAS
ROLLBACK
Valora esta pregunta


0