1
resposta

O código correto para atualizar o estoque com base nas vendas seria:

Olá!

Fiquei com uma duvida e ao perguntar para o chat GPT ele me dá essa correção sobre esse código infra da aula 06 , Capitulo 03 "Inserindo dados", gostava de saber qual resposta está correcta?

3 - Inserção condicional de dados

Imagine que temos uma tabela de Vendas, com as colunas ID_venda, ID_produto e quantidade, e uma tabela de Estoque, com as colunas ID_produto e quantidade. Queremos diminuir a quantidade em estoque dos produtos vendidos. Para isso, poderíamos usar a seguinte combinação de INSERT, SELECT e UPDATE:

INSERT INTO Estoque (ID_produto, quantidade)
SELECT Vendas.ID_produto, Estoque.quantidade - Vendas.quantidade
FROM Vendas, Estoque
WHERE Vendas.ID_produto = Estoque.ID_produto;

Correção do Código através do ChatGPT:

*O código correto para atualizar o estoque com base nas vendas seria: # *

UPDATE Estoque
SET Estoque.quantidade = Estoque.quantidade - Vendas.quantidade
FROM Vendas
WHERE Vendas.ID_produto = Estoque.ID_produto;
  • UPDATE Estoque: Dizemos que estamos atualizando a tabela Estoque.
  • SET Estoque.quantidade = Estoque.quantidade - Vendas.quantidade: Estamos atualizando a quantidade no estoque, subtraindo a quantidade vendida.
  • FROM Vendas: Trabalhamos com a tabela Vendas para obter a quantidade vendida.
  • WHERE Vendas.ID_produto = Estoque.ID_produto: Garantimos que o produto da venda corresponde ao produto no estoque
1 resposta

Oii, Ricardo!

O código da atividade realmente continha equívocos e isso porque no SQLite, não podemos atualizar registros existentes diretamente usando o INSERT INTO. INSERT INTO é destinado apenas para inserir novos registros. Para atualizar registros existentes, temos o UPDATE ou o INSERT OR REPLACE.

Antes de irmos à solução, deixa-me te dizer o objetivo da instrução, que é objetivo é diminuir a quantidade em estoque de todos os produtos que foram vendidos. Imagine que você vendeu 5 unidades do produto A e 3 unidades do produto B. O que precisamos fazer é atualizar o estoque para refletir essas vendas, diminuindo a quantidade disponível de cada produto.

SOLUÇÃO

INSERT OR REPLACE INTO Estoque (ID_produto, quantidade)
SELECT Vendas.ID_produto, Estoque.quantidade - Vendas.quantidade
FROM Vendas
JOIN Estoque ON Vendas.ID_produto = Estoque.ID_produto;

Neste código, o comando INSERT OR REPLACE INTO Estoque verifica se o ID_produto já existe na tabela Estoque, se existir, ele será substituído pelo novo valor. Se não existir, um novo registro será criado. Já o SELECT Vendas.ID_produto, Estoque.quantidade - Vendas.quantidade irá calcular a quantidade restante no estoque após a venda e insere ou substitui o registro com a nova quantidade. Por fim o JOIN faz o relacionamento entre a tabela Vendas e a tabela Estoque com base no ID_produto.

PARA TESTAR

Separei esse script para caso você queira testar o código no Sqlite Online:

-- Criação da tabela Estoque
CREATE TABLE Estoque (
    ID_produto INTEGER PRIMARY KEY, 
    quantidade INTEGER               
);

-- Criação da tabela Vendas
CREATE TABLE Vendas (
    ID_venda INTEGER PRIMARY KEY AUTOINCREMENT,  
    ID_produto INTEGER,                          
    quantidade INTEGER,                         
    FOREIGN KEY (ID_produto) REFERENCES Estoque(ID_produto)  
);

-- Inserindo produtos na tabela Estoque
INSERT INTO Estoque (ID_produto, quantidade) VALUES (1, 100);
INSERT INTO Estoque (ID_produto, quantidade) VALUES (2, 200);
INSERT INTO Estoque (ID_produto, quantidade) VALUES (3, 150);
INSERT INTO Estoque (ID_produto, quantidade) VALUES (4, 300);
INSERT INTO Estoque (ID_produto, quantidade) VALUES (5, 50);
INSERT INTO Estoque (ID_produto, quantidade) VALUES (6, 400);
INSERT INTO Estoque (ID_produto, quantidade) VALUES (7, 250);
INSERT INTO Estoque (ID_produto, quantidade) VALUES (8, 600);
INSERT INTO Estoque (ID_produto, quantidade) VALUES (9, 120);
INSERT INTO Estoque (ID_produto, quantidade) VALUES (10, 75);

-- Inserindo vendas na tabela Vendas
INSERT INTO Vendas (ID_produto, quantidade) VALUES (1, 2);
INSERT INTO Vendas (ID_produto, quantidade) VALUES (2, 5);
INSERT INTO Vendas (ID_produto, quantidade) VALUES (3, 1);
INSERT INTO Vendas (ID_produto, quantidade) VALUES (4, 10);
INSERT INTO Vendas (ID_produto, quantidade) VALUES (5, 3);
INSERT INTO Vendas (ID_produto, quantidade) VALUES (6, 8);
INSERT INTO Vendas (ID_produto, quantidade) VALUES (7, 6);
INSERT INTO Vendas (ID_produto, quantidade) VALUES (8, 12);
INSERT INTO Vendas (ID_produto, quantidade) VALUES (9, 4);
INSERT INTO Vendas (ID_produto, quantidade) VALUES (10, 7);

Para verificar os dados da tabela:

SELECT * FROM Vendas
SELECT * FROM Estoque

Agora, ao rodar o comando abaixo o valor de estoque será atualizado. Por exemplo, o ID 1 teve 2 vendas e tinha 100 itens em estoque, ao rodar esse comando, o valor em estoque será atualizado para 98:

INSERT OR REPLACE INTO Estoque (ID_produto, quantidade)
SELECT Vendas.ID_produto, Estoque.quantidade - Vendas.quantidade
FROM Vendas
JOIN Estoque ON Vendas.ID_produto = Estoque.ID_produto;

Obs: O código da atividade foi atualizado.

Espero ter ajudado e qualquer dúvida, conte conosco!

Bons estudos, Ricardo!