GARANTIR DESCONTO

Fórum Acesso Simultâneo à Dados em aplicações Cliente / Servidor #215649

20/02/2004

0

Galera, continuo com probleminhas em minha aplicação para rede. Testando, descobri um detalhe. estou numa tela de cadastro, com determinado código (autoincremento). Na maq do lado, na mesma tela, o código tbem está igual. Qdo cadastro no 1º computador, ele salva legal. Mas no computador do lado, se eu cadastrar, ele irá alterar o cadastro que havia feito.

Gostaria de saber, se há como evitar isso. Tipo, qdo estiver incluindo em outro computador, dar um aviso de que este registro já foi incluído por outro usuário!

Desde já, muito obrigada !!!


Vivipeder

Vivipeder

Responder

Posts

20/02/2004

Codigodelphi

Que banco de dados voc esta usando?


Responder

Gostei + 0

20/02/2004

Vivipeder

Desculpe nao ter falado, esqueci. Uso Interbase !


Responder

Gostei + 0

20/02/2004

Vinicius2k

Vivi,
bem, vamos começar pelo seu autoincremento... que no IB não existe, a não ser através de triggers... como vc tah fazendo?

T+


Responder

Gostei + 0

20/02/2004

Vivipeder

Bem Vinicius, na verdade, nesta tela minha, meu autoincremento é um pouco diferente. Geralmente crio um Generator no Interbase e controlo com uma Trigger. Mas só em determinados cadastros. Nesta tela, o q faço é o seguinte:

- qdo abro a tela, busco na Tabela o último registro. Dele, pego o código e somo 1. No meu button ´Salvar´ eu verifico se este código já existe. Se existir, dou Update, senão Insert. É que a tela está estruturada de tal forma, que o código será um dos existentes, somente se apessoa ´consultar´ um registro. O campo do código é desativado para edição. Mas neste caso, na rede, não dá certo, pois como disse, em ambos os computadores, a tela é aberta no modo de inserção. Só que o primeiro q salvar correrá o risco de ter o registro modificado caso o computador do lado salve ´por cima´.

O problema está consistindo nisso, no computador ´X´ a tela abre com código, p ex, 1 e no computador ´Y´, a tela tbem abrirá com código 1. Isso se for ao mesmo tempo. O que acontecerá é que se ´X´ salvar primeiro e ´Y´ depois, o registro de código 1 será substiutido, ficando com as informações feitas em ´Y´.

O q posso fazer para controlar este acesso simultaneo usando este tipo de controle ??? Pensei em talvez numa rotina de verificação para ver se há mais um computador aberto na mesma tela, mas não há como, entende ?

Espero ter explicado um pouco melhor o meu problema.... Obrigada por estar me ajudando!!!


Responder

Gostei + 0

20/02/2004

Vinicius2k

Vivi,

Acho q entendi e a situação, em si é meio inesperada... perdõe-me caso eu não tenha entendido corretamente... mas veja a idéia :

- qdo abro a tela, busco na Tabela o último registro. Dele, pego o código e somo 1. No meu button ´Salvar´ eu verifico se este código já existe. Se existir, dou Update, senão Insert. É que a tela está estruturada de tal forma, que o código será um dos existentes, somente se apessoa ´consultar´ um registro.


então, sempre será insert caso o usuário não consulte o registro antes correto?

-> faça uma query com buscando o max do seu código e acrescentando 1 apenas na hora de salvar (max é mais rápido do que dar select em tudo e ir para o último registro)... para que ocorra o erro os dois usuários terão que clicar no botão salvar no mesmo milésimo de segundo... pouco provável... um risco infinitamente pequeno, mas é um risco...
eu fazia assim nos tempos do clipper e até mesmo com delphi+paradox pq não gostava de usar o autoincrement do paradox... NUNCA me aconteceu duplicação de código... tenho alguns sistemas trabalhado 10 ou mais terminais, o tempo todo, na mesma tela, inserindo registros, com esta estrutura...

espero ter ajudado...


Responder

Gostei + 0

20/02/2004

Vivipeder

Obrigado Vinicius, ajudou sim.... Valeu e desculpe se te enrolei um pouquinho! Vou tentar implementar o q disse, caso contrário, entro no forum de novo, tá!


Responder

Gostei + 0

20/02/2004

Vinicius2k

blz. se eu puder ajudar em mais alguma coisa, estarei à disposição...
T+


Responder

Gostei + 0

25/02/2004

Thomaz_prg

Apenas para demonstrar uma outra forma, porque é a que eu usava com tabelas Paradox, poiis tbém não gosto do autoincremento é a seguinte:

crio uma tabela apenas para controle do código (ou códigos se for mais de um sistema), e na hora em que o usuario entre na tela de inserção, é incrementado o valor desta tabela, e repassado ao campo ´autoincrementável´.

Exemplo.
Estrutura da tabela de clientes
//
se tabcodigos estiver vazia, cadastra valor 1 e retorna
senão altera valor do campo ucodcli somando + 1 (ucodcli:=ucodcli+1).
//
daí a o campo codcli da tabela de clientes recebe o valor do campo ucodcli da tabela tabcodigos.
//
cod_cli = tabcodigos.ucodcli
nome
endereco

estrutura da tabela tabcodigos.
ucodcli


* No caso de se usar mais de uma tabela, cada campo da tabela tabcodigos será referante a uma tabela.

Sei que talvez não tenha ajudado, porém acho que é sempre bom conhecer várias formas de se fazer.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar