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
-- --------------------------------------------------------------------------------
-- 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