Como chamar uma função

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
Laninha
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 68
Registrado em: Qua, 24 Out 2007 3:06 pm
Localização: Nilópolis - Rio de Janeiro

Galerinha,

Eu tenho a seguinte função abaixo:

Selecionar tudo

CREATE OR REPLACE FUNCTION CALCULA_DIVERGENCE (p_dtfrom in DATE, p_dtto in DATE)
RETURN number IS

--Declarando variáveis

V_UNID   NUMBER(4);




BEGIN
 
    BEGIN
      SELECT ff.id_unid_fornec            
        INTO V_UNID             
        FROM ffor_fat_fornec ff,
             itff_item_fat_fornec itff,
             itpe_item_pedido itpe
       WHERE ff.num_fat_fornec = itff.num_fat_fornec	
         and ff.id_unid_fornec = itff.id_unid_fornec
         and ff.cod_interno_fat_fornec = itff.cod_interno_fat_fornec
         and ff.id_instalacao_empresa_pedido = itff.id_instalacao_empresa_pedido
         and itff.num_pedido = itpe.num_pedido
         and itff.num_seq_item_pedido = itpe.num_seq_item_pedido
         and itff.cod_brasif_item = itpe.cod_brasif_item
         and ff.dt_emissao_fat_fornec BETWEEN TRUNC(p_dtfrom) and  TRUNC(p_dtto)
      

HAVING ((sum(nvl(itff.qtd_item_fat_fornec,0) + nvl(itff.qtd_free_fat_fornec,0)))=
        (sum(nvl(itpe.qtd_solicitada,0) + nvl(itpe.qtd_free_promocao,0) + nvl(itpe.qtd_free_desconto,0))))

GROUP BY ff.id_unid_fornec;
RETURN (V_UNID);
END;
END CALCULA_DIVERGENCE;
Pergunta: Como chama-la no forms na trigger PRE-QUERY???


Obrigada,
Laninha :D
Laninha
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 68
Registrado em: Qua, 24 Out 2007 3:06 pm
Localização: Nilópolis - Rio de Janeiro

Pessoal,

Eu não sei mais o que fazer já andei pesquisando em outros sites... Mas eu não consigo achar um jeito de chamar essa minha função dentro da minha PRE_QUERY, o que eu faço???


Obrigada,

Laninha :(
rodfbar
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 241
Registrado em: Ter, 09 Out 2007 11:15 am
Localização: Batatais - SP

esse topico tem q ser movido para o forms....


seguinte Laninha... existem varias maneiras de chamar a sua função dentro do pre-query

por exemplo:

1º vode pode ter uma variavel do mesmo tipo que vai retornar a sua funcao, neste caso um number, receber sua função

Selecionar tudo

  select funcao(parametros)
     into variavel
    from dual
--ou então
   variavel := funcao(parametros);
rodfbar
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 241
Registrado em: Ter, 09 Out 2007 11:15 am
Localização: Batatais - SP

completando

tambem pode ser direto em um if

Selecionar tudo

  if funcao(parametros) > 0 then
     /*bloco*/
   end if;
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

Laninha, boa tarde.

Desta forma abaixo dá algum erro?
Troque os valores (datas) pelos teus e faça um teste.

Selecionar tudo

DECLARE 
  v_retorno NUMBER := 0;
BEGIN
  v_retorno :=  CALCULA_DIVERGENCE (p_dtfrom => '19-nov-2007', 
		                                  p_dtto   => '31-dec-2007'); 

EXCEPTION
  WHEN OTHERS THEN 
		   message('Erro validando função:' || SQLERRM);		        
		   message('Erro validando função:' || SQLERRM);		        
     RAISE form_trigger_failure;					                          
 
END;  
Laninha
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 68
Registrado em: Qua, 24 Out 2007 3:06 pm
Localização: Nilópolis - Rio de Janeiro

Desculpe pessoal por ter posto minha pergunta no lugar errado, vou passar minha pergunta novamente pro item de FORMS e mais detalhada, ok???

Obrigada pela ajuda de vocês,
Laninha :)
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

