Jump to content
Edilson Chaves

Criar um novo registro com CURSOR no MySql

Recommended Posts

Ola amigos, uso curso a algum tempo, só que desta vez estou apanhando de algo que aparentemente e bem simples. Tenho certeza que estou esquecendo algum detalhe.

To a 2 dias me debatendo com isto.

Por isto estou pedindo ajuda.

 

O que pretendo fazer e criar um novo registro que mostre a evoluçao do crecimento mensal projetando o ponto de equilibrio. Para isto eu preciso pegar a soma do mês anterior e acrescentar a soma do atual.

 

Esta é a Procedure. Abaixo explico o quer nao esta funcionado.

 

DROP PROCEDURE IF EXISTS sp_Monitorado;

DELIMITER $$
    CREATE PROCEDURE sp_Monitorado()
    BEGIN
        DECLARE done INT DEFAULT FALSE;
        DECLARE vVlrMesAtuPrv, vVlrMesAntPrv, vVlrMesAtuRea, vVlrMesAntRea, vPrevisto, vRealizado numeric(10,2);
        DECLARE vAnoAtu, vMesAtu, vOrdem, vAno, vMes INT;
        DECLARE vGrupo, vSubGrupo, vPessoa, vPessoaAtu VARCHAR(100);
        DECLARE cDados CURSOR FOR SELECT Ordem, Grupo, SubGrupo, Pessoa, Ano, Mes, Previsto, Realizado FROM vwresultadomonitoramento;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

        OPEN cDados;

        read_loop: LOOP

            FETCH cDados INTO vOrdem, vGrupo, vSubGrupo, vPessoa, vAno, vMes, vPrevisto, vRealizado;

            IF done THEN
               LEAVE read_loop;
            END IF;

            IF vOrdem <= 4 THEN
                SET vVlrMesAtuPrv = vVlrMesAtuPrv + vPrevisto;
                SET vVlrMesAtuRea = vVlrMesAtuRea + vRealizado;
            INSERT INTO zzResultado VALUES (vOrdem, vGrupo, vSubGrupo, vPessoa, vAno, vMes, vPrevisto, vVlrMesAtuPrv);
            END IF;

            IF vOrdem = 4 THEN
                SET vVlrMesAntPrv = vVlrMesAntPrv + vVlrMesAtuPrv;
                SET vVlrMesAntRea = vVlrMesAntRea + vVlrMesAtuRea;
                INSERT INTO zzResultado VALUES (99, vGrupo, 'PONTO DE EQUILIBRIO', vPessoa, vAno, vMes, vVlrMesAntPrv, vVlrMesAntRea);
                SET vVlrMesAtuPrv = 0;
                SET vVlrMesAtuPrv = 0;
            END IF;

        END LOOP read_loop;

        CLOSE cDados;
    END;
$$ DELIMITER;

 

Quando co cursor entra nesta condiçao abaixo ele deveria pegar o valor acumulado anterior e acrescentar as variaveis (vVlrMesAntPrv, vVlrMesAntRea). So que o valor se perde e fica tudo zerado.

Alguém pode me dizer onde estou errando.

Anexo tem um print do resultado que pretendo ter

 

 IF vOrdem = 4 THEN
                SET vVlrMesAntPrv = vVlrMesAntPrv + vVlrMesAtuPrv;
                SET vVlrMesAntRea = vVlrMesAntRea + vVlrMesAtuRea;
                INSERT INTO zzResultado VALUES (99, vGrupo, 'PONTO DE EQUILIBRIO', vPessoa, vAno, vMes, vVlrMesAntPrv, vVlrMesAntRea);
                SET vVlrMesAtuPrv = 0;
                SET vVlrMesAtuPrv = 0;

END IF;

 

PontoEquilibrio.png

Share this post


Link to post
Share on other sites

1) não exponha pessoas reais nos exemplos.

2) explique a memória de cálculo , não entendi de onde veio  o -989,35 da coluna 2.

3) pesquise pela cláusula over() pois ela permite totais acumulados (running totals)

Share this post


Link to post
Share on other sites
1 hora atrás, Motta disse:

1) não exponha pessoas reais nos exemplos.

2) explique a memória de cálculo , não entendi de onde veio  o -989,35 da coluna 2.

3) pesquise pela cláusula over() pois ela permite totais acumulados (running totals)

Motta obrigado por responder.

1) sua preocupação com expor o nome de uma cliente e valida, mas este e um nome ficticio que invetei para este exemplo.

2) nao se preocupe com estes valores que estão na frente do nome. Eles nao estão validos ainda. Será o acumulado do mes

3) Ja usei a clausula OVER no Oracle e Sql Server, nem sabia que o MySql ja tinha. No meu caso acho que ela nao se aplica.

 

