Function no Forms

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
thatifc
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Qui, 03 Mai 2007 5:35 pm
Localização: São Paulo - SP

Boa tarde!
Por favor, como eu faço para chamar uma função (do banco) no Forms?
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Thati,

Num botão teu, ou numa procedure:

Selecionar tudo

 
 DECLARE 
   V_RETORNA_NOME VARCHAR2(200);
 BEGIN
   V_RETORNA_NOME := PCK_BANCO.FUN_RETORNA_NOME(1);   
	END;  

-- Onde no exemplo anterior você joga o Nome da pessoa, passando o código.

OU

Um outro exemplo:


Num CURSOR DO Forms:

Selecionar tudo

	
CURSOR CUR_DADOS
  IS  	
				SELECT ENDERECO,
				       PCK_BANCO.FUN_BUSCA_NOME(ID) Nome
				  FROM T_ENDERECO;
qualquer coisa, manda ai.
thatifc
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Qui, 03 Mai 2007 5:35 pm
Localização: São Paulo - SP

Trevisolli,

Primeiro, obrigada pela resposta!!
Mas não está dando certo...
Olha só:
Problema original: No forms, eu preciso fazer um where dinâmico. Tentei fazer como faço no Reports, carregando um parameter e chamando ele na query, mas não deu certo porque vezes eu preciso fazer
'And campox = variável"
e outras vezes

Selecionar tudo

And campox In (1, 2, 3)
Então, não consegui tratar o "=" e o "In". Foi aí que tive a idéia de fazer uma função de banco, que retorna um cursor... Dentro dessa function, eu trato as duas situações, e ele retorna o cursor certo.
Agora, eu preciso dar um jeito de receber o retorno da função no forms, abrir o cursor e carregar meus campos...
Quando tento fazer da primeira forma que você postou, ao compilar o trigger do botão, recebo a seguinte msg:

Selecionar tudo

PDE-PSD001 Could not resolve reference to <Unknown Program Unit> while loading Block PI5_25_OCT_200713_12_37.
Sabe o que é isso??
thatifc
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Qui, 03 Mai 2007 5:35 pm
Localização: São Paulo - SP

Só um complemento:
A variação na clausula where deve-se porque o usuário pode:
* não informar o parametro (null);
* Selecionar um item.
* Ou selecionar 'n' itens.

Então seria:

Selecionar tudo

And campox = Nvl(parametro, campox)
ou

Selecionar tudo

And campox In (parametro1, parametro2, parametro3, ...)
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Estou montando um exemplo de Pre_query e já posto aqui.
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Thati,

Crie uma tabela com 3 campos (chamada teste):

Selecionar tudo

ID
NOME
CHEFE
E faça um teste com este exemplo aqui e, qualquer coisa, dá um alô.

Nota importante: A trigger PRE-QUERY do bloco Teste, é onde você irá realizar o teu "Where dinâmico" ok?
thatifc
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Qui, 03 Mai 2007 5:35 pm
Localização: São Paulo - SP

Trevisolli,

Dei uma olhada no forms exemplo... Mas vi que você setou o where do block. O que acontece é: O bloco que preciso carregar não é base table, então, não dá para eu fazer isso... foi por isso que comecei essa história de fazer a function... A primeira coisa que fiz antes disso foi salvar a clausula (string) num campo para usar ele no cursor, passando ele como parametro do cursor... Mas fazendo dessa forma, eu tenho que montar a clausula no where do cursor e fazer a comparação com o parametro que recebo... E aí que dá pau: Não consegui tratar para usar "In" ou "="....
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Então, essa tratativa de se ter o "in" ou o "=", pode ser feita com sql dinâmico.

Aqui no fórum tem vários exemplos.

Dá uma procurada por DINÂMICO que vai achar vários exemplos, como esta DICA do Dr_Gori:

http://www.glufke.net/oracle/viewtopic. ... din%E2mico

qualquer coisa, manda ai.
rodfbar
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 241
Registrado em: Ter, 09 Out 2007 11:15 am
Localização: Batatais - SP

boa tarde thatifc

você precisa criar um bloco, um cursor ou uma consulta com esse where dinamico?

se for um bloco a melhor forma de fazer é criar um bloco baseando em clausula from ou setar o default_where do bloco


abrçs
thatifc
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Qui, 03 Mai 2007 5:35 pm
Localização: São Paulo - SP

Ok Trevisolli, darei uma olhada nesses posts.

De qualquer forma, muito obrigada pela ajuda!!

