Página 1 de 1

Duplicidade

Enviado: 17 Mar 2005 14:40
por MikeKlr
Amigos Clippeiros,

Tenho um sistema relativamente pesado em clipper 5.3 + blinker + CDX + w2k server, ele tem um DBF principal que hoje está com aprox 400MB e 1.200.000 registros, tudo está funcionando normalmente nos acessos da rede em todas as rotinas.

Porém ultimamente vem acontecendo um problema que não consegui solucionar, o cenário é o seguinte :
São vários computadores cadastrando clientes ao mesmo tempo, uso arquivos .mem para controlar a autonumeração do código dos clientes e orçamentos, abro o .mem, pego o nro atual, adiciono +1 no nro, e gravo. o problema é que algumas vezes na semana está dando uma duplicidade, acho que por ser vários cadastrando ao mesmo tempo, coicide o milisegundo exato da gravação do .mem de 2 ou 3 terminais ao mesmo tempo e grava errado.

Gostaria de saber como vocês fazem pra controlar autonumeração? (sem usar recno() ou go bottom)

Desde já agradeço.

Enviado: 17 Mar 2005 20:14
por Augusto
Amigo eu faço exatamente como vc... só que eu uso um DBF só p/ controlar a numeração.
Abro com RLOCK(), pego o número jogo p/ memória, incremento 1 e gravo, UNLOCK para o próximo usuário...

Caso o numero não seja usado... eu dou como perdido...

Comigo funciona... não se vai te ajudar...

Enviado: 18 Mar 2005 10:44
por Hasse
Bom dia amigos.

Eu uso da seguinte forma:

ARQLOCK()
&&................. nenhum outro usuário tem acesso ao arquivo para fazer alterações.
APPEND BLANCK
UNLOCK
&& .................liberar o arquivo para todos os usuários.
4) RLOCK()
&& .................para o usuário local fazer o seu trabalho.
5) UNLOCK
&& .................Libera o registro.
6) DBCOMMIT()
&& .................Dá visibilidade do dados à rede.

Os 4 primeiros comandos efetuam as operações muito rapidamnente. Nem se percebe o que está ocorrendo.

Fizemos vários teste preparando 5 terminais para fazerem a solicitação ao mesmo tempo, e a um comando todos os 5 foram acionados, os 5 novos registros foram adicionados, e somente um ou dois chegam a fazer a 2ª tentativa (ver abaixo, a explicação 'tentativas').

Observação: Para os comandos ARQLOCK(), APPEND BLANCK, RLOCK() uso funções que eu criei, que fazem 10 tentativas, uma a cada 0,5 segundo, e somente depois retornam mensagem informando o ocorrido para que seja tomada a decisão pertinente.

O sistema está rodando fazem 8 anos e ainda não tive qualquer número duplicado.

Espero ter contribuído com algum detalhe.

Hasse.

Enviado: 18 Mar 2005 11:11
por MikeKlr
obrigado pelos comentários, irei testar substituindo o .mem que uso atualmente por um DBF pra armazenar o "próximo número"

Sucesso a todos.

Enviado: 18 Mar 2005 12:30
por Dudu_XBase