logo DevMedia  
Home Entenda o site Revistas Canais Cursos Palestras Suporte Fórum +Serviços Assine Compre Créditos

Edição do Mês
  Fórum DevMedia
Fórum de Discussão
Conheça também o NOVO fórum da DevMedia, no endereço: www.devmedia.com.br/forum
O novo fórum possui diversas vantagens! Saiba mais em
www.devmedia.com.br/articles/viewcomp.asp?comp=14726
Estamos sempre trabalhando na melhora do site como um todo! Bons códigos!
Equipe DevMedia

 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos  RegistrarRegistrar   
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 
Edição do Mês

Criar essa procedure
 
Novo Tópico   Responder Mensagem    Fórum DevMedia - Índice do Fórum -> MySQL
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
Facc
Membro Senior


Registrado em: Sábado, 29 de Março de 2003
Mensagens: 1141
Localiza?: Cerquilho / SP

MensagemEnviada: Qua Set 16, 2009 11:20 am    Assunto: Criar essa procedure Responder com Citação

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




Até aí tudo bem, fiz essa procedure

C?o:
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!
_________________
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário Yahoo Messenger
Facc
Membro Senior


Registrado em: Sábado, 29 de Março de 2003
Mensagens: 1141
Localiza?: Cerquilho / SP

MensagemEnviada: Qua Set 16, 2009 12:08 pm    Assunto: Responder com Citação

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)
C?o:
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)
C?o:
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

_________________
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário Yahoo Messenger
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    Fórum DevMedia - Índice do Fórum -> MySQL Todos os horários são GMT - 3 Hours
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibído.
Responder Tópicos Proibído
Editar Mensagens: Proibído.
Excluir Mensagens: Proibído.
Votar em Enquetes: Proibído.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB