sexta-feira, 6 de junho de 2008

Eliminando o registro corrente de um SelectOneChoice

Galera desculpa pela demora nos posts.

Hoje é uma dica bastante interessante para a galera que desenvolve aplicativos com muitas ligações.
Em nosso cenário teremos uma página de cadastro, aonde o VO base irá conter uma ligação apontando para a mesma tabela base.
/* Tabela Processos
Atributo Id not null
Atributo Nome not null
Atributo Status not null
Atributo Data not null
Atributo Acao not null
Atributo Processo_Pai null - Atributo com uma FK apontando para a propria Tabela Processos.
*/
Em nossa Página o atributo processo_pai não é obrigatório, assim possibilita o usuário a deixar nulo o campo, deixando ele alterar o registro em um outro acesso vinculando o processo_pai ao mesmo Id do registro, assim o registro ficará errado.
A forma de tratarmos esse erro é listar todos os processos, menos o processo corrente, travando o usuário de cometer o erro.

O Primeiro passo é:

Criarmos um VO da seguinte forma:
/*
SELECT *
FROM Processos tp
where tp.Processo_id <> :procId
-- procId é a variavel que irá trazer o registro corrente
*/
Declare a variável procId nos "Bind Variables".

Na Página de cadastro no campo Processo_Pai adicione o componente SelectOneChoice baseado no VO que acabamos de criar.

Na PageDef de nossa Página criar uma Action "ExecuteWithParams" amarrando a variável com parâmetro #{bindings.Id} que é o Id do VO base da página.

Dentro da pasta Executables criar um InvokeAction com as seguintes informações:
* Id: // Nome que desejar
* Binds: ExecuteWithParams // Ação que executa o VO com os parâmetros
* Refresh: IfNeeded // Atualização
* RefreshCondition: ${not adfFacesContext.postback} // Condição de execução.

Assim toda a vez que entrar na Página esse InvokeAction será chamado, e a condição do parâmetro será executada.

Deixando sua aplicação mais segura contra erros do usuário.

Até a próxima.

Nenhum comentário: