Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Trigger varios consecutivos (https://www.clubdelphi.com/foros/showthread.php?t=65053)

seara2005 17-11-2009 20:58:49

Trigger varios consecutivos
 
Hola a todos,

Utilizo Delphi 2007, Firebird 2.1, Para diseño y pruebas en la base de Datos IBExpert.

Mi problema es el siguiente:
Tengo Una tabla de correspondencia:
Corresp con los Campos
Usuario= Varchar(3)
Consec= Integer
Descrip= Varchar(50)

La idea es que se debe llevar un consecutivo por cada usuario, por lo que el campo Consecutivo puede tener un valor repetido, pero el índice Usuario+Consecutivo si es único

He preparado el siguiente trigger

Código SQL [-]
CREATE trigger corresp_ai0 for corresp
active before insert position 0
AS
begin
  New.Consec = (Select Max(Consec)+1 from Corresp
                       Where Usuario=Old.Usuario);
end

Me da el siguiente error

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

mightydragonlor 17-11-2009 23:47:46

Pues no se si me equivoco, pero creo que te falta un Set.

defcon1_es 18-11-2009 12:35:04

Prueba así:
Código SQL [-]
CREATE trigger corresp_ai0 for corresp
active before insert position 0
AS 
begin   
  Select Max(Consec)+1 
  from Corresp 
  Where Usuario=Old.Usuario
  into New.Consec;
end

celades1 18-11-2009 13:21:59

Hola

No entiendo porque poneis old.usuario
si es trigger AI sera new
Otra cosa es preveer el primero ya que devolvera null


Código SQL [-]
CREATE trigger corresp_ai0 for corresp
active before insert position 0
AS 
begin   
  Select Max(Consec)+1   from Corresp 
  Where Usuario=new.Usuario
  into New.Consecend;
 if (new.Consecend is null) then new.Consecend=1;end

Saludos

seara2005 18-11-2009 15:46:19

Gracias a todos ha funcionado perectamente así:
Código SQL [-]
CREATE trigger corresp_ai0 for corresp
active before insert position 0
AS 
begin   
  Select Max(Consec)+1   from Corresp 
  Where Usuario=New.Usuario
  into New.Consec;
  if (New.Consec is null) then New.Consec=1;
end

Esto me ha permitido evitar la necesidad de crear un consecutivo independiente en el maestro de Usuarios y las correspondientes referencias a otra tabla.


La franja horaria es GMT +2. Ahora son las 06:38:04.

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