DOIS USUARIO EDITANDO UM CADASTRO AO MESMO TEMPO

MOREIRA 01/07/2010 15:25:12
#346299
Olá pessoal, preciso de uma rotina que impeça que mais de um usuário edite ao mesmo tempo um Cadastro..
ou seja, o usuário X esta com um cadastro de Maria da silva na tela, Então o Usuário Y, nao poderá editar o mesmo...

dando um msgbox de aviso....

uso o db mysql
MICROSCHEME 01/07/2010 16:05:19
#346307
Cara.

Essa dica é do Marcelo-Treze.

Gravei ela, pois achei interessante a imposição em que um sistema em rede impõe necessidades, em que o programador
tem que se virar, pra que não digam que seu sistema não é bem bolado e todos fiquem felizes.

Se funfar, todos os créditos são do mano [txt-color=#e80000][txt-size=2]Marcelo-Treze[/txt-size][/txt-color], Blz . . .


On Error GoTo TrataErro [ô]Caso ocorra um erro ele irá para a rotina TrataErro
Set banco = OpenDatabase(App.Path & [Ô]\db5.mdb[Ô]) [ô]Abro o banco de dados
Set tborc = banco.OpenRecordset([Ô]PedOrc[Ô], dbOpenTable, dbDenyWrite) [ô]Abro a tabela como dbDenyWrite - ou seja o banco de dados ficará disponível apenas para essa pessoa .

TrataErro: [ô]Caso de erro ( outra pessoa tenta abrir a base de dados virá para essa rotina )
If MsgBox([Ô]Não é possível efetuar esta operação no momento. Aguardar?[Ô], vbYesNo + vbQuestion, [Ô]Orçamentos e Pedidos[Ô]) = vbYes Then [ô]Faço um pergunta se deseja esperar a liberação da base de dados
Resume [ô]Se quiser esperar, mando o Resume para que o programa continue da linha que deu o erro
Else [ô]Senão
Unload Me [ô]Fecho a tela
End If


. . .

JCARLOS 01/07/2010 16:41:22
#346314
O problema no exemplo do Marcelo-treze é que se o usuário ficar namorando o form por muito tempo, ninguém mais vai acessar esta tabela pra fazer alteração até que ele faça a alteração e libere a tabela.
Uma outra forma seria montar um controle de alterar na tabela somente os campos que sofreram alteração, aí preservaria alterações feitas em outros campos por outro operador.
Outra forma também seria ao consultar, atualizar imediatamente um campo de status no cadastro tipo=1 em manutenção após alterar, atualizar o status para 0=liberado. Assim o próximo que acessar o sistema checaria o status, se for 1, dá a msg dizendo que está em uso e pedindo pra aguardar. neste caso, travaria só o registro e não a tabela inteira.
Bem, pode ter outras sugestões que com certeza virão dos amigos internaltas.
Abraços.
MARCELO.TREZE 01/07/2010 18:31:23
#346336
JCarlos tem Tem razão, esta é uma discução que vem se arrastando, de ante mão gostaria de agradecer o colega MICROSCHEME, pelos créditos, mas este código também não é meu, é resultado de uma pesquisa na net, e lógico é um código de longa data, realmente existe o problema de uma pessoa bloquear o registro por um longo tempo, isto inclusive é explicado no tópico em que abordo sobre abrir como DenyWrite.

Voltando ao que o colega JCARLOS disse, a solução postada por ele foi a melhor que encontrei para evitar problemas.

*o Melhor deste forum é isso, usuários buscando melhor forma desenvolvimento


então boa sorte.

RICATOM 01/07/2010 19:52:08
#346353
Usava este mesmo esquema que o colega JCARLOS comenteu, mas tive uns problemas de micro travar, reinicar e o registro ficar marcado como [Ô]sendo editado[Ô] ai tinha que orientar o cliente a roda uma rotina para [Ô]desbloquear[Ô] o registro, ai criei a minha propria solução.

A solução foi criar a mesma logica que o Access usa. Quando vc abre um arquivo mdb o Access cria outro arquivo com extensao ldb, isso indica que ele esta aberto.

Entao faço o seguinte, qdo um registro vai ser editado, crio um arquivo txt renomeado para lck, exemplo: clie00001.lck e mantenho esse txt aberto enquanto o registro estiver sendo editado. Se outro usuario tentar editar aquele registro, primeiro verifico se existe o txt e tento exclui-lo, se estiver aberto ele retornara um erro pois nao é possível excluir um arquivo aberto, e desta forma sei que esta sendo editado e o usuario recebe uma mensagem para tentar mais tarde

Uso isso a anos em sistemas com 20, 30 maquinas e numca deu problema.
MICROSCHEME 02/07/2010 18:04:17
#346418

Quanto ao problema de um usuário tirar um cochilo com o aplicativo aberto dê uma olhada neste link:

http://www.vbmania.com.br/pages/index.php?varModulo=Forum&varMethod=abrir&varID=339256&varWorld=

Nele eu passei prum camarada um pequeno aplicativo que faz o logout do usuário caso a inatividade alcance um tempo pré determinado

é só baixar e verificar se por acaso não te ajuda quanto a inatividade com os bancos abertos

. . .

GREGO 03/07/2010 08:47:04
#346438
fala ai galera!

estou um pouco sumido, mas achei interessante fazer um comentário neste post!

verificar se 2 pessoas estão mexendo ao mesmo tempo no mesmo registro acho um pouco de preciosismo porque:

se 1 usuário altera o cadastro, e depois de alterado outro usuário abre o mesmo cadastro vê que foi alterado ele pode mudar de novo, e o as alterações do primeiro usuário tbm vão se perder!

isso entra mais na política da empresa mesmo:

eu acho que não precisa fazer um controle desse para impedir que 2 usuários ao mesmo tempo altere um cadastro de cliente, mas este tipo de alteração sempre usar transação no banco de dados! SEMPRE!

vamos imaginar outro caso

Tenho 2 caixas que ao mesmo tempo estão vendendo o produto A, os 2 caixa enxergavam que o produto A tem 5 unidade no estoque, o primeiro caixa esta vendendo a qta 1 de A e o caixa dois esta vendendo a qtd 2 de A, temos duas formas de atualizar o estoque:

caixa A

qtdAntigo = 5
qtdVendido = 1

update tabela set estoque = qtdAntigo - qtdVendido

desta forma provavelmente de problemas se os 2 caixa estiverem fazendo a venda do mesmo produto

mas se atualiza assim

update tabela set estoque = estoque - qtdVendido

ja n tera mais problema

tudo isso com controle de transação em!

mas para resolver o problema de 2 pessoas estarem alterando o mesmo cadastro de cliente, o ideal e mesmo fazer um log com as alterações do cadastro, mostrando o que foi mudado, quando, por quem foi alterado, valor anterior e valor atualizado.

esse sim seria o controle perfeito, mas eu sei que fazer log é um saco, e muitas vezes não é feito porque imaginam que não terá muitos benefícios, mas quando o software se torna grande e as informações que estão nes se tornam importantes este tipo de informação de log é fundamental.

imaginem em uma empresa que tenha um cliente que faça todo mes uma compra de 2 milhões de reais!, ai chega um cara e altera o endereço de entrega deste cliente. ai os produtos não são entregues no endereço correto e a empresa corre o risco de perder este cliente vocês não acham que seja fundamental ter um log para saber quem foi o Zé que alterou o cadastro deste cliente, e qual era o endereço anterior?

valew gente
MOREIRA 03/07/2010 13:14:40
#346449
Bom pessoal, boa tarde a todos, o que eu desejo fazer é o seguinte: Esse é um modulo de telemarketing.. quanto o usuário X chamar um cadastro para sua tela.. não deixar o usuário Y Usar esse registro.. ou seja, está reservado ao usuário X...


Tópico encerrado , respostas não são mais permitidas