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