Ok, mensagem movida para o grupo de FORMS.
Laninha
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 68
Registrado em: Qua, 24 Out 2007 3:06 pm
Localização: Nilópolis - Rio de Janeiro

Na verdade eu tenho PRE_QUERY abaixo:

Selecionar tudo

 def_where := '(dt_emissao_fat_fornec between to_date('''    
                  ||to_char(:blk_seletor.dt_from, 'mmddyyyy') 
                  ||''', ''mmddyyyy'')and to_date(''' 
                  ||to_char(:blk_seletor.dt_to, 'mmddyyyy') 
                  ||''', ''mmddyyyy'')OR '''||:blk_seletor.dt_from||''' is null
                  and '''||:blk_seletor.dt_to||''' is null)  
                  and status_fatura = '''||'ACCEPTED'||'''
                  and exists(select ffor_cargas_fornec.num_fat_fornec  
                               from ffor_cargas_fornec
                              where ffor_fat_fornec.num_fat_fornec = ffor_cargas_fornec.num_fat_fornec
                                and ffor_fat_fornec.id_unid_fornec =ffor_cargas_fornec.id_unid_fornec
                                and ffor_fat_fornec.id_instalacao_empresa_pedido = ffor_cargas_fornec.id_instalacao_empresa_pedido
                                and exists(select pedi_clas_envolve_pedido.num_pedido
                                             from pedi_clas_envolve_pedido
                                            where ffor_cargas_fornec.num_pedido = pedi_clas_envolve_pedido.num_pedido
                                              and exists(select clas_classe_item.cod_classe_item
                                             from clas_classe_item
                                            where clas_classe_item.cod_classe_item = '''||:category||'''
                                              and pedi_clas_envolve_pedido.cod_classe_item = clas_classe_item.cod_classe_item
                                              and pedi_clas_envolve_pedido.tipo_classe_item = clas_classe_item.tipo_classe_item
                                               OR '''||:category||''' is null)))
                                              and (id_unid_fornec = '''||:id_unid_emp||'''
                                               OR '''||:id_unid_emp||''' is null)'; 
Daria para setar dentro desse meu def_where a minha função? Ficaria como?


Abrços,
Laninha :D
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

Laninha, já tentou desta forma:

Selecionar tudo

def_where := '(dt_emissao_fat_fornec between to_date('''    
                  ||to_char(:blk_seletor.dt_from, 'mmddyyyy') 
                  ||''', ''mmddyyyy'')and to_date(''' 
                  ||to_char(:blk_seletor.dt_to, 'mmddyyyy') 
                  ||''', ''mmddyyyy'')OR '''||:blk_seletor.dt_from||''' is null 
                  and '''||:blk_seletor.dt_to||''' is null)  
                  and status_fatura = '''||'ACCEPTED'||''' 
                  -- como abaixo ou com as datas do teu próprio select!
                  --------------------------------------------------------------------------
                  and MEU_CAMPO_NRO = CALCULA_DIVERGENCE (''19-nov-2007'',''31-dec-2007'')
                  --------------------------------------------------------------------------
                  and exists(select ffor_cargas_fornec.num_fat_fornec  
                               from ffor_cargas_fornec 
                              where ffor_fat_fornec.num_fat_fornec = ffor_cargas_fornec.num_fat_fornec 
                                and ffor_fat_fornec.id_unid_fornec =ffor_cargas_fornec.id_unid_fornec 
                                and ffor_fat_fornec.id_instalacao_empresa_pedido = ffor_cargas_fornec.id_instalacao_empresa_pedido 
                                and exists(select pedi_clas_envolve_pedido.num_pedido 
                                             from pedi_clas_envolve_pedido 
                                            where ffor_cargas_fornec.num_pedido = pedi_clas_envolve_pedido.num_pedido 
                                              and exists(select clas_classe_item.cod_classe_item 
                                             from clas_classe_item 
                                            where clas_classe_item.cod_classe_item = '''||:category||''' 
                                              and pedi_clas_envolve_pedido.cod_classe_item = clas_classe_item.cod_classe_item 
                                              and pedi_clas_envolve_pedido.tipo_classe_item = clas_classe_item.tipo_classe_item 
                                               OR '''||:category||''' is null))) 
                                              and (id_unid_fornec = '''||:id_unid_emp||''' 
                                               OR '''||:id_unid_emp||''' is null)'; 
Laninha
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 68
Registrado em: Qua, 24 Out 2007 3:06 pm
Localização: Nilópolis - Rio de Janeiro

Não ainda não tentei, mas vou testar dessa maneira que você me falou, só que eu acho que sei porque está dando erro. Minha função traz mais de um registro, o que devo fazer???


Abraços,
Laninha :)
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, Laninha...

A função, deve obrigatóriamente, retornar UM valor.
À não ser que ela retorne um objeto (uma table pl/sql) mas, não sei se é o teu caso.

Verifique qual o propósito e, caso seja mesmo retornar mais de um valor, teria que fazer de outra forma.

Caso tenha que retornar apenas um valor, é da forma acima, como te passei um exemplo. Faz um teste "na mão" com a função, executando-a numa outra sessão e analisando os valores.

Aqui no fórum tem N exemplos de PL/SQL Table.

qualquer coisa, manda pra gente.
Laninha
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 68
Registrado em: Qua, 24 Out 2007 3:06 pm
Localização: Nilópolis - Rio de Janeiro

Amigos,

Precisava saber como faço uma função retornar mais de uma linha??



Abrços,
Laninha :D
Laninha
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 68
Registrado em: Qua, 24 Out 2007 3:06 pm
Localização: Nilópolis - Rio de Janeiro

Realmente era porque a função traz mais de um registro. Então porisso partir para a criação de uma procedure.



Obrigada pessoal,
:)
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

Oi Laninha,

aqui segue um exemplo de como retornar mais de um valor através de uma funçao.

Selecionar tudo

DECLARE
   TYPE rec_DADOS IS RECORD (CODIGO    NUMBER(3), 
                             DESCRICAO VARCHAR2(100));
   TYPE tb_DADOS IS TABLE OF rec_DADOS INDEX BY BINARY_INTEGER;
       
   tbl_DADOS_OLD     tb_DADOS;
   tbl_DADOS_NEW     tb_DADOS;
   
   PROCEDURE prc_POPULA_DADOS IS 
   BEGIN
      /* INCLUSAO DOS REGISTROS NA TEMP */
      tbl_DADOS_OLD(1).CODIGO    := 1;
      tbl_DADOS_OLD(1).DESCRICAO := 'CRISTIANO';
      --
      tbl_DADOS_OLD(2).CODIGO    := 2;
      tbl_DADOS_OLD(2).DESCRICAO := 'MARIA';
      --
   END;
   
   FUNCTION f_BUSCA_DADOS RETURN tb_DADOS IS
   BEGIN
      RETURN (tbl_DADOS_OLD);
   END;

BEGIN
   prc_POPULA_DADOS; --OLD
   
   -- PREENCHE A DADOS_NEW COM O MESMO CONTEUDO DA DADOS_OLD
   tbl_DADOS_NEW := f_BUSCA_DADOS;
   
   -- IMPRIMINDO OS DADOS
   FOR x IN 1..tbl_DADOS_NEW.COUNT LOOP
      dbms_output.put_line('Registro : '||tbl_DADOS_NEW(x).CODIGO||' - '||tbl_DADOS_NEW(x).DESCRICAO);
   END LOOP;
   
END;
nesse caso utilizei uma funcao, porém poderia ser uma procedure também.

[]'s
Responder
  • Informação
  • Quem está online

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