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
Consulta com campos não base table
-
- Rank: Programador Júnior
- Mensagens: 21
- Registrado em: Qui, 10 Jan 2008 1:26 pm
- Localização: Portlo Alegre - RS
-
- 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.... )
SET_BLOCK_PROPERTY ( bloco, default_where.... )
-
- 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...
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...
-
- 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
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
where código_da_tabela = código_da_tela
-
- 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:
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]
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;
-
- 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.
-
- 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.
O que eu faria é um cursor com o select que você fez e iria criando os registros no bloco.
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;
-
- 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
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?

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?
-
- 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...
-
- Informação
-
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante