when-validate-item

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
lelostyle
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Qui, 09 Jul 2009 9:59 pm
Localização: SP

Boa tarde pessoal,

Obrigado por abrir esse espaço para ajuda. vamos lá

Estou precisando fazer um when-validate-item em tres campos que tenho no meu forms. Os campos são os seguintes BEM,CARC e RAMO da tabela
RAMO_CARAC_BEM_SEGURADO. Na hora que o ususario digitar verificar se existe na tabela, caso exista deixa inserir, caso não da msg falando que não existe. como sou iniciante estou encontrando dificuldades, se alguém puder me dar uma luz.


Gratooo

Leloo
Jezper
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 36
Registrado em: Seg, 17 Ago 2009 11:02 am
Localização: Gaspar-SC
Jeziel Peres

PL/SQL - Forms 6i

faz uma condição nesse teu validate na qual verefica na tabela... ou nesao monta a tua condição em uma procedure e so chama ela no validade.

cria uma procedure onde nela você faz o select com toda as condições e depois apenas chama essa procedure no validate.

se não for realmente essa a sua dificuldade fale, tente explicar melhor e posta aqui o teu codigo atual.
lelostyle
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Qui, 09 Jul 2009 9:59 pm
Localização: SP

Jeziel,

desde já agradeço a ajuda.

Agora até deu uma clareada, mas acontece que meu codigo não funciona, não ta validando nada no campo, pode verificar o que estou errando ?

Segue

Selecionar tudo

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;
 
Se puder me ajudar !!!
Gratooo
Lelooo
Avatar do usuário
NightSpy
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 49
Registrado em: Ter, 09 Set 2008 4:18 pm
Localização: SP

Cara usando count, nunca dará when no_data_found, porque para cair neste erro e travar o programa, tem q voltar NULL no seu select e usando o count nunca voltará NULL , no máximo 0.... alias, por isso mesmo, não precisa usar exception com um select count...

não entendi porque você jogou o resultado do select no lugar do valor q você digitou na tela e que usou no where.

Seria interessante declarar uma variavel...assim:

Selecionar tudo

Declare
   aux number;
Begin
   select count(*) into aux
   from   RAMO_CARAC_BEM_SEGURADO
   where   cd_tipo_bem_segurado   =   :radesc.cd_tipo_bem_segurado; 
   
   if aux = 0 then
      mensagem ('Tipo Bem Segurado não Cadastrado.');
      raise form_trigger_failure; 
   end if;
end;
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Não faz um select into, em um campo do bloco, até por que você não precisa.

Selecionar tudo

declare
  cursor c_teste is
    select  1 
    from   RAMO_CARAC_BEM_SEGURADO 
    where   cd_tipo_bem_segurado   =   :radesc.cd_tipo_bem_segurado; 
begin
  open c_teste ;
  if c_teste%notfound then
    mensagem ('Tipo Bem Segurado não Cadastrado.'); 
    raise form_trigger_failure; 
  end if;
  close c_teste;
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; 
deve funcionar, se ocorrer erro, poste no forms.
Jezper
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 36
Registrado em: Seg, 17 Ago 2009 11:02 am
Localização: Gaspar-SC
Jeziel Peres

PL/SQL - Forms 6i

o select do SergioLBJr esa correto...
ainda não intendi muito bem o que você deseja....
lelostyle
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Qui, 09 Jul 2009 9:59 pm
Localização: SP

Pessoal,

Muito obrigado pela ajuda ate agora.

Acontece que nehuma das duas funfo não sei o motivo.

Tenho 3 campos BEM,CARAC e RAMO da tabela RAMO_CARAC_BEM_SEGURADO.

preciso que na hora de inserir a informção no campo do forms, verifique se é valido no banco, por exemplo:

insere ramo 1, se valido deixa inserir, senão da mensagem avisando que não existe o ramo, e fazer para os demais campos também.

Alguma sugestão simples para que alem de fazer eu possa entender.

Gratooo

Leloooo
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

O que aconteceu??? qual foi o erro que a trigger disparou???
lelostyle
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Qui, 09 Jul 2009 9:59 pm
Localização: SP

O pior de td é que não da nenhum erro !!!
Executa de boa, o problema é que não da a mensagem impedindo o usuario inserir.

Valeww
Jezper
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 36
Registrado em: Seg, 17 Ago 2009 11:02 am
Localização: Gaspar-SC
Jeziel Peres

PL/SQL - Forms 6i

então bota uma clausula impedindo isso... ali exibe a menssagem, então bota uma clausula que impessa o usuario de executar essa função...

essa menssagem tem q da so quando comita ou quando ele insere os dados???
lelostyle
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Qui, 09 Jul 2009 9:59 pm
Localização: SP

Bom dia pessoal, obrigadoo pela ajuda até agora.
É o seguinte acho que o problema estã em uma função que já está no forms que trata todo tipo de erro, será que é por isso que não ta validandoo ?

Gratoo
lelostyle
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Qui, 09 Jul 2009 9:59 pm
Localização: SP

Isso somente quando ele insere o dado no no campo !!!!
Jezper
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 36
Registrado em: Seg, 17 Ago 2009 11:02 am
Localização: Gaspar-SC
Jeziel Peres

PL/SQL - Forms 6i

tu que mostra q ele ta cadastrado ou não ta cadastrado ou que pode ou não pode cadastrar, um usuario que já existi tabela.

esta meio q confuso isso. tente se mais claro.. a partir de que menssagem tu que barrar o usuario de cadastrar?
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Cara se tu pensa que o problema esta na função que trata os erros, então posta ela aí no forum, ou comenta onde ela ta chendo chamada e verifica se vai tratar.
lelostyle
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Qui, 09 Jul 2009 9:59 pm
Localização: SP

Quero que quando o usuario digite e tente passar para o proximo campo, exiba a mensagem senao existir .

Tem essa seguinte função que trata erros segue, e pelo jeito é padrãem alguma telas:

Selecionar tudo

FUNCTION ERROS (TIPO_ERRO IN VARCHAR2,
                CODIGO_ERRO IN NUMBER,
                TEXTO_ERRO IN VARCHAR2)
                RETURN VARCHAR2 IS
  V_MENSAGEM    VARCHAR2(300) := TEXTO_ERRO;
BEGIN
  IF CODIGO_ERRO = 40100 THEN
     V_MENSAGEM := TIPO_ERRO||'-'||TO_CHAR(CODIGO_ERRO)||':'||' Primeiro registro.';
  ELSIF CODIGO_ERRO = 40102 THEN
        V_MENSAGEM := TIPO_ERRO||'-'||TO_CHAR(CODIGO_ERRO)||':'||' Registro deve ser informado ou excluido.';
  ELSIF CODIGO_ERRO IN (40200, 41008) THEN
        V_MENSAGEM := TIPO_ERRO||'-'||TO_CHAR(CODIGO_ERRO)||':'||' Campo protegido contra atualização.';
  ELSIF CODIGO_ERRO = 40202 THEN
        V_MENSAGEM := TIPO_ERRO||'-'||TO_CHAR(CODIGO_ERRO)||':'||' Campo deve ser informado.';
  ELSIF CODIGO_ERRO = 40207 and substr(V_MENSAGEM,1,16) = 'Must be in range' THEN
        V_MENSAGEM := TIPO_ERRO||'-'||TO_CHAR(CODIGO_ERRO)||':'||replace(V_MENSAGEM, 'Must be in range', ' Valor deve estar entre');
        V_MENSAGEM := replace(V_MENSAGEM, 'to', 'e');
  ELSIF CODIGO_ERRO = 40209 and substr(V_MENSAGEM,1,21) = 'Field must be of form' THEN
        V_MENSAGEM := TIPO_ERRO||'-'||TO_CHAR(CODIGO_ERRO)||':'||replace(V_MENSAGEM, 'Field must be of form', ' Campo deve respeitar o formato de');
  ELSIF CODIGO_ERRO = 40212 and substr(V_MENSAGEM,1,23) = 'Invalid value for field' THEN
        V_MENSAGEM := TIPO_ERRO||'-'||TO_CHAR(CODIGO_ERRO)||':'||replace(V_MENSAGEM, 'Invalid value for field', ' Valor inválido para o campo');
  ELSIF CODIGO_ERRO = 40401 THEN
     V_MENSAGEM := TIPO_ERRO||'-'||TO_CHAR(CODIGO_ERRO)||':'||' Não há transações para serem efetivadas.'; 
  ELSIF CODIGO_ERRO = 40501 THEN
     V_MENSAGEM := TIPO_ERRO||'-'||TO_CHAR(CODIGO_ERRO)||':'||' Registro não poderá ser alterado ou excluído, pois está sendo alterado por outro usuário.'; 
  ELSIF CODIGO_ERRO = 40508 THEN
     V_MENSAGEM := TIPO_ERRO||'-'||TO_CHAR(CODIGO_ERRO)||':'||' ERRO ORACLE: Problema ao inserir um registro. Favor entrar em contato com o suporte.'; 
  ELSIF CODIGO_ERRO in (41000, 41009) THEN
        V_MENSAGEM := TIPO_ERRO||'-'||TO_CHAR(CODIGO_ERRO)||':'||' Função não disponível.';
  ELSIF CODIGO_ERRO = 41051 THEN
        V_MENSAGEM := TIPO_ERRO||'-'||TO_CHAR(CODIGO_ERRO)||':'||' Proibida a criação de registros.';
  ELSIF CODIGO_ERRO = 41830 THEN
        V_MENSAGEM := TIPO_ERRO||'-'||TO_CHAR(CODIGO_ERRO)||':'||' Lista de Valores não contém dados.';
  ELSIF CODIGO_ERRO = 41049 THEN
	V_MENSAGEM := TIPO_ERRO||'-'||TO_CHAR(CODIGO_ERRO)||':'||' Registro Não pode ser Excluído'; 
  ELSIF CODIGO_ERRO = 40702 THEN
	V_MENSAGEM := TIPO_ERRO||'-'||TO_CHAR(CODIGO_ERRO)||':'||' Favor SALVAR ou CANCELAR as alterações feitas antes de mudar de tela'; 
  ELSIF CODIGO_ERRO = 40403 THEN
	V_MENSAGEM := TIPO_ERRO||'-'||TO_CHAR(CODIGO_ERRO)||':'||' Esta transação não pode ser Salvada pois há telas anteriores que ainda NÃO foram salvas!. Sair SEM SALVAR desta tela e salvar primeiro as telas pendentes!.'; 
  ELSIF CODIGO_ERRO IN (40358, 50002, 50003, 50004) THEN
	V_MENSAGEM := TIPO_ERRO||'-'||TO_CHAR(CODIGO_ERRO)||':'||' Data Inválida.'; 
  ELSIF CODIGO_ERRO = 40509 THEN
	if substr(get_application_property (CURRENT_FORM_NAME),1,4) = 'SINI' then
		V_MENSAGEM := TIPO_ERRO||'-'||TO_CHAR(CODIGO_ERRO)||':'||' Erro ao atualizar. Tabela pode não existir ou falta privilégio p/processar operação. Clique em <SHIFT> + <F1> p/verificar o erro e contacte a equipe da SIMETRIAS.(Ramal 7651)'; 
	else
		V_MENSAGEM := TIPO_ERRO||'-'||TO_CHAR(CODIGO_ERRO)||':'||' Erro ao atualizar. Tabela pode não existir ou falta privilégio p/processar operação. Clique em <SHIFT> + <F1> p/verificar o erro e contacte a área de SISTEMAS(Ramais 7651,7647 e 7652).'; 
	end if;
  ELSIF CODIGO_ERRO IN (40356, 50016) THEN
	V_MENSAGEM := TIPO_ERRO||'-'||TO_CHAR(CODIGO_ERRO)||':'||' Conteúdo Inválido para Campo Numérico.'; 
  ELSIF CODIGO_ERRO = 50025 THEN
	V_MENSAGEM := TIPO_ERRO||'-'||TO_CHAR(CODIGO_ERRO)||':'||' Dia e Hora devem ser informados no seguinte formato : DD/MM/AAAA HH:MI.'; 
  ELSIF CODIGO_ERRO = 28000 THEN
	V_MENSAGEM := TIPO_ERRO||'-'||TO_CHAR(CODIGO_ERRO)||':'||' Tentativa de conexão bloqueada. Para desbloqueio, comunicar-se c/Depto Sistemas (7651, 7652, 7647). Se o erro não foi da sua digitação, checar quem está tentando utilizar a sua senha.';
  ELSIF CODIGO_ERRO = 50026 THEN
	V_MENSAGEM := TIPO_ERRO||'-'||TO_CHAR(CODIGO_ERRO)||':'||' Campo deve respeitar o formato de dd/mm/yyyy.'; 
  ELSE
     V_MENSAGEM := TIPO_ERRO||'-'||TO_CHAR(CODIGO_ERRO)||' '||TEXTO_ERRO;
  END IF;
  RETURN(V_MENSAGEM);
