Simulação de Movimetação de Caixa — Procedure que consulta View e efetua Insert.
MySQL, SQL View Comments Marcelo KorjenioskiHoje estou postando uma procedure que consulta uma View e faz um insert.
A View criada é para simular a movimentação do caixa do dia atual.
A Procedure ira fazer a consulta da movimentação do caixa através da View.
Caso a movimentação seja positiva e não conste registro de fechamento do caixa no dia atual um Insert com o valor da movimentação será executado.
No script abaixo será criado 3 tabelas (tb_cliente, tb_movimentacao e tb_caixa),
1 View (viewMovimentacao) e uma procedure(sp_fecha_caixa).
Na tabela tb_cliente consta os clientes que poderão efetuar a movimentação do caixa.
Na tabela tb_movimentacao consta os movimentos realizados pelos clientes.
Na tabela tb_caixa consta os registros de caixas fechados.
A View viewMovimentacao ira retornar todos os registros de movimentação do dia atual.
A Procedure sp_fecha_caixa ira executar a View pegar o valor da movimentação de hoje e irá
inserir este valor na tabela tb_caixa.
// Verifica se tabela existe. Caso Exista ele remove.
GO
DROP TABLE IF EXISTS tb_cliente;
// Caso a tabela não exista ele cria uma tabela.
GO
CREATE TABLE IF NOT EXISTS tb_cliente (
pk_cliente int(10) AUTO_INCREMENT NOT NULL PRIMARY KEY,
nome varchar(60) not null,
cpf varchar(20) not null unique
) Engine =InnoDB;
//------------------------------------------------------------
// Insere os dados na tabela
GO
INSERT INTO tb_cliente (nome, cpf)
VALUES
('Joao', '12345678910'),
('Paulo', '12345678911'),
('Marcelo', '12345678912'),
('Gabriel', '12345678913'),
('Julio', '12345678914')
//------------------------------------------------------------
// Caso a tabela não exista ele cria uma tabela.
GO
DROP TABLE IF EXISTS tb_movimentacao;
// Caso a tabela não exista ele cria uma tabela.
GO
CREATE TABLE IF NOT EXISTS tb_movimentacao (
pk_saldo int(10) AUTO_INCREMENT NOT NULL PRIMARY KEY,
fk_cliente int(10) NOT NULL,
saldo decimal(10,2),
dt_cadastro timestamp default current_timestamp,
CONSTRAINT fk_cliente FOREIGN KEY (fk_cliente) REFERENCES tb_cliente (pk_cliente)
)
//------------------------------------------------------------
// Insere os dados na tabela tb_movimentacao para simular movimentação do caixa.
GO
INSERT INTO tb_movimentacao (fk_cliente,saldo,dt_cadastro)
VALUES
(1,42, ADDDATE( CURDATE(), INTERVAL 1 DAY)),
(1,51, ADDDATE( CURDATE(), INTERVAL 0 DAY)),
(2,23, ADDDATE( CURDATE(), INTERVAL 0 DAY)),
(3,52, ADDDATE( CURDATE(), INTERVAL 1 DAY)),
(3,68, ADDDATE( CURDATE(), INTERVAL 0 DAY)),
(3,85, ADDDATE( CURDATE(), INTERVAL 0 DAY)),
(4,82, ADDDATE( CURDATE(), INTERVAL 0 DAY)),
(5,110,ADDDATE( CURDATE(), INTERVAL 0 DAY)),
(5,109,ADDDATE( CURDATE(), INTERVAL 2 DAY)),
(5,116,ADDDATE( CURDATE(), INTERVAL 0 DAY)),
(5,129,ADDDATE( CURDATE(), INTERVAL 4 DAY))
//------------------------------------------------------------
// Caso a tabela não exista ele cria uma tabela.
GO
DROP TABLE IF EXISTS tb_caixa;
// Caso a tabela não exista ele cria uma tabela.
GO
CREATE TABLE IF NOT EXISTS tb_caixa (
pk_caixa int(10) AUTO_INCREMENT NOT NULL PRIMARY KEY,
saldo decimal(10,2),
dt_caixa timestamp default current_timestamp
)
//------------------------------------------------------------
// Caso a VIEW não exista ele cria uma tabela.
GO
DROP VIEW IF EXISTS viewMovimentacao;
// Agora é criada a VIEW que ira fazer a consulta das movimentações do dia.
GO
CREATE VIEW viewMovimentacao AS
SELECT
tb_cliente.pk_cliente AS fk_cliente,
tb_cliente.nome AS nome,
tb_cliente.cpf AS cpf,
tb_movimentacao.saldo AS saldo,
tb_movimentacao.dt_cadastro AS dt_cadastro
FROM tb_cliente
INNER JOIN tb_movimentacao ON (pk_cliente = fk_cliente)
WHERE dt_cadastro = CURDATE();
Agora vamos criar nossa Procedure para fechar o caixa do dia.
// Dropa a procedure se já existir. GO DROP PROCEDURE IF EXISTS sp_fecha_caixa; // Cria procedure. GO CREATE PROCEDURE sp_fecha_caixa() BEGIN DECLARE var_temp_saldo_dia decimal(10,2); DECLARE var_temp_registro decimal(10,2); //Pega o saldo da movimentacao de hoje. DECLARE cursorViewMovimentacao CURSOR FOR SELECT sum(saldo) as saldo_dia FROM viewMovimentacao; DECLARE cursorTabelaCaixa CURSOR FOR SELECT count(dt_caixa) as registro FROM tb_caixa WHERE dt_caixa = CURDATE(); OPEN cursorViewMovimentacao; FETCH cursorViewMovimentacao INTO var_temp_saldo_dia; CLOSE cursorViewMovimentacao; //Pega os registros do caixa de hoje. OPEN cursorTabelaCaixa; FETCH cursorTabelaCaixa INTO var_temp_registro; CLOSE cursorTabelaCaixa; // Verifica se teve movimentacao no dia e se caixa já foi fechado. IF (var_temp_saldo_dia > 0 AND var_temp_registro = 0 ) THEN INSERT INTO tb_caixa(saldo,dt_caixa) VALUES (var_temp_saldo_dia, CURDATE()); ELSEIF (var_temp_registro > 0 ) THEN SELECT 'Caixa já foi fechado' AS Msg; ELSEIF (var_temp_saldo_dia <= 0 ) THEN SELECT 'Caixa com valor negativo' AS Msg; ELSE SELECT 'Erro ao executar' AS Msg; END IF; END; GO call sp_fecha_caixa();
Agora vamos fazer um select para verificar se o valor foi inserido.
select * from tb_caixa
Caso tenha alguma duvida deixe um comentário que terei prazer em ajudar.
Comentários são bem vindos assim posso melhorar a qualidade dos tutoriais aqui apresentados.

Comentários Recentes