Criar essa procedure

MySQL

16/09/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;
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!


Facc

Facc

Curtidas 0

Respostas

Facc

Facc

16/09/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



GOSTEI 0
José

José

16/09/2009

Este tópico esta sendo fechado por inatividade. Se necessário, sinalizar para que seja reaberto ou abrir um novo.
GOSTEI 0
POSTAR