END; 

Desde já obrigadoo pela ajudaa
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Duvido muito que esta função seja o seu problema.

Faça o seguinte:
exiba na tela o resultado do seu select:

Selecionar tudo

declare 
  cursor c_teste is 
    select  1 
    from   RAMO_CARAC_BEM_SEGURADO 
    where   cd_tipo_bem_segurado   =   :radesc.cd_tipo_bem_segurado; 
begin 
  open c_teste ; 
  if c_teste%notfound then 
    mensagem ('Tipo Bem Segurado não Cadastrado.'); 
    raise form_trigger_failure; 
  else
     mensagem ('Achei');
  end if; 
  close c_teste; 
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;
[code]
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Se encontrar achei, ele pode inserir.
Jezper
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 36
Registrado em: Seg, 17 Ago 2009 11:02 am
Localização: Gaspar-SC
Jeziel Peres

PL/SQL - Forms 6i

Selecionar tudo

declare
cursor c_teste is
select cd_tipo_bem_segurado
from RAMO_CARAC_BEM_SEGURADO
where cd_tipo_bem_segurado = :radesc.cd_tipo_bem_segurado
and ROWNUM = 1;
begin
open c_teste ;
if c_teste%notfound then
mensagem ('Tipo Bem Segurado não Cadastrado.');
raise form_trigger_failure;
else
mensagem ('Achei');
end if;
close c_teste;
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; 

apesar de estar muito parecido com o do sergio e talves fazer a mesma função, testa esse pois se não for isso eu sei realmente o que você quer!!!!!!!!!!!
lelostyle
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Qui, 09 Jul 2009 9:59 pm
Localização: SP

Galera muito obrigado, ajuda de vocês foi de real importancia !!!
O problema tava em umas triggers antigas aqui que tinham, e como sou novo na area e também na empresa não conhecia.

Mas esses dois ultimos selects me ajudaram !!!
valeu

T+
Responder
  • Informação
  • Quem está online

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