Ir para conteúdo

POWERED BY:

Arquivado

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

Faccruz

Como montar isso?

Recommended Posts

Boa tarde,

 

Estou com duvida de como montar essa SQL ou procedure. Me passaram o seguinte enunciado:

 

1 - Ter atingido pelo menos 8 vezes a meta de vendas nos últimos 12 meses. Entra em Ativo (Gravo a data de ativação)

2 - Ter atingido 2 metas totais de vendas nos últimos 3 meses após a ativação. Após de ativo esse enunciado entra em ação, contado qntos meses ele atingiu, se atingiu de 2 a 3, continua ativo, caso contrario entra para suspenso (tbm gravo a data que foi suspenso, para no próximo mês ele ter a chance novamente)

 

O vendedor cadastra o mês/ano da venda e se atingiu ou não a meta estipulada (campo Char(1) "S" ou "N")

 

Preciso trazer para a tela se ele continua ativo ou suspenso de acordo com esse enunciado.

 

Espero ter sido claro.

 

Não sei se ajuda, mas estou usando o MySQL Server 5.1 com VB2008 (Conector MySQL.NET 6.0.4)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use WHERE ou IF:

 

SELECT campo FROM tabela WHERE meta='S'

Ou... (eu acho)

 

if ($meta=="S"){
   echo "Meta atingida.";
} else {
   echo "Meta não atingidade.";
}

 

Espero poder ajudar. Té mais!

Compartilhar este post


Link para o post
Compartilhar em outros sites

... meta estipulada (campo Char(1) "S" ou "N") ...

 

ao invés disso...crie o campo como ENUM..

 

ai ficaria

 

ENUM('N', 'S')

isso pode (vaii) agilizar as consultas filtradas por esse campo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas isso no BD MySQL?

 

O que eu fiz foi mais ou menos isso:

 

update funcionario set dtativacao = <Data Atual>
where (SELECT count(*) from metas
        where atingiu = 'S'
          and idfuncionario = <cod. vendedor>
          and mesano between <dtativacao - 3 meses> and <dtativacao>) >= 2
  and idfuncionario = <cod. vendedor>

Mas como alterar o campo dtsuspensao, imaginando que esse vendedor não atingiu a 2 das 3 metas nos 3 meses anteriores?

 

Gostaria de algo "automatico", tipo uma triger após inclusão da última meta.

 

 

 

... meta estipulada (campo Char(1) "S" ou "N") ...

 

ao invés disso...crie o campo como ENUM..

 

ai ficaria

 

ENUM('N', 'S')

isso pode (vaii) agilizar as consultas filtradas por esse campo.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá vou deixar mais uma opinião

 

Eu faria isso por meio de uma trigger disparada no AFTER INSERT, ou seja, assim que o vendedor cadastrasse o mes e se atingiu a meta...

 

Bom... vou te dar os passos e você pesquisa o manual ok? vi que sua select ta boa e acho que você chega lá...

 

a trigger deve...

 

Consultar qtd de meses que o vendedor (new.vendedorcodigo) atingiu a meta, use uma SELECT INTO que vai atribuir o valor a uma variavel inteira

Teste essa variavel e veja se eh >= 8 (no caso a sua meta) (sua clausula where para a conta parece que esta ok na sua select)

Se for maior igual que 8 faca update da tabela de vendedores salvando ele como "ativo" e jogue current_date no campo data_de_ativacao

Coloque um else para desativar ele, caso ele nao tenha atingido a meta no período, entao faca a update para desativar (se necessario).

 

Não escrevi codigo mas acho que a idéia tá aí, espero ter ajudado, consulte o manual do mysql na parte de triggers q vai ser baba.

 

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá vou deixar mais uma opinião

 

Eu faria isso por meio de uma trigger disparada no AFTER INSERT, ou seja, assim que o vendedor cadastrasse o mes e se atingiu a meta...

 

Bom... vou te dar os passos e você pesquisa o manual ok? vi que sua select ta boa e acho que você chega lá...

 

a trigger deve...

 

Consultar qtd de meses que o vendedor (new.vendedorcodigo) atingiu a meta, use uma SELECT INTO que vai atribuir o valor a uma variavel inteira

Teste essa variavel e veja se eh >= 8 (no caso a sua meta) (sua clausula where para a conta parece que esta ok na sua select)

Se for maior igual que 8 faca update da tabela de vendedores salvando ele como "ativo" e jogue current_date no campo data_de_ativacao

Coloque um else para desativar ele, caso ele nao tenha atingido a meta no período, entao faca a update para desativar (se necessario).

 

Não escrevi codigo mas acho que a idéia tá aí, espero ter ajudado, consulte o manual do mysql na parte de triggers q vai ser baba.

 

Abraço

 

seria basicamente isso? É que sou meio novato em MySQL ainda.

 

CREATE TRIGGER ATIVA_VENDEDOR AFTER INSERT ON METAS
FOR EACH ROW
BEGIN
  SET @IQTD = (SELECT count(*) from metas
                where atingiu = 'S'
                  and idfuncionario = NEW.IDFUNCIONARIO
                  and mesano between (CURRENT_DATE - INTERVAL 12 MONTH)
                                 and CURRENT_DATE);
  IF @IQTD >= 8 THEN
    UPDATE FUNCIONARIO SET DTATIVACAO = CURRENT_DATE, DTSUSPENSO = NULL
      WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;
  ELSE
    UPDATE FUNCIONARIO SET DTATIVACAO = NULL, DTSUSPENSO = CURRENT_DATE
      WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;
  END IF;
END

 

Agora me pasaram outra coisa... isso que eu falei acima serve para Vendedor, mas querem também para Assistentes, Gerentes e Supervisores, e esses tem dados diferente dos Vendedores (para ativar seriam 6 e não 12 meses)

tem como passar parametros para a Trigger?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ai cara, mandou bem... prefiro dar os caminhos e deixar que as pessoas façam o trem andar, do que dar a resposta pronta!

Voce consegue passar paramentros para uma procedure, chamando ela pelo comando CALL(nomeprocedure(parametros)), mas trigger só são ativadas qdo algo acontece na tabela.

 

As metas Assistentes, Gerentes e Supervisores são baseadas nas de Metas certo?

 

Todo vendedor tem seu Assistentes, Gerentes e Supervisores certo? Tem algo que referencia isso na tabela de Metas?

 

Se sim, faca como fez para verificar a meta do vendedor, consulte as metas dos Assistentes, Gerentes e Supervisores baseados no new.codigoassis, new.codigogerente e new.codigosupervisores e jah faca as updates nas tabelas respectivas

 

Abraço e parabéns

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gostei desse seu modo de ajudar. Nos faz usar a cabeça.

 

Então, na tabela Funcionario existe um campo que "diz" se é Vendedor (2), Assistente (4), Gerente (5) ou Supervisor (6).

Tem como usar um CASE na Trigger? Se sim, poderia me informar se a sintaxe abaixo é correta? Pois assim no momento que ele for inserir a meta, verifico o tipo da função e realizo o Update de acordo.

 

Case idFuncao
    2: <Comandos>
    4: <Comandos>
    5: <Comandos>
    6: <Comandos>
  end Case;

 

Ai cara, mandou bem... prefiro dar os caminhos e deixar que as pessoas façam o trem andar, do que dar a resposta pronta!

Voce consegue passar paramentros para uma procedure, chamando ela pelo comando CALL(nomeprocedure(parametros)), mas trigger só são ativadas qdo algo acontece na tabela.

 

As metas Assistentes, Gerentes e Supervisores são baseadas nas de Metas certo?

 

Todo vendedor tem seu Assistentes, Gerentes e Supervisores certo? Tem algo que referencia isso na tabela de Metas?

 

Se sim, faca como fez para verificar a meta do vendedor, consulte as metas dos Assistentes, Gerentes e Supervisores baseados no new.codigoassis, new.codigogerente e new.codigosupervisores e jah faca as updates nas tabelas respectivas

 

Abraço e parabéns

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa se pode, eu diria que até deve usar um case, a sintaxe aparentemente está correta, porém agora nao posso confirmar no manual aogra...

 

Mas é esse mesmo o caminho!

 

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa se pode, eu diria que até deve usar um case, a sintaxe aparentemente está correta, porém agora nao posso confirmar no manual aogra...

 

Mas é esse mesmo o caminho!

 

Abraço

 

 

Cheguei nisso... Mas não está compilando. Pode me ajudar?

 

CREATE TRIGGER ATIVA_VENDEDOR AFTER INSERT ON METAS
FOR EACH ROW
BEGIN
  DECLARE TPFUNC INT;
  DECLARE IQTD INT;

  SELECT IDFUNCAO INTO TPFUNC FROM FUNCIONARIO
   WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;

  CASE TPFUNC
    2: BEGIN
         SELECT count(*) INTO IQTD from metas
          where atingiu = 'S'
            and idfuncionario = NEW.IDFUNCIONARIO
            and mesano between (CURRENT_DATE - INTERVAL 3 MONTH)
                           and CURRENT_DATE);

         IF IQTD >= 2 THEN
           UPDATE FUNCIONARIO SET DTATIVACAO = CURRENT_DATE, DTSUSPENSO = NULL
            WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;
         ELSE
           UPDATE FUNCIONARIO SET DTATIVACAO = NULL, DTSUSPENSO = CURRENT_DATE
            WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;
         END IF;
       END;
    4: BEGIN
         SELECT count(*) INTO IQTD from metas
          where atingiu = 'S'
            and idfuncionario = NEW.IDFUNCIONARIO
            and mesano between (CURRENT_DATE - INTERVAL 6 MONTH)
                           and CURRENT_DATE);

         IF IQTD >= 4 THEN
           UPDATE FUNCIONARIO SET DTATIVACAO = CURRENT_DATE, DTSUSPENSO = NULL
            WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;
         ELSE
           UPDATE FUNCIONARIO SET DTATIVACAO = NULL, DTSUSPENSO = CURRENT_DATE
            WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;
         END IF;
       END;
    5: BEGIN
         SELECT count(*) INTO IQTD from metas
          where atingiu = 'S'
            and idfuncionario = NEW.IDFUNCIONARIO
            and mesano between (CURRENT_DATE - INTERVAL 6 MONTH)
                           and CURRENT_DATE);

         IF IQTD >= 4 THEN
           UPDATE FUNCIONARIO SET DTATIVACAO = CURRENT_DATE, DTSUSPENSO = NULL
            WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;
         ELSE
           UPDATE FUNCIONARIO SET DTATIVACAO = NULL, DTSUSPENSO = CURRENT_DATE
            WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;
         END IF;
       END;
    6: BEGIN
         SELECT count(*) INTO IQTD from metas
          where atingiu = 'S'
            and idfuncionario = NEW.IDFUNCIONARIO
            and mesano between (CURRENT_DATE - INTERVAL 6 MONTH)
                           and CURRENT_DATE);

         IF IQTD >= 4 THEN
           UPDATE FUNCIONARIO SET DTATIVACAO = CURRENT_DATE, DTSUSPENSO = NULL
            WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;
         ELSE
           UPDATE FUNCIONARIO SET DTATIVACAO = NULL, DTSUSPENSO = CURRENT_DATE
            WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;
         END IF;
       END;
  END CASE;
END

Compartilhar este post


Link para o post
Compartilhar em outros sites

É a sintaxe do CASE, abaixo a página do manual

 

http://dev.mysql.com/doc/refman/5.0/en/case-statement.html

 

Tem um WHEN aí no meio que você não colocou!

Olha o exemplo na procedure, que é o mesmo que nas triggers

 

 

abraço

 

Lucas

Compartilhar este post


Link para o post
Compartilhar em outros sites

É a sintaxe do CASE, abaixo a página do manual

 

http://dev.mysql.com/doc/refman/5.0/en/case-statement.html

 

Tem um WHEN aí no meio que você não colocou!

Olha o exemplo na procedure, que é o mesmo que nas triggers

 

 

abraço

 

Lucas

 

Já acertei a sintaxe, mas o erro ainda persiste.

 

Script line: 1 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 4

CREATE TRIGGER ATIVA_VENDEDOR AFTER INSERT ON METAS
FOR EACH ROW
BEGIN
  DECLARE IQTD INT;

  SELECT IDFUNCAO INTO TPFUNC FROM FUNCIONARIO
   WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;

  CASE (SELECT IDFUNCAO FROM FUNCIONARIO WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO)
    WHEN 2 THEN
      BEGIN
         SELECT count(*) INTO IQTD from metas
          where atingiu = 'S'
            and idfuncionario = NEW.IDFUNCIONARIO
            and mesano between (CURRENT_DATE - INTERVAL 3 MONTH)
                           and CURRENT_DATE);

         IF IQTD >= 2 THEN
           UPDATE FUNCIONARIO SET DTATIVACAO = CURRENT_DATE, DTSUSPENSO = NULL
            WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;
         ELSE
           UPDATE FUNCIONARIO SET DTATIVACAO = NULL, DTSUSPENSO = CURRENT_DATE
            WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;
         END IF;
      END;
    WHEN 4 THEN
      BEGIN
         SELECT count(*) INTO IQTD from metas
          where atingiu = 'S'
            and idfuncionario = NEW.IDFUNCIONARIO
            and mesano between (CURRENT_DATE - INTERVAL 6 MONTH)
                           and CURRENT_DATE);

         IF IQTD >= 4 THEN
           UPDATE FUNCIONARIO SET DTATIVACAO = CURRENT_DATE, DTSUSPENSO = NULL
            WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;
         ELSE
           UPDATE FUNCIONARIO SET DTATIVACAO = NULL, DTSUSPENSO = CURRENT_DATE
            WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;
         END IF;
      END;
    WHEN 5 THEN
      BEGIN
         SELECT count(*) INTO IQTD from metas
          where atingiu = 'S'
            and idfuncionario = NEW.IDFUNCIONARIO
            and mesano between (CURRENT_DATE - INTERVAL 6 MONTH)
                           and CURRENT_DATE);

         IF IQTD >= 4 THEN
           UPDATE FUNCIONARIO SET DTATIVACAO = CURRENT_DATE, DTSUSPENSO = NULL
            WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;
         ELSE
           UPDATE FUNCIONARIO SET DTATIVACAO = NULL, DTSUSPENSO = CURRENT_DATE
            WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;
         END IF;
      END;
    WHEN 6 THEN
      BEGIN
         SELECT count(*) INTO IQTD from metas
          where atingiu = 'S'
            and idfuncionario = NEW.IDFUNCIONARIO
            and mesano between (CURRENT_DATE - INTERVAL 6 MONTH)
                           and CURRENT_DATE);

         IF IQTD >= 4 THEN
           UPDATE FUNCIONARIO SET DTATIVACAO = CURRENT_DATE, DTSUSPENSO = NULL
            WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;
         ELSE
           UPDATE FUNCIONARIO SET DTATIVACAO = NULL, DTSUSPENSO = CURRENT_DATE
            WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;
         END IF;
    END;
  END CASE;
END

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tu esqueceu de declarar a variavel TPFUNC.

 

Use a variavel TPFUNC no case e nao a select (ta ficando duplicada)

SELECT IDFUNCAO INTO TPFUNC FROM FUNCIONARIO
   WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;

  CASE (SELECT IDFUNCAO FROM FUNCIONARIO WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO)


Compartilhar este post


Link para o post
Compartilhar em outros sites

Depois q tu acertar isso...

 

Ta vendo q sua update ta repetindo mto?

 

Dp tu vai criar uma procedure pra fazer a ativacao, desativacao ou suspencao do usuario

isso vai reduzir bem o codigo da sua trigger e facilitar a manutencao do codigo

 

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tu esqueceu de declarar a variavel TPFUNC.

 

Use a variavel TPFUNC no case e nao a select (ta ficando duplicada)

SELECT IDFUNCAO INTO TPFUNC FROM FUNCIONARIO
   WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;

  CASE (SELECT IDFUNCAO FROM FUNCIONARIO WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO)


mesmo declarando deu o erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Tu esqueceu de declarar a variavel TPFUNC.

 

Use a variavel TPFUNC no case e nao a select (ta ficando duplicada)

SELECT IDFUNCAO INTO TPFUNC FROM FUNCIONARIO
   WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;

  CASE (SELECT IDFUNCAO FROM FUNCIONARIO WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO)


mesmo declarando deu o erro.

 

 

Tirou a select repedida tb?

 

Posta como ficou, linha e erro que deu!

 

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

CREATE TRIGGER ATIVA_VENDEDOR AFTER INSERT ON METAS
FOR EACH ROW
BEGIN
  DECLARE IQTD INT;
  DECLARE TPFUNC INT;

  SELECT IDFUNCAO INTO TPFUNC FROM FUNCIONARIO
   WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;

  CASE TPFUNC
    WHEN 2 THEN
      BEGIN
         SELECT count(*) INTO IQTD from metas
          where atingiu = 'S'
            and idfuncionario = NEW.IDFUNCIONARIO
            and mesano between (CURRENT_DATE - INTERVAL 3 MONTH)
                           and CURRENT_DATE);

         IF IQTD >= 2 THEN
           UPDATE FUNCIONARIO SET DTATIVACAO = CURRENT_DATE, DTSUSPENSO = NULL
            WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;
         ELSE
           UPDATE FUNCIONARIO SET DTATIVACAO = NULL, DTSUSPENSO = CURRENT_DATE
            WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;
         END IF;
      END;
    WHEN 4 THEN
      BEGIN
         SELECT count(*) INTO IQTD from metas
          where atingiu = 'S'
            and idfuncionario = NEW.IDFUNCIONARIO
            and mesano between (CURRENT_DATE - INTERVAL 6 MONTH)
                           and CURRENT_DATE);

         IF IQTD >= 4 THEN
           UPDATE FUNCIONARIO SET DTATIVACAO = CURRENT_DATE, DTSUSPENSO = NULL
            WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;
         ELSE
           UPDATE FUNCIONARIO SET DTATIVACAO = NULL, DTSUSPENSO = CURRENT_DATE
            WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;
         END IF;
      END;
    WHEN 5 THEN
      BEGIN
         SELECT count(*) INTO IQTD from metas
          where atingiu = 'S'
            and idfuncionario = NEW.IDFUNCIONARIO
            and mesano between (CURRENT_DATE - INTERVAL 6 MONTH)
                           and CURRENT_DATE);

         IF IQTD >= 4 THEN
           UPDATE FUNCIONARIO SET DTATIVACAO = CURRENT_DATE, DTSUSPENSO = NULL
            WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;
         ELSE
           UPDATE FUNCIONARIO SET DTATIVACAO = NULL, DTSUSPENSO = CURRENT_DATE
            WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;
         END IF;
      END;
    WHEN 6 THEN
      BEGIN
         SELECT count(*) INTO IQTD from metas
          where atingiu = 'S'
            and idfuncionario = NEW.IDFUNCIONARIO
            and mesano between (CURRENT_DATE - INTERVAL 6 MONTH)
                           and CURRENT_DATE);

         IF IQTD >= 4 THEN
           UPDATE FUNCIONARIO SET DTATIVACAO = CURRENT_DATE, DTSUSPENSO = NULL
            WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;
         ELSE
           UPDATE FUNCIONARIO SET DTATIVACAO = NULL, DTSUSPENSO = CURRENT_DATE
            WHERE IDFUNCIONARIO = NEW.IDFUNCIONARIO;
         END IF;
    END;
  END CASE;
END

Script line: 1 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 4

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sua tabela funcionario é mesmo em LETRAS MAIUSCULAS?

 

confira os nomes de todas as tabelas e campos

 

rode essa query pra testar

 

SELECT IDFUNCAO FROM FUNCIONARIO
   WHERE IDFUNCIONARIO = 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sua tabela funcionario é mesmo em LETRAS MAIUSCULAS?

 

confira os nomes de todas as tabelas e campos

 

rode essa query pra testar

 

SELECT IDFUNCAO FROM FUNCIONARIO
   WHERE IDFUNCIONARIO = 1

Me trouxe normalmente o resultado dos dois modos (tudo maiusculo e igual ao criado)

Compartilhar este post


Link para o post
Compartilhar em outros sites

SELECT count(*) from metas
          where atingiu = 'S'
            and idfuncionario = 1
            and mesano between (CURRENT_DATE - INTERVAL 3 MONTH)
                           and CURRENT_DATE);
Essa aqui roda de boa?

Parece que tem um ")" no final que nao deveria ter, antes do ";" ..... "and CURRENT_DATE);"

 

ta errado em todas, corrija isso e vamos tentar,

 

agora acho que é só isso

 

abraço

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.