Jump to content


Photo

[RESUELTO] Trigger con select firebird 2.1


  • Please log in to reply
20 replies to this topic

#1 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2040 posts
  • LocationSanto Domingo

Posted 23 January 2011 - 08:43 PM

Hola a todos

tengo una tabla llamada ACMSUB y otra tabla llamada ACTIVAS y las dos tienen un campo CSID.

Lo que quiero hacer es que en un trigger BEFORE INSERT en la tabla ACTIVAS verifique si el valor
del campor en_prueba de la tabla ACMSUB es =1 y si es asi le de el valor 'COMPLETADA' al campo COMPLETA de la tabla ACTIVAS, caso contrario que le de el valor 'PENDIENTE'.

Actualmente tengo un trigger que le da el valor pendiente a todos los registros nuevos de la tabla activa, pero quiero modificarlo para que haga lo que indique anteriormente. Este es el que tengo ahora:



sql
  1. CREATE OR ALTER TRIGGER ACTIVAS_BI0 FOR ACTIVAS
  2. ACTIVE BEFORE INSERT POSITION 0
  3. AS
  4. BEGIN
  5. NEW.completa=('PENDIENTE');
  6. END
  7. ^
  8.  
  9.  
  10. SET TERM ; ^



Este lo hice con ibexpert.
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14448 posts
  • LocationMéxico

Posted 23 January 2011 - 10:06 PM

Algo así  ¿no?



sql
  1. CREATE OR ALTER TRIGGER ACTIVAS_BI0 FOR ACTIVAS
  2. ACTIVE BEFORE INSERT POSITION 0
  3. AS
  4. BEGIN
  5.   IF (NEW.en_prueba = 1) THEN
  6.       NEW.completa=('COMPLETADA');
  7.   ELSE NEW.completa=('PENDIENTE');
  8. END



Salud OS
  • 0

#3 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2040 posts
  • LocationSanto Domingo

Posted 23 January 2011 - 10:33 PM

Gracias egostar por responder.

En activas no se inserta ningun valor a en_prueba, ya que este campo pertenece a otra tabla(acmsub)
solo necesito saber como poner algo como:


sql
  1. SELECT en_prueba FROM acmsub INNER JOIN activas ON acmsub.csid=activas.csid


asignarle este valor de en prueba a una variable y crear el if sobre ella.


  • 0

#4 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4483 posts
  • LocationVenezuela

Posted 24 January 2011 - 08:02 AM

Desde un trigger no se puede ejecutar un Select, deberas hacerlo desde un SP
  • 0

#5 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2137 posts

Posted 24 January 2011 - 08:12 AM

Desde un trigger no se puede ejecutar un Select, deberas hacerlo desde un SP


????? si se puede amigo Eduardo.

No se si entendí, si el campo CSID es único en la tabla ACMSUB  entonces  ensaya con esto.



sql
  1. SET TERM ^ ;
  2.  
  3. CREATE OR ALTER TRIGGER activas_bi0 FOR activas
  4. ACTIVE BEFORE INSERT POSITION 0
  5. AS
  6. DECLARE variable vEn_Prueba INTEGER;
  7. BEGIN
  8. SELECT en_prueba FROM ACMSUB
  9. WHERE CSID = NEW.CSID
  10. INTO :vEn_Prueba;
  11.   IF (vEn_Prueba = 1) THEN
  12.     NEW.COMPLETA = 'COMPLETADA'
  13.     ELSE
  14.     NEW.COMPLETA = 'PENDIENTE';
  15. END
  16. ^
  17.  
  18.  
  19. SET TERM ; ^


  • 0

#6 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2092 posts
  • LocationRepública Dominicana

Posted 24 January 2011 - 08:42 AM

Saludos.

Efectivamente, como indica Wilson es la manera correcta de hacer lo que andas buscando.

Ahora bien, debes de tener en cuenta de que ese Select solo te devuelva una fila (registro) porque en caso contrario Firebird se quejara y te mandara un error de Multiple rows.....
  • 0

#7 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2040 posts
  • LocationSanto Domingo

Posted 24 January 2011 - 10:52 AM

Gracias por responder

me da el siguiente error al compilar el trigger

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 11, column 5.
ELSE.


  • 0

#8 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2092 posts
  • LocationRepública Dominicana

Posted 24 January 2011 - 11:08 AM

Saludos.

Antes del ELSE lleva punto y coma la sentencia.



sql
  1. NEW.COMPLETA = 'COMPLETADA';


  • 0

#9 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2040 posts
  • LocationSanto Domingo

Posted 24 January 2011 - 11:13 AM

Gracias Rolphy ya me habia dado cuenta.
Funciona bien, pero me crea un conflicto con otro proceso. Lo que necesito ahora es hacer un update al campo completa con el valor 'COMPLETADA' si  el campo en_prueba de acmsub es =1. Me imagino que sera en un after insert. 

Como debo escribir la sentencia para hacer el update a ese campo
  • 0

#10 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2092 posts
  • LocationRepública Dominicana

Posted 24 January 2011 - 11:19 AM

Saludos.

Creo que si te crea un conflicto con otro proceso deberías de pensar en unificar ambos procesos en un SP y dada las condiciones adecuadas para cada proceso se dispare esa parte del código.

En cuanto a como realizar el UPDATE es el mismo proceso salvo en que cambias la sentencias NEW por el UPDATE.  Debes de tener pendiente si tienes algún trigger B/A UPDATE para que no te cree más conflicto.
  • 0

#11 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2040 posts
  • LocationSanto Domingo

Posted 24 January 2011 - 11:44 AM

Me dices ponerlo asi:



sql
  1. CREATE TRIGGER activas_ai0 FOR activas
  2. active after INSERT POSITION 0
  3. AS
  4. DECLARE variable vEn_Prueba INTEGER;
  5. BEGIN
  6. SELECT en_prueba FROM ACMSUB
  7. WHERE CSID = NEW.CSID
  8. INTO :vEn_Prueba;
  9.   IF (vEn_Prueba = 1) THEN
  10.     UPDATE.COMPLETA = 'COMPLETADA';
  11.     ELSE
  12.     UPDATE.COMPLETA = 'PENDIENTE';
  13. END



Me da el siguiente error:

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 10, column 11.
.


  • 0

#12 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2092 posts
  • LocationRepública Dominicana

Posted 24 January 2011 - 11:46 AM

Saludos.

No amigo, no me exprese claramente.

Me refiero a la sintaxis del UPDATE:



sql
  1. UPDATE TABLA
  2. SET CAMPO = VALOR
  3. WHERE CAMPO = CONDICION


  • 0

#13 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2137 posts

Posted 24 January 2011 - 11:48 AM

Luciano deberías aclarar en que proceso y en que tabla te encuentras cuando quieres actualizar la tabla "Actvas".
  • 0

#14 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2040 posts
  • LocationSanto Domingo

Posted 24 January 2011 - 11:58 AM

Si lo hago asi:



sql
  1. CREATE TRIGGER activas_ai0 FOR activas
  2. active after INSERT POSITION 0
  3. AS
  4. DECLARE variable vEn_Prueba INTEGER;
  5. BEGIN
  6. SELECT en_prueba FROM ACMSUB
  7. WHERE CSID = NEW.CSID
  8. INTO :vEn_Prueba;
  9.   IF (vEn_Prueba = 1) THEN
  10.   UPDATE ACTIVAS
  11.   SET COMPLETA='COMPLETADA';
  12.  
  13. END



me da este error:

This operation is not defined for system tables.
unsuccessful metadata update.
DEFINE TRIGGER failed.
attempt to store duplicate value (visible to active transactions) in unique index "RDB$INDEX_8".


  • 0

#15 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1484 posts
  • LocationMallorca

Posted 24 January 2011 - 12:01 PM

Hola.

Este último error creo que te lo da porqué ya tienes otro Trigger con este mismo nombre.

Saludos.
  • 0

#16 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2040 posts
  • LocationSanto Domingo

Posted 24 January 2011 - 12:04 PM

Gracias Marc tienes razon, le cambie el nombre y se compilo bien
  • 0

#17 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2092 posts
  • LocationRepública Dominicana

Posted 24 January 2011 - 12:06 PM

Saludos.

Look2009, creo que debes de sentarte a revisar bien el proceso que tienes montado para que le puedas hacer esa nueva adaptación que quieres.

Esa ultima sentencia que pusiste sobre el Update, te actualizara la tabla completa sin discriminación alguna.

Como te había dicho, revisa el proceso completo para ver si es posible ponerlo dentro de un SP.

Suerte!
  • 0

#18 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2040 posts
  • LocationSanto Domingo

Posted 24 January 2011 - 01:45 PM

Tienes razon Rolphy, voy a revisar bien el asunto. Nunca he utilizado store procedure. Puedes darme una idea de por donde comienzo?

Gracias de todos modos
  • 0

#19 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2137 posts

Posted 24 January 2011 - 02:31 PM

Para no dar palos de ciego, insisto en que nos aclares en que momento y en que proceso estás cunado quieres realizar la actualización de la tabla "activas"?.

Posible respuesta:

- Insertando un registro en "Activas"?
  • 0

#20 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2137 posts

Posted 24 January 2011 - 02:43 PM

Para no dar palos de ciego, insisto en que nos aclares en que momento y en que proceso estás cunado quieres realizar la actualización de la tabla "activas"?.

Posible respuesta:

- Insertando un registro en "Activas"?


Prosigo, si es a la hora de insertar un nuevo registro en la tabla "Activas"  y dices que si lo colocas en BEFORE UPDATE te causa conflictos, entonces con esto sería suficiente:



sql
  1. SET TERM ^ ;
  2.  
  3. CREATE OR ALTER TRIGGER activas_bi0 FOR activas
  4. ACTIVE AFTER INSERT POSITION 0
  5. AS
  6. DECLARE variable vEn_Prueba INTEGER;
  7. BEGIN
  8. SELECT en_prueba FROM ACMSUB
  9. WHERE CSID = NEW.CSID
  10. INTO :vEn_Prueba;
  11.   IF (vEn_Prueba = 1) THEN
  12.     NEW.COMPLETA = 'COMPLETADA';
  13.     ELSE
  14.     NEW.COMPLETA = 'PENDIENTE';
  15. END
  16. ^
  17.  
  18.  
  19. SET TERM ; ^



Si estás procesando otra tabla, o en una situación distinta hazlo saber.
  • 0




IP.Board spam blocked by CleanTalk.