Ir al contenido


Foto

Ejecutar un Store Procedure desde un Trigger


  • Por favor identifícate para responder
11 respuestas en este tema

#1 JandoK

JandoK

    Advanced Member

  • Moderadores
  • PipPipPip
  • 838 mensajes
  • LocationMexico

Escrito 01 junio 2009 - 06:15

Hola...

Como puedo ejecutar un SP  desde un trigger  en una Base de Datos Firebird ???

este es mi SP :
se llama  AJUSTARTOTALES  y recibe un parametro de tipo  entero, (cve_pedido)



delphi
  1. BEGIN
  2. UPDATE PEDIDOS
  3. SET TOTAL = (SELECT SUM(total)
  4.               FROM pedidosdetalle
  5.               WHERE folio_detalle = :cve_pedido)
  6. WHERE cve_pedido = :cve_pedido;
  7. END



el procedimiento es para actualizar la suma de una serie de productos que se agregan a un pedido ....

ahora bien... lo quiero ejecutar desde un TRIGGER , pero ahi es donde me trabe  (  :$ :$ )

NOTA: desde DELPHI, lo ejecuto sin problemas :D :D

este es el  TRIGGER que hasta ahorita tengo 



delphi
  1. AS
  2. begin
  3.   execute procedure AJUSTARTOTALES (new.folio_detalle);  // este es el campo que tiene el valor que quiero enviar como parametro
  4. end



pero no funciona..

mi duda es... como se manda a llamar??? y como le paso el parametro del registro que acabo de alterar ... ya sea  por INSERT  o  EDIT  o  DELETE  ????

espero haberme  explicado... :D:D

salu2!!!!!!!
  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 01 junio 2009 - 06:36

Hola amigo, ¿no será así­?:



sql
  1. AS
  2. BEGIN
  3.   EXECUTE PROCEDURE AJUSTARTOTALES (NEW.PEDIDOS)// <<< Aquí­
  4. END



Saludos.
  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 01 junio 2009 - 06:37

Hola,

Además de lo comentado por enecumene, que componente estas usando para conectarte a Firebird?

Salud OS
  • 0

#4 JandoK

JandoK

    Advanced Member

  • Moderadores
  • PipPipPip
  • 838 mensajes
  • LocationMexico

Escrito 02 junio 2009 - 08:28

Hola amigo, ¿no será así­?:



sql
  1. AS
  2. BEGIN
  3.   EXECUTE PROCEDURE AJUSTARTOTALES (NEW.PEDIDOS)// <<< Aquí­
  4. END



Saludos.


pero por que  new.PEDIDOS    ??????

la tabla es la siguiente :

Nombre de la tabla :  PEDIDOSDETALLE
Campos de la tabla :  FOLIO_DETALLE  (INTEGER)
                              PRODUCTO_CVE  (INTEGER)
                              PRODUCTO_DESC  (VARCHAR)
                              CANTIDAD            (NUMERIC 10,2)
                              PRECIO              (NUMERIC 10,2)



///Edicion,  agregando mas verbo :D

Cuando se inserte un nuevo registro a la tabla, o cuando se modifique o elimine, lo que quiero hacer es enviar como parametro al  Stored Procedure el valor que del campo FOLIO_DETALLE  del registro en cuestion ...

salu2!!!!!!!
  • 0

#5 JandoK

JandoK

    Advanced Member

  • Moderadores
  • PipPipPip
  • 838 mensajes
  • LocationMexico

Escrito 02 junio 2009 - 08:31

Hola,

Además de lo comentado por enecumene, que componente estas usando para conectarte a Firebird?

Salud OS



pues  para conectar mi aplicacion con FIREBIRD, utilizo los componentes  ZEOS ....  TZConnection, TZTable  y  ZStoredProc  para  ejecutar el  procedimiento almacenado ....

salu2!!!!!!!
  • 0

#6 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 02 junio 2009 - 09:30

Porque en tu procedimiento tienes esto:



sql
  1. BEGIN
  2. UPDATE PEDIDOS
  3. SET TOTAL = (SELECT SUM(total)
  4.               FROM pedidosdetalle
  5.               WHERE folio_detalle = :cve_pedido)
  6. WHERE cve_pedido = :cve_pedido;
  7. END



Por eso el New.PEDIDOS, ahora me dices que es PEDIDOSDETALLES, pues debe ser New.PEDIDOSDETALLE :D

Saludos.
  • 0

#7 JandoK

JandoK

    Advanced Member

  • Moderadores
  • PipPipPip
  • 838 mensajes
  • LocationMexico

Escrito 02 junio 2009 - 09:54

Porque en tu procedimiento tienes esto:



sql
  1. BEGIN
  2. UPDATE PEDIDOS
  3. SET TOTAL = (SELECT SUM(total)
  4.               FROM pedidosdetalle
  5.               WHERE folio_detalle = :cve_pedido)
  6. WHERE cve_pedido = :cve_pedido;
  7. END



Por eso el New.PEDIDOS, ahora me dices que es PEDIDOSDETALLES, pues debe ser New.PEDIDOSDETALLE :D

Saludos.


entonces..  aki es donde estoy perdido ....  :s :s :s

yo habia entendido que  NEW  y  OLD    se ocupaba  para identificar el valor nuevo y anterior  de un campo ...

es por eso que yo habia puesto  new.FOLIO_DETALLE    ...  es decir,  NEW.nombre_del_campo  ....

pero como tu me estas indicando, seria      NEW.nombre_de_la_tabla    ?????


MAS EXPLICACION ... por que la verdad,  estoy  confundido  :| :| :|

Tengo  2  tablas :  PEDIDOS    y    PEDIDOSDETALLE

Tabla PEDIDOS
              FOLIO      (INTEGER)
              CLIENTE  (VARCHAR)
              FECHA    (DATE)
              TOTAL    (NUMERIC 10,2)


Tabla PEDIDOSDETALLE
              FOLIO_DETALLE    (INTEGER)
              PRODUCTO_CVE    (INTEGER)
              PRODUCTO_DESC  (VARCHAR)
              CANTIDAD            (NUMERIC 10,2)
              PRECIO                (NUMERIC 10,2)



entonces, Primero creo un registro en la tabla PEDIDOS  y se genera con un  folio  ( ejmplo :  1 )

ahora, para agregar productos en el pedido, se hace en la tabla PEDIDOSDETALLE  y cada  registro de esta tabla, se guarda con el mismo folio de la tabla pedidos  ( es decir, con el folio  1 ) 

ahora, por cada registro de la tabla PEDIDOSDETALLE, ya sea nuevo, modificacion o eliminacion, quiero ACTUALIZAR el valor del campo TOTAL de la tabla PEDIDOS, mediante el Store Procedure .

Para eso, por cada registro de PEDIDOSDETALLE  se ejecuta el TRIGGER  mandando a ejecutar el STORE PROCEDURE enviando como parametro el numero del pedido, es decir, el valor del campo FOLIO_DETALLE  del registro en cuestion ...

por eso mi duda con el  NEW.no_se_que_va_aqui    ....  pense que se ponia el NOMBRE DEL CAMPO ...  ????

salu2!!!!!!!
salu2!!!!!!!
  • 0

#8 defcon1_es

defcon1_es

    Member

  • Miembros
  • PipPip
  • 19 mensajes
  • LocationEspaña

Escrito 02 junio 2009 - 10:27

Supongo que PEDIDOSDETALLE.folio_detalle es una clave ajena (Foreign Key) a la tabla de PEDIDOS, ¿no?



sql
  1. ALTER TRIGGER TRPEDIDOSDETALLE1 FOR PEDIDOSDETALLE
  2. ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 0
  3. AS
  4. BEGIN
  5.   IF (INSERTING OR UPDATING) THEN
  6.     EXECUTE PROCEDURE AJUSTARTOTALES (NEW.folio_detalle);
  7.   ELSE
  8.     EXECUTE PROCEDURE AJUSTARTOTALES (OLD.folio_detalle);
  9. END


  • 0

#9 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 02 junio 2009 - 11:15

Pues a como lo veo... deberí­a funcionar. Y si: después del punto de NEW y/o OLD va el nombre del campo. Y como ilustra defcon1_es también está a disposición las variables INSERTING, UPDATING, DELETING.

¿Porqué no nos copias el código exacto tanto del Trigger como del SP? A lo mejor hay algo allí­ que no funciona del todo bien.

Saludos,
  • 0

#10 JandoK

JandoK

    Advanced Member

  • Moderadores
  • PipPipPip
  • 838 mensajes
  • LocationMexico

Escrito 02 junio 2009 - 11:21

Gracias  a todos por la atencion  (y) (y) (y)

ya funcionó ...  el detalle es que en el TRIGGER  estaba poiniendo mal el nombre del SP ....  :s :s :s :$

y en cuanto al detalle del  NEW.algo  y  OLD.algo    me confindí­ con lo que habia puesto enecumene  ..

pero ya vi tambien que si es el CAMPO ....  como bien lo indicas  delphius

y eso de las variables que puso defcon1_es  INSERTING, UPDATING, DELETING no me las  sabia ...  :$ :| :|  ....

y es que apenas ando  aplicando estos conceptos..  SP  y TRIGGERS .... :D:D:D:D

GRACIAS de nuevo ...

salu2!!!!!!!
  • 0

#11 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 02 junio 2009 - 11:38

Gracias  a todos por la atencion   (y) (y) (y)

ya funcionó ...  el detalle es que en el TRIGGER  estaba poiniendo mal el nombre del SP ....   :s :s :s :$


Hay Dios... en donde habrás tenido la cabeza ¿no? :p :D
Jajaja...
Yo por esos errores me pongo p*l*t*d* y más gallego que nunca... Capáz de estar una semana o más examinando el código y no "querer" ver el error.

Lo bueno es que ya funciona (y).

y eso de las variables que puso defcon1_es  INSERTING, UPDATING, DELETING no me las  sabia ...  :$ :| :|   ....

y es que apenas ando  aplicando estos conceptos..  SP  y TRIGGERS .... :D:D:D:D

GRACIAS de nuevo ...

salu2!!!!!!!

Pues yo tampoco estaba al tanto de esas variables hasta que agarré el Release Notes y me puse a leerlo :p.
No te preocupes que somos muchos quienes recién andamos viendo estos conceptos.

Aquí­ entre todos nos ayudamos. Total, el problema es chiquito y nosotros somos grandes y muchos... Lo reventamos a palos y ¡listo! :D :p

Saludos,
  • 0

#12 defcon1_es

defcon1_es

    Member

  • Miembros
  • PipPip
  • 19 mensajes
  • LocationEspaña

Escrito 02 junio 2009 - 04:36

Me alegro que ya te funcione  ;)

Siempre que sale una revisión de FireBird, me pongo a leer las notas de esa revisión...
En eso si que me "entrenó" bien mi ex-compañero y mentor Kinobi.
  • 0




IP.Board spam blocked by CleanTalk.