Jump to content

Recommended Posts

Posted

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.  :wallbash:

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



Posted

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!

Posted

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á!!

Posted

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.

Posted

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á!!

Posted

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.

Posted

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á!!

Posted

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.

Posted

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...

Posted

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%.

Posted

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%)

Posted

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

Posted

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.

Posted

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."

 

Posted

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.