Ir para conteúdo

sidneypsoares

Members
  • Total de itens

    1
  • Registro em

  • Última visita

Posts postados por sidneypsoares


  1. 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?

     

     

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.