- Este tópico contém 11 respostas, 3 vozes e foi atualizado pela última vez 15 anos, 4 meses atrás por LeloStyle.
-
AutorPosts
-
26 de agosto de 2009 às 10:30 pm #89312LeloStyleParticipante
Boa tarde pessoal,
Estou precisando de uma ajuda de vcs para fazer um when-validate-item.
Vamos lá tenho tres campos no meu forms: Bem, Carc bem e ramo, só que qndo o usuario digita preciso validar se esses campos constam na tabela RAMO_CARAC_BEM_SEGURADO.Alguém poderia me dar uam luz sobre isso, pois sou iniciante e ainda não tinha pegado algumas telas desde inicio para desenvolver.
Desde já agradeço
26 de agosto de 2009 às 10:37 pm #89313Rodrigo MesquitaParticipantePelo que entendi vc quer ver se o valor digitado no campo, consta na tabela RAMO_CARAC_BEM_SEGURADO. Se quiser validar no momento em que o usuário deixar o field use do trigger, on-change no item. Se for no momento do comitt utiliza o when-validate-item.
26 de agosto de 2009 às 10:49 pm #89315LeloStyleParticipanteRodrigoo,
É mas ou menos isso, quando o usuario digita por exemplo 1 verifica se tem na tabela, se sim deicxa inserir, senao da mensagem de q não existe esse ramo por exemplo. Será que teria como me dar um exemplo de como fazer ?
Desde já agradeço a ajuda
Abraço
26 de agosto de 2009 às 11:34 pm #89317Rodrigo MesquitaParticipanteLelo,
Existe várias maneiras de fazer…umas delas é…
crie um trigger on_change no item, depois coloque o código abaixo
Declare
Cursor c_Select Is Select coluna From tabela;
Tselect tabela.coluna%Type;
Begin
Open c_select;
Fetch c_select Into Tselect;
If c_select%Notfound Then
Null;
message(‘valor nao existe na tabela’);
End If;
Close c_select;
End;26 de agosto de 2009 às 11:59 pm #89320LeloStyleParticipanteRodrigo mas uma vez muito obrigado, compreendi da maneira que me passou. Mas estava fazendo assim será que daria para aproveitar essa ideia ou não ?
begin
select count(1)
into :radesc.cd_tipo_bem_segurado
from RAMO_CARAC_BEM_SEGURADO
where cd_tipo_bem_segurado = :radesc.cd_tipo_bem_segurado;
exception
when no_data_found then
mensagem ('Tipo Bem Segurado não Cadastrado.');
raise form_trigger_failure;
when others then
mensagem ('Problemas ao Selecionar Registro em TIPO_BEM_SEGURADO. Erro: '||sqlerrm||' - (when-validate-item - controle.cd_tipo_bem_segurado).');
raise form_trigger_failure;
end;
Valeww
27 de agosto de 2009 às 12:02 am #89321Rodrigo MesquitaParticipanteda sim!
Esta correto da maneira que vc fez tambem. Como falei, existe várias formas de fazer essa validação. Só que prefiro sempre que der utilizar um cursor, por que alem de ser na maioria das veses mais performáticos não tem necessidade de utilizar exceptions.
27 de agosto de 2009 às 12:19 am #89324LeloStyleParticipanteRodrigo, valew cara !!!!
Só um probleminha !!!
Ele não ta validando o campoo lá to conseguindo inserir qualquer coisa !!!
Pode verificar o erro no meu códigooo ?Muito obrigadoo
Abraço
27 de agosto de 2009 às 6:19 am #89330AnônimoLelo, boa noite.
A melhor maneira para se validar é utilizando a trigger WHEN-VALIDATE-ITEM.
A ideia do seu código é boa, mas tem alguns erros:
Quando vc usa o comando COUNT(), tem que ter em mente que nunca cairá na exception NO_DATA_FOUND, pois este comando sempre retorna registro, ou seja, mesmo que não encontre nenhum registro que satisfaça a condição do WHERE, o SELECT COUNT(1) retornará 0 (ZERO), entendeu? Então, ou vc usa o COUNT() e logo abaixo da query faz uma validação para verificar se retornou ZERO ou vc usa um select sem COUNT e trata com a exception NO_DATA_FOUND, exemplos:
1) Utilizando o COUNT:
declare
l_contador number := 0;begin
select count(1)
into l_contador
from RAMO_CARAC_BEM_SEGURADO
where cd_tipo_bem_segurado = :radesc.cd_tipo_bem_segurado;
—
if l_contador = 0 then
mensagem (‘Tipo Bem Segurado não Cadastrado.’);
raise form_trigger_failure;
end if;
exception
when others then
mensagem (‘Problemas ao Selecionar Registro em TIPO_BEM_SEGURADO. Erro: ‘||sqlerrm||’ – (when-validate-item – controle.cd_tipo_bem_segurado).’);
raise form_trigger_failure;
end;2) Não utilizando o COUNT:
declare
l_validacao number;begin
select 1
into l_validacao
from RAMO_CARAC_BEM_SEGURADO
where cd_tipo_bem_segurado = :radesc.cd_tipo_bem_segurado
and rownum < 2;
exception
when no_data_found then
mensagem ('Tipo Bem Segurado não Cadastrado.');
raise form_trigger_failure;
when others then
mensagem ('Problemas ao Selecionar Registro em TIPO_BEM_SEGURADO. Erro: '||sqlerrm||' – (when-validate-item – controle.cd_tipo_bem_segurado).');
raise form_trigger_failure;
end;Utilizei o ROWNUM na segunda opção, pois caso esta tabela não tenha validação de chave primária, vc não terá problemas com retorno de mais de 1 registro.
Entendeu?
Abs
27 de agosto de 2009 às 3:58 pm #89337LeloStyleParticipanteScheduardo,cara valew, deu uma puta clareada…
Pessoal,
Agora to conseguindo , ele compilouu sem erros, mas na hora de validar no forms, não ta validando. Então verifiquei que tem uma função no forms que trata milhares de validações, será que por isso não esta caindo nesse when-validate ?
Gratoooo
27 de agosto de 2009 às 4:15 pm #89339Rodrigo MesquitaParticipanteLelo,
Verifique no trigger when-validade-item se antes do código que vc colocou existe algum bloco com validações e a linha RAISE FORM_TRIGGER_FAILURE pois essa linha interrompe o processamento e não executa o restante do código.
27 de agosto de 2009 às 5:54 pm #89340AnônimoLelo, bom dia.
No bloco desses itens existe também uma WHEN-VALIDATE-ITEM?
Vc tem certeza que o programa está executando esta trigger? Coloque mensagens e execute-o novamente p/ ver se elas são mostradas, assim terá certeza que o programa está executando esta trigger.
Abs
27 de agosto de 2009 às 8:16 pm #89346LeloStyleParticipanteCaras, muito obrigado pela ajuda, consegui resolver meu problema. Acontece que existiam uma triggers aqui q não eram de meu conhecimentos, pois sou novo em forms e aqui na empresa tbm. Comentei algumas delas e alterei alguma coisas e conseguii !!!
Valew
Abraço
-
AutorPosts
- Você deve fazer login para responder a este tópico.