Ver Mensaje Individual
  #2 (permalink)  
Antiguo 21/05/2009, 17:11
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ayuda Urgente con Procedimiento Almacenado

Tu problema básico, si entendí bien, es que el procedimiento funciona bien en tanto y en cuanto todos los valores de las variable contengan algún resultado, esto es, contengan algún valor. El problema es si uno de esos valores es NULL.
Eso es esperable, porque en la artimética de consultas, un valor NULL anula todo resultado de operaciones aritméticas o de cadena. Esto significa:
Código sql:
Ver original
  1. CONCAT(NULL,'ABC') = NULL
  2. 1 + 2 + 3 + NULL = NULL
En esencia es un problema muy habitual, y la solución más simple, para la prisa que tienes, mi consejo es usar la función IFNULL en la carga de los datos. Algo así:
Código sql:
Ver original
  1. DELIMITER $$
  2.  
  3. DROP PROCEDURE IF EXISTS `viaticosver2`.`procedsuma` $$
  4. CREATE DEFINER=`root`@`localhost` PROCEDURE `procedsuma`(IN identificador INTEGER)
  5. BEGIN
  6.   SET @hosp_tot =  IFNULL(SELECT SUM(Cantidad) FROM conceptos WHERE Concepto LIKE 'Hospedaje' AND Folio=identificador), 0);
  7.   SET @iva_h =  IFNULL(SELECT SUM(Iva_cant) FROM conceptos WHERE Concepto LIKE 'Hospedaje' AND Folio=identificador), 0);
  8.   SET @tran_tot =  IFNULL(SELECT SUM(Cantidad) FROM conceptos WHERE Concepto LIKE 'Transporte' AND Folio=identificador), 0);
  9.   SET @iva_t =  IFNULL(SELECT SUM(Iva_cant) FROM conceptos WHERE Concepto LIKE 'Transporte' AND Folio=identificador), 0);
  10.   SET @com_tot =  IFNULL(SELECT SUM(Cantidad) FROM conceptos WHERE Concepto LIKE 'Comidas' AND Folio=identificador), 0);
  11.   SET @iva_c =  IFNULL(SELECT SUM(Iva_cant) FROM conceptos WHERE Concepto LIKE 'Comidas' AND Folio=identificador), 0);
  12.   SET @av_tot =  IFNULL(SELECT SUM(Cantidad) FROM conceptos WHERE Concepto LIKE 'Avion' AND Folio=identificador), 0);
  13.   SET @iva_a =  IFNULL(SELECT SUM(Iva_cant) FROM conceptos WHERE Concepto LIKE 'Avion' AND Folio=identificador), 0);
  14.   SET @lav_tot =  IFNULL(SELECT SUM(Cantidad) FROM conceptos WHERE Concepto LIKE 'Lavanderia' AND Folio=identificador), 0);
  15.   SET @iva_l =  IFNULL(SELECT SUM(Iva_cant) FROM conceptos WHERE Concepto LIKE 'Lavanderia' AND Folio=identificador), 0);
  16.   SET @otr_tot =  IFNULL(SELECT SUM(Cantidad) FROM conceptos WHERE Concepto LIKE 'Otros' AND Folio=identificador), 0);
  17.   SET @iva_o =  IFNULL(SELECT SUM(Iva_cant) FROM conceptos WHERE Concepto LIKE 'Otros' AND Folio=identificador), 0);
  18.   SET @noded_tot =  IFNULL(SELECT SUM(Cantidad) FROM conceptos WHERE Concepto LIKE 'No deducibles' AND Folio=identificador), 0);
  19.   SET @iva_n =  IFNULL(SELECT SUM(Iva_cant) FROM conceptos WHERE Concepto LIKE 'No deducibles' AND Folio=identificador), 0);
  20.   UPDATE justif_gastos SET Hospedaje_tot=@hosp_tot, Iva_hosp=@iva_h, Transporte_tot=@tran_tot, Iva_trans=@iva_t,
  21.     Comidas_tot=@com_tot, Iva_com=@iva_c, Avion_tot=@av_tot, Iva_avion=@iva_a, Lavanderia_tot=@lav_tot, Iva_lavan=@iva_l,
  22.     Otros_tot=@otr_tot, Iva_otros=@iva_o, No_deducibles=@noded_tot, Iva_noded=@iva_n
  23.   WHERE Folio=identificador;
  24.   SET @tot =  IFNULL(SELECT Hospedaje_tot + Iva_hosp + Transporte_tot + Iva_trans + Comidas_tot + Iva_com + Avion_tot + Iva_avion +
  25.     Lavanderia_tot + Iva_lavan + Otros_tot + Iva_otros +No_deducibles + Iva_noded FROM justif_gastos WHERE Folio=identificador), 0);
  26.   UPDATE justif_gastos SET Total=@tot
  27.   WHERE Folio=identificador;
  28. END $$
  29.  
  30. DELIMITER ;

Por tu apuro, no me puse a revisar mucho la sintaxis.
Espero que te sirva.

P.D.: Sería buena idea que dieras una mirada a tantos SELECT, porque a simple vista parece no ser muy eficiente. Sería interesante ver si se puede hacer una consulta que te devuelva todos esos valores con un sólo SELECT o un número menor de ellos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)