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???
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???
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?
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)';
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???
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.
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.