Ir para conteúdo
Geraldo Silva

trigger para criar e atualizar saldo em uma tabela

Recommended Posts

olá pessoal.

 

sou novo no forum e também no assunto trigger para o mysql e precisei usar este recurso, mas não estou conseguindo chegar ao resultado que gostaria, por isso venho aqui pedir ajuda de vocês.

 

seguinte:

tenho uma tabela 'lancamentos' com o campos [iD;HISTORICO;TIPO;VALOR;SALDO] [Tipo = Debito (D) ou Credito ©] e tenho criar uma trigger pra ser disparada no BEFORE INSERT para calcular o saldo e inserir no campo SALDO. vejam exemplo abaixo que já encontrei em outro post aqui.

CREATE TRIGGER `SaldoAtual` BEFORE INSERT ON `lancamentos`
 FOR EACH ROW BEGIN
  DECLARE saldoAnterior DECIMAL(10,2);

  SET saldoAnterior = (SELECT L.SALDO FROM lancamentos L ORDER BY L.ID DESC LIMIT 1);
  
  IF saldoAnterior <> '' THEN

      IF (NEW.TIPO = 'C') THEN
        SET NEW.SALDO = saldoAnterior + NEW.VALOR;
      ELSE
        SET NEW.SALDO = saldoAnterior - NEW.VALOR;
      END IF;
      
      ELSE
      
      SET NEW.SALDO = NEW.VALOR;
      
  END IF;

END

esse exemplo funciona bem para o insert, mas existe outra dificuldade e não tenho conseguido resolver.

 

Preciso ter outra trigger no BEFORE UPDATE da mesma tabela que se eu alterar um valor anterior por exemplo esta trigger atualize o saldo da linha alterada e de todas as outras linhas que existirem depois dela para que o saldo fique correto.

 

espero ter me feito compreender e se alguém puder me ajudar com algum exemplo eu ficarei muito grato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, ninguém ajudou aqui, mas encontrei uma solução diferente em outro fórum e acho que conhecimento é pra ser compartilhado, então vou postar pra ajudar alguém no futuro a solução simples e que resolveu perfeitamente.Eu coloquei a query abaixo em uma view e o resultado ficou exatamente como eu queria.

SELECT DATE_FORMAT(data,'%d/%m/%Y') AS data,
    SUM(IF(tipo = 'C', valor, 0)) AS credito,
    SUM(IF(tipo = 'D', valor, 0)) AS debito,
    (SELECT SUM(IF(tipo = 'C', valor, -valor)) FROM lancamentos AS L2
         WHERE DATE_FORMAT(lancamentos.data,'%Y%m%d') >= DATE_FORMAT(L2.data,'%Y%m%d')
    ) AS saldo
