Recuperar valor anterior do item do bloco em tempo execuçao

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
mysturm
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 39
Registrado em: Sex, 31 Ago 2007 10:42 pm
Localização: são paulo

Caros,

Tenho um form de cadastro com três blocos e não quero repertir os valores da lov de cada um dos blocos, ficaria simples ao fazer um validate_item onde recupero da base se o valor já existe, mas quero fazer isso em tempo de execução antes de inserir na base.

Como faço para recuper esse registro anterior sem que o usuário tenha efetivado a inserção? Ou seja se estou no campo BLOCO.ITEM (2) como recupero o valor anterior BLOCO.ITEM (1).

Desde já agradeço a ajuda.

Abs, Myrella
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Não entendi direito o que você quer fazer :-(

Você tem 3 blocos. OK.
Tem 3 campos que REPETEM nos 3 blocos ?
Daí você quer popular o primeiro bloco com a LOV e o valor vai popular os outros 2 blocos automático ?
mysturm
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 39
Registrado em: Sex, 31 Ago 2007 10:42 pm
Localização: são paulo

Na verdade eu citei os meus tres blocos, por fazer parte de todo o form.

Mas para facilitar a explicação, vamos pensar que eu só tenha um bloco.

O campo que é populado por LOV não pode permitir escolher valores iguais, ou seja se no item 1 escolhi o valor A da LOV, no item 2 não posso escolher de novo o mesmo item.

Obrigada :-)
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Mas pra isso, basta você colocar na WHEN-VALIDATE-ITEM o teste!

NO BLOCO3

Selecionar tudo

IF bloco3.campo = bloco1.campo
OR bloco3.campo = bloco2.campo
THEN --MENSAGEM --> não pode repetir
.
.
.
END IF;
NO BLOCO2

Selecionar tudo

IF bloco2.campo = bloco1.campo
OR bloco2.campo = bloco3.campo
THEN --MENSAGEM --> não pode repetir
.
.
.
END IF;
etc


era isso ?
mysturm
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 39
Registrado em: Sex, 31 Ago 2007 10:42 pm
Localização: são paulo

Olá thomas,
Ainda não é isso.

Acredito que me expressei errado.

Estou mandando um print da tela.

A idéia é não deixar o usuario colocar duas bases iguais da lov, exemplo dado não posso deixar que ele insira novamente 'TRECHO DESTINO' ou 'OUTRAS BASES'.

O meu problema é que devo fazer isso antes de apertar o botão inserir.

No caso de atualização é fácil pois posso recuperar o valor da base, mas no caso da primeira inserção não estou sabendo como faz pois o valor ainda está em memória ainda não foi fisicalizado.

Desde já obrigada a todos os colegas que se dispõe a ajudar.

My
Imagem
marcio.adao
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 53
Registrado em: Sex, 18 Mai 2007 11:52 am
Localização: Descalvado

Olá, caro!

Não sei se entendi direito, mas se forem 2 campos de uma mesmo registro, você pode restringir no grupo de registros da LOV. Algo assim:

Selecionar tudo

Select campo
from tabela
where campo <> :bloco.campo1;
Abraço!
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

OK, entendi.

* Cada vez que você coloca algo num bloco, a informação NÃO VAI instantaneamente pro banco. Fica apenas dentro do FORMS. Por isso, se você fizer assim na LOV:

Selecionar tudo

select * from tabela
where chave not in (select chave from tabela_do_bloco... )
Isso nunca vai funcionar, pois as informações estão apenas no FORMS.

Uma forma de fazer IR PRO BANCO é colocar o comando POST após sair de cada linha. Esse comando envia pro ORACLE todas alterações feitas no forms. Ou seja, ele literalmente faz "por baixo dos panos" os comandos INSERT INTO tabela OU UPDATE..., etc... de cada alteração feita.

MAS esse comando não faz COMMIT. Ele apenas insere sem comitar.
Dessa forma, você consegue fazer a LOV da forma acima. Dai caso o usuário insira o código 10 na primeira linha, quando for na segunda linha e rodar a LOV, esse código 10 nem vai aparecer na listagem.
Gibson
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Ter, 11 Nov 2008 6:44 pm
Localização: São Paulo

Já usei essa do Dr. Gori. Funciona bem!!!

No caso eu usei o BLOCK_STATUS obrigando o usuário a salvar cada alteração antes de inserir outra linha.
Mas em caso de muitos registros não ficaria legal.

Acho que dá pra commitar usando o FORMS_DDL...

Vale a pena tentar!!

Abs.
Responder
  • Informação
  • Quem está online

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