Ver Mensaje Individual
  #1 (permalink)  
Antiguo 17/10/2013, 14:18
mutant_x
 
Fecha de Ingreso: enero-2007
Mensajes: 58
Antigüedad: 17 años, 3 meses
Puntos: 3
Problemas con unprocedimiento almacenado

buenas amigos, gracias por la ayuda que me puedan brindar ...
tengo un procedimiento almacenado que calcula el tiempo de uso de los activos de una tabla activos,
el problema es que cuando lo ejecuto a todos los registros me da un resultado equivocado, pero cuando lo corro a un solo registro lo hace bien, y no le encuentro donde esta el error.
cuelgo aqui el codigo a ver si alguien me puede ayudar.
Código MySQL:
Ver original
  1.     DECLARE bContinuar BOOLEAN DEFAULT true;
  2.     DECLARE VarSecuencia VARCHAR(50);
  3.     DECLARE Mensaje VARCHAR(100);
  4.     DECLARE VarValorActual DOUBLE(15,0);
  5.     DECLARE VarPorcentaje DOUBLE(15,0);
  6.     DECLARE VarValorAgregado DOUBLE(15,0);
  7.     DECLARE VarValor DOUBLE(15,0);
  8.     DECLARE VarDepAcum DOUBLE(15,0);
  9.     DECLARE VarDepAnual DOUBLE(15,0);
  10.     DECLARE VarDepMensual DOUBLE(15,0);
  11.     DECLARE VarDepDia DOUBLE(15,0);
  12.     DECLARE VarDepTotal DOUBLE(15,0);
  13.     DECLARE VarValorReal DOUBLE(15,0);
  14.     DECLARE VarNewVal DOUBLE(15,0);
  15.     DECLARE VarRestaAcumulada DOUBLE(15,0);
  16.     DECLARE VarFechaActual DATE;
  17.     DECLARE VarFechaAdq DATE;
  18.     DECLARE AnoAct INT;
  19.     DECLARE MesAct INT;
  20.     DECLARE DiaAct INT;
  21.     DECLARE Dia INT;
  22.     DECLARE Mes INT;
  23.     DECLARE Ano INT;
  24.     DECLARE AnoAdq INT;
  25.     DECLARE MesAdq INT;
  26.     DECLARE DiaAdq INT;
  27.     DECLARE AnosEnDias INT;
  28.     DECLARE MesesEnDias INT;
  29.     DECLARE TiempoDeUso INT;
  30.     DECLARE cursor1 CURSOR FOR SELECT SECUENCIA, PORCDEP, VALORACTUAL, VALORAGREGADO, VALOR, FECHAADQUISICION, TOTALDEPRECIADO FROM activos;
  31.     DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET bContinuar = false;
  32.     SET VarFechaActual = CURDATE();
  33.     SET AnoAct = YEAR(NOW());
  34.     SET MesAct = MONTH (NOW());
  35.     SET DiaAct = DAY(NOW());
  36.  
  37.     OPEN cursor1;
  38.     REPEAT
  39.     FETCH cursor1 INTO VarSecuencia, VarPorcentaje, VarValorActual, VarValorAgregado, VarValor, VarFechaAdq, VarDepAcum;
  40.     IF bContinuar THEN
  41.         SET AnoAdq = YEAR(VarFechaAdq);
  42.         SET MesAdq = MONTH (VarFechaAdq);
  43.         SET DiaAdq = DAY(VarFechaAdq);
  44.  
  45.         IF DiaAct < DiaAdq THEN
  46.             SET MesAct = MesAct - 1;
  47.             SET DiaAct = DiaAct + 30;
  48.         END IF;
  49.         IF MesAct < MesAdq THEN
  50.             SET AnoAct = AnoAct - 1;
  51.             SET MesAct = MesAct + 12;
  52.         END IF;
  53.         SET Dia = DiaAct - DiaAdq;
  54.         SET Mes = MesAct - MesAdq;
  55.         SET Ano = AnoAct - AnoAdq;
  56.  
  57.         SET Mensaje = CONCAT('En el inventario, el tiempo de uso es de: ', Ano, ' años, ', Mes , ' mes/es y ', Dia, ' días');
  58.        
  59.         SET AnosEnDias = Ano * 365;
  60.         SET MesesEnDias = Mes * 30;
  61.         SET TiempoDeUso = AnosEnDias + MesesEnDias + Dia;
  62.         UPDATE activos SET activos.FECHAACTUAL = VarFechaActual, activos.TIEMPOUSO = Mensaje WHERE SECUENCIA = VarSecuencia;
  63.     END IF;
  64.     UNTIL NOT bContinuar END REPEAT;
  65.     CLOSE cursor1;
  66. SELECT "Activos Actualizados con Exito";
  67.  

hay algunas variables que no se estan usando todavia pero que mas a delante las usare estas no intervienen en el codigo hasta ahora...
la tabla tiene un campo FECHAADQUISICION, un campo FECHAACTUAL y un campo TIEMPOUSO

si calculo el tiempo de uso a un solo registro me da este resultado:
En el inventario, el tiempo de uso es de: 2 años, 9 mes/es y 14 días
la fehca de adquisicion es 2011-01-03
las fecha actual es 2013-10-17
este resultado es correcto

pero si calculo a todos me da este resultado:
En el inventario, el tiempo de uso es de: 2 años, 8 mes/es y 44 días

gracias por la ayuda...