Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MySQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-04-2012
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
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||
Responder Con Cita
  #2  
Antiguo 11-04-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: 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
Responder Con Cita
  #3  
Antiguo 11-04-2012
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
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||
Responder Con Cita
  #4  
Antiguo 11-04-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: 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
Responder Con Cita
  #5  
Antiguo 11-04-2012
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
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||
Responder Con Cita
  #6  
Antiguo 12-04-2012
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.408
Poder: 22
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 -
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
ALTER TRIGGER dentro de un Procedimiento Vlady SQL 2 11-06-2010 20:04:50
Procedimiento almacenado ejecutado desde un trigger. Gabichu Firebird e Interbase 3 30-09-2008 19:51:11
Llamada a Procedimiento Almacenado desde dentro de un Thread MontarazAE MS SQL Server 2 29-05-2007 18:46:34
Desactivar trigger desde procedimiento almacenado oliverinf Firebird e Interbase 5 09-10-2004 17:17:45
Ejecutar Procedimiento Almacenado en Trigger AGAG4 SQL 16 21-09-2004 04:27:47


La franja horaria es GMT +2. Ahora son las 12:18:39.


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
Copyright 1996-2007 Club Delphi