Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

bacoco

Trigger para gerar relatorio

Recommended Posts

Olá,

Preciso gerar um relatório que calcule a porcentagem de preventivas não concluídas de um funcionário e exiba no relatório

Para fazer isso criei uma tabela onde guardo nela as informações como nome do funcionário, porcentagem e o mês referente.

A questão é que não posso por exemplo gerar 2 informações para um mesmo funcionário em um mesmo mês, então fiz o seguinte trigger abaixo:

 

CREATE TRIGGER `preventiva_AUPD` AFTER UPDATE ON preventiva FOR EACH ROW
-- Edit trigger body code below this line. Do not edit lines above this one
if exists (select idFuncionario as fatoIdFun,data from fato_performance_individual where idFuncionario = NEW.idFuncionario and data = NEW.data)  then
	UPDATE `preventiva`.`fato_performance_individual` 
		INNER JOIN (SELECT preventiva.idFuncionario,nome,count(idPreventiva) * t.factor AS pct,MONTH(data) as MES,data
		FROM preventiva
		INNER JOIN funcionario on funcionario.idFuncionario = preventiva.idFuncionario
		JOIN (SELECT 100/COUNT(*) AS factor FROM preventiva where idFuncionario = NEW.idFuncionario and data= NEW.data ) AS t
		where preventiva.idFuncionario = NEW.idFuncionario and data= NEW.data and concluida = 0
		GROUP BY data,concluida) as f -- Tabela para o join
	ON `preventiva`.`fato_performance_individual`.idFuncionario = f.idFuncionario
	SET
	`porcentagem` = f.pct
	WHERE `fato_performance_individual`.idFuncionario = NEW.idFuncionario and `fato_performance_individual`.data = NEW.data;
else
	INSERT INTO `preventiva`.`fato_performance_individual`
	(`idFuncionario`,`Nome`,`porcentagem`,`mes`,`data`)

	SELECT preventiva.idFuncionario,nome,count(idPreventiva) * t.factor AS pct,MONTH(data) as MES,data
	FROM preventiva
	INNER JOIN funcionario on funcionario.idFuncionario = preventiva.idFuncionario
	JOIN (SELECT 100/COUNT(*) AS factor FROM preventiva where idFuncionario = NEW.idFuncionario and data= NEW.data ) AS t
	where preventiva.idFuncionario = NEW.idFuncionario and data= NEW.data and concluida = 0
	GROUP BY data,concluida;
end if;

 

Minha questão é, essa é de fato uma boa solução?

É performático fazer isso ? Vou ter muito impacto negativo? Se sim porque?

Se algum poder ajudar agradeço.

Att

Compartilhar este post


Link para o post
Compartilhar em outros sites

Criar uma chave única na tabela (usuario,ano,mes)

Esta insersão poderia ser feita via procedure, não ? Até um event para ficar automático.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Criar uma chave única na tabela (usuario,ano,mes)

Esta insersão poderia ser feita via procedure, não ? Até um event para ficar automático.

Olá Motta, como poderia ser feito via procedure ou pelo event?

Nesses casos eu não utilizaria recurso desnecessário ?

Com relação a chave unica, eu tenho uma PK na tabela porem usada para ID, eu consigo fazer uma chave unica para diversas colunas? como você disse uma chave unica para usuário,ano,mês ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

como poderia ser feito via procedure ou pelo event?

 

O que a sua trigger faria, a Procedure faria, a vantagem e que as operações de insert e update não ficariam lentas.

 

Com relação a chave unica, eu tenho uma PK na tabela porem usada para ID, eu consigo fazer uma chave unica para diversas colunas? como você disse uma chave unica para usuário,ano,mês ?

 

Não sei se MySql aceita unique key, creio que sim, mas pode questões de versão, engine etc.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que a sua trigger faria, a Procedure faria, a vantagem e que as operações de insert e update não ficariam lentas.

 

 

Não sei se MySql aceita unique key, creio que sim, mas pode questões de versão, engine etc.

Como eu faria para essa procedure executar para todos os usuários, para todos os meses e anos que possui registro?

Porque realmente não quero fazer o update e insert ficarem mais lerdos, visto que essa tabela é muito movimentada e alterada.

 

Vou pesquisar sobre como fazer a unique key.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A query básica da procedure e a que geraria o relatório não houvesse a base consolidada.

 

A síntaxe não sei, mas

 

 

//Cursor do select agregador
select xxx, sum(0 xxx
from  
group by xxx
//insert na agregadora
insert into ();

Para rodar de forma automática sei que existe um objeto chamado EVENT.

 

Ajudou ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

A query básica da procedure e a que geraria o relatório não houvesse a base consolidada.

 

A síntaxe não sei, mas

 

 

//Cursor do select agregador
select xxx, sum(0 xxx
from  
group by xxx
//insert na agregadora
insert into ();

Para rodar de forma automática sei que existe um objeto chamado EVENT.

 

Ajudou ?

Ajudou levantando mais duvidas, vou atras disso que você falou, obrigado Motta

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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