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 originalCONCAT(NULL,'ABC') = NULL
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 originalDELIMITER $$
DROP PROCEDURE IF EXISTS `viaticosver2`.`procedsuma` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `procedsuma`(IN identificador INTEGER)
BEGIN
SET @hosp_tot = IFNULL(SELECT SUM(Cantidad) FROM conceptos WHERE Concepto LIKE 'Hospedaje' AND Folio=identificador), 0);
SET @iva_h = IFNULL(SELECT SUM(Iva_cant) FROM conceptos WHERE Concepto LIKE 'Hospedaje' AND Folio=identificador), 0);
SET @tran_tot = IFNULL(SELECT SUM(Cantidad) FROM conceptos WHERE Concepto LIKE 'Transporte' AND Folio=identificador), 0);
SET @iva_t = IFNULL(SELECT SUM(Iva_cant) FROM conceptos WHERE Concepto LIKE 'Transporte' AND Folio=identificador), 0);
SET @com_tot = IFNULL(SELECT SUM(Cantidad) FROM conceptos WHERE Concepto LIKE 'Comidas' AND Folio=identificador), 0);
SET @iva_c = IFNULL(SELECT SUM(Iva_cant) FROM conceptos WHERE Concepto LIKE 'Comidas' AND Folio=identificador), 0);
SET @av_tot = IFNULL(SELECT SUM(Cantidad) FROM conceptos WHERE Concepto LIKE 'Avion' AND Folio=identificador), 0);
SET @iva_a = IFNULL(SELECT SUM(Iva_cant) FROM conceptos WHERE Concepto LIKE 'Avion' AND Folio=identificador), 0);
SET @lav_tot = IFNULL(SELECT SUM(Cantidad) FROM conceptos WHERE Concepto LIKE 'Lavanderia' AND Folio=identificador), 0);
SET @iva_l = IFNULL(SELECT SUM(Iva_cant) FROM conceptos WHERE Concepto LIKE 'Lavanderia' AND Folio=identificador), 0);
SET @otr_tot = IFNULL(SELECT SUM(Cantidad) FROM conceptos WHERE Concepto LIKE 'Otros' AND Folio=identificador), 0);
SET @iva_o = IFNULL(SELECT SUM(Iva_cant) FROM conceptos WHERE Concepto LIKE 'Otros' AND Folio=identificador), 0);
SET @noded_tot = IFNULL(SELECT SUM(Cantidad) FROM conceptos WHERE Concepto LIKE 'No deducibles' AND Folio=identificador), 0);
SET @iva_n = IFNULL(SELECT SUM(Iva_cant) FROM conceptos WHERE Concepto LIKE 'No deducibles' AND Folio=identificador), 0);
UPDATE justif_gastos SET Hospedaje_tot=@hosp_tot, Iva_hosp=@iva_h, Transporte_tot=@tran_tot, Iva_trans=@iva_t,
Comidas_tot=@com_tot, Iva_com=@iva_c, Avion_tot=@av_tot, Iva_avion=@iva_a, Lavanderia_tot=@lav_tot, Iva_lavan=@iva_l,
Otros_tot=@otr_tot, Iva_otros=@iva_o, No_deducibles=@noded_tot, Iva_noded=@iva_n
WHERE Folio=identificador;
SET @tot = IFNULL(SELECT Hospedaje_tot + Iva_hosp + Transporte_tot + Iva_trans + Comidas_tot + Iva_com + Avion_tot + Iva_avion +
Lavanderia_tot + Iva_lavan + Otros_tot + Iva_otros +No_deducibles + Iva_noded FROM justif_gastos WHERE Folio=identificador), 0);
UPDATE justif_gastos SET Total=@tot
WHERE Folio=identificador;
END $$
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.