SUB_WHERE

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

Oi ,
Preciso de uma ajuda: Eu criei um SUB_WHERE dentro da trigger PRE_QUERY do bloco onde quero que traga os dados de consulta de acordo com o que eu jogar nos parâmetros do outro bloco, sendo que essa SUB_WHERE abaixo não está funcionando, preciso saber se está correto?


Exemplo: Eu tenho meu primeiro bloco não basetable com os seguintes parâmetros: Data Início e Data Fim e o segundo bloco já é basetable onde deverá trazer os dados de consulta de acordo com o que eu jogar nos parâmetros acima. Então esse SUB_WHERE abaixo está correto ou tem outra maneira de fazer?

Selecionar tudo

BEGIN
   DECLARE
   block_id Block := find_block('POOP2');
   sub_where VARCHAR2(512);
   def_where VARCHAR2(2000);

FUNCTION add_and(
 P_WHERE IN VARCHAR2
) RETURN VARCHAR2 IS
BEGIN
   IF (nvl(length(P_WHERE),0) !=0)then
      RETURN(P_WHERE||'AND');
   ELSE
      RETURN(P_WHERE);
   END IF;
END;

BEGIN

   sub_where := NULL;
   
   IF(:BLK_SELETOR.DT_FROM IS NOT NULL)THEN
      sub_where := add_and(def_where)||':FFOR_FAT_FORNEC.DT_EMISSAO_FAT_FORNEC';     
   END IF; 

   IF(sub_where IS NOT NULL)THEN
      def_where := add_and(def_where)||'(SELECT DT_EMISSAO_FAT_FORNEC '||'FROM FFOR_FAT_FORNEC
      WHERE (DT_EMISSAO_FAT_FORNEC BETWEEN :BLK_SELETOR.DT_FROM AND :BLK_SELETOR.DT_TO)'||sub_where||')';       
   END IF;
   
   set_block_property('FFOR_FAT_FORNEC',DEFAULT_WHERE,def_where);


 
     
END;  
END; 
Obrigada,
Luana. :D
rodfbar
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 241
Registrado em: Ter, 09 Out 2007 11:15 am
Localização: Batatais - SP

bom dia...

tenta setar o where do bloco com a data contendo um NVL

tipo:

def_where := add_and(def_where)|| 'DT_EMISSAO_FAT_FORNEC BETWEEN ''' || nvl(:BLK_SELETOR.DT_FROM, to_date('01/01/1900','DD/MM/YYYY')) || ''' and ''' || nvl(:BLK_SELETOR.DT_TO,to_date('01/01/3000','DD/MM/YYYY'))'';

set_block_property('FFOR_FAT_FORNEC',DEFAULT_WHERE,def_where);

tendo que tomar cuidado para no caso de já existir uma where no bloco para não substitui-ls caso não seja esse seu interesse, dai você concatena o com o where já existente...


eu particularmante sempre seto o bloco com nvl pois para o usuario tipo poder escolher apenas data de inicio ou a data de fim... o range fica mais dinamico....
bom foi só uma dica :wink:

um exemplo usado num pre query q fiz esses dias atraz

V_WHERE := V_WHERE || 'DT_ORCAMENTO BETWEEN TO_DATE(''' || NVL(TO_CHAR(:FILTRO.DT_INICIAL,'DD/MM/YYYY'),'01/01/1991') ||''',''DD/MM/YYYY'')
AND TO_DATE(''' || NVL(TO_CHAR(:FILTRO.DT_FINAL,'DD/MM/YYYY'),'01/01/3991') ||''',''DD/MM/YYYY'')'


abrçs
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

Continua dando problema... Ou seja, não trazendo nada.
Pode ser a versão do Forms, pois aqui estou com o Forms 5.0.
Bom, fiz tudo que você falou, mas mesmo assim Obrigada pela ajuda.
rodfbar
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 241
Registrado em: Ter, 09 Out 2007 11:15 am
Localização: Batatais - SP

você por colocar seu pre_query ai pra gente ver como ficou?
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Dando uma olhada por cima (não cheguei a testar o código, então posso estar errado):

1 - A variável def_where não está sendo inicializada em nenhum momento, logo o where que você está montando irá substituir o where padrão do bloco (não sei se esta era a intenção).

2 - no where final está saindo algo do tipo:

Selecionar tudo

'(SELECT DT_EMISSAO_FAT_FORNEC FROM FFOR_FAT_FORNEC WHERE (DT_EMISSAO_FAT_FORNEC BETWEEN :BLK_SELETOR.DT_FROM AND :BLK_SELETOR.DT_TO) :FFOR_FAT_FORNEC.DT_EMISSAO_FAT_FORNEC)'
o que não faz muito sentido na cláusula where do bloco (o select DT_EMISSAO... não é comparado com nenhum campo, por exemplo...)

você por acaso estaria tentando retornar os registros de FFOR_FAT_FORNEC com DT_EMISSAO entre as datas informadas no bloco não base table?

se for isso, tente colocar apenas o código abaixo na pre-query:

Selecionar tudo

declare
   v_where varchar2(600);
begin
   v_where := 'dt_emissao between nvl(to_date('''
           ||to_char(:blk_seletor.dt_from, 'yyyymmddhh24miss')
           ||''', ''yyyymmddhh24miss''), trunc(sysdate)) and nvl(to_date('''
           ||to_char(:blk_seletor.dt_to, 'yyyymmddhh24miss')
           ||''', ''yyyymmddhh24miss''), trunc(sysdate)+.99999)';

   set_block_property('FFOR_FAT_FORNEC', DEFAULT_WHERE, v_where);
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

Obrigado rogenaro, funcionou realmente!!!
Obrigado também rodfbar pela ajuda você também me ajudou!!!
Espero sempre poder contar com vocês e vocês comigo também...

Um abraço,
Luana.
Responder
  • Informação
  • Quem está online

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