Verificar item duplicado

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
Avatar do usuário
tiago_pimenta
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 213
Registrado em: Qua, 29 Jun 2011 9:49 am
Localização: Barretos / SP

Senhores bom dia,

Estou com a seguinte dúvida, preciso fazer a verificação de duplicidade de um item, mas não encontrei nada parecido com o meu caso aqui no forum.

Quando eu gravo o primeiro item, ele não é gravado fisicamente na tabela, então não dá para eu fazer um select na base.

Teria alguma maneira de fazer isso direto no bloco ?

Grato

Att.

Tiago Pimenta
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

Existe o comando POST, que envia tudo pra banco, mas sem fazer commit. Só faz os updates, inserts, etc. Ou seja, se você fizer um POST, você pode fazer SELECT na base tranquilamente.

(no Forms, quando você dá o comando COMMIT ou COMMIT_FORM, ele primeiro dá um POST enviando tudo pro banco). Só depois ele faz um STANDARD.COMMIT, que é o COMMIT do banco.



:-o
Avatar do usuário
tiago_pimenta
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 213
Registrado em: Qua, 29 Jun 2011 9:49 am
Localização: Barretos / SP

dr_gori, primeiro obrigado por responder tão rápido, mas o meu caso eu precisava de fazer a validação no when-validade-item do código do item.

Ai que o bixo pega, pois como o item ainda não foi fisicamente para a tabela, está só na memória.

Abraços.
ederphil
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 52
Registrado em: Qua, 15 Out 2008 4:05 pm
Localização: taquara-RS

pois é, é isso que o dr_gori quis dizer, ao invés de validar no when-validate validaria no post,

mas qual é sua realidade? você tem um bloco multi record e quer validar se já existe dentro do próprio bloco? se for isso. você terá que varrer o bloco e ver se tem registros duplicados,

manda mais detalhes,


vlw!
Avatar do usuário
tiago_pimenta
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 213
Registrado em: Qua, 29 Jun 2011 9:49 am
Localização: Barretos / SP

Foi isso que eu quis dizer Eder, tenho um bloco multi record no qual eu preciso varre-lo no when-validate-item se já existe aquele item ou não.

Não posso fazer com select no banco, pois esses dados ainda não estão fisicamente gravados, estão alocados na memória ( Essa parte não sei como o forms armazena ), pois estão no bloco mas não vão para a tabela até eu dar commit.

[ ]s
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

Veja se você não consegue fazer POST em cada linha.
Como eu disse, quando você faz POST, os dados vão do bloco até o banco! Dai você pode fazer validações usando select sim.

(tem algumas triggers que são restritas e não suportam alguns comandos. Teria que ver se esse é um caso).

Leia sobre esse comando POST pra entender bem o que ele faz!
Avatar do usuário
tiago_pimenta
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 213
Registrado em: Qua, 29 Jun 2011 9:49 am
Localização: Barretos / SP

No meu caso não é indicado pelo seguinte:

1# Ele não grava na tabela se eu não salvar o registro, ou seja, posso ir no bloco filho e preencher 10 registros que ele fica alocado na memória.

2# No when-validade-item tem alguns processos que são realizados, então se eu já fizer essa verificação do item duplicado, eu não preciso rodar esses processos. Fora que também é melhor para o usuário, imagina ele digitar 20 campos e só depois eu falar para ele que já tem aquele item ?

[ ]s
ederphil
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 52
Registrado em: Qua, 15 Out 2008 4:05 pm
Localização: taquara-RS

ok,

você vai ter que varrer o bloco, algo do tipo >>

Selecionar tudo

DECLARE
	 
	vCampo      VARCHAR2(30) := :BLOCK.TEXT_ITEM;
	vDuplicados NUMBER 			 := 0;
	
BEGIN
	
	FIRST_RECORD;
	
	LOOP
		
		IF :BLOCK.TEXT_ITEM = vCampo THEN
		
		  vDuplicados := vDuplicados + 1;
		
		END IF;
				
		IF :SYSTEM.last_record = 'TRUE' THEN
		
		  EXIT;
		
		ELSE
		
		  NEXT_RECORD;
		
		END IF;
		
		IF vDuplicados > 1 THEN
			
			MESSAGE('Registro duplicados');
			MESSAGE('Registro duplicados');
			
		END IF;
		
	  END LOOP;
	
	
	END;

qualquer coisa posta ai!

vlw!
Avatar do usuário
tiago_pimenta
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 213
Registrado em: Qua, 29 Jun 2011 9:49 am
Localização: Barretos / SP

Valeu Eder, acho que era isso mesmo que eu procurava ;)

[ ]s
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

1# Ele não grava na tabela se eu não salvar o registro, ou seja, posso ir no bloco filho e preencher 10 registros que ele fica alocado na memória.
Acho que até agora você não entendeu o que faz o comando POST.

POST é um comando do forms. Este comando justamente pega todos as linhas do seu BLOCO (que estão na memória) e envia pro banco, mas SEM COMITAR... Só faz os INSERTS e UPDATES, mas não faz COMMIT.

Com isso é possível fazer SELECT, pois seus dados passaram do FORMS pro banco. O post "transforma" tudo que você alterou/criou em comandos SQL e aplica no banco sem comitar.
Editado pela última vez por dr_gori em Qua, 29 Jun 2011 3:05 pm, em um total de 1 vez.
Avatar do usuário
tiago_pimenta
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 213
Registrado em: Qua, 29 Jun 2011 9:49 am
Localização: Barretos / SP

dr_gori, agora que eu entendi, me desculpe.

[ ]s
Responder
  • Informação