Forms + raise form_trigger_failure + go_record

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 o seguinte problema:

Possuo um esquema de relação FUNCIONARIO(CPF, PNOME, SNOME, DEPARTAMENTO, CPF_GERENTE, SALARIO)
Esse meu esquema foi populado. Os CPFs com valores '00000000000', '11111111111'...'444444444444' são os CPFs dos gerentes. Nesses registros, CPF_GERENTE fica vazio. Os registros que possuem essas características não podem ser atualizados.

Tenho, obviamente, um módulo. Este se chama EMPRESA. Nesse módulo, se encontra o meu bloco FUNCIONARIO. Nesse bloco, eu tenho os itens que correspondem aos atributos da tabela (descritos no esquema de relação acima).

Criei uma trigger PRE-UPDATE no bloco FUNCIONARIO:

Selecionar tudo

declare
    alerta number;

if  :funcionario.cpf = '00000000000' or
    :funcionario.cpf = '11111111111' or
    :funcionario.cpf = '22222222222' or
    :funcionario.cpf = '33333333333' or
    :funcionario.cpf = '44444444444'
then
    number := show_alert('alerta_não_pode_atualizar');
    raise form_trigger_failure;
end if;

Descrição do problema: eu seleciono no menu do forms "executar consulta" e clico em "próximo registro". Os registros vão aparecendo (estão todos no canvas). Modifico algum atributo de algum registro que não tenha CPF de um gerente e a atualização ocorre perfeitamente. Clico em "próximo registro" até começar a aparecer os registros dos gerentes. Escolho um aleatoriamente, o que tem CPF = '33333333333' e modifico o seu salário, por exemplo. O alerta é mostrado adequadamente o o raise form_trigger_failure impede a modificação. CONTUDO, OS VALORES QUE ESTAVAM SENDO MOSTRADOS NA TELA SÃO MODIFICADOS SEMPRE PARA O PRIMEIRO REGISTRO GERENTE (que tem cpf = 00000000000, pnom = ..., snome = ...). Não importa qual dos registros de gerente eu escolha: sempre que tento atualizar, a mensagem aparece (é o desejado), a atualização é impedida (também desejado) e os valores mostrados em tela voltam ao valor do primeiro registro que pertence ao primeiro gerente cadastrado no banco de dados (não desejado).

Não estou entendendo isso. (1)Por que isso ocorre? (2) Tentei usar o go_record, utilizando ":SYSTEM.CURSOR_RECORD;" ou "Get_Block_Property( 'FUNCIONARIO', CURRENT_RECORD);" e não funcionou. A trigger compilou sem erros, mas no navegador dá o erro "procedimento restrito GO_RECORD na trigger PRE-UPDATE".

Por favor, me ajudem!
tora34
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 108
Registrado em: Qua, 12 Nov 2008 6:01 pm
Localização: Campo Mourão PR
Renato Pasquini
Oracle Developer

Bom dia,
eu implementaria de uma forma diferente.
Na trigger WHEN-NEW-RECORD-INSTANCE do bloco funcionário colocaria o seguinte:

Selecionar tudo

if  :funcionario.cpf in ('00000000000', '11111111111', '22222222222',  '33333333333',  '44444444444')
then
    set_block_property('FUNCIONARIO', update_allowed, property_false);
else
   set_block_property('FUNCIONARIO', update_allowed, property_true);
end if;
Assim, antes ao tentar alterar qualquer campo é apresentada mensagem padrão (que pode ser alterada) que não é permitido alterar o registro.
milhorini
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 26
Registrado em: Qua, 05 Dez 2012 7:28 am

Obrigado!

Para resolver o meu problema, eu tive de fazer o que você disse.
Quando eu lanço um form_trigger_failure, é como se o programa travasse e somente avançasse caso o problema fosse resolvido.

Quando devo usar um trigger_form_failure?
Responder
  • Informação
  • Quem está online

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