Simulação de Movimetação de Caixa — Procedure que consulta View e efetua Insert.

MySQL, SQL Comentar >> Marcelo Korjenioski

Hoje estou pos­tando uma pro­ce­dure que con­sulta uma View e faz um insert.
A View cri­ada é para simu­lar a movi­men­ta­ção do caixa do dia atual.
A Pro­ce­dure ira fazer a con­sulta da movi­men­ta­ção do caixa atra­vés da View.
Caso a movi­men­ta­ção seja posi­tiva e não conste regis­tro de fecha­mento do caixa no dia atual um Insert com o valor da movi­men­ta­ção será executado.

No script abaixo será cri­ado 3 tabe­las (tb_cliente, tb_movimentacao e tb_caixa),
1 View (view­Mo­vi­men­ta­cao) e uma procedure(sp_fecha_caixa).

Na tabela tb_cliente consta os cli­en­tes que pode­rão efe­tuar a movi­men­ta­ção do caixa.
Na tabela tb_movimentacao consta os movi­men­tos rea­li­za­dos pelos cli­en­tes.
Na tabela tb_caixa consta os regis­tros de cai­xas fecha­dos.
A View view­Mo­vi­men­ta­cao ira retor­nar todos os regis­tros de movi­men­ta­ção do dia atual.
A Pro­ce­dure sp_fecha_caixa ira exe­cu­tar a View pegar o valor da movi­men­ta­ção de hoje e irá
inse­rir 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 produtos (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 Pro­ce­dure 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 veri­fi­car se o valor foi inserido.

select * from tb_caixa

Caso tenha alguma duvida deixe um comen­tá­rio que terei pra­zer em aju­dar.
Comen­tá­rios são bem vin­dos assim posso melho­rar a qua­li­dade dos tuto­ri­ais aqui apresentados.

Com­par­ti­lhe com seus ami­gos:
  • Print
  • Facebook
  • Google Bookmarks
  • PDF
  • RSS
  • Twitter
  • LinkedIn



Deixe um comentário

Designed by NattyWP Wordpress Themes.
Images by desEXign.