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)
-   -   Subselect illegal in this context. (https://www.clubdelphi.com/foros/showthread.php?t=57320)

eduarcol 11-06-2008 17:37:48

Subselect illegal in this context.
 
Estoy haciendo un trigger para que me actualize el costo promedio del producto al momento de actualizar un registro.

Este es el trigger
Código Delphi [-]
AS
begin
   if (New.costounitario <> Old.costounitario) then
   begin
      Insert Into Historicocostos (codigo, codigoproducto, costoanterior, costonuevo, fechacambio, UsuarioCambio) values (Coalesce((Select Max(Codigo) from HistoricoCostos where codigoproducto = new.codigo), 0) + 1, new.codigo, Old.costounitario, New.costounitario, current_date, New.UsuarioModificado);
      New.ultimocosto = Old.costounitario;
      if (New.costopromedio <> 0) then
      begin
         New.CostoPromedio = (select avg(costonuevo) from historicocostos where codigoproducto = New.codigo);
      end
      else
      begin
         New.costopromedio = New.costounitario;
      end
   end
end

pero al compilar me da este error:

Cita:

SQL error code = -206.
Subselect illegal in this context.
Lo compilo con ibExpert y Firebird 2.0

afxe 11-06-2008 18:38:38

Quizás peque de ignorante.
 
Quizás peque de ignorante, pero creo que un Select no devuelver un valor, ni se puede evaluar como un resultado. Yo lo haría así:


Código:


AS
  DECLARE VARIABLE Valor FLOAT;
begin 
  if (New.costounitario <> Old.costounitario) then  begin     
          Insert Into Historicocostos (codigo, codigoproducto, costoanterior, costonuevo, fechacambio, UsuarioCambio)
              values (Coalesce((Select Max(Codigo) from HistoricoCostos
              where codigoproducto = new.codigo), 0) + 1, new.codigo, Old.costounitario, New.costounitario, current_date, New.UsuarioModificado);     
    New.ultimocosto = Old.costounitario;     
    if (New.costopromedio <> 0) then     
      begin       
        select avg(costonuevo) from historicocostos         
            where codigoproducto = New.codigo         
            into :Valor;       
        New.CostoPromedio = Valor;     
      end     
    else     
      begin       
        New.costopromedio = New.costounitario;     
      end 
    endend

Saludos

eduarcol 11-06-2008 18:48:35

pues aparentemente asi si funciona, pero no sabia que no se podia tomar el valor desde el select.

Muchas gracias ;)

rastafarey 11-06-2008 19:36:04

resp
 
Y no seri amejor asi.
Código SQL [-]
...
select avg(costonuevo) from historicocostos where codigoproducto = new.codigo into New.CostoPromedio;
...
Bueno digo.

eduarcol 12-08-2008 18:01:34

Cita:

Empezado por rastafarey (Mensaje 292882)
Y no seri amejor asi.
Código SQL [-]
...
select avg(costonuevo) from historicocostos where codigoproducto = new.codigo into New.CostoPromedio;
...
Bueno digo.

lo acabo de probar y funciona perfectamente...


La franja horaria es GMT +2. Ahora son las 09:49:14.

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