Acesso Simultâneo à Dados em aplicações Cliente / Servidor
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 !!!
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
Curtidas 0
Respostas
Codigodelphi
20/02/2004
Que banco de dados voc esta usando?
GOSTEI 0
Vivipeder
20/02/2004
Desculpe nao ter falado, esqueci. Uso Interbase !
GOSTEI 0
Vinicius2k
20/02/2004
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+
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+
GOSTEI 0
Vivipeder
20/02/2004
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!!!
- 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!!!
GOSTEI 0
Vinicius2k
20/02/2004
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 :
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...
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...
GOSTEI 0
Vivipeder
20/02/2004
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á!
GOSTEI 0
Vinicius2k
20/02/2004
blz. se eu puder ajudar em mais alguma coisa, estarei à disposição...
T+
T+
GOSTEI 0
Thomaz_prg
20/02/2004
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.
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.
GOSTEI 0