Soma de anos

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
ROBSON ROCHA
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qua, 10 Mar 2010 10:20 am
Localização: IGREJINHA

Olá.
Estou com uma grande dúvida.
Criei uma tabela para cadastramento de veículos. Nela existe um campo para ano_fabricação e outro para ano_modelo do veículo. Lembrando que usei a máscara YYYY para os campos. Fiz um when-validate-item para q se o usuário digitasse o ano_modelo menor q o ano_fabricação retornasse um erro. Até aí tudo bem, o problema é q tb quero q se o ano_modelo for dois anos a mais q o ano_fabricação ele me retorne um erro tb. Tipo, se o ano_fabricação for 2005 o ano_modelo tem q ser 2006, não mais q isso.

Até agora fiz isso:

DECLARE
ANO_FABRICACAO NUMBER;
ANO_MODELO NUMBER;

BEGIN
ANO_FABRICACAO := (':FRT_VEICULOS.ANO_FABRICACAO');
ANO_MODELO := (':FRT_VEICULOS.ANO_MODELO');



IF ANO_MODELO < ANO_FABRICACAO AND
ANO_MODELO > (ANO_FABRICACAO + 2) <-- "AQUI O ERRO"
THEN
MESSAGE('DIGITE ANO MODELO NOVAMENTE');
MESSAGE('DIGITE ANO MODELO NOVAMENTE');
RAISE FORM_TRIGGER_FAILURE;
END IF;
END;


Se alguém entendeu o q eu quis dizer e souber como resolver agradeço se me ajudar, vlw!
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Hmm.. não entendi muito bem o seu problema..
Está dando algum erro na comparação?

Nestas linhas, você está usando aspas entre o nome dos campos mesmo?

Selecionar tudo

ANO_FABRICACAO := (':FRT_VEICULOS.ANO_FABRICACAO'); 
ANO_MODELO := (':FRT_VEICULOS.ANO_MODELO'); 
Os campos :FRT_VEICULOS.ANO_FABRICACAO e :FRT_VEICULOS.ANO_MODELO são do tipo number? ou date? se forem date, seria necessário convertê-los

Selecionar tudo

ANO_FABRICACAO := to_number(to_char(:FRT_VEICULOS.ANO_FABRICACAO, 'yyyy'))); 
ANO_MODELO := to_number(to_Char((:FRT_VEICULOS.ANO_MODELO, 'yyyy')));
No if.. pelo que você descreveu, você precisa apresentar o erro se o ano do modelo for inferior ao ano de fabricação, ou se o ano do modelo for dois anos mais velho que o ano de fabricação (no seu if está com and.. acredito que seja um or).

Selecionar tudo

if ( ( ano_modelo < ano_fabricacao ) or ( ( ano_modelo - ano_fabricacao ) > 2 ) ) then
ROBSON ROCHA
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qua, 10 Mar 2010 10:20 am
Localização: IGREJINHA

E aê Rogenaro.
Primeiramente t agradeço pela ajuda.
Seguinte, na parte em q passo os valores para as variáveis (q estão como NUMBER) eu realmente uso aspas. Tentei fazer sem as aspas mas dava erro, e desta forma ele passa tranquilo.

Mas olha só, resolví fazer de uma forma diferente, sem precisar atribuir variáveis, partindo direto de um IF, olha só:

Selecionar tudo

IF ((:FRT_VEICULOS.ANO_MODELO   < :FRT_VEICULOS.ANO_FABRICACAO)
 OR 
	 ((:FRT_VEICULOS.ANO_MODELO - :FRT_VEICULOS.ANO_FABRICACAO) > 2 ))
THEN
	MESSAGE('DIGITE ANO MODELO NOVAMENTE');
	MESSAGE('DIGITE ANO MODELO NOVAMENTE');	
	RAISE FORM_TRIGGER_FAILURE;
END IF;
Como eu queria ele não permite q se coloque o ano_modelo inferior ao ano_fabricação, só que agora ele tb não permite q o ano_modelo seja 1 ano maior q o de fabricação. Tipo se o ano_fabricação é 2005 ele não permite q o ano_modelo seja 2006. Resumindo ele só passa se o ano_modelo for o mesmo ano_fabricação.
ROBSON ROCHA
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qua, 10 Mar 2010 10:20 am
Localização: IGREJINHA

Conseguí!

O problema é q os testes q eu fazia não batiam com os tipos criados para cada variável.
Agradeço ao Rogenaro pela ajuda.

Bom, fica aqui então a query para quem quiser usar.

Selecionar tudo

DECLARE
	ANO_MODELO NUMBER;
	ANO_FABRICACAO NUMBER;
BEGIN
	ANO_MODELO := TO_NUMBER(TO_CHAR(:FRT_VEICULOS.ANO_MODELO,'YYYY'));
	ANO_FABRICACAO := TO_NUMBER(TO_CHAR(:FRT_VEICULOS.ANO_FABRICACAO,'YYYY'));
	

IF ((ANO_MODELO < ANO_FABRICACAO) OR 
	 ((ANO_MODELO - ANO_FABRICACAO) > 1 ))
	THEN
	MESSAGE('DIGITE ANO MODELO NOVAMENTE');
	MESSAGE('DIGITE ANO MODELO NOVAMENTE');	
	RAISE FORM_TRIGGER_FAILURE;
END IF;
END;
Abraço a todos!
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 13 visitantes