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

MySQL, SQL 1 Comment » 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 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 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.

Exemplo de como criar uma View no MySQL. (Virtual Tables)

MySQL, SQL No Comments » Marcelo Korjenioski

Neste Post irei mos­trar como criar uma View para agi­li­zar sua vida na hora de libe­rar con­sul­tar espe­ci­fi­cas sem ter medo dos usuá­rios matem o banco na hora de criar uma con­sulta já conhecida.

Alguns bene­fí­cios das Views são:
Segu­rança no acesso de dados das taba­las.
Oti­mi­za­ção das consultas.

A sin­taxe basica para criar uma VIEW:

CREATE VIEW view_name AS select_statement

Para efe­tuar a con­sulta da VIEW é seme­lhande a con­sulta de uma TABLE:

SELECT fields FROM view_name

Neste exem­plo vamos criar duas tabe­las para exe­cu­tar nossa VIEW.
Uma tabela com cli­en­tes e outra com a movi­men­ta­ção de caixa deste cli­ente.
Copie o código abaixo e exe­cute no banco de dados.

// 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
GO
INSERT INTO tb_movimentacao (fk_cliente,saldo,dt_cadastro)
VALUES
(1,42, ADDDATE( CURDATE(), INTERVAL 1 DAY)),
(1,51, ADDDATE( CURDATE(), INTERVAL 2 DAY)),
(2,23, ADDDATE( CURDATE(), INTERVAL 1 DAY)),
(3,52, ADDDATE( CURDATE(), INTERVAL 1 DAY)),
(3,68, ADDDATE( CURDATE(), INTERVAL 2 DAY)),
(3,85, ADDDATE( CURDATE(), INTERVAL 3 DAY)),
(4,82, ADDDATE( CURDATE(), INTERVAL 1 DAY)),
(5,110,ADDDATE( CURDATE(), INTERVAL 1 DAY)),
(5,109,ADDDATE( CURDATE(), INTERVAL 2 DAY)),
(5,116,ADDDATE( CURDATE(), INTERVAL 3 DAY)),
(5,129,ADDDATE( CURDATE(), INTERVAL 4 DAY))

Agora vamos criar uma VIEW para efe­tuar a con­sulta de movi­men­ta­ção do cli­ente.
Para isso vamos usar as duas tabe­las para a con­sulta da VIEW.

// Caso a VIEW não exista ele cria uma tabela.
GO
DROP VIEW IF EXISTS viewMovimentacao;
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)

Exe­cuta a View.

// Efetua consulta View
GO
SELECT fk_cliente,nome,cpf,saldo,dt_cadastro FROM viewMovimentacao

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.

Designed by NattyWP Wordpress Themes.
Images by desEXign.