[MYSQL]Trigger para gerar relatorio

6 respostas
B

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

6 Respostas

M

Se eu entendi bem o que voce quer fazer eu criaria uma chave primaria para evitar duplicidade de registros e avaliaria a possibilidade de transferir a regra de negocio para aplicação .

B

misterzire:
Se eu entendi bem o que voce quer fazer eu criaria uma chave primaria para evitar duplicidade de registros e avaliaria a possibilidade de transferir a regra de negocio para aplicação .


É possível criar uma chave primaria para evitar duplicidade de diversos campos?
Porque o que não posso deixar duplar é registro para uma mesma data em um mesmo funcionário.
Apenas sei evitar registros duplicados em um campo e se eu restringir em um campo não conseguirei as informações que preciso.

Pensei em ter a regra de negocio na aplicação, mas não vi uma maneira de faze-la.

M

bacoco:
misterzire:
Se eu entendi bem o que voce quer fazer eu criaria uma chave primaria para evitar duplicidade de registros e avaliaria a possibilidade de transferir a regra de negocio para aplicação .


É possível criar uma chave primaria para evitar duplicidade de diversos campos?
Porque o que não posso deixar duplar é registro para uma mesma data em um mesmo funcionário.
Apenas sei evitar registros duplicados em um campo e se eu restringir em um campo não conseguirei as informações que preciso.

Pensei em ter a regra de negocio na aplicação, mas não vi uma maneira de faze-la.

Sim , você pode criar uma chave primaria com os campos data e funcionário.

B

misterzire:
bacoco:
misterzire:
Se eu entendi bem o que voce quer fazer eu criaria uma chave primaria para evitar duplicidade de registros e avaliaria a possibilidade de transferir a regra de negocio para aplicação .


É possível criar uma chave primaria para evitar duplicidade de diversos campos?
Porque o que não posso deixar duplar é registro para uma mesma data em um mesmo funcionário.
Apenas sei evitar registros duplicados em um campo e se eu restringir em um campo não conseguirei as informações que preciso.

Pensei em ter a regra de negocio na aplicação, mas não vi uma maneira de faze-la.

Sim , você pode criar uma chave primaria com os campos data e funcionário.


Como eu poderia fazer isso no MYSQL? Apenas declarar a PK composta para as colunas que desejo não faria isso,faria?

M
CREATE TABLE `teste` (

  `codigo` int(7) NOT NULL default '0',

  `sequencia` int(6) NOT NULL default '0',

  `descricao` varchar(50) NOT NULL default '',

  PRIMARY KEY  (`codigo`,`sequencia`)

)
B
misterzire:
CREATE TABLE `teste` (

  `codigo` int(7) NOT NULL default '0',

  `sequencia` int(6) NOT NULL default '0',

  `descricao` varchar(50) NOT NULL default '',

  PRIMARY KEY  (`codigo`,`sequencia`)

)
Achei que fazendo a PK composta não seria exatamente a solução, obrigado misterzire
Criado 10 de julho de 2013
Ultima resposta 11 de jul. de 2013
Respostas 6
Participantes 2