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

[SOLUCIONADO] obtener resultado de procedimiento desde un disparador

Estas en el tema de obtener resultado de procedimiento desde un disparador en el foro de Mysql en Foros del Web. Hola! buen día... Les explico mi problema, estoy tratando de obtener el resultado que me arroja un procedimiento, con parametro de salida, llamandolo desde un ...
  #1 (permalink)  
Antiguo 26/04/2013, 12:26
Avatar de tanliz  
Fecha de Ingreso: abril-2013
Ubicación: Irapuato
Mensajes: 63
Antigüedad: 11 años, 8 meses
Puntos: 1
obtener resultado de procedimiento desde un disparador

Hola! buen día... Les explico mi problema, estoy tratando de obtener el resultado que me arroja un procedimiento, con parametro de salida, llamandolo desde un disparador, pero me arroja un error en el insert. Les muestro el codigo del disparador, el procedimiento si me funciona, pues ya lo he ejecutado antes...
espero me puedan ayudar, de antemano GRACIAS!

Código:
DELIMITER $$
USE `proiplus`$$
DROP TRIGGER /*!50032 IF EXISTS */ `Actualiza_Cuentas_Por_Cobrar`$$

CREATE
    /*!50017 DEFINER = 'proi'@'localhost' */
    TRIGGER `Actualiza_Cuentas_Por_Cobrar` AFTER INSERT ON `detalle_cuentas_por_cobrar` 
    FOR EACH ROW BEGIN
	DECLARE nuevoAbono DECIMAL(10,2);
	DECLARE nuevoSaldo DECIMAL(10,2);
	DECLARE nuevaLlave VARCHAR(5);
	
	SET nuevoAbono =(SELECT Abono FROM cuentas_por_cobrar WHERE Cuenta_Por_Cobrar_Id=new.Cuenta_Por_Cobrar_Id)+new.Abono;
	SET nuevoSaldo = (SELECT Saldo FROM cuentas_por_cobrar WHERE Cuenta_Por_Cobrar_Id=new.Cuenta_Por_Cobrar_Id) - new.Abono;
	
	UPDATE cuentas_por_cobrar
	SET Abono=nuevoAbono, Saldo=nuevoSaldo
	WHERE Cuenta_Por_Cobrar_Id=new.Cuenta_Por_Cobrar_Id;
	
	IF (STRCMP(new.FormaPago, "Efectivo")==0) THEN
		CALL Crear_Llave_Caja(@llave);
		SET nuevaLlave=(SELECT @llave);
		INSERT INTO caja (Caja_Id, Tipo_Id, Origen_Id, Ingreso_Id, Fecha, Descipcion, Monto, Numero_Folio, Estatus_Registro)
		VALUES (nuevaLlave, 'Ingreso', 'Cuentas_Por_Cobrar', new.Detalle_Cuentas_Por_Cobrar_Id, new.Fecha, 'Abono de cliente', new.Abono, new.Moneda, 'Activo');
	ELSE THEN
		CALL Crear_Llave_Bancos(@llave);
		SET nuevaLlave=(SELECT @llave);
		INSERT INTO bancos (Bancos_Id, Tipo_Id, Origen_Id, Ingreso_Id, Fecha, Descipcion, Monto, Numero_Folio, Estatus_Registro)
		VALUES (nuevaLlave, 'Ingreso', 'Cuentas_Por_Cobrar', new.Detalle_Cuentas_Por_Cobrar_Id, new.Fecha, 'Abono de cliente', new.Abono, new.Moneda, 'Activo');
	END IF;
    END;
$$
DELIMITER ;
Y este es el error:

Error Code: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '==0) then
call Crear_Llave_Caja(@llave);
set nuevaLlave=(select @llave);
i' at line 16

Última edición por tanliz; 26/04/2013 a las 12:31
  #2 (permalink)  
Antiguo 26/04/2013, 12:34
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: obtener resultado de procedimiento desde un disparador

MySQL no admite llamar rutinas almacenadas (procedures, o functions), desde un TRIGGER.
__________________
¿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 26/04/2013, 12:42
Avatar de tanliz  
Fecha de Ingreso: abril-2013
Ubicación: Irapuato
Mensajes: 63
Antigüedad: 11 años, 8 meses
Puntos: 1
Respuesta: obtener resultado de procedimiento desde un disparador