Meu caso e simples. fiz um cursor que percorre uma lista ordenada por cliente, ano, mes e um ID com nome ordem.

a cada registro que ele passa, e acumulado o valor PLANEJADO em "vVlrMesAtuPrv". 

Quando ele entra condição "vOrdem = 4" deveria fazer este calculo "SET vVlrMesAntPrv = vVlrMesAntPrv + vVlrMesAtuPrv;", só que qdo entra aqui o calculo nao execulta e o valor fica ZERO.

Share this post


Link to post
Share on other sites

Não tem "ordem" faltante ou em duplicidade ?

Tua lógica supõe uma base limpa , de banho tomado e penteada ...

 

Share this post


Link to post
Share on other sites
Em 25/04/2020 at 17:27, Motta disse:

Não tem "ordem" faltante ou em duplicidade ?

Tua lógica supõe uma base limpa , de banho tomado e penteada ...

 

Se alguém tiver um problema como este, eu encontrei o problema e solução.

Por algum motivo o MySql perde o valor da Variável quando e passada por outro mais de uma condição IF ... END.

O que fiz foi criar uma variável global para todos os valores que seriam utilizados posteriormente.

 

DELIMITER $$
    CREATE PROCEDURE sp_Monitorado()
    BEGIN
        DECLARE done INT DEFAULT FALSE;
        DECLARE vPrevisto, vRealizado numeric(10,2);
        DECLARE vAnoAtu, vMesAtu, vOrdem, vAno, vMes INT;
        DECLARE vGrupo, vSubGrupo, vPessoa VARCHAR(100);
        DECLARE cDados CURSOR FOR SELECT Ordem, Grupo, SubGrupo, Pessoa, Ano, Mes, Previsto, Realizado FROM vwResultado;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    SET @PessoaAnt = (SELECT pessoa from vwResultado limit 1);
    SET @VlrMesAntPrv := 0.0;
    SET @VlrMesAntRea := 0.0;

        OPEN cDados;

        read_loop: LOOP

            FETCH cDados INTO vOrdem, vGrupo, vSubGrupo, vPessoa, vAno, vMes, vPrevisto, vRealizado;

            IF done THEN
               LEAVE read_loop;
            END IF;

      IF @PessoaAnt != vPessoa THEN
         SET @VlrMesAntPrv := 0.0;
         SET @VlrMesAntRea := 0.0;
      END IF;

      SET @VlrMesAntPrv = @VlrMesAntPrv + vPrevisto;
            SET @VlrMesAntRea = @VlrMesAntRea + vRealizado;
      SET @PessoaAnt = vPessoa;
      INSERT INTO Resultado VALUES (vOrdem, vGrupo, vSubGrupo, vPessoa, vAno, vMes, vPrevisto, vRealizado);

            IF (@PessoaAnt = vPessoa AND vOrdem = 4) THEN
                 INSERT INTO Resultado VALUES (99, vGrupo, 'PONTO DE EQUILIBRIO', vPessoa, vAno, vMes, @VlrMesAntPrv, @VlrMesAntRea);
            END IF;

        END LOOP read_loop;

        CLOSE cDados;
    END;
$$ DELIMITER;

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 lUANZIKA3
      minha pagina contém uma table que
      exibe a ultima id da minha DB porém ela não fica ativa.
      a ultima id só é exibida se o form tiver sido enviado.
      ↓table aonde é exibida a Insert_id
      <table class="table table-dark" method="POST" action="processa.php"> <thead> <tr> <th scope="col">#</th> <th scope="col">Ultimo ID</th> </tr> </thead> <tbody> <tr> <th scope="row">1</th> <td> <?php if(isset($_SESSION['id'])){ echo $_SESSION['id']; } ?></td> </tr> </tbody> </table> Agora a conexao.php
      <?php session_start(); $servidor = "localhost"; $usuario = "root"; $senha = ""; $dbname = "contas"; //Criar a conexao $conn = mysqli_connect($servidor, $usuario, $senha, $dbname); $nome = filter_input(INPUT_POST, 'nome', FILTER_SANITIZE_STRING); $face = filter_input(INPUT_POST, 'face', FILTER_SANITIZE_STRING); $numeros = filter_input(INPUT_POST, 'numeros', FILTER_SANITIZE_STRING); //echo "Nome: $nome <br>"; //echo "E-mail: $email <br>"; $result_usuario = "INSERT INTO usuarios (nome, face, numeros, created) VALUES ('$nome', '$face', '$numeros', NOW())"; if ($conn->query($result_usuario) === TRUE) { $id = $conn->insert_id; $_SESSION['id'] = "" . $id; } else { echo "Error: " . $result_usuario . "<br>" . $conn->error; } $resultado_usuario = mysqli_query($conn, $result_usuario); if(mysqli_insert_id($conn)){ $_SESSION['msg'] = "<div class='alert alert-success' role='alert'> Parabéns agora você está participando! </div>"; header("Location: index.php"); }else{ $_SESSION['msg'] = "<div class='alert alert-danger' role='alert'> OPS! Parece que você já está participando, espere por outro sorteio e volte! </div>"; header("Location: index.php"); }  
    • By lUANZIKA3
      minha pagina contém uma table que
      exibe a ultima id da minha DB porém ela não fica ativa.
      a ultima id só é exibida se o form tiver sido enviado.
      ↓table aonde é exibida a Insert_id
      <table class="table table-dark" method="POST" action="processa.php"> <thead> <tr> <th scope="col">#</th> <th scope="col">Ultimo ID</th> </tr> </thead> <tbody> <tr> <th scope="row">1</th> <td> <?php if(isset($_SESSION['id'])){ echo $_SESSION['id']; } ?></td> </tr> </tbody> </table> Agora a conexao.php
      <?php session_start(); $servidor = "localhost"; $usuario = "root"; $senha = ""; $dbname = "contas"; //Criar a conexao $conn = mysqli_connect($servidor, $usuario, $senha, $dbname); $nome = filter_input(INPUT_POST, 'nome', FILTER_SANITIZE_STRING); $face = filter_input(INPUT_POST, 'face', FILTER_SANITIZE_STRING); $numeros = filter_input(INPUT_POST, 'numeros', FILTER_SANITIZE_STRING); //echo "Nome: $nome <br>"; //echo "E-mail: $email <br>"; $result_usuario = "INSERT INTO usuarios (nome, face, numeros, created) VALUES ('$nome', '$face', '$numeros', NOW())"; if ($conn->query($result_usuario) === TRUE) { $id = $conn->insert_id; $_SESSION['id'] = "" . $id; } else { echo "Error: " . $result_usuario . "<br>" . $conn->error; } $resultado_usuario = mysqli_query($conn, $result_usuario); if(mysqli_insert_id($conn)){ $_SESSION['msg'] = "<div class='alert alert-success' role='alert'> Parabéns agora você está participando! </div>"; header("Location: index.php"); }else{ $_SESSION['msg'] = "<div class='alert alert-danger' role='alert'> OPS! Parece que você já está participando, espere por outro sorteio e volte! </div>"; header("Location: index.php"); }  
    • By lUANZIKA3
      Olá boa tarde, tenho uma form que pega os dados via POST funcionando corretamente, porém eu quero pegar somente o ultimo insert_id do banco de dados e exibir na pagina inicial só que não estou conseguindo, alguém por favor poderia me dar uma dica?
      codes↓
      ACTION="processa"
      processa.php
      <?php session_start(); include_once("conexao.php"); $nome = filter_input(INPUT_POST, 'nome', FILTER_SANITIZE_STRING); $face = filter_input(INPUT_POST, 'face', FILTER_SANITIZE_STRING); $numeros = filter_input(INPUT_POST, 'numeros', FILTER_SANITIZE_STRING); //echo "Nome: $nome <br>"; //echo "E-mail: $email <br>"; $result_usuario = "INSERT INTO usuarios (nome, face, numeros, created) VALUES ('$nome', '$face', '$numeros', NOW())"; $resultado_usuario = mysqli_query($conn, $result_usuario); if(mysqli_insert_id($conn)){ $_SESSION['msg'] = "<div class='alert alert-success' role='alert'> Parabéns agora você está participando! </div>"; header("Location: index.php"); }else{ $_SESSION['msg'] = "<div class='alert alert-danger' role='alert'> OPS! Parece que você já está participando, espere por outro sorteio e volte! </div>"; header("Location: index.php"); }  
      conexao.php
      <?php $servidor = "localhost"; $usuario = "id12363089_dados"; $senha = "37875199"; $dbname = "id12363089_dados"; //Criar a conexao $conn = mysqli_connect($servidor, $usuario, $senha, $dbname); INDEX.PHP
      <?php session_start(); ?> <?php if(isset($_SESSION['msg'])){ echo $_SESSION['msg']; unset($_SESSION['msg']); } ?> <img src="giftcard.png" class="rounded mx-auto d-block" alt="Gift Card 50 Reais"> <br> <form method="POST" action="processa.php"> <div class="input-group mb-3"> <div class="input-group-prepend"> <span class="input-group-text" id="inputGroup-sizing-default">Seu Nome</span> </div> <input type="text" name="nome" class="form-control" aria-label="Exemplo do tamanho do input" aria-describedby="inputGroup-sizing-default"> </div> <div class="input-group mb-3"> <div class="input-group-prepend"> <span class="input-group-text" id="basic-addon3">face, insta ou email para contato/</span> </div> <input type="text" name="face" class="form-control" id="basic-url" aria-describedby="basic-addon3"> </div> <div class="input-group mb-3"> <div class="input-group-prepend"> <span class="input-group-text" id="inputGroup-sizing-default">3 Pares de Numeros de 0 a 1000 EX: 10.20.30</span> </div> <input type="text" name="numeros" class="form-control" aria-label="Exemplo do tamanho do input" aria-describedby="inputGroup-sizing-default"> </div> <input type="submit" class="btn btn-success btn-lg btn-block"value="Participar do Sorteio"> <table class="table table-dark"> <thead> <tr> <th scope="col">#</th> <th scope="col">First</th> <th scope="col">Last</th> <th scope="col">ULTIMO ID</th> </tr> </thead> <tbody> <tr> <th scope="row">1</th> <td>Mark</td> <td>Otto</td> <td>AONDE EU QUERO INSERIR O ULTIMO ID</td> </tr> </tbody> </table>  
    • By lUANZIKA3
      Olá boa tarde, tenho uma form que pega os dados via POST funcionando corretamente, porém eu quero pegar somente o ultimo insert_id do banco de dados e exibir na pagina inicial só que não estou conseguindo, alguém por favor poderia me dar uma dica?
      codes↓
      ACTION="processa"
      processa.php
      <?php session_start(); include_once("conexao.php"); $nome = filter_input(INPUT_POST, 'nome', FILTER_SANITIZE_STRING); $face = filter_input(INPUT_POST, 'face', FILTER_SANITIZE_STRING); $numeros = filter_input(INPUT_POST, 'numeros', FILTER_SANITIZE_STRING); //echo "Nome: $nome <br>"; //echo "E-mail: $email <br>"; $result_usuario = "INSERT INTO usuarios (nome, face, numeros, created) VALUES ('$nome', '$face', '$numeros', NOW())"; $resultado_usuario = mysqli_query($conn, $result_usuario); if(mysqli_insert_id($conn)){ $_SESSION['msg'] = "<div class='alert alert-success' role='alert'> Parabéns agora você está participando! </div>"; header("Location: index.php"); }else{ $_SESSION['msg'] = "<div class='alert alert-danger' role='alert'> OPS! Parece que você já está participando, espere por outro sorteio e volte! </div>"; header("Location: index.php"); }  
      conexao.php
      <?php $servidor = "localhost"; $usuario = "id12363089_dados"; $senha = "37875199"; $dbname = "id12363089_dados"; //Criar a conexao $conn = mysqli_connect($servidor, $usuario, $senha, $dbname); INDEX.PHP
      <?php session_start(); ?> <?php if(isset($_SESSION['msg'])){ echo $_SESSION['msg']; unset($_SESSION['msg']); } ?> <img src="giftcard.png" class="rounded mx-auto d-block" alt="Gift Card 50 Reais"> <br> <form method="POST" action="processa.php"> <div class="input-group mb-3"> <div class="input-group-prepend"> <span class="input-group-text" id="inputGroup-sizing-default">Seu Nome</span> </div> <input type="text" name="nome" class="form-control" aria-label="Exemplo do tamanho do input" aria-describedby="inputGroup-sizing-default"> </div> <div class="input-group mb-3"> <div class="input-group-prepend"> <span class="input-group-text" id="basic-addon3">face, insta ou email para contato/</span> </div> <input type="text" name="face" class="form-control" id="basic-url" aria-describedby="basic-addon3"> </div> <div class="input-group mb-3"> <div class="input-group-prepend"> <span class="input-group-text" id="inputGroup-sizing-default">3 Pares de Numeros de 0 a 1000 EX: 10.20.30</span> </div> <input type="text" name="numeros" class="form-control" aria-label="Exemplo do tamanho do input" aria-describedby="inputGroup-sizing-default"> </div> <input type="submit" class="btn btn-success btn-lg btn-block"value="Participar do Sorteio"> <table class="table table-dark"> <thead> <tr> <th scope="col">#</th> <th scope="col">First</th> <th scope="col">Last</th> <th scope="col">ULTIMO ID</th> </tr> </thead> <tbody> <tr> <th scope="row">1</th> <td>Mark</td> <td>Otto</td> <td>AONDE EU QUERO INSERIR O ULTIMO ID</td> </tr> </tbody> </table>  
    • By RodrigoWD3
      Ola boa tarde, não sei se aqui e o tópico correto , tenho uma tabela de vendas , id , nome, id_vendedor (essa id identifica o vendedor)
      ID    |     produto      |        | id_vendedor |
      1     | computador x |          |  2 |
      2     | computador x |          |  2 |
      3     | computador x |          |  2 |
      4     | Mouse |                      |  1 |
       
      Como faço para ordenar da seguinte forma.   Quero contar quantas vezes o produto foi repetido, e ordenar pelo numero de repetições na tabela  SQL se alguém souber obrigado
       
×

Important Information

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