Procedure Calcula Saldo por Produto e Data

Exemplo de Store Procedure realizado em base de dados MySQL onde irá calcular o saldo de estoque por produto e irá retornar o saldo total daquele produto até a data inicial (parâmetro datinicial) e também o saldo total do mesmo produto até a data final (parâmetro datfinal).



-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `CalculaSaldoData`(in intcodigo_produto integer, datinicial date, datfinal date)
BEGIN
-- Criar a Store Procedure que calcula o saldo de estoque por produto e por 
-- invervalo de data, retornando o saldo anterior a data inicial e 
-- o saldo ate a data final

-- Declarando variaveis
    declare varsomaentradasini decimal(8,2); 
    declare varsomasaidasini decimal(8,2);
    declare varsomaentradasfim decimal(8,2); 
    declare varsomasaidasfim decimal(8,2);
    declare varsaldoini decimal(8,2);
    declare varsaldofim decimal(8,2);

-- Saldo anterior a data inicial - Entradas
    declare centradasini cursor for 
        select coalesce (sum(quantidade),0) as entradaini
          from movimento_estoque
         where tipo_operacao = 'entrada' 
           and codigo_produto = intcodigo_produto
           and `data` <= datinicial;
           
-- Saldo até a data final - Entradas
    declare centradasfim cursor for 
        select coalesce (sum(quantidade),0) as entradafim
          from movimento_estoque
         where tipo_operacao = 'entrada' 
           and codigo_produto = intcodigo_produto
           and `data` <= datfinal;
           
-- Saldo anterior a data inicial - Saídas
    declare csaidasini cursor for 
        select coalesce (sum(quantidade),0) as saidaini
          from movimento_estoque
         where tipo_operacao = 'saida' 
           and codigo_produto = intcodigo_produto
           and `data` <= datinicial;
           
-- Saldo até a data final - Saídas
    declare csaidasfim cursor for 
        select coalesce (sum(quantidade),0) as saidafim
          from movimento_estoque
         where tipo_operacao = 'saida' 
           and codigo_produto = intcodigo_produto
           and `data` <= datfinal;
    
    -- Abrindo cursores
    open centradasini;
    open csaidasini;
    open centradasfim;
    open csaidasfim;
    
    -- Passar resultado do select para as variaveis
    fetch centradasini into varsomaentradasini;
    fetch csaidasini into varsomasaidasini;
    fetch centradasfim into varsomaentradasfim;
    fetch csaidasfim into varsomasaidasfim;
    
    -- Setando valor de saldo
    set varsaldoini = varsomaentradasini - varsomasaidasini;
    set varsaldofim = varsomaentradasfim - varsomasaidasfim;
    
    -- Fechando cursores para evitar desperdício de memória
    close centradasini;
    close centradasfim;
    close csaidasini;
    close csaidasfim;
    
    select varsaldoini as SaldoAnteriorDataInicial
           , varsaldofim as SaldoAteDataFinal;
    
END

Nenhum comentário:

Postar um comentário