Gracias gnzsoloyo... pero ahora he cambiado la llamada del procedimiento por una simple consulta pero me sigue marcando error...
puse esto:
Código MySQL:
Ver original
  1. IF (STRCMP(new.FormaPago, "Efectivo")==0) THEN
  2.         SET nuevaLlave=(SELECT IFNULL(MAX(Caja_Id),0)+1 FROM caja);
  3.         INSERT INTO caja (Caja_Id, Tipo_Id, Origen_Id, Ingreso_Id, Fecha, Descripcion, Monto, Numero_Folio, Estatus_Registro)
  4.         VALUES (nuevaLlave, 'Ingreso', 'Cuentas_Por_Cobrar', new.Detalle_Cuentas_Por_Cobrar_Id, new.Fecha, 'Abono de cliente', new.Abono, new.Moneda, 'Activo');
  5.     ELSE THEN
  6.         SET nuevaLlave=(SELECT IFNULL(MAX(Bancos_Id),0)+1 FROM bancos);
  7.         INSERT INTO bancos (Bancos_Id, Tipo_Id, Origen_Id, Ingreso_Id, Fecha, Descipcion, Monto, Numero_Folio, Estatus_Registro)
  8.         VALUES (nuevaLlave, 'Ingreso', 'Cuentas_Por_Cobrar', new.Detalle_Cuentas_Por_Cobrar_Id, new.Fecha, 'Abono de cliente', new.Abono, new.Moneda, 'Activo');
  9.     END IF;
  #4 (permalink)  
Antiguo 26/04/2013, 12:46
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: obtener resultado de procedimiento desde un disparador

Partamos de la base que no existen las pseudovariables NEW y OLD en los SP. Son exclusivamente de los TRIGGER, así que debes adaptar eso para comenzar.

Esto tampoco está bien:
Código MySQL:
Ver original 
Sólo va ELSE.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 26/04/2013, 13:01
Avatar de tanliz  
Fecha de Ingreso: abril-2013
Ubicación: Irapuato
Mensajes: 63
Antigüedad: 11 años, 8 meses
Puntos: 1
Respuesta: obtener resultado de procedimiento desde un disparador

Mmm ya quite el "then" en el "else" (persiste el error) y las pseudovariables las estoy utilizando en el trigger, no en el procedimento... o q te refieres?
  #6 (permalink)  
Antiguo 26/04/2013, 13:03
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: obtener resultado de procedimiento desde un disparador

Por tu mensaje parecía entenderse que estabas cambiando de un TRIGGER a un SP.

Si es el SP, entonces pruébalo con las pseudovariables... Pero postea todo el mensaje de error y código del trigger. A veces el error está más adelante de lo que menciona.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 26/04/2013, 13:09
Avatar de tanliz  
Fecha de Ingreso: abril-2013
Ubicación: Irapuato
Mensajes: 63
Antigüedad: 11 años, 8 meses
Puntos: 1
Respuesta: obtener resultado de procedimiento desde un disparador

Este es el trigger:
Código MySQL:
Ver original
  1. DELIMITER $$
  2. USE `proiplus`$$
  3. DROP TRIGGER /*!50032 IF EXISTS */ `Actualiza_Cuentas_Por_Cobrar`$$
  4.  
  5.     /*!50017 DEFINER = 'proi'@'localhost' */
  6.     TRIGGER `Actualiza_Cuentas_Por_Cobrar` AFTER INSERT ON `detalle_cuentas_por_cobrar`
  7.     DECLARE nuevoAbono DECIMAL(10,2);
  8.     DECLARE nuevoSaldo DECIMAL(10,2);
  9.     DECLARE nuevaLlave VARCHAR(5);
  10.     DECLARE FormaPago VARCHAR(20);
  11.    
  12.     SET nuevoAbono =(SELECT Abono FROM cuentas_por_cobrar WHERE Cuenta_Por_Cobrar_Id=new.Cuenta_Por_Cobrar_Id)+new.Abono;
  13.     SET nuevoSaldo = (SELECT Saldo FROM cuentas_por_cobrar WHERE Cuenta_Por_Cobrar_Id=new.Cuenta_Por_Cobrar_Id) - new.Abono;
  14.    
  15.     UPDATE cuentas_por_cobrar
  16.     SET Abono=nuevoAbono, Saldo=nuevoSaldo
  17.     WHERE Cuenta_Por_Cobrar_Id=new.Cuenta_Por_Cobrar_Id;
  18.    
  19.    
  20.     IF (STRCMP(new.Forma_Pago, "Efectivo")==0) THEN
  21.         SET nuevaLlave=(SELECT IFNULL(MAX(Caja_Id),0)+1 FROM caja);
  22.         INSERT INTO caja (Caja_Id, Tipo_Id, Origen_Id, Ingreso_Id, Fecha, Descripcion, Monto, Numero_Folio, Estatus_Registro)
  23.         VALUES (nuevaLlave, 'Ingreso', 'Cuentas_Por_Cobrar', new.Detalle_Cuentas_Por_Cobrar_Id, new.Fecha, 'Abono de cliente', new.Abono, new.Moneda, 'Activo');
  24.     ELSE
  25.         SET nuevaLlave=(SELECT IFNULL(MAX(Bancos_Id),0)+1 FROM bancos);
  26.         INSERT INTO bancos (Bancos_Id, Tipo_Id, Origen_Id, Ingreso_Id, Fecha, Descipcion, Monto, Numero_Folio, Estatus_Registro)
  27.         VALUES (nuevaLlave, 'Ingreso', 'Cuentas_Por_Cobrar', new.Detalle_Cuentas_Por_Cobrar_Id, new.Fecha, 'Abono de cliente', new.Abono, new.Moneda, 'Activo');
  28.     END IF;
  29.     END;
  30. $$
  31. DELIMITER ;
  32.  
  33.  
  34. y este es el error:
  35.  
  36.  queries executed, 2 success, 1 errors, 0 warnings
  37.  
  38. Query: USE `proiplus`
  39.  
  40. Query: USE `proiplus`
  41.  
  42. 0 row(s) affected
  43.  
  44. Execution Time : 0 sec
  45. Transfer Time  : 0 sec
  46. Total Time     : 0 sec
  47. --------------------------------------------------
  48.  
  49. Query: DROP TRIGGER /*!50032 IF EXISTS */ `Actualiza_Cuentas_Por_Cobrar`
  50.  
  51. Query: DROP TRIGGER /*!50032 IF EXISTS */ `Actualiza_Cuentas_Por_Cobrar`
  52.  
  53. 0 row(s) affected, 1 warning(s)
  54.  
  55. Execution Time : 0 sec
  56. Transfer Time  : 0 sec
  57. Total Time     : 0 sec
  58.  
  59. Note: To see complete list of warning(s), enable Tools -> Preferences -> General -> Show Warning(s) in Messages Tab
  60. --------------------------------------------------
  61.  
  62. Query: CREATE /*!50017 DEFINER = 'proi'@'localhost' */ TRIGGER `Actualiza_Cuentas_Por_Cobrar` AFTER INSERT ON `detalle_cuentas_por_cobr...
  63.  
  64. Query: CREATE /*!50017 DEFINER = 'proi'@'localhost' */ TRIGGER `Actualiza_Cuentas_Por_Cobrar` AFTER INSERT ON `detalle_cuentas_por_cobr...
  65.  
  66. Error Code: 1064
  67. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '==0) then
  68.         set nuevaLlave=(SELECT IFNULL(MAX(Caja_Id),0)+1 FROM caja);
  69.         insert' at line 18
  70.  
  71. Execution Time : 0 sec
  72. Transfer Time  : 0 sec
  73. Total Time     : 0 sec
  #8 (permalink)  
