PT-Team Posted April 10, 2012 at 04:43 PM Report #448414 Posted April 10, 2012 at 04:43 PM Olá pessoal Precisava de ajuda a resolver o problema neste trigger. Pretendo verificar se o valor IVA é diferente de 0.06, 0.13 ou 0.23. Criei este trigger para verificar e em caso de o valor ser diferente dar a mensagem de erro "Taxa de IVA errada." Porem, o que acontece é que o trigger dá sempre erro e não consigo descobrir o problema. Alguém pode ajudar-me? CREATE TRIGGER ValidaProduto BEFORE INSERT ON Produto FOR EACH ROW BEGIN DECLARE DADOS_INVALIDOS CONDITION FOR SQLSTATE '45004'; /* ---------------------------------------------------- Verifica a taxa de IVA */ IF NEW.IVA <> 0.06 AND NEW.IVA <> 0.13 AND NEW.IVA <> 0.23 THEN SIGNAL DADOS_INVALIDOS SET MESSAGE_TEXT = 'Taxa de IVA errada.'; END IF; END//
José Lopes Posted April 10, 2012 at 10:35 PM Report #448491 Posted April 10, 2012 at 10:35 PM Não conheço bem a sintaxe do mysql para triggers, mas se esse trugger fosse um oracle, diria que falta aí um ";" na linha SIGNAL DADOS_INVALIDOS. Quando te pedirem peixe.... ensina-os a Pescar!!Hum..lálálálá!!
pmg Posted April 10, 2012 at 10:46 PM Report #448494 Posted April 10, 2012 at 10:46 PM Se multiplicares por 100 e comparares dois numeros inteiros continua a acontecer? Pergunto porque, possivelmente, os valores 0.06, 0.13, e 0.23 nao sao completamente representaveis em binario --- sendo qualquer coisa como 0.1299999999999999998564352. What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
José Lopes Posted April 10, 2012 at 10:49 PM Report #448496 Posted April 10, 2012 at 10:49 PM Depois do esclarecimento anterior ocorre-me perguntar-te, qual o formato dos dados dos campos que utilizas para guardar o IVA, é que essa comparação só vai funcionar se os campos forem numéricos... caso contrário vai estourar porque ele não aceita essa comparação para strings... PS - isso dá alguma mensagem de erro? Quando te pedirem peixe.... ensina-os a Pescar!!Hum..lálálálá!!
PT-Team Posted April 10, 2012 at 11:06 PM Author Report #448500 Posted April 10, 2012 at 11:06 PM Depois do esclarecimento anterior ocorre-me perguntar-te, qual o formato dos dados dos campos que utilizas para guardar o IVA, é que essa comparação só vai funcionar se os campos forem numéricos... caso contrário vai estourar porque ele não aceita essa comparação para strings... PS - isso dá alguma mensagem de erro? O formato é float e não dá erro nenhum, só diz "Taxa de IVA errada.", só que essa mensagem só deveria aparecer quando o valor não fosse um desses três.
José Lopes Posted April 10, 2012 at 11:09 PM Report #448503 Posted April 10, 2012 at 11:09 PM Então essa condição é impossível..repara lá bem... tu queres que o IVa responda a TODOS os teus critérios.... Parece-me que isso resultará com or's... Quando te pedirem peixe.... ensina-os a Pescar!!Hum..lálálálá!!
PT-Team Posted April 10, 2012 at 11:17 PM Author Report #448505 Posted April 10, 2012 at 11:17 PM Se multiplicares por 100 e comparares dois numeros inteiros continua a acontecer? Pergunto porque, possivelmente, os valores 0.06, 0.13, e 0.23 nao sao completamente representaveis em binario --- sendo qualquer coisa como 0.1299999999999999998564352. Mesmo multiplicando por 100 continua com o mesmo erro de validação.
José Lopes Posted April 10, 2012 at 11:22 PM Report #448508 Posted April 10, 2012 at 11:22 PM Experimenta: CREATE TRIGGER ValidaProduto BEFORE INSERT ON Produto FOR EACH ROW BEGIN DECLARE DADOS_INVALIDOS CONDITION FOR SQLSTATE '45004'; /* ---------------------------------------------------- Verifica a taxa de IVA */ IF (NEW.IVA <> 0.06 OR NEW.IVA <> 0.13 OR NEW.IVA <> 0.23) THEN SIGNAL DADOS_INVALIDOS SET MESSAGE_TEXT = 'Taxa de IVA errada.'; END IF; END// Quando te pedirem peixe.... ensina-os a Pescar!!Hum..lálálálá!!
PT-Team Posted April 10, 2012 at 11:30 PM Author Report #448510 Posted April 10, 2012 at 11:30 PM Então essa condição é impossível..repara lá bem... tu queres que o IVa responda a TODOS os teus critérios.... Parece-me que isso resultará com or's... A condição não é impossível, pois a mesma está a ocorrer e só o deveria fazer quando NEW.IVA não fosse igual a uma das três condições. Já testei a condição em C e funciona, em MySQL não consigo que funcione.
PT-Team Posted April 10, 2012 at 11:32 PM Author Report #448511 Posted April 10, 2012 at 11:32 PM Experimenta: CREATE TRIGGER ValidaProduto BEFORE INSERT ON Produto FOR EACH ROW BEGIN DECLARE DADOS_INVALIDOS CONDITION FOR SQLSTATE '45004'; /* ---------------------------------------------------- Verifica a taxa de IVA */ IF (NEW.IVA <> 0.06 OR NEW.IVA <> 0.13 OR NEW.IVA <> 0.23) THEN SIGNAL DADOS_INVALIDOS SET MESSAGE_TEXT = 'Taxa de IVA errada.'; END IF; END// Continua com o mesmo problema...
brunoais Posted April 11, 2012 at 06:04 AM Report #448517 Posted April 11, 2012 at 06:04 AM Experimenta usar inteiros para isso. Agora muda isso tudo para inteiro (não só multiplicar por 100) (inclui a coluna da tabela). CREATE TRIGGER ValidaProduto BEFORE INSERT ON Produto FOR EACH ROW BEGIN DECLARE DADOS_INVALIDOS CONDITION FOR SQLSTATE '45004'; /* ---------------------------------------------------- Verifica a taxa de IVA */ IF (NEW.IVA <> 6 AND NEW.IVA <> 13 AND NEW.IVA <> 23) THEN SIGNAL DADOS_INVALIDOS SET MESSAGE_TEXT = 'Taxa de IVA errada.'; END IF; END// Com OR e <> ele retorna sempre true. Com AND e = ele retorna sempre false. "[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31 Life is a genetically transmitted disease, induced by sex, with death rate of 100%.
PT-Team Posted April 11, 2012 at 02:06 PM Author Report #448588 Posted April 11, 2012 at 02:06 PM Infelizmente não posso mudar para inteiro, tenho que seguir as seguintes regras: singular, obrigatório, formato: em percentagem, regra de validação: um de {0.06, 0.13, 0.23} (ie, 6, 13 ou 23%), valor pré-definido: 0,23 (ie, 23%)
rumbafum Posted April 11, 2012 at 05:50 PM Report #448635 Posted April 11, 2012 at 05:50 PM podes sempre tentar fazer round dos valores para perceber se o problema é do valor novo: CREATE TRIGGER ValidaProduto BEFORE INSERT ON Produto FOR EACH ROW BEGIN DECLARE DADOS_INVALIDOS CONDITION FOR SQLSTATE '45004'; /* ---------------------------------------------------- Verifica a taxa de IVA */ IF Round(NEW.IVA*100) = 6 OR Round(NEW.IVA*100) = 13 OR Round(NEW.IVA*100) = 23 THEN SIGNAL DADOS_INVALIDOS SET MESSAGE_TEXT = 'Taxa de IVA errada.'; END IF; END//
PT-Team Posted April 11, 2012 at 11:21 PM Author Report #448709 Posted April 11, 2012 at 11:21 PM podes sempre tentar fazer round dos valores para perceber se o problema é do valor novo: CREATE TRIGGER ValidaProduto BEFORE INSERT ON Produto FOR EACH ROW BEGIN DECLARE DADOS_INVALIDOS CONDITION FOR SQLSTATE '45004'; /* ---------------------------------------------------- Verifica a taxa de IVA */ IF Round(NEW.IVA*100) = 6 OR Round(NEW.IVA*100) = 13 OR Round(NEW.IVA*100) = 23 THEN SIGNAL DADOS_INVALIDOS SET MESSAGE_TEXT = 'Taxa de IVA errada.'; END IF; END// Também já tinha tentado essa possibilidade e não funcionou. Entretanto já resolvi o problema, alterei a formatação do IVA na tabela de float para float(3,4). Assim passou a funcionar. Quero deixar aqui o meu agradecimento a todos os que me tentaram ajudar.
M6 Posted April 12, 2012 at 09:19 AM Report #448731 Posted April 12, 2012 at 09:19 AM Um pequeno à parte, não verifiques isso de forma hard coded. Verifica contra uma tabela de valores uma vez que o IVA muda de tempos a tempos. Algo do tipo: select count(*) from tabela_iva where valor = NEW.IVA E se o valor for > 0, então o IVA é válido. Podes até complementar com intervalos de data, do género: o IVA é válido se a data de compra do produto se enquadra no intervalo de datas de validade do IVA. 10 REM Generation 48K! 20 INPUT "URL:", A$ 30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50 40 PRINT "404 Not Found" 50 PRINT "./M6 @ Portugal a Programar."
PT-Team Posted April 12, 2012 at 11:28 AM Author Report #448750 Posted April 12, 2012 at 11:28 AM Caro M6, Uma boa programação seria fazer como dizes, só que neste caso eu tenho que seguir regras do enunciado e no qual a finalidade era verificar os meus conhecimentos de trigger's
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now