Ir para conteúdo

Edilson Chaves

Members
  • Total de itens

    3
  • Registro em

  • Última visita

Posts postados por Edilson Chaves


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


  2. 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.


  3. 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

×

Informação importante

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