Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Go Back   Foros Club Delphi > Bases de datos > MySQL
Register FAQ Members List Calendar Guía de estilo Search Today's Posts Mark Forums Read

Reply
 
Thread Tools Search this Thread Display Modes
  #1  
Old 11/04/2012
AzidRain's Avatar
[AzidRain] AzidRain is offline
Miembro Premium
 
Join Date: Sep 2005
Location: Córdoba, Veracruz, México
Posts: 2,914
Poder: 23
AzidRain Va camino a la fama
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í.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Reply With Quote
  #2  
Old 11/04/2012
roman's Avatar
roman roman is offline
Moderador
 
Join Date: May 2003
Location: Ciudad de México
Posts: 20,269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
No estaría mal un ejemplo de cómo estás llamando al procedimiento almacenado desde el disparador.

// Saludos
Reply With Quote
  #3  
Old 11/04/2012
AzidRain's Avatar
[AzidRain] AzidRain is offline
Miembro Premium
 
Join Date: Sep 2005
Location: Córdoba, Veracruz, México
Posts: 2,914
Poder: 23
AzidRain Va camino a la fama
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
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Reply With Quote
  #4  
Old 11/04/2012
roman's Avatar
roman roman is offline
Moderador
 
Join Date: May 2003
Location: Ciudad de México
Posts: 20,269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Reply With Quote
  #5  
Old 11/04/2012
AzidRain's Avatar
[AzidRain] AzidRain is offline
Miembro Premium
 
Join Date: Sep 2005
Location: Córdoba, Veracruz, México
Posts: 2,914
Poder: 23
AzidRain Va camino a la fama
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í.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Reply With Quote
  #6  
Old 12/04/2012
fjcg02's Avatar
[fjcg02] fjcg02 is offline
Miembro Premium
 
Join Date: Dec 2003
Location: Zamudio
Posts: 1,418
Poder: 24
fjcg02 Va camino a la fama
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
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Reply With Quote
Reply


Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
ALTER TRIGGER dentro de un Procedimiento Vlady SQL 2 11/06/2010 19:04
Procedimiento almacenado ejecutado desde un trigger. Gabichu Firebird e Interbase 3 30/09/2008 18:51
Llamada a Procedimiento Almacenado desde dentro de un Thread MontarazAE MS SQL Server 2 29/05/2007 17:46
Desactivar trigger desde procedimiento almacenado oliverinf Firebird e Interbase 5 09/10/2004 16:17
Ejecutar Procedimiento Almacenado en Trigger AGAG4 SQL 16 21/09/2004 03:27


All times are GMT +2. The time now is 03:28.


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