Ir al contenido


Foto

PROBLEMA EN TRIGGER


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

#1 razadi

razadi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 681 mensajes
  • LocationMéxico D.F.

Escrito 13 agosto 2013 - 10:43

Buen día amigo, tengo un detalle al crear un trigger en firebird

quiero hacer lo siguiente: Necesito grabar en una tabla todos los empleados que estén dados de alta en la tabla OEMPLOYES con el tipo E2, y así tengo mi trigger, funciona bien sin la instrucción (IF (EMP_CLAVE IN (SELECT CVE_EMPLO FROM OEMPLOYES WHERE TIP_EMPLO='E2')) THEN BEGIN)


CREATE OR ALTER TRIGGER T_CARGAEMPLO FOR OGUARDS
ACTIVE AFTER UPDATE POSITION 0
AS
BEGIN
  IF (UPDATING AND OLD.GUA_ID IS NOT NULL) THEN BEGIN
    IF (EMP_CLAVE IN (SELECT CVE_EMPLO FROM OEMPLOYES WHERE TIP_EMPLO='E2')) THEN BEGIN
      INSERT INTO OGUARDSTMP (GUA_CLAVE,GUA_FECHA,GUA_ESTADO) VALUES (OLD.EMP_CLAVE,'NOW','A');
    END
  END
END;


bueno según yo esta bien, pero me marca el error:

/*******************************************************************************
The next statement causes the following error:

Column does not belong to referenced table.
Dynamic SQL Error.
SQL error code = -206.
Subselect illegal in this context.
*******************************************************************************/

Algo que este haciendo mal....  :(
  • 0

#2 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 13 agosto 2013 - 03:11

Hola.

El mensaje de error indica que no puedes poner un subquery dentro de la condición de un IF.

Personalmente yo lo cambiaría ligeramente para evitar usar un subquery allí.

Define una variable EXISTE de tipo integer, y sustituye tu IF por estas dos líneas :


SELECT COUNT(*) FROM OEMPLOYES WHERE TIP_EMPLO='E2' and CVE_EMPLO = EMP_CLAVE INTO :EXISTE;

IF (:EXISTE > 0) THEN BEGIN

  • 0

#3 razadi

razadi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 681 mensajes
  • LocationMéxico D.F.

Escrito 14 agosto 2013 - 07:41

Gracias por contestar amigo Marc, si lo intente como mencionas pero el resultado de la consulta trae varios registros y marcaba error de múltiples registros.

Pero buscando y buscando llegue a esta otra solución y que con gusto comparto con todos

CREATE OR ALTER TRIGGER T_CARGAEMPLO FOR OGUARDS
ACTIVE AFTER UPDATE POSITION 0
AS
BEGIN
  IF (UPDATING AND OLD.GUA_ID IS NOT NULL) THEN BEGIN
    IF (EXISTS (SELECT * FROM OEMPLOYES WHERE CVE_EMPLO=OLD.EMP_CLAVE AND TIP_EMPLO='E2')) THEN BEGIN
      INSERT INTO OGUARDSTMP (GUA_CLAVE,GUA_FECHA,GUA_ESTADO) VALUES (OLD.EMP_CLAVE,'NOW','A');
    END
  END
END;


Ya corrí este script y esta trabajando sin problemas y cumple con lo que estaba buscando.

gracias y saludos (y) (y)
  • 0




IP.Board spam blocked by CleanTalk.