FROM lancamentos
GROUP BY DAY(data), MONTH(data), YEAR(data) 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por MAKAVELIQUE
      Pessoal, imaginem a seguinte situação: o usuário A clica no botão enviar no mesmo instante que o usuário B, caso a ação do sql seja um comando update no mesmo campo, id=7 por exemplo e isso acontecer exatamente no mesmo instante, ocorre perca de dados? 
      <?php $update = "UPDATE br_gang SET i='$i', data= NOW() WHERE id='$id'"; $query = mysqli_query($update, $conn) or die (mysqli_error($conn)); if($update==true){ echo "<script>alert ('DADOS SALVOS COM SUCESSO, BOA SORTE!');</script>"; } ?> Se isso acontecer e ocorrer perca de dados, qual o procedimento possível para resolver o problema?
    • Por kaiquefigui
      sempre que uso o comando 'insert into cliente values...' diz que minha query foi atualiza e as linhas foram afetadas porem quando utilizo o comando 'desc cliente' não vejo alterações, como posso resolver esse problema?
      CREATE TABLE CLIENTE( NOME VARCHAR(30), SEXO CHAR(1), CPF CHAR(11), EMAIL VARCHAR(50), TELEFONE VARCHAR(30), ENDEREÇO VARCHAR(100) ); SHOW TABLES; DESC CLIENTE; INSERT INTO CLIENTE VALUES('KAUAN','M','23453678911','KAUAN@HOTMAIL.COM','254896534','ANTONIO HERDEIRO - SÃO PAULO - SP'); INSERT INTO CLIENTE VALUES('ADRIANA','F','24587630894','ADRIANA@HOTMAIL.COM','48652479','ANTONIO HERDEIRO - SÃO PAULO - SP'); INSERT INTO CLIENTE VALUES('KAIQUE','M','34221176809','KAIQUE@HOTMAIL.COM',NULL,'ANTONIO HERDEIRO - SÃO PAULO - SP'); INSERT INTO CLIENTE(NOME,SEXO,CPF,EMAIL,TELEFONE,ENDEREÇO) VALUES('MARCELA','F','15489652011','MARCELO@HOTMAIL.COM','245826157','ANTONIO HERDEIRO - SÃO PAULO - SP');  
    • Por eduuh1524
      Olá.
      Boa noite a todos,eu preciso de uma ajuda.
      Eu tenho um projeto em PHP e MySQL
      Tem uma database chamada easy e a uma tabela chamada usuários
      E dentro da tabela tem usuário,senha, saldo
       
      Bem.
      Eu tenho um random resultados em duas form na (resultados.php)eu queria fazer que quando a pessoa clicasse no botão Gerar usasse o saldo e gerasse o resultado.
      Exemplo,a pessoa já começa com 1000 de saldo e o botão diminui esse saldo em 100 e quando esse saldo chegasse em 0 se tentasse usar dá um erro de saldo insuficiente.
      Como posso fazer isso?
      Dei uma olhada em uns artigos aqui mas estou meio confuso,sou iniciante em PHP mas tenho uma noçãozinha .
      Boa noite a todos.
       
    • Por GabrielB3r
      Bom dia,
      estou tentando criar um sistema de empréstimo e devolução de documentos.
      Funciona da seguinte forma:
      A pessoa tem o opção de cadastrar novos documentos,os quais são inseridos da tabela "dossie_cadastrado", e ela pode cadastrar o empréstimo e a devolução do mesmo que ficam salvos na tabela "dossie_emprestimo".
      A parte de cadastro e empréstimo consegui fazer funcionar, meu problema é na hora de cadastrar a devolução. Preciso inserir a data atual no último cadastro de um determinado dossie na tabela "dossie_emprestimo".
       
      Tenho o seguinte código:
      if(isset($_POST["cod_cad"])){         $cod_cad = $_POST["cod_cad"];         }          if(isset($_GET["cod_cad"])){         $cod_cad = $_GET["cod_cad"];     } $cod_cad = strip_tags($_POST['cod_cad']); $select_upd= mysqli_query($conexao_bd,"SELECT id_emp, data_emp from dossie_emprestimo where cod_cad='$cod_cad' ORDER BY data_emp desc limit 1") ; $sql_update="UPDATE dossie_emprestimo SET data_dev=CURDATE() WHERE id_emp='$id_emp'"; mysqli_query($conexao_bd, $sql_update);  
      quando eu rodo esse código separado no phpmyadmin, funciona normalmente, mas quando coloco no meu código ele não encontra o id_emp.
      id_emp - id de empréstimo, chave primaria com auto incremento.
      data_emp - data que foi realizado o empréstimo.
      cod_cad - código de cadastro, é o código que esta relacionado a tabela de cadastro, é o id do documento. ex: toda vez que o documento "20" for emprestado esse código sera "20".
       
    • Por ment0r
      Boa tarde amigos, tudo bem? Mais uma vez venho pedir o auxilio de vocês.
       
      Bom, estou desenvolvendo um sistema intranet pra uma empresa (php + firebird) e nele haverá uma página de cadastro de pedido; nela, o usuário digita a data da compra, a data de vencimento e vai listando os produtos - bem simples.
       
      Minha dúvida é a seguinte: como eu faço pra pra inserir vários produtos na mesma página e depois cadastrar tudo de uma vez? Peguei como exemplo uma tela do sistema de um amigo (não pode ser copiado, pois foi desenvolvido em Delphi).
       

       
      O usuário escolhe um produto e insere na lista, escolhe outro e insere na lista e assim por diante. No final ele cadastra todos. Minha dúvida não é nos procedimentos de cadastros (funções de banco e etc) é em como fazer a aparecer essa lista de produtos.
       
      Será que é com Jquey, Javascript... enfim... me deêm uma luz rsrs
       
      Muito obrigado desde já.
       
×

Informação importante

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