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 de calculo Stock Firebird (https://www.clubdelphi.com/foros/showthread.php?t=85498)

mantraxer21 25-03-2014 21:52:53

Trigger de calculo Stock Firebird
 
Estiamdos :

Tengo el siguiente Trigger en Firebird 2.5.

Código SQL [-]
SET TERM ^ ;



CREATE OR ALTER TRIGGER STOCK_MATERIALES FOR PRESTAMOS
ACTIVE AFTER INSERT POSITION 0
AS
begin
  /* Trigger text */

  update libros set libros.cantidad_lib = -1 *(select sum(prestamos.cantidad_material1)
  from prestamos where prestamos.id_material1 = new.id_material1)
  where libros.idlibro = new.id_material1;
end
^


SET TERM ; ^

Los campos de la tabla Libros son:

Código SQL [-]
    IDLIBRO          INTEGER NOT NULL,
    IDAUTOR          INTEGER,
    ISBN_LIB         VARCHAR(25),
    TITULO_LIB       VARCHAR(50),
    IDTEMATICA       INTEGER,
    CANTIDAD_LIB     INTEGER,
    CANTIDAD_MINIMA  INTEGER,
    ANIO_LIB         VARCHAR(4),
    REGISTRO_LIB     DATE DEFAULT 'NOW',
    IDIOMA_LIB       INTEGER,
    IDUBICACION      INTEGER,
    PAGINAS          INTEGER

Campos de la tabla préstamos son:

Código SQL [-]
    IDPRESTAMO          INTEGER NOT NULL,
    ID_ALUMNO           INTEGER,
    ID_DOCENTE          INTEGER,
    FECHA_PRESTAMO      DATE,
    ID_MATERIAL1        INTEGER, // libro o material 1
    ID_MATERIAL2        INTEGER, // libro o material 2
    ID_MATERIAL3        INTEGER, // libro o material 3
    FECHA_DEVOLUCION1   DATE,
    FECHA_DEVOLUCION2   DATE,
    FECHA_DEVOLUCION3   DATE,
    CANTIDAD_MATERIAL1  INTEGER, // unidades a solicitar de material 1
    CANTIDAD_MATERIAL2  INTEGER, // unidades a solicitar de material 2
    CANTIDAD_MATERIAL3  INTEGER // unidades a solicitar de material 3

Pero por ejemplo en el campo "CANTIDAD_LIB" de la tabla libros tengo asignado un stock de prueba "200", pero al momento de hacer INSERT sobre la Tabla préstamos, me muestra "-120" registros en el campo "CANTIDAD_LIB" de la tabla Libros.

Alguien una ayuda?

Casimiro Notevi 26-03-2014 00:44:24

¿Y qué datos tienen esas tablas?, haces un sum(cantidad_material) ¿es correcto la cantidad que hay?

duilioisola 26-03-2014 14:30:39

Parece ser que siempre que insertas un registro en PRESTAMOS le restas todas las cantidades de los registros que se correspondan con ese material.
Solo deberías restarle el del registro que estás insrtando:

Código SQL [-]
CREATE OR ALTER TRIGGER STOCK_MATERIALES FOR PRESTAMOS
ACTIVE AFTER INSERT POSITION 0
AS
begin
  /*
  Esto devuelve la suma de todos los préstamos, no solo del de este registro
  select sum(cantidad_material1) from prestamos where id_material1 = new.id_material1

  update libros
  set cantidad_lib = -1 *(select sum(cantidad_material1) from prestamos where id_material1 = new.id_material1)
  where idlibro = new.id_material1;
  */

  update libros 
  set cantidad_lib = cantidad_lib - new.cantidad_material1
  where idlibro = new.id_material1;
end


La franja horaria es GMT +2. Ahora son las 05:13:59.

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