Bloquear atualização de um registro

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
milhorini
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 26
Registrado em: Qua, 05 Dez 2012 7:28 am

Eu tenho um esquema de relação FUNCIONARIO(*CPF, PNOME, SNOME, NOME_DEPARTAMENTO, SALARIO)

Eu entrei com vários registros. Alguns são registros do gerente, que não podem ser atualizados.

No forms, quando eu clicar em "executar consulta", se o registro mostrado tiver um CPF igual a alguns valores, quero que a atualização seja impedida para todos os itens.

Para isso, eu fiz um trigger pre-update

Selecionar tudo

declare
	
	alerta number;

begin
	
	if :funcionario.cpf = 'x' or 
		 :funcionario.cpf = y' or
		 :funcionario.cpf = 'z' or
		 :funcionario.cpf = 'w'
	then	
		
		set_block_property('funcionario', UPDATE_ALLOWED, PROPERTY_FALSE);
		raise form_trigger_failure;
		
	else
		
		set_block_property('funcionario', UPDATE_ALLOWED, PROPERTY_TRUE);
		
	end if;
	
	exception
		when form_trigger_failure then
			alerta := show_alert('alerta_atualizacao_não_permite');
			
	
end;
Esse trigger não está bloqueando a atualização. Quando utilizo um set_item_property, também não funciona.
Quando não trato o form_trigger_failure, a atualização é impedida para os registros que desejo, contudo parece que aquele registro que lançou a exceção fica congelado. As variáveis que possuem os valores retornados do banco não mudam. Mudam em tela, somente!

Em outras palavras, no caso em que não trato a exceção: ao encontrar um registro que pertence a um gerente, eu tento modifica-lo. Uma mensagem de alerta é mostrada e a atualização é impedida. Ao continuar a navegar ("próximo registro"), encontro um outro registro que não é de um gerente. Tento modifica-lo. Deveria ser possível a sua atualização, contudo o mesmo alerta é mostrado. É como se os itens ainda estivessem com os mesmos valores do registro de gerente.

Alguém pode me explicar melhor como funciona o raise form_trigger_failure e como posso fazer para bloquear um registro em determinadas situações?

Obrigado!
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

Eu faria da seguinte forma pra bloquear:
Na POST-QUERY, ou seja, pra cada registro que vier do banco, eu executar uma SET_ITEM_INSTANCE_PROPERTY, utilizando UPDATE_ALLOWED false, e INSERT_ALLOWED false sempre que a linha corrente satisfazer a sua condição.

Caso contrário, executa o SET_ITEM_INSTANCE_PROPERTY com UPDATE_ALLOWED = true, e INSERT_ALLOWED também.

Dessa forma a linha fica bloqueada e você pode navegar livremente no bloco sem se preocupar com nada. :-o
milhorini
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 26
Registrado em: Qua, 05 Dez 2012 7:28 am

Obrigado!!!
Responder
  • Informação
  • Quem está online

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