Consulta com campos não base table

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
jackie_0704
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qui, 10 Jan 2008 1:26 pm
Localização: Portlo Alegre - RS

Olá Pessoal,
Estou com uma dúvida. Tenho um form que guarda o histórico de alterações de preços de um produto, e este form tem um campo não base table chamado "codigo" (este código faz referência ao atributo "código" do form de cadastro de produtos).

O que eu preciso é o seguinte: no momento que eu digitar o código do produto no form de histórico e dar o comando "Query -> Execute" (do menu de ferramentas do oracle forms), eu gostaria que a consulta me retornasse SOMENTE as informações referentes ao produto na qual possui este código, e não todas as ocorrências, como está acontecendo agora.
Se puderem me passar um exemplo de código e em qual smart trigger colocar este código, eu ficaria muito agradecido.

Abraços
rafasch
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 23
Registrado em: Qui, 18 Out 2007 8:05 pm
Localização: Blumenau

Não basta setar a cláusulta where do bloco no momento em que validar o código digitado para buscar onde código da tabela seja igual ao código digitado?
SET_BLOCK_PROPERTY ( bloco, default_where.... )
jackie_0704
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qui, 10 Jan 2008 1:26 pm
Localização: Portlo Alegre - RS

Estou com um pouco de dificuldade para entender essa sua resposta.

Quando eu faço uma pesquisa desse tipo num campo que pertence ao form de histórico (ou seja, é base table), ele me retorna o código, descrição e preço apenas de um registro.

No caso desse código não base table. quero fazer uma busca pelo código "a124". Quando coloco esse critério de busca e dou em Execute, ao invés de o form me retornar apenas a descrição e o preço do produto referente à esse código, ele retorna as descrições e preços dos produtos de códigos diferentes também...
rafasch
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 23
Registrado em: Qui, 18 Out 2007 8:05 pm
Localização: Blumenau

Desculpe, se o bloco não é base table ele é populado manualmente em algum lugar... na post-query por exemplo, ou o bloco é baseado em um select?

Meu palpite é que ele é populado na post-query, então basta você adicionar o critério de seleção que quiser.
Deve existir um select populando o bloco, nesse select coloque na cláusula

Selecionar tudo

where código_da_tabela = código_da_tela
jackie_0704
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qui, 10 Jan 2008 1:26 pm
Localização: Portlo Alegre - RS

tentei fazer a seguinte query:

Selecionar tudo

begin
   select description, price, xxtr_history.start_date, xxtr_history.end_date
   into 
     :BLK_HISTORY2.TEXT_DESCR - descrição
    ,:BLK_HISTORY2.TEXT_PRICE - preço
    ,:BLK_HISTORY2.TEXT_START_DATE - data de abertura do preço
    ,:BLK_HISTORY2.TEXT_END_DATE -- data de fechamento do preço
   from XXTR_PRODUCTS, XXTR_HISTORY
    where code = :BLK_HISTORY2.TEXT_COD_PROD;
    
exception
	
	when no_data_found then message('excep 1');
	when too_many_rows then message('excep 2');
	when others then message('excep 3');
	
end;
Esse código eu pus na trigger when-validate-item no form de histórico. Ele compila, mas na hora de fazer a "Query-Execute" no banco, ele cai na execeção "too-many-rows".[/b]
jackie_0704
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qui, 10 Jan 2008 1:26 pm
Localização: Portlo Alegre - RS

ahhh, e o "code" na cláusula "where" é o atributo não base table.
rafasch
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 23
Registrado em: Qui, 18 Out 2007 8:05 pm
Localização: Blumenau

Se cai na exception too_many_rows é porque está retornando mais de uma linha , o que indica que o código não é a chave da tabela.
O que eu faria é um cursor com o select que você fez e iria criando os registros no bloco.

Selecionar tudo

declare cursor c is 
 select description, price, xxtr_history.start_date, xxtr_history.end_date
   into
     :BLK_HISTORY2.TEXT_DESCR - descrição
    ,:BLK_HISTORY2.TEXT_PRICE - preço
    ,:BLK_HISTORY2.TEXT_START_DATE - data de abertura do preço
    ,:BLK_HISTORY2.TEXT_END_DATE -- data de fechamento do preço
   from XXTR_PRODUCTS, XXTR_HISTORY
    where code = :BLK_HISTORY2.TEXT_COD_PROD;
begin

  go_block('bloco');
  first_record;

  for c1 in c loop

     if(:bloco.campo is not null)then
        do_key('create_record');
    end if; 
    
     :bloco.campo = c1.campo;
     e assim por diante...
  
  end loop;

end;
jackie_0704
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qui, 10 Jan 2008 1:26 pm
Localização: Portlo Alegre - RS

Primeiramente, obrigado pela sua ajuda até agora :o

Realmente, esqueci de mencionar, mas o atributo não base table "code" não é chave primária da tabela/form de produtos. A chave primária é o id do produto, mas essa informação de id não deve aparecer para o usuario, pois é uma informação que ele não precisa saber. É por isso que eu estou usando este "code". Que é o caso de estar caindo na exceção.

Vou tentar usar esse cursor que você me passou. Mas, onde tu sugere que eu coloque ele, ou seja, em qual trigger?
rafasch
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 23
Registrado em: Qui, 18 Out 2007 8:05 pm
Localização: Blumenau

Depende de como foi montada a tela...pode ser na validação do campo, você pode criar uma procedure com o código que popula o bloco e chamar em outros lugares...como na post-query do bloco em questão...realmente depende de como a tela foi feita...das funcionalidades que ela tem...etc...talvez num primeiro momento seja melhor colocar na when-validate-item do campo código e depois ir ajustando conforme as necessidades e os problemas que surgirem...
Responder
  • Informação
  • Quem está online

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