Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

[Dúvida] Tabela vazia

Comigo está acontecendo o mesmo problema da pessoa do outro tópico, a tabela está em branco, não insere nenhum produto quando eu rodo o código.


REATE DEFINER=`root`@`localhost` PROCEDURE `p_inserir_venda`(vData DATE, max_itens INT, max_quantidade INT)
BEGIN
DECLARE vCliente VARCHAR(11);
DECLARE vProduto VARCHAR(10);
DECLARE vVendedor VARCHAR(5);
DECLARE vQuantidade INT;
DECLARE vPreco FLOAT;
DECLARE vItens INT;
DECLARE vNumeroNota INT;
DECLARE vContador INT ;
DECLARE vNumItensNotas INT;
SELECT MAX(NUMERO) + 1 INTO vNumeroNota FROM notas_fiscais;
SET vCliente = f_cliente_aleatorio();
SET vVendedor = f_vendedor_aleatorio();
INSERT INTO notas_fiscais(CPF, MATRICULA, DATA_VENDA, NUMERO, IMPOSTO)
VALUES(vCliente, vVendedor, vData, vNumeroNota, 0.18);
SET vItens = f_numero_aleatorio(1, max_itens);
WHILE vContador <= vItens
DO
    SET vProduto = f_produto_aleatorio();
    SELECT COUNT(*) INTO vItens FROM itens_notas_fiscais
    WHERE NUMERO = vNumeroNota AND CODIGO_DO_PRODUTO = vProduto;
    IF vNumItensNota = 0 THEN
        SET vQuantidade = f_numero_aleatorio(10, max_quantidade);
        SELECT PRECO_DE_LISTA INTO vPreco FROM tabela_de_produtos WHERE CODIGO_DO_PRODUTO = vProduto;
        INSERT INTO itens_notas_fiscais(NUMERO, CODIGO_DO_PRODUTO, QUANTIDADE, PRECO)
        VALUES(vNumero_nota, vProduto, vQuantidade, vPreco);
END IF;
SET vContador = vContador + 1;
END WHILE;
END



CALL p_inserir_venda('20190517', 3, 100);



SELECT A.NUMERO, COUNT(*) AS NUMERO_ITENS,SUM(B.QUANTIDADE * B.PRECO) AS FATURADO 
FROM notas_fiscais A
INNER JOIN itens_notas_fiscais B
ON A.NUMERO = B.NUMERO
WHERE A.DATA_VENDA = '20190517'
GROUP BY A.NUMERO;
4 respostas

Oi, Patrícia! Tudo bom contigo?

Desculpe a demora em te responder.

Ao observar o código que você compartilhou, percebi que a variável vContador foi declarada, mas nenhum valor default foi atribuído a ela. Isso significa que seu valor é NULL por padrão.

No entanto, a estrutura WHILE dependerá dessa variável para controlar quantos itens inserir. Se vContador for NULL, a condição WHILE vContador <= vItens nunca será verdadeira, e o loop não será executado.

Como a inserção de produtos ocorre dentro do WHILE e ele não está sendo executado, consequentemente nenhuma venda será registrada (nem apresentada na consulta).

Sabendo disso, basta utilizar, em sua stored procedure, o seguinte trecho de código ao declarar a variável vContador:

DECLARE vContador INT DEFAULT 1;

Espero que dê tudo certo, Patrícia! Caso o problema continue ou surjam outras dúvidas, estarei por aqui.

Abraços!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Oi Andrieli,

eu retirei do vContador o DEFAULT 1, pois quando faço dessa forma, surge esse erro: Error Code: 1406. Data too long for column 'vRetorno' at row 1

solução!

Oi, Patrícia!

Puxa, que situação curiosa! O erro 1406 refere-se à tentativa de inserir informações a uma coluna além do que ela de fato suporta.

Após analisar e testar os códigos que você compartilhou no presente tópico e também neste (sobre a função f_produto_aleatorio), notei alguns detalhes que passaram despercebidos, observe:

