Jump to content
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.

Share this post


Link to post
Share on other 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) 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By mayconyury
      Galera, boa noite.
       
      Estou com dificuldades para realizar um insert em uma tabela no oracle. 
       
      Criei duas lists, uma buscando o código das filiais existentes em uma tabela e outro para receber as filiais de acordo com a escolha do usuário. Estou realizando um cadastro de produtos por filial, então ao terminar o cadastro o dialog pergunta se quer atualizar os dados em outra filial. Se marcada a opção SIM, abre a tela para escolher para qual filial o usuário quer copiar ( update ). Mas pode existir situações onde o produto não existe, então queria que realiza-se um insert para essas filiais ao invés do update.
       
      Alguém pode ajudar?
       
    • By brunoogm
      Pessoal estou desenvolvendo em Android Studio mas estou com o seguinte problema:
      Todos os inserts onde eu coloco alguma palavra composta ele da erro no app, porem todos os inserts com campos sem o espaço eles funcionam
       
      Ex: se eu for inserir "NOME SOBRENOME"  ele me devolve erro (com espaço)
      mas se eu inserir "NOMESOBRENOME" ele funciona normalmente (sem espaço)
       
      Ja configurei o android pra ISO 8859-1 e também pra UTF-8 mas nenhum dos dois me resolveu os problemas.
       
      Alguém tem alguma sugestão do que pode ser ?
    • By ayrtonmaia25
      Pessoal, tô com uma big dúvida e tô perdido, sem saber o que fazer. Me iniciei no PHP há uns 10/15 anos atrás e pelo menos os últimos 5, passei sem trabalhar com desenvolvimento e não me atualizei com a nova versão do PHP e agora tô enfrentando algumas dificuldades, enfim... Preciso fazer um update de várias linhas no banco de dados. Os dados vem de uma lista de forms com uma paginação e preciso que o update atualize os dados das 10 linhas que são listadas por vez. Segue o código da página, dá pra vocês terem uma noção melhor
      <?php $pagina = (isset($_GET['pagina']))? $_GET['pagina'] : 1; //seleciona todos os itens da tabela $cmd = $conn->query("select prod_id from produtos"); $produtos = $cmd->fetch(); //seta a quantidade de itens por página $registros = 10; //variavel para calcular o início da visualização com base na página atual $inicio = ($registros*$pagina)-$registros; // Variáveis para cor da linha $contacor = 0; $cor1 = ""; $cor2 = "#E0E0E0"; echo "<form class=\"form-group\" method=\"post\" action=\"?pagina=".$pagina."&act=up\">"; //seleciona os itens por página $data = $conn->query('SELECT * FROM produtos ORDER BY prod_id LIMIT '.$inicio.','.$registros.''); while($row = $data->fetch()) { $contacor++; // Se o contador for par if($contacor % 2 == 0){ $color = $cor1; } else { $color = $cor2; } ?> <div class="row mb-3" style="background:<?php echo $color; ?>;"> <div class="col-md-3 p-3 text-center"> <img src="images/produtos/<?php echo $row['prod_img']; ?>" class="img-fluid" style="max-height:200px;"> </div> <div class="col-md-9 p-3"> <p class="lead"> <b class="text-primary">ID do produto: <?php echo $row['prod_id']; ?></b> </p> <p class="lead"> <input type="text" class="form-control" id="form44" placeholder="Título para o produto" name="nome[<?php echo $row['prod_id']; ?>]" value="<?php echo $row['prod_title']; ?>"> </p> <p class="form-check text-primary"> <input type="checkbox" class="form-check-input" name="destaque" id="destaque[<?php echo $row['prod_id']; ?>]"<?php if($row['prod_high']=="yes"){echo " checked"; } ?>> <label class="form-check-label" for="exampleCheck1"><b>Produto em destaque</b></label> </p> </div> </div> <?php } ?>  
    • By dutopfave
      Galera, tenho um cadastro com ajax, até ai blz tava funcionando, so que quis fazer uma verificação se o email ja existi não, se ja existe ai seria como erro, caso ao contrario seria success e cadastrava normal, so não ta indo dps q fiz isso não sei oq é, segue codigo Ajax e PHP:
       
      Ajax:
       
      $(document).ready(function(e) { $("form[ajax=cadastro]").submit(function(e) { e.preventDefault(); var form_data = $(this).serialize(); var form_method = $(this).attr("method").toUpperCase(); $.ajax({ url: 'salvar_cadastro.php', type: form_method, data: form_data, cache: false, dataType: 'json', success: function(data){ if(data == 'true'){ window.location = 'cadastro.php?modal=ok'; }else{ window.location = 'cadastro.php?modal=error'; } }, }); }); });  
       
      PHP (salvar_cadastro.php):
       
      <?php require 'Connections/config.php'; date_default_timezone_set('America/Sao_Paulo'); // INICIO VERIFICAR SE EMAIL JÁ EXISTE $email_verificar = addslashes($_POST['email']); $Verifica_Email = $pdo->prepare("SELECT email FROM cad_administracao WHERE email = :email"); $Verifica_Email->bindValue(":email", $email_verificar); $Verifica_Email->execute(); if($Verifica_Email->rowCount() > 0){ $data = array("success" => false); echo json_encode($data); }else{ // FIM VERIFICAR SE EMAIL JA EXISTE $nome = addslashes($_POST['nome']); $sobrenome = addslashes($_POST['sobrenome']); $email = addslashes($_POST['email']); $cpf_cnpj = addslashes($_POST['cpf_cnpj']); $pessoa = addslashes($_POST['pessoa']); $sexo = addslashes($_POST['sexo']); $telefone = addslashes($_POST['telefone']); $endereco = addslashes($_POST['endereco']); $numero = addslashes($_POST['numero']); $complemento = addslashes($_POST['complemento']); $cidade = addslashes($_POST['cidade']); $bairro = addslashes($_POST['bairro']); $cep = addslashes($_POST['cep']); $estado = addslashes($_POST['estado']); $como_conheceu = addslashes($_POST['como_conheceu']); $foto = addslashes($_POST['foto']); $login = addslashes($_POST['login']); $senha = addslashes(md5($_POST['senha'])); $status = addslashes($_POST['status']); $active = addslashes($_POST['active']); $data = addslashes(date('Y-m-d H:i:s')); $Inserir = $pdo->prepare("INSERT INTO cad_administracao (nome, sobrenome, email, cpf_cnpj, pessoa, sexo, telefone, endereco, numero, complemento, cidade, bairro, cep, estado, como_conheceu, foto, login, senha, status, active, data) VALUES (:nome, :sobrenome, :email, :cpf_cnpj, :pessoa, :sexo, :telefone, :endereco, :numero, :complemento, :cidade, :bairro, :cep, :estado, :como_conheceu, :foto, :login, :senha, :status, :active, :data)"); $Inserir->bindValue(":nome", $nome); $Inserir->bindValue(":sobrenome", $sobrenome); $Inserir->bindValue(":email", $email); $Inserir->bindValue(":cpf_cnpj", $cpf_cnpj); $Inserir->bindValue(":pessoa", $pessoa); $Inserir->bindValue(":sexo", $sexo); $Inserir->bindValue(":telefone", $telefone); $Inserir->bindValue(":endereco", $endereco); $Inserir->bindValue(":numero", $numero); $Inserir->bindValue(":complemento", $complemento); $Inserir->bindValue(":cidade", $cidade); $Inserir->bindValue(":bairro", $bairro); $Inserir->bindValue(":cep", $cep); $Inserir->bindValue(":estado", $estado); $Inserir->bindValue(":como_conheceu", $como_conheceu); $Inserir->bindValue(":foto", $foto); $Inserir->bindValue(":login", $login); $Inserir->bindValue(":senha", $senha); $Inserir->bindValue(":status", $status); $Inserir->bindValue(":active", $active); $Inserir->bindValue(":data", $data); $Inserir->execute(); $data = array("success" => true); echo json_encode($data); } ?>  
    • By jardeldint
      Estou em um dilema simples (creio eu)
       
      Eu possuo 3 tabelas em questão.. a tabela Associado, tabela Pedido e a caixaEnt.
       
      Os campos do associado são: id, ref_by, nome ....
       
      Os campos do pedido são: pedido_id, pedido_cliente, pedido_data, pedido_status, pedido_total_produto.
       
      Os campos do caixaEnt são: id, id_cliente,cliente,id_doc,valor,data
       
      O que preciso fazer é o seguinte: Preciso inserir na tabela caixaEnt, todos os pedidos que tenham o status 4. Porém preciso que preencha com os dados: id_cliente (codigo do associado q está na tabela pedido.pedido_cliente)), cliente (nome do associado), id_doc(código do pedido), valor (valor do pedido), data (data do pedido).
       
      Quero fazer isso tudo automaticamente através direto do mysql, sem usar outra linguagem de programação como o JSP.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.