Pessoal,
Sou novo em trigger, agradeceria sua ajuda.
Tenho um banco de dados de consumo de cliente. Acontece que quando vou inserir nova leitura para o cliente ele deve calcular o consumo atual.
Mas acontece que pode haver uma virada na medição, ou seja, a leitura anterior está em 9999 e agora está 1, ele deve prever isso.
Assim criei essa trigger:Gatilhos `historico`
--
DELIMITER $$
CREATE TRIGGER `consumo_atual` BEFORE INSERT ON `historico` FOR EACH ROW BEGIN
DECLARE leitura_anterior int(5);
DECLARE tempo int(5);
SET leitura_anterior = (SELECT L.tb_leitura FROM historico L WHERE L.tb_instalacao=NEW.tb_instalacao ORDER BY L.tb_data DESC LIMIT 1);
SET tempo = (SELECT DATEDIFF( CURRENT_DATE(),L.tb_data) AS valor FROM historico L WHERE L.tb_instalacao=NEW.tb_instalacao ORDER BY L.tb_data DESC LIMIT 1);
IF (leitura_anterior <> '' )
THEN
IF (NEW.tb_leitura > 0 and tempo >=1 and tempo <=30)
THEN
IF (NEW.tb_op = 1) THEN
CASE
WHEN (NEW.tb_diais= '4' AND leitura_anterior > NEW.tb_leitura AND leitura_anterior >= 9000) THEN
SET NEW.tb_consumo = ((NEW.tb_leitura - leitura_anterior) + 10000) * NEW.tb_const,
NEW.tb_cod = '137';
WHEN (NEW.tb_diais= '5' AND leitura_anterior > NEW.tb_leitura AND leitura_anterior >= 90000) THEN
SET NEW.tb_consumo = ((NEW.tb_leitura - leitura_anterior) + 100000) * NEW.tb_const,
NEW.tb_cod ='137';
WHEN (NEW.tb_diais= '6' AND leitura_anterior > NEW.tb_leitura AND leitura_anterior >=900000) THEN
SET NEW.tb_consumo = ((NEW.tb_leitura - leitura_anterior) + 1000000) * NEW.tb_const,
NEW.tb_cod ='137';
ELSE
BEGIN
SET NEW.tb_consumo = (NEW.tb_leitura - leitura_anterior) * NEW.tb_const;
END;
END CASE;
ELSE
SET NEW.tb_consumo = 0;
END IF;
ELSE
SET NEW.tb_consumo = 0;
END IF;
ELSE
SET NEW.tb_consumo =NEW.tb_leitura * NEW.tb_const;
END IF;
END
$$
DELIMITER ;
Essa é a estrutura do banco:
Estrutura para tabela `historico`
--
CREATE TABLE `historico` (
`tb_id` int(11) NOT NULL,
`tb_instalacao` varchar(10) NOT NULL,
`tb_reg` char(3) NOT NULL,
`tb_unidade` varchar(8) NOT NULL,
`tb_local` varchar(4) NOT NULL,
`tb_razao` varchar(2) NOT NULL,
`tb_data` date NOT NULL,
`tb_adm` int(11) NOT NULL,
`tb_contrato` varchar(10) NOT NULL,
`tb_leitura` int(5) NOT NULL,
`tb_cod` varchar(4) DEFAULT NULL,
`tb_mat` int(11) DEFAULT NULL,
`tb_sgl` int(5) DEFAULT NULL,
`tb_subsigla` int(5) DEFAULT NULL,
`tb_op` int(11) NOT NULL DEFAULT '0',
`tb_consumo` float DEFAULT NULL,
`tb_provavel` int(6) DEFAULT NULL,
`tb_minima` int(6) DEFAULT NULL,
`tb_faturada` int(6) DEFAULT NULL,
`tb_acerto` int(6) DEFAULT NULL,
`tb_obs` varchar(150) DEFAULT NULL,
`tb_f1` char(1) DEFAULT NULL,
`tb_f2` char(1) DEFAULT NULL,
`tb_f3` char(1) DEFAULT NULL,
`tb_ver` char(1) NOT NULL DEFAULT 'N',
`tb_seq` int(5) DEFAULT NULL,
`tb_seqdig` int(11) DEFAULT NULL,
`tb_A02` varchar(3) DEFAULT NULL,
`tb_nome` varchar(50) DEFAULT NULL,
`tb_medidor` varchar(12) NOT NULL,
`tb_diais` varchar(3) NOT NULL,
`tb_const` int(5) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
E esse é o registro:
INSERT INTO `historico` ( `tb_instalacao`, `tb_reg`, `tb_unidade`, `tb_local`, `tb_razao`, `tb_data`, `tb_adm`, `tb_contrato`, `tb_leitura`, `tb_cod`, `tb_mat`, `tb_sgl`, `tb_subsigla`, `tb_op`, `tb_consumo`, `tb_provavel`, `tb_minima`, `tb_faturada`, `tb_acerto`, `tb_obs`, `tb_f1`, `tb_f2`, `tb_f3`, `tb_ver`, `tb_seq`, `tb_seqdig`, `tb_A02`, `tb_nome`, `tb_medidor`, `tb_diais`, `tb_const`) VALUES
('3013639052', '03', '01330101', '3301', '01', '2019-05-01', 1, '4680005077', 90001, '1801', 0, 0, NULL, 1, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'N', 1, 1, NULL, 'SIDNEY PORTELA SOARES', 'APC099037055', '5', 1);
COMMIT;
INSERT INTO `historico` ( `tb_instalacao`, `tb_reg`, `tb_unidade`, `tb_local`, `tb_razao`, `tb_data`, `tb_adm`, `tb_contrato`, `tb_leitura`, `tb_cod`, `tb_mat`, `tb_sgl`, `tb_subsigla`, `tb_op`, `tb_provavel`, `tb_minima`, `tb_faturada`, `tb_acerto`, `tb_obs`, `tb_f1`, `tb_f2`, `tb_f3`, `tb_ver`, `tb_seq`, `tb_seqdig`, `tb_A02`, `tb_nome`, `tb_medidor`, `tb_diais`, `tb_const`) VALUES
('3013639052', '03', '01330101', '3301', '01', '2019-06-01', 1, '4680005077', 7, '1801', 0, 0, NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'N', 1, 1, NULL, 'SIDNEY PORTELA SOARES', 'APC099037055', '5', 1);
COMMIT;
Observe que a leitura do cliente em 2019-05-01 foi 90001 e em 2019-05-01 foi 7 e como o campo tb_diais é 5 houve uma virada na medição então o CASE deveria aceitar o calculo :
WHEN (NEW.tb_diais= '5' AND leitura_anterior > NEW.tb_leitura AND leitura_anterior >= 90000) THEN
SET NEW.tb_consumo = ((NEW.tb_leitura - leitura_anterior) + 100000) * NEW.tb_const,
NEW.tb_cod ='137';
Mas justamente não está fazendo, ele apenas coloca no consumo o valor 0.
Alguém poderia me ajudar?