Em f_produto_aleatorio, precisamos adicionar à variável vRetorno o codigo_do_produto da TABELA_DE_PRODUTOS. Na sua função, por outro lado, estávamos trabalhando com o campo nome_do_produto. Após substituir nome_do_produto por codigo_do_produto no SELECT ... INTO, chegaremos neste resultado:

CREATE DEFINER=`root`@`localhost` FUNCTION `f_produto_aleatorio`() RETURNS varchar(10) CHARSET utf8mb4
BEGIN
DECLARE vRetorno VARCHAR(10);
DECLARE num_maximo_tabela INT;
DECLARE num_aleatorio INT;
SELECT COUNT(*) INTO num_maximo_tabela FROM tabela_de_produtos;
    SET num_aleatorio = f_numero_aleatorio(1, num_maximo_tabela);
    SET num_aleatorio = num_aleatorio - 1;
    SELECT CODIGO_DO_PRODUTO INTO vRetorno FROM tabela_de_produtos 
    LIMIT num_aleatorio, 1;
   RETURN vRetorno;
END

Além disso, ao observar a stored procedure p_inserir_venda, têm-se alguns problemas na utilização das variáveis vItens, vNumeroNota e vNumItensNotas — que não estão necessariamente relacionados aos erros que você relatou, mas que também podem interferir na execução da stored procedure.

Abaixo, temos a p_inserir_venda atualizada, com base na estrutura desenvolvida na videoaula:

CREATE DEFINER=`root`@`localhost` PROCEDURE `p_inserir_venda`(vData DATE, max_itens INT, max_quantidade INT)
BEGIN
DECLARE vCliente VARCHAR(11);
DECLARE vProduto VARCHAR(10);
DECLARE vVendedor VARCHAR(5);
DECLARE vQuantidade INT;
DECLARE vPreco FLOAT;
DECLARE vItens INT;
DECLARE vNumeroNota INT;
DECLARE vContador INT DEFAULT 1;
DECLARE vNumItensNotas INT;
SELECT MAX(NUMERO) + 1 INTO vNumeroNota FROM notas_fiscais;
SET vCliente = f_cliente_aleatorio();
SET vVendedor = f_vendedor_aleatorio();
INSERT INTO notas_fiscais(CPF, MATRICULA, DATA_VENDA, NUMERO, IMPOSTO)
VALUES(vCliente, vVendedor, vData, vNumeroNota, 0.18);
SET vItens = f_numero_aleatorio(1, max_itens);
WHILE vContador <= vItens
DO
    SET vProduto = f_produto_aleatorio();
    SELECT COUNT(*) INTO vNumItensNotas FROM itens_notas_fiscais
    WHERE NUMERO = vNumeroNota AND CODIGO_DO_PRODUTO = vProduto;
    IF vNumItensNotas = 0 THEN
        SET vQuantidade = f_numero_aleatorio(10, max_quantidade);
        SELECT PRECO_DE_LISTA INTO vPreco FROM tabela_de_produtos WHERE CODIGO_DO_PRODUTO = vProduto;
        INSERT INTO itens_notas_fiscais(NUMERO, CODIGO_DO_PRODUTO, QUANTIDADE, PRECO)
        VALUES(vNumeroNota, vProduto, vQuantidade, vPreco);
END IF;
SET vContador = vContador + 1;
END WHILE;
END

Para acompanhar as mudanças, observe comigo estes pontos:

  • Em SELECT COUNT(*) INTO vNumItensNotas FROM itens_notas_fiscais, substituímos vItens por vNumItensNotas;
  • Em IF vNumItensNotas = 0 THEN, substituímos vNumItensNota por vNumItensNotas (variável inicializada anteriormente);
  • Em VALUES(vNumeroNota, vProduto, vQuantidade, vPreco), substituímos vNumero_nota por vNumeroNota.

Patrícia, lembre-se também de utilizar o valor default na variável vContador. Depois dessas modificações, basta chamarmos a stored procedure para inserir uma nova venda.

Espero que dê tudo certo, abração!

Oi Andrieli,

Problema resolvido, agora deu tudo certo! Muito obrigada! :)