:wink:
thatifc
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Qui, 03 Mai 2007 5:35 pm
Localização: São Paulo - SP

Então rodfbar, eu preciso criar um cursor com esse where dinâmico. Mas não dá pra setar o where do bloco porque não é base table.
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Thati,

Em último caso, pode basear este teu bloco numa Procedure ou numa View, se assim achar mais fácil.
rodfbar
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 241
Registrado em: Ter, 09 Out 2007 11:15 am
Localização: Batatais - SP

ok... se você tem o bloco fica mais facil...

não sei se tem algum exemplo aqui no forum... mais cria um bloco data_base baseado em clausula from

1º - na trigger pre-query do mesmo você tem uma variavel que vai armazenar a string do seu sql que você pode criar normalmente
2º - setar o bloco a propriedade do bloc com tua strig

obs: seus itens que você retorna no sql no bloco devemt er o mesmo nome, o mesmo tamanho, serem do mesmo tipo de dados, e serem data_base

ex:

Selecionar tudo


declare 
  v_sql varchar2(32767);
begin
  v_sql := '(select cd_pessoa,nm_pessoa from pessoa';
  --  
  if :filtro.ativos = 'S' then
    v_sql := v_sql || ' where st_ativo in(''N'',''C''))';
  elsif 
    v_sql := v_sql || ' where st_ativo in(''A''))';
  end if;
  --
  set_block_propert(:system.cursor_block,query_data_source_name,v_sql);
end;


espero q sirva...
abrçs
rodfbar
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 241
Registrado em: Ter, 09 Out 2007 11:15 am
Localização: Batatais - SP

ops vou mehlorar..

Selecionar tudo

declare 
  v_sql varchar2(32767); 
begin 
  v_sql := '(select cd_pessoa,nm_pessoa from pessoa'; 
  --st_ativo A-ativos  N-desativados C-Cancelados
  if :filtro.ativos = 'T' then  --todos não cancelados 
    v_sql := v_sql || ' where st_ativo in(''S'',''N''))'; 
  elsif :filtro.ativos = 'A'  then --ativos
    v_sql := v_sql || ' where st_ativo in(''A''))'; 
  elsif  :filtro.ativos = 'C'  then --cancelados
  	v_sql := v_sql || ' where st_ativo in(''C''))';
  elsif  :filtro.ativos = 'N'  then --desativados
  	v_sql := v_sql || ' where st_ativo in(''C''))'; 	 
  else
  	v_sql := v_sql || ')';
  end if; 
  -- 
  set_block_propert(:system.cursor_block,query_data_source_name,v_sql); 
end;

Avatar do usuário
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 342
Registrado em: Seg, 29 Jan 2007 7:36 am
Localização: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

Pessoal, aproveitando a polêmica do tópico, realmente não é possível fazer um Where dinâmico num cursor 'estático' na situação de se ter 'IN', '=' ou nada??? :(

desculpem a ignorância, já se falou um monte aqui, mas é que não ficou muito claro mesmo, já que seria uma mão na roda ter essa possibilidade!
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother,

Não entendi o que quis dizer com 'cursor estático' mas, where dinâmico no forms, sem problemas, dá pra se fazer sim.
Avatar do usuário
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 342
Registrado em: Seg, 29 Jan 2007 7:36 am
Localização: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

o Cursor convencional, Paulão..

o dinâmico é aquele que a gente tem que definir as colunas, e que utilizamos o comando Parse pra executar o SQL etc, o que eu quis dizer com 'estático' é o outro:

Selecionar tudo

CURSOR nome_do_cursor IS
  SELECT * FROM...
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Cara, no caso do cursor, o correto seria se montar um pl/sql dinâmico, por exemplo, utilizando a DBMS_SQL que você citou brother.

Daí você faz o loop e trabalha normalmente.

Existem vários exemplos aqui no fórum sobre sql dinâmico.

qualquer coisa, manda ai brother.
Avatar do usuário
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 342
Registrado em: Seg, 29 Jan 2007 7:36 am
Localização: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

beleza Paulão, eu saquei

só comentei mesmo que seria bem melhor se não precisasse utilizar o DBMS., o código ficaria muito mais enxuto

mas paciência, vâmos fazendo da maneira que é possível
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Então brother,

Dependendo da situação, um Execute Immediate também serve.

Veja este exemplo que o Tineks (Cristiano) colocou no fórum:

http://glufke.net/oracle/viewtopic.php? ... ht=execute

qualquer coisa, manda ai.
Responder
  • Informação
  • Quem está online

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