Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Ayuda Urgente con Procedimiento Almacenado

Estas en el tema de Ayuda Urgente con Procedimiento Almacenado en el foro de Mysql en Foros del Web. Que tal compañeros necesito su ayuda urgente tengo una aplicacion web para entregar el dia de mañana para la cual necesito el siguiente procedimiento almacenado: ...
  #1 (permalink)  
Antiguo 21/05/2009, 16:34
 
Fecha de Ingreso: abril-2009
Mensajes: 78
Antigüedad: 15 años
Puntos: 0
Ayuda Urgente con Procedimiento Almacenado

Que tal compañeros necesito su ayuda urgente tengo una aplicacion web para entregar el dia de mañana para la cual necesito el siguiente procedimiento almacenado:

DELIMITER $$

DROP PROCEDURE IF EXISTS `viaticosver2`.`procedsuma` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `procedsuma`(in identificador INTEGER)
begin
set @hosp_tot=(SELECT SUM(Cantidad) FROM conceptos WHERE Concepto LIKE 'Hospedaje' AND Folio=identificador);
set @iva_h=(SELECT SUM(Iva_cant) FROM conceptos WHERE Concepto LIKE 'Hospedaje' AND Folio=identificador);
set @tran_tot=(SELECT SUM(Cantidad) FROM conceptos WHERE Concepto LIKE 'Transporte' AND Folio=identificador);
set @iva_t=(SELECT SUM(Iva_cant) FROM conceptos WHERE Concepto LIKE 'Transporte' AND Folio=identificador);
set @com_tot=(SELECT SUM(Cantidad) FROM conceptos WHERE Concepto LIKE 'Comidas' AND Folio=identificador);
set @iva_c=(SELECT SUM(Iva_cant) FROM conceptos WHERE Concepto LIKE 'Comidas' AND Folio=identificador);
set @av_tot=(SELECT SUM(Cantidad) FROM conceptos WHERE Concepto LIKE 'Avion' AND Folio=identificador);
set @iva_a=(SELECT SUM(Iva_cant) FROM conceptos WHERE Concepto LIKE 'Avion' AND Folio=identificador);
set @lav_tot=(SELECT SUM(Cantidad) FROM conceptos WHERE Concepto LIKE 'Lavanderia' AND Folio=identificador);
set @iva_l=(SELECT SUM(Iva_cant) FROM conceptos WHERE Concepto LIKE 'Lavanderia' AND Folio=identificador);
set @otr_tot=(SELECT SUM(Cantidad) FROM conceptos WHERE Concepto LIKE 'Otros' AND Folio=identificador);
set @iva_o=(SELECT SUM(Iva_cant) FROM conceptos WHERE Concepto LIKE 'Otros' AND Folio=identificador);
set @noded_tot=(SELECT SUM(Cantidad) FROM conceptos WHERE Concepto LIKE 'No deducibles' AND Folio=identificador);
set @iva_n=(SELECT SUM(Iva_cant) FROM conceptos WHERE Concepto LIKE 'No deducibles' AND Folio=identificador);
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=(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);
update justif_gastos set Total=@tot
where Folio=identificador;
end $$

DELIMITER ;

Pero tengo el siguiente problema, lo que esto hace es seleccionar los conceptos y el iva para hacer una suma y luego esta insertarla en un campo, pero el problema que tengo es que no siempre van a estar todos los conceptos, ya que estos los da el usuario, a veces se tienen varios conceptos llamados Avion con el mismo Folio y los suma todos, para que algunos no se confundan tienen un número de ID como llave primaria para tener varios conceptos con el mismo folio, pues bien el procedimiento lo realiza muy bien pero solo lo hace cuando encuentra todos los conceptos, por ejemplo si no encuentra Transporte porque el usuario no metió ese registro entonces el procedimiento no se hace pero yo necesito que lo haga aunque no estén todos, pensé en hacer esto con un if pero no se si se puedan meter consultas además de que no se manejar muy bien el mysql, si alguien me puede ayudar a hacer esto o me enseña una mejor forma se lo agradecería mucho ya que me pasó en las pruebas finales de mi aplicación y ahora ya me está comiendo el tiempo
Gracias Gracias Gracias
  #2 (permalink)  
Antiguo 21/05/2009, 17:11
Avatar de 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, 4 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)
  #3 (permalink)  
Antiguo 24/05/2009, 18:31
 
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 ?
  #4 (permalink)  
Antiguo 24/05/2009, 21:21
 
Fecha de Ingreso: abril-2009
Mensajes: 78
Antigüedad: 15 años
Puntos: 0
Respuesta: Ayuda Urgente con Procedimiento Almacenado

Ya me salió el procedimiento lo que tenía mal era la sintaxis del ifnull, ya que hacía falta encerrar el select entre paréntesis para que solo eso tomara el ifnull.
Pero muchas gracias por su ayuda en especial por la ayuda de gnzsoloyo por la recomendación del ifnull esto me va a servir para muchas cosas más
Gracias
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:02.