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 >0and tempo >=1and 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;
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.
Problemas com Trigger
em MySQL
Postado
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`
--
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:
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 :
Mas justamente não está fazendo, ele apenas coloca no consumo o valor 0.
Alguém poderia me ajudar?