Antiguo 26/04/2013, 13:11
Avatar de tanliz  
Fecha de Ingreso: abril-2013
Ubicación: Irapuato
Mensajes: 63
Antigüedad: 11 años, 8 meses
Puntos: 1
Respuesta: obtener resultado de procedimiento desde un disparador

ya encontre el error: :P estaba poniendo un 0 de mas en la condicion

quedo asi:
IF (STRCMP(new.Forma_Pago, "Efectivo")=0) THEN...

muchas gracias por tu atencion!
  #9 (permalink)  
Antiguo 26/04/2013, 13:16
Avatar de tanliz  
Fecha de Ingreso: abril-2013
Ubicación: Irapuato
Mensajes: 63
Antigüedad: 11 años, 8 meses
Puntos: 1
Respuesta: obtener resultado de procedimiento desde un disparador

y si me funciono llamar al procedimiento en el trigger... por si a alguien le interesa...
quedo asi:
Código:
IF (STRCMP(new.Forma_Pago, "Efectivo")=0) THEN
		CALL Crear_Llave_Caja(@llave);
		SET nuevaLlave=(SELECT @llave);
		INSERT INTO caja (Caja_Id, Tipo_Id, Origen_Id, Ingreso_Id, Fecha, Descripcion, Monto, Numero_Folio, Estatus_Registro)
		VALUES (nuevaLlave, 'Ingreso', 'Cuentas_Por_Cobrar', new.Detalle_Cuentas_Por_Cobrar_Id, new.Fecha, 'Abono de cliente', new.Abono, new.Moneda, 'Activo');
	ELSE.....
  #10 (permalink)  
Antiguo 26/04/2013, 13:30
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: obtener resultado de procedimiento desde un disparador

Veamos:
1) Las comparaciones en MySQL son con "=", no "==". Ten en cuenta siempre que los operadores lógicos no necesariamente son iguales entre diferentes DBMS.
2) Las comillas (") y los apóstrofos no son lo mismo. Las cadenas de texto se encierran entre apóstrofos (para usar comillas hay que modificar la configuracion del servidor).

Usa:
Código MySQL:
Ver original
  1. IF STRCMP(new.Forma_Pago, 'Efectivo') = 0 THEN
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 26/04/2013, 14:47
Avatar de tanliz  
Fecha de Ingreso: abril-2013
Ubicación: Irapuato
Mensajes: 63
Antigüedad: 11 años, 8 meses
Puntos: 1
Respuesta: obtener resultado de procedimiento desde un disparador

si, tienes razon, he hecho me equivoque en mi respuesta, quise decir q habia escrito un "=" de as en mi condicion y en lugar de eso escribi un "0"...
pero ya me funciono, GRACIAS!

Etiquetas: disparador, insert, procedimiento, registro, resultado, select
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 18:27.