Como tratar somente os atributos alterados?

6 respostas
C

Como podemos enviar para o serviço somente os atributos que foram alterados numa janela?
Exemplo: tenho dois usuários que usam a mesma tela de um sistema, os dois entram e carregam o objeto com os dados que estavam na persistência naquele momento (data de vencimento e valor). O primeiro altera a data de vencimento. O segundo altera o valor. O primeiro manda salvar. O segundo manda salvar. A informação do segundo do campo data de vencimento sobrepõe ao salvamento da alteração do primeiro. COMO EVITO ISSO? CONSIGO IDENTIFICAR QUE ATRIBUTOS FORAM ALTERADOS? CONSIGO ENVIAR PARA O MEU SERVIÇO DE UPDATE SOMENTE OS QUE FORAM ALTERADOS?

6 Respostas

L

Olá Cris,

bom, existe uma solução simples para saber quais atributos de uma determinada tela foram alterados…
Logo na abertura da tela, vc mantém em memória uma estrutura de dados com os valores vindos do banco.
Esta estrutura pode ser a que vc preferir, mas eu aconselharia uma instância de uma classe com os atributos que podem ser alterados.
Assim, no momento da gravação, vc poderia comparar o valor novo de cada atributo com o antigo (presente na estrutura em memória), e gravar apenas o q foi alterado.
Sacou?
Se bem que, pelo que vc escreveu, acho que vc quer mesmo é bloquear (ou anular) a edição de determinados valores de uma tela, caso estes tenham sido alterados depois que a tela foi aberta. É isso mesmo?

C

Leiras,

Pensamos em criar estes objetos, o problema é que as classes são grandes (numa janela tenho 15 classes, e cerca de 150 atributos no total) e achamos que talvez a memória na sessão não aguentaria.
Não queremos bloquear na tela, mas ter uma forma mais inteligente de passar somente os atributos alterados, alguma forma de identificá-los e mandar salvar no banco somente estes, para não correr o risco de sobrepor alteração de outros usuários indevidamente.

Obrigada pela primeira resposta.

R

Olá a Todos!

Vou tentar explicar melhor o problema da Cris (nós trabalhamos juntos no mesmo projeto e empresa) para obtermos uma reposta mais objetiva do problema.

O nosso sistema é WEB e utilizamos SOA (Web Services). A questão torna-se complicada quando pensamos em na concorrencia dos dados. Se um usuário carrega uma tela de alteração de cliente e um outro usuário carrega o mesmo cliente para alterar (ao mesmo tempo), quem submeter por ultimo vai sobrescrever as alterações do primeiro.

A nossa idéia foi tentar travar a classe(ou a instacia da classe) que contem os dados de usuário para permitir que somente UMA pessoa possa manter esta classe de cada vez. Seria como se esta classe fosse global para a aplicação… Não sei se é melhor solução, mas como fazer isso? Lembrando que Web Service não guarda estado, então não dá pra saber se tem um usuário ou mais usuários acessando a funcionalidade “alterar”…

Aguardamos sugestões!

Abraços !

Renan

F

Cara,
problemas como esse sao muito foda…

Pra mim eh um risco que se corre…
quem gravar por ultimo eh quem define os dados… se esta gravacao sobreescreveu valores
alterados anteriormente… azar, a ultima gravacao que vai valer

Uma alternativa eh criar formulario menores, com informacoes bem relacionadas…
tipo, quando vou editar usuario, nao abre uma tela com todas as informacoes do usuario…
deve-se escolher se vai editar informacoes pessoais, endereco, informacoes profissionais, etc.

Mas se vcs precisam muito disso…

E postem a solucao q encontrarem!! :wink:

R

Olá!

Na verdade, não estamos pensando em solução(pelo menos ainda!)… tipo que achamos que isso é um risco que qualquer app web corre…
Mas deve ter como evitar isso…

qualquer coisa posto o resultado aqui!

Até!

F

Bom, tem uma alternativa sim…

Criar 2 metodo para carregar os valores, um que carrega normal, sem fazer
lock
E outro que carrega e da um lock na entidade…

Sendo que se o cara vai abrir somente para visualizar, tu chama o load normal…

Se for para editar, tu chama o load and lock. Dai se outro tentar usar esse,
tu manda algum aviso que nao esta disponivel no momento pois outra edicao esta sendo feita.

Se o cara gravar, cancelar ou estourar por algum timeout, tu tira o lock dessa entidade! :wink:

Criado 24 de maio de 2006
Ultima resposta 26 de mai. de 2006
Respostas 6
Participantes 4