Drop Inventory with SQL Triggers

1

I started doing a course on SQL and I am in doubt regarding the triggers this is the table

create table Produto (
    codProduto int primary key identity(1,1),
    Nome varchar(50),
    Quantidade int,
    Preco smallmoney
);
create table ItemVenda (
    codVenda int identity(1,1),
    foreign key (codProduto) references Produto(codProduto),
    codProduto int primary key,
    Quantidade int
);

I need to do a trigger so that after I give insert in the table sale product the quantity inserted in the product table is debited, how could I do this?

    
asked by anonymous 13.09.2017 / 12:53

1 answer

3

In most cases the ideal is not to save calculation attributes in tables, but if you want to TRIGGER it would look like this:

IF OBJECT_ID('tgr_itemvenda_ai', 'TR') IS NULL
BEGIN
  EXEC('CREATE TRIGGER tgr_itemvenda_ai ON ItemVenda FOR INSERT AS BEGIN SELECT 1 END');
END;
GO

ALTER TRIGGER tgr_itemvenda_ai
ON ItemContrato
FOR INSERT
AS
BEGIN
  SET NOCOUNT ON;

  UPDATE p
     SET p.Quantidade = p.Quantidade - i.Quantidade
    FROM Produto p
         INNER JOIN inserted i ON i.codProduto = p.codProduto;
END;
GO

The suggestion I give you to not have to use TRIGGER is to use a stock table in which you close the account on a monthly basis or according to your needs:

CREATE TABLE Estoque(
  codEstoque INT  PRIMARY KEY IDENTITY(1, 1),
  codProduto INT  NOT NULL,
  Quantidade INT  NOT NULL,
  Inicio     DATE NOT NULL,
  Fim        DATE NOT NULL,
  CONSTRAINT fk_EstoqueProduto FOREIGN KEY(codProduto) REFERENCES Produto
    ON DELETE CASCADE
    ON UPDATE CASCADE
);

Considering that you have a data column in the Venda table:

SELECT e.codProduto,
       CONVERT(VARCHAR(10), e.Inicio, 103) AS Inicio,
       CONVERT(VARCHAR(10), e.Fim, 103) AS Fim,
       e.Quantidade - SUM(iv.Quantidade) AS disponivelFim
  FROM Estoque e
       INNER JOIN ItemVenda iv ON iv.codProduto = e.codProduto
       INNER JOIN Venda v ON v.codVenda = iv.codVenda
 WHERE v.data BETWEEN e.Inicio AND e.Fim
 GROUP BY e.codEstoque,
          e.codProduto,
          e.Inicio,
          e.Fim,
          e.Quantidade
    
13.09.2017 / 13:43