Faccruz 0 Denunciar post Postado Agosto 26, 2009 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
Eliseu M. 2 Denunciar post Postado Agosto 26, 2009 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
Lucas Renan 2 Denunciar post Postado Agosto 27, 2009 ... 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
Faccruz 0 Denunciar post Postado Agosto 27, 2009 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
LHAlmeida 0 Denunciar post Postado Agosto 27, 2009 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
Faccruz 0 Denunciar post Postado Agosto 27, 2009 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
LHAlmeida 0 Denunciar post Postado Agosto 27, 2009 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
Faccruz 0 Denunciar post Postado Agosto 27, 2009 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
LHAlmeida 0 Denunciar post Postado Agosto 27, 2009 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
Faccruz 0 Denunciar post Postado Agosto 27, 2009 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
LHAlmeida 0 Denunciar post Postado Agosto 27, 2009 É 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
Faccruz 0 Denunciar post Postado Agosto 27, 2009 É 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
LHAlmeida 0 Denunciar post Postado Agosto 27, 2009 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
LHAlmeida 0 Denunciar post Postado Agosto 27, 2009 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
Faccruz 0 Denunciar post Postado Agosto 27, 2009 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
LHAlmeida 0 Denunciar post Postado Agosto 27, 2009 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
Faccruz 0 Denunciar post Postado Agosto 27, 2009 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
LHAlmeida 0 Denunciar post Postado Agosto 27, 2009 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
Faccruz 0 Denunciar post Postado Agosto 27, 2009 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
LHAlmeida 0 Denunciar post Postado Agosto 27, 2009 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