Ver Mensaje Individual
  #3 (permalink)  
Antiguo 24/05/2009, 18:31
jorgelo82
 
Fecha de Ingreso: abril-2009
Mensajes: 78
Antigüedad: 15 años
Puntos: 0
Respuesta: Ayuda Urgente con Procedimiento Almacenado

Cita:
Iniciado por gnzsoloyo Ver Mensaje
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.

Que tal muchas gracias perdón por no haber respondido antes pero estaba intentando lo que me dijiste pero me sale un error de sintaxis en el ifnull no se si tenga algo que ver con la version porque es 1.1 sabrás a que se deba esto ?
Otendrás alguna otra forma que pueda intentar o alguien más ? Me dieron oporunidad hasta el Lunes, crees poderme ayudar ?