Ir para conteúdo

POWERED BY:

Arquivado

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

Faccruz

Criar essa procedure

Recommended Posts

Bom dia, me pediram para criar uma procedure com base a regra na imagem,

 

Imagem Postada

 

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;
END
Mas 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

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

×

Informação importante

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