Edilson Chaves
-
Total de itens
3 -
Registro em
-
Última visita
Posts postados por Edilson Chaves
-
-
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.
-
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;
Criar um novo registro com CURSOR no MySql
em MySQL
Postado
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;