1
resposta

MINHA RESPOSTA


USE `sucos_vendas`;
DROP procedure IF EXISTS `sucos_vendas`.`Mais_Um_Campo1`;
;

DELIMITER $$
USE `sucos_vendas`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `Mais_Um_Campo1`(VMES INT,VANO INT)
BEGIN
DECLARE FIM_CURSOR BIT(1) DEFAULT 1;
DECLARE VQTD,VPRECO FLOAT;
DECLARE VTOTALVENDA,VFATURAMENTO FLOAT DEFAULT 0;
DECLARE C CURSOR FOR SELECT QUANTIDADE,PRECO FROM ITENS_NOTAS_FISCAIS INF
INNER JOIN NOTAS_FISCAIS NF ON INF.NUMERO=NF.NUMERO
WHERE MONTH(NF.DATA_VENDA)=VMES AND YEAR(NF.DATA_VENDA)=VANO;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET FIM_CURSOR=0;
OPEN C;
    WHILE FIM_CURSOR DO
        FETCH C INTO VQTD,VPRECO;
            IF FIM_CURSOR THEN
                SET VTOTALVENDA=(VQTD*VPRECO);
                SET VFATURAMENTO=VFATURAMENTO+VTOTALVENDA;
            END IF;
    END WHILE;
SELECT CONCAT(convert(VMES,CHAR),'/',CONVERT(VANO,CHAR)) AS MES_ANO,
CONCAT('R$ ', REPLACE(REPLACE(REPLACE(FORMAT(VFATURAMENTO, 2),'.',';'),',','.'),';',',')) AS FATURAMENTO;
CLOSE C;
END$$

DELIMITER ;
;

Usei o FIM_CURSOR como tipo BIT(1) inicializado em 1, como 1(um) é igual a True, enquanto essa variável apresentar esse valor o comando WHILE se repete e quando é alterada para 0 (zero) se torna False a partir do erro NOT FOUND. Por isso não apresentei no WHILE uma condição de igualdade já que o BIT já apresenta valor booleano (verdadeiro ou falso).

Esse CONCAT abaixo formata números em moeda (R$).

CONCAT('R$ ', REPLACE(REPLACE(REPLACE(FORMAT(valor, 2),'.',';'),',','.'),';',','))

Espero que ajude.

1 resposta

Oi, Dani! Tudo bem?

Desde já, peço desculpas por demorar a retornar.

Nossa, parabéns pelo desenvolvimento da Stored Procedure! O raciocínio que você usou para construí-la está excelente, continue sempre assim!

Além disso, obrigada por compartilhar com o fórum uma maneira de formatar o resultado do faturamento, com certeza será bastante útil aos alunos e alunas que também estão realizando o curso.

Continue se dedicando nos estudos, se surgir alguma dúvida, fico à disposição.

Abraços!