Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

DÚVIDAS

![](Insira aqui a descrição dessa imagem para ajudar na acessibilidade )!
fiz passo a passo mas não tá saindo NULL no descontoAplicado e valorFinal


DELIMITER $$

CREATE TRIGGER AtualizaResumoAluguel
AFTER INSERT ON alugueis
FOR EACH ROW
BEGIN

    DECLARE desconto DECIMAL(10,2);
    DECLARE valorFinal DECIMAL(10,2);

    SET desconto = CalcularDescontoPorDIas(NEW.aluguel_id);

    SET valorFinal = CalcularValorFinalComDesconto(NEW.aluguel_id);

    INSERT INTO resumo_aluguel
    (
        aluguel_id,
        cliente_id,
        valorTotal,
        descontoAplicado,
        valorFinal
    )
    VALUES
    (
        NEW.aluguel_id,
        NEW.cliente_id,
        NEW.preco_total,
        desconto,
        valorFinal
    );

END$$

DELIMITER ;

SELECT * FROM resumo_aluguel;

INSERT INTO alugueis(aluguel_id, cliente_id, hospedagem_id, data_inicio, data_fim, preco_total)
VALUES (10002, 42, 15, '2024-01-01', '2024-01-08', 3000.00);

DROP TRIGGER IF EXISTS AtualizaResumoAluguel;

SELECT CalcularValorFinalComDesconto('10001');

SELECT CalcularDescontoPorDIas('10001');

DELIMITER $$
CREATE FUNCTION CalcularValorFinalComDesconto(AluguelID INT)
RETURNS DECIMAL(10,2) DETERMINISTIC
BEGIN
DECLARE ValorTotal DECIMAL(10,2);	
DECLARE Desconto INT;
DECLARE ValorFinal DECIMAL(10,2);
SELECT preco_total INTO ValorTotal FROM alugueis 
WHERE aluguel_id = AluguelID;

SET Desconto = CalcularDescontoPorDIas(AluguelID);

SET ValorFinal = ValorTotal - (ValorTotal * Desconto / 100);

RETURN ValorFinal;
END $$
DELIMITER ;


SELECT  CalcularValorFinalComDesconto(1);

DELIMITER $$
CREATE FUNCTION CalcularDescontoPorDIas(AluguelID INT)
RETURNS INT DETERMINISTIC
BEGIN
DECLARE desconto INT;	
SELECT 
    CASE
        WHEN DATEDIFF(data_fim, data_inicio) BETWEEN 4 AND 6 THEN 5
        WHEN DATEDIFF(data_fim, data_inicio) BETWEEN 7 AND 9 THEN 10
        WHEN DATEDIFF(data_fim, data_inicio) >= 10 THEN 15
        ELSE 0
    END INTO desconto    
FROM alugueis
WHERE cliente_id = AluguelID;
RETURN desconto;
END$$
DELIMITER ;

SELECT CalcularDescontoPorDIas(1);
1 resposta

Ei, Italo! Tudo certinho? Espero que sim.

O motivo de os campos descontoAplicado e valorFinal estarem sendo gravados como NULL está na função CalcularDescontoPorDIas(). Na função, a busca está sendo feita com a coluna cliente_id, porém o parâmetro recebido é o aluguel_id:

SELECT
    CASE
        WHEN DATEDIFF(data_fim, data_inicio) BETWEEN 4 AND 6 THEN 5
        WHEN DATEDIFF(data_fim, data_inicio) BETWEEN 7 AND 9 THEN 10
        WHEN DATEDIFF(data_fim, data_inicio) >= 10 THEN 15
        ELSE 0
    END INTO desconto
FROM alugueis
WHERE cliente_id = AluguelID;

Esse trecho procura um registro em que cliente_id = AluguelID, o que não acontece. Como nenhum registro é encontrado, a variável desconto permanece com valor NULL, e esse valor acaba sendo propagado para a função CalcularValorFinalComDesconto().

Ajuste seu código assim:

SELECT
    CASE
        WHEN DATEDIFF(data_fim, data_inicio) BETWEEN 4 AND 6 THEN 5
        WHEN DATEDIFF(data_fim, data_inicio) BETWEEN 7 AND 9 THEN 10
        WHEN DATEDIFF(data_fim, data_inicio) >= 10 THEN 15
        ELSE 0
    END INTO desconto
FROM alugueis
WHERE aluguel_id = AluguelID;

Nesse código aqui faz a consulta localizar o aluguel correto utilizando o aluguel_id recebido pela função.

Após o ajuste, execute novamente o código e observe se funciona como esperado. Qualquer dúvida ou se der certo, conte pra gente!

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!