Faccruz 0 Denunciar post Postado Setembro 16, 2009 Bom dia, me pediram para criar uma procedure com base a regra na imagem, Até aí tudo bem, fiz essa procedure CREATE DEFINER=`Clube`@`%` PROCEDURE `Ativa_Vendedor`(P_idFuncionario int, P_idFuncao int) BEGIN declare iQtd int; declare sStatus varchar(1); declare dtAtiva Date; declare dtInativa Date; Select dtAtivacao into dtAtiva from Funcionario where idFuncionario = P_idFuncionario; Select dtSuspenso into dtInativa from Funcionario where idFuncionario = P_idFuncionario; Select Ativo into sStatus from Funcionario where idFuncionario = P_idFuncionario; if sStatus = 'N' then case P_idFuncao when 2 then begin Select count(M.Atingiu) into iQtd from Metas M, Funcionario F where M.idFuncionario = P_idFuncionario and Atingiu = 'S' and M.MesAno between (current_date - interval 12 month) and current_date and M.idFuncionario = F.idFuncionario; if iQtd >= 8 then update Funcionario set Ativo = 'S', dtPrimAtiva = current_date, dtAtivacao = current_date where idFuncionario = P_idFuncionario; end if; end; else begin Select count(M.Atingiu) into iQtd from Metas M, Funcionario F where M.idFuncionario = P_idFuncionario and Atingiu = 'S' and M.MesAno between (current_date - interval 6 month) and current_date and M.idFuncionario = F.idFuncionario; if iQtd >= 4 then update Funcionario set Ativo = 'S', dtPrimAtiva = current_date, dtAtivacao = current_date where idFuncionario = P_idFuncionario; end if; end; end case; else begin Select count(M.Atingiu) into iQtd from Metas M, Funcionario F where M.idFuncionario = P_idFuncionario and Atingiu = 'S' and M.MesAno between DATE_SUB(current_date, interval 3 month) and current_date and M.idFuncionario = F.idFuncionario; if iQtd >= 2 then update Funcionario set DtAtivacao = current_date, DtSuspenso = null where idFuncionario = P_idFuncionario; else update Funcionario set DtAtivacao = null, DtSuspenso = current_date where idFuncionario = P_idFuncionario; end if; end; end if; ENDMas agora me falaram que como é uma simulação, os usuários podem alterar no momento que quiserem, então como posso fazer para, caso o usuário desmarcar mais de 8 metas nos meses (vendedores), desativar o cadastro? Consigo fazer a simulação dos 3 meses anteriores ao ultimo inserido, mas como fazer dos 12 meses anteriores? Para chamar a stored procedure, criei uma Trigger After Insert e After Update. Desde já agradeço qualquer ajuda! Compartilhar este post Link para o post Compartilhar em outros sites
Faccruz 0 Denunciar post Postado Setembro 16, 2009 Separei a procedure acima em 2 novas procedures... mas ainda continuo para saber qndo executar uma ou a outra, dependendo da seleção do usuário As procedures Essa Verifica se possui 8 Metas atingidas nos ultimos 12 meses (Vendedores) ou 4 em 6 meses (Demais usuários) CREATE DEFINER=`Clube`@`%` PROCEDURE `prcAtiva_Vendedor`(pidFuncionario int, pidFuncao int, pData date) BEGIN Declare iQtd int; case pidFuncao when 2 then begin Select count(M.Atingiu) into iQtd from Metas M left join Funcionario F on (F.idFuncionario = M.idFuncionario) where M.Atingiu = 'S' and M.idFuncionario = pidFuncionario and M.MesAno >= Date_Sub(pData, interval 12 month) and M.MesAno <= pData; if iQtd >= 8 then update Funcionario set Ativo = 'S', dtPrimAtiva = Current_date, dtAtivacao = Current_Date, dtSuspenso = Null where idFuncionario = pidFuncionario; else update Funcionario set Ativo = 'N', dtPrimAtiva = Null, dtAtivacao = Null, dtSuspenso = Current_Date where idFuncionario = pidFuncionario; end if; end; else begin Select count(M.Atingiu) into iQtd from Metas M left join Funcionario F on (F.idFuncionario = M.idFuncionario) where M.Atingiu = 'S' and M.idFuncionario = pidFuncionario and M.MesAno between Date_Sub(pData, interval 6 month) and pData; if iQtd >= 4 then update Funcionario set Ativo = 'S', dtPrimAtiva = Current_date, dtAtivacao = Current_Date, dtSuspenso = Null where idFuncionario = pidFuncionario; else update Funcionario set Ativo = 'N', dtPrimAtiva = Null, dtAtivacao = Null, dtSuspenso = Current_Date where idFuncionario = pidFuncionario; end if; end; end case; END E essa Ativa/desativa o cadastro, caso não cumpra 2 nos ultimos 3 meses (todos usuários) CREATE DEFINER=`Clube`@`%` PROCEDURE `prcAtiva_Suspende`(pidFuncionario int, pData date) BEGIN Declare iQtd int; Select count(M.Atingiu) into iQtd from Metas M left join Funcionario F on (F.idFuncionario = M.idFuncionario) where M.Atingiu = 'S' and M.MesAno >= Date_Sub(pData, interval 3 month) and M.MesAno <= pData and M.idFuncionario = pidFuncionario; if iQtd >= 2 then update Funcionario set DtAtivacao = Current_Date, DtSuspenso = null where idFuncionario = pidFuncionario; else update Funcionario set DtAtivacao = Null, DtSuspenso = Current_date where idFuncionario = pidFuncionario; end if; END Compartilhar este post Link para o post Compartilhar em outros sites