PROBLEMAS COM USO MULTIUSUARIO
Bom dia...
Pessoal estou com um problema no uso do meu sistema quando usado por mais de um usuario, tenho um sistema em DAO e uso Access97 que roda a mais de 5 anos sem problemas em desktop e normalmente usado por um usuario, mas algum tempo atras coloquei o sistema em rede e inicialmente em duas maquinas e agora em 3 maquinas, e a partir de então começou a dar alguns probleminhas rsrsrs... começou a aparecer cadastros de clientes duplicados, por algum motivo na hora de salvar ou alterar alguns cadastros esta salvando no NSU de outros clientes ou seja substituindo cadastros existentes.
Eu uso por exe.:
[Ô]Set RSBoletos = DbCAS.OpenRecordset([Ô]boletos[Ô], dbOpenDynaset)[Ô]
no [Ô]Form_Load[Ô], seria melhor usar apenas no ato de [Ô]salvar[Ô] ou [Ô]consultar[Ô] [Ô]excluir[Ô]
isso ajudaria?
Sei que ADO e outro tipo de banco dados é melhor, mas de imediato preciso resolver o problema com o que tenho, pois migrar tudo vai demandar um tempo razoavel e não da pra fazer isso de imediato.
Alguem poderia me dar uma ideia.
Claudiney
www.cassystems.com.br
Pessoal estou com um problema no uso do meu sistema quando usado por mais de um usuario, tenho um sistema em DAO e uso Access97 que roda a mais de 5 anos sem problemas em desktop e normalmente usado por um usuario, mas algum tempo atras coloquei o sistema em rede e inicialmente em duas maquinas e agora em 3 maquinas, e a partir de então começou a dar alguns probleminhas rsrsrs... começou a aparecer cadastros de clientes duplicados, por algum motivo na hora de salvar ou alterar alguns cadastros esta salvando no NSU de outros clientes ou seja substituindo cadastros existentes.
Eu uso por exe.:
[Ô]Set RSBoletos = DbCAS.OpenRecordset([Ô]boletos[Ô], dbOpenDynaset)[Ô]
no [Ô]Form_Load[Ô], seria melhor usar apenas no ato de [Ô]salvar[Ô] ou [Ô]consultar[Ô] [Ô]excluir[Ô]
isso ajudaria?
Sei que ADO e outro tipo de banco dados é melhor, mas de imediato preciso resolver o problema com o que tenho, pois migrar tudo vai demandar um tempo razoavel e não da pra fazer isso de imediato.
Alguem poderia me dar uma ideia.
Claudiney
www.cassystems.com.br
Cara.....na vdd assim
Em qual momento vc percebeu a zica? é na inclusão do q? alteração do q?
SINKERTEC, valeu pela atenção...
não sei ao certo quando, mas deduzi que seja na hora de fazer alguma alteração no cadastro ou inclusão de num novo cadastro, quando usado simultaneamente.
Não consegui detectar o momento do erro.
Claudiney
www.cassystems.com.br
não sei ao certo quando, mas deduzi que seja na hora de fazer alguma alteração no cadastro ou inclusão de num novo cadastro, quando usado simultaneamente.
Não consegui detectar o momento do erro.
Claudiney
www.cassystems.com.br
Olha..eu penso assim
Trabalhando do jeito que vc está trabalhando....em cada tabela que pode ser aberta simultaneamente...teria q criar um campo flag, onde por exemplo se eu puxar o cliente código 2 pra alterar , esse flag = 1...e nenhum outro usuario conseguira mexer nesse cadastro até o flag voltar a 0
qto a inserção, o certo é criar codigos de autonumeração..aà mata essse bo
boa sorte
SINKERTEC,
muito interessante sua ideia, mas vc poderia me mostrar ou dar um exemplo de como implantar este metodo de flag no mdb?
não tenho idéia de como fazer,
Claudiney
www.cassystems.com.br
muito interessante sua ideia, mas vc poderia me mostrar ou dar um exemplo de como implantar este metodo de flag no mdb?
não tenho idéia de como fazer,
Claudiney
www.cassystems.com.br
Cara..seria algo mais ou meno assim
Vc tem a tabela clientes com os campos lá e tal, certo? Crie, só mais um campo (Flag)
Toda vez que incluir um Cliente, no registro, coloca o flag como 0 (zero)
Qdo a pessoa chama o registro do cliente pra alterar, vc faz um edit no registro, simplesmente pra atualizar o flag para 1..
e claro..na chamada que vc usa pra trazer o registro a ser alterado, vc coloca sendo q se o flag = 1, retorne a msg para o usuário ( Cliente sendo alterado por outro usuário, aguarde)
Qdo o primeiro usuário confirmar a alteração, atualiza junto o flag para 0, liberando o registro
entendeu?
Ao Sinkertec...
E se o primeiro usuário não confirmar a alteração e deixar o registro trancado?
O que acontece se o primeiro usuário não confirmar a alteração e a máquina dele trancar?
E se o primeiro usuário não confirmar a alteração e deixar o registro trancado?
O que acontece se o primeiro usuário não confirmar a alteração e a máquina dele trancar?
Na vdd assim...se n fizer uma coisa, fara outra certo?
Caso n confirme...tipo...saia da tela ou n cofirme a alteração, basta dar um edit novamente...retornando o flag para zero, liberando o registro da mesma forma!!
Ou por acaso, vc quer dizer se a luz acabar por exemplo e o registro ficar trancado?
Eu acredito que esteja acontecendo o seguinte:
duas pessoas acessam praticamente ao mesmo tempo o banco de dados, e se vc possuir um campo que seja autonumerado, então as duas irà o pegar o mesmo id, só que ao salvar uma irá salvar com os dadod e um cliente e outra com os dados de outro cliente a que salvar por ultimo prevalecerá.
será que não é isto
bom se for isso vc pode tentar abrir o banco para que apenas uma pessoa mexa por vez
[ô]Quando for preciso usar o banco de dados utilize esse método de
[ô]abertura de banco
[ô]O que acontece com esse código é o seguinte. 2 usuários vão abrir a
[ô]mesma tela, para gravar um código de cliente ( exemplo ). Pela lógica
[ô]você não pode ter o mesmo número de registro para 2 clientes distintos,
[ô]correto? Intão, essa rotina faz com que por mais preciso que os 2
[ô]apertem o botão de incluir ( exemplo do cliente ) nunca abrirá nas 2
[ô]máquinas. Um deles terá a base aberta, o outro irá para a rotina de erro
[ô]até que a liberação da base seja feita.
[ô]Problemas: se você abrir a base e esquiecer de fechá-la, ninguem da sua
[ô]rede conseguirar acessar a tabela enquanto a mesma estiver aberta
[ô]nesse modo.
[ô]Soluções: garantia de que quando você for incluir, alterar ou excluir um
[ô]registro, saberá que o mesmo será feito sem nenhum problema.
[ô]PS: abre o banco de dados desse jeito ( mostrado acima ) apenas para
[ô]rotinas de inclusão, alteração e exclusão de registros. Para consulta
[ô]troque o dbDenyWrite para dbReadOnly.
veja se ajuda
duas pessoas acessam praticamente ao mesmo tempo o banco de dados, e se vc possuir um campo que seja autonumerado, então as duas irà o pegar o mesmo id, só que ao salvar uma irá salvar com os dadod e um cliente e outra com os dados de outro cliente a que salvar por ultimo prevalecerá.
será que não é isto
bom se for isso vc pode tentar abrir o banco para que apenas uma pessoa mexa por vez
[ô]Quando for preciso usar o banco de dados utilize esse método de
[ô]abertura de banco
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
[ô]O que acontece com esse código é o seguinte. 2 usuários vão abrir a
[ô]mesma tela, para gravar um código de cliente ( exemplo ). Pela lógica
[ô]você não pode ter o mesmo número de registro para 2 clientes distintos,
[ô]correto? Intão, essa rotina faz com que por mais preciso que os 2
[ô]apertem o botão de incluir ( exemplo do cliente ) nunca abrirá nas 2
[ô]máquinas. Um deles terá a base aberta, o outro irá para a rotina de erro
[ô]até que a liberação da base seja feita.
[ô]Problemas: se você abrir a base e esquiecer de fechá-la, ninguem da sua
[ô]rede conseguirar acessar a tabela enquanto a mesma estiver aberta
[ô]nesse modo.
[ô]Soluções: garantia de que quando você for incluir, alterar ou excluir um
[ô]registro, saberá que o mesmo será feito sem nenhum problema.
[ô]PS: abre o banco de dados desse jeito ( mostrado acima ) apenas para
[ô]rotinas de inclusão, alteração e exclusão de registros. Para consulta
[ô]troque o dbDenyWrite para dbReadOnly.
veja se ajuda
MARCELO_TREZE,
bom dia...
olha perfeita sua idéia é o que eu preciso, muito obrigado.
Agora uma pergunta:
eu uso o [Ô]banco.OpenRecordset[Ô] no [Ô]Form_Load[Ô], o correto então é usar apenas no ato de [Ô]salvar[Ô] ou [Ô]consultar[Ô] [Ô]excluir[Ô] ?
mais uma vez obrigado.
Claudiney
www.cassystems.com.br
bom dia...
olha perfeita sua idéia é o que eu preciso, muito obrigado.
Agora uma pergunta:
eu uso o [Ô]banco.OpenRecordset[Ô] no [Ô]Form_Load[Ô], o correto então é usar apenas no ato de [Ô]salvar[Ô] ou [Ô]consultar[Ô] [Ô]excluir[Ô] ?
mais uma vez obrigado.
Claudiney
www.cassystems.com.br
seria o ideal, pois assim nà o correria o rsico de manter o recordset aberto, ok
lembre-se apenas de abri-lo e fecha-lo para não bloquear o acesso de outro usuário.
lembre-se apenas de abri-lo e fecha-lo para não bloquear o acesso de outro usuário.
Tópico encerrado , respostas não são mais permitidas