Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Procedimiento almacenado que no hace nada dentro de un trigger (https://www.clubdelphi.com/foros/showthread.php?t=78344)

AzidRain 11-04-2012 01:54:18

Procedimiento almacenado que no hace nada dentro de un trigger
 
Tengo una tabla facturas, que contiene un campo "si_aplica". A su vez tengo un procedimiento almacenado que dado un numero de factura hace varios calculos con los campos del registro y actualiza el campo "si_aplica".

La tabla facturas tiene un trigger que se dispara despues de cada inserción.

Deseo llamar al procedimiento almacenado que hace el cálculo dentro del trigger, para que cada vez que haya una inserción se haga el cálculo ya mencionado.

Si llamo al procedimiento almacenado "por fuera", es decir, no dentro del trigger. Hace lo que tiene que hacer. Sin embargo si lo llamo dentro del trigger, no hace nada ni envía ningún mensaje de error. No es una referencia circular ya que el procedimiento almacenado hace un UPDATE en la tabla facturas y se ejecuta justo después de cada INSERT, es decir, el registro ya existe en la tabla.

Antes de meterme a modificar algo quería preguntar a ver si a alguien le sucedió o bien si estoy dando por hecho que MySQL se comporta de una forma cuando en realidad no es así.

roman 11-04-2012 02:19:15

No estaría mal un ejemplo de cómo estás llamando al procedimiento almacenado desde el disparador.

// Saludos

AzidRain 11-04-2012 02:47:24

Código SQL [-]
BEGIN
  # Estas 3 sentencias actuan sobre otras tablas diferentes a la que contiene el trigger
  INSERT INTO ACUSES SET NO_TALON=new.no_talon, SUCURSAL=new.sucursal,BODEGA=new.sucursal,NO_VIAJE=new.no_viaje,STATUS=0;
  UPDATE CLIENTES SET FECHA_PRIMERA_FACTURA=CURRENT_DATE() WHERE CLIENTES.NUMCLIENTE=new.CVE_REMITE AND CLIENTES.FECHA_PRIMERA_FACTURA IS NULL;
  UPDATE CLIENTES SET FECHA_PRIMERA_FACTURA=CURRENT_DATE() WHERE CLIENTES.NUMCLIENTE=new.CVE_DESTIN AND CLIENTES.FECHA_PRIMERA_FACTURA IS NULL;

  CALL SET_COMISIONES(new.NO_TALON,new.SUCURSAL);  # aqui llamo al trigger
END

roman 11-04-2012 03:14:05

Y, ¿las otras sentencias del disparador sí se ejecutan? Porque, de acuerdo al manual, el cuerpo del disparador debe incluir la sentencia

Código SQL [-]
for each row
begin
  ...
end;

// Saludos

AzidRain 11-04-2012 21:35:27

En efecto Roman, las otras sentencias si se ejecutan, en el código que puse no aparece el for each row porque el administrador que uso (Navicat) lo pone por default al escribir un trigger. El trigger ya funcionaba bien anteriormente, las otras sentencias ya existían pero decidí que en lugar de meter todo el código ahi en el trigger mejor hacer un SP por separado y llamarlo desde ahí.

fjcg02 12-04-2012 08:28:49

Aunque no puedo asegurarlo, me temo que el ámbito de las variables new.XXX no sobrepasa los límites del trigger. Esto quiere decir que cuando ejecutas el SP desde el trigger, los valores de new.NO_TALON y new.SUCURSAL se convertirán seguramente en nulos, con lo que el procedimiento no hará nada.
De ahí que cuando lo ejecutas desde fuera, le das unos valores que "entiende" el SP realizando la actualización correctamente.

Lo puñetero del tema es que no da ningún error. A mí me pasó con Firebird, pero seguramente con MySQL será parecido.

Mira a ver si puedes trazar los valores de los parámetros ( por ejemplo actualizando un registro localizado) para ver qué valores contienen.

Un saludo


La franja horaria es GMT +2. Ahora son las 18:33:43.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi