COMO BLOQUEAR O REGISTRO NO ACCESS USANDO VB6
Boa noite Galera,
Criei um função para gravar os produtos em ambiente multusuario.
O problema que na hora da gravação esta inserido resultados de outros usuarios e outras estações
Alguem pode me ajudar
a função e esta
dim NewFlag as boolean
set adoproduto = new adodb.recordset
sql =0
err =0
sql = [Ô]Select * from [Produto] Where trim(Orcamento)=[ô][Ô] & trim(txtorcamento) & [Ô][ô][Ô]
adoproduto.open sql, dborcamento, adopenstatic, adlockoptimistic
NewFlag = adoproduto.recordcount=0
adoproduto.close
if NewFlag then
insert to
else
update
endif
Criei um função para gravar os produtos em ambiente multusuario.
O problema que na hora da gravação esta inserido resultados de outros usuarios e outras estações
Alguem pode me ajudar
a função e esta
dim NewFlag as boolean
set adoproduto = new adodb.recordset
sql =0
err =0
sql = [Ô]Select * from [Produto] Where trim(Orcamento)=[ô][Ô] & trim(txtorcamento) & [Ô][ô][Ô]
adoproduto.open sql, dborcamento, adopenstatic, adlockoptimistic
NewFlag = adoproduto.recordcount=0
adoproduto.close
if NewFlag then
insert to
else
update
endif
Explique melhor colega
Bom dia Marcelo vou explicar o que esta acontecendo
Existe 10 estações trabalhando como o mesmo sistema ao mesmo tempo e quando 1 usuario vai gravar o seu orçamento esta
misturando com do outro usuario;Assim 1 produto seu e 1 produto meu entendeu ?
Existe 10 estações trabalhando como o mesmo sistema ao mesmo tempo e quando 1 usuario vai gravar o seu orçamento esta
misturando com do outro usuario;Assim 1 produto seu e 1 produto meu entendeu ?
Entendi, o que eu costumo fazer é o seguinte em um ambiente multiusuário.
ao abrir o form onde é preenchido o orçamento já grave o numero do id deste orçamento, com os demais dados em banco, e quando terminar de preencher este form ao invés de salvar apenas de um update, desta forma vc evitará erros, porque quando vc abre o formulário vc ja grava no banco um id e mantem este na tela, se outro usuário abrir o form dele irá salvar um novo id posterior ao seu, exemplo:
no Load do form de orçamento
Salva apenas o ID e mantém os outros campos em branco
INSERT INTO tabela(id) VALUES (Select Max(id) + 1)
o exemplo acima vai salvar o novo numero de id (isso se o campo não for autonumeração), e manterá este numero em um label ou textbox
após preencher os demais dados vc faz um update baseado no id que vc salvou
[Ô]UPDATE tabela SET nome=[ô]marcelo[ô],idade=[ô]40[ô], valor = [ô]R$ 200,00[ô] WHERE id = [Ô] & labelID.Caption
desta forma vc poderá contornar este erro, que deve estar ocorrendo pelo seguinte motivo.
quando você abre o form ja deve capturar o proximo ID e o mantém no form porém este não foi salvo no banco, então suponha que você abra seu form e coloque nele o ID 40 porém não o salvou no banco, quando um outro usuário abre o form dele o ID será 40 também, o que ocasiona o erro.
ao abrir o form onde é preenchido o orçamento já grave o numero do id deste orçamento, com os demais dados em banco, e quando terminar de preencher este form ao invés de salvar apenas de um update, desta forma vc evitará erros, porque quando vc abre o formulário vc ja grava no banco um id e mantem este na tela, se outro usuário abrir o form dele irá salvar um novo id posterior ao seu, exemplo:
no Load do form de orçamento
Salva apenas o ID e mantém os outros campos em branco
INSERT INTO tabela(id) VALUES (Select Max(id) + 1)
o exemplo acima vai salvar o novo numero de id (isso se o campo não for autonumeração), e manterá este numero em um label ou textbox
após preencher os demais dados vc faz um update baseado no id que vc salvou
[Ô]UPDATE tabela SET nome=[ô]marcelo[ô],idade=[ô]40[ô], valor = [ô]R$ 200,00[ô] WHERE id = [Ô] & labelID.Caption
desta forma vc poderá contornar este erro, que deve estar ocorrendo pelo seguinte motivo.
quando você abre o form ja deve capturar o proximo ID e o mantém no form porém este não foi salvo no banco, então suponha que você abra seu form e coloque nele o ID 40 porém não o salvou no banco, quando um outro usuário abre o form dele o ID será 40 também, o que ocasiona o erro.
Oi Marcelo entendir que vc falou só que o meu problema é o seguinte
em um form cadastro os dados do orçamento em uma tabela quando o usuario seleciona iniciar o sistema ja gravar o ID,Vendedor,Nome do Cliente e libera um outro form que deixa o mesmo escolher os produtos e quando ele selecione gravar o sistema faz aquela validação verificando se existe o orcamento e o codigo do produto.
Só que esta acontecendo que esta entrando um codigo nao selecionado por vc e sim seleciona por outro usuario junto ao seu entendeu
em um form cadastro os dados do orçamento em uma tabela quando o usuario seleciona iniciar o sistema ja gravar o ID,Vendedor,Nome do Cliente e libera um outro form que deixa o mesmo escolher os produtos e quando ele selecione gravar o sistema faz aquela validação verificando se existe o orcamento e o codigo do produto.
Só que esta acontecendo que esta entrando um codigo nao selecionado por vc e sim seleciona por outro usuario junto ao seu entendeu
então filho reveja tudo, com certeza este problema é codificação, o ideal seria vermos parte do código, pois isto não deveria acontecer.
você possui um ID do orçamento nesta tabela?
você possui um ID do orçamento nesta tabela?
sim, nas 2 tabelas CadOrcametno e CadProduto
sendo CadOrcamento=> Numero do orcamebnto, Vendedor, Cliente, Emissao,
CadProduto=> Numero do Orcamento, Codigo do produto, Descricao, Qte, Valor Total
e a funcção fica assim
dim NewFlag as boolean
set adoproduto = new adodb.recordset
sql =0
err =0
sql = [Ô]Select * from [Produto] Where trim(Orcamento)=[ô][Ô] & trim(txtorcamento) & [Ô][ô] and trim(CodProduto)=[ô][Ô] & trim(txtcodproduto) & [Ô][ô][Ô]
adoproduto.open sql, dborcamento, adopenstatic, adlockoptimistic
NewFlag = adoproduto.recordcount=0
adoproduto.close
if NewFlag then
insert to
else
update
endif
sendo CadOrcamento=> Numero do orcamebnto, Vendedor, Cliente, Emissao,
CadProduto=> Numero do Orcamento, Codigo do produto, Descricao, Qte, Valor Total
e a funcção fica assim
dim NewFlag as boolean
set adoproduto = new adodb.recordset
sql =0
err =0
sql = [Ô]Select * from [Produto] Where trim(Orcamento)=[ô][Ô] & trim(txtorcamento) & [Ô][ô] and trim(CodProduto)=[ô][Ô] & trim(txtcodproduto) & [Ô][ô][Ô]
adoproduto.open sql, dborcamento, adopenstatic, adlockoptimistic
NewFlag = adoproduto.recordcount=0
adoproduto.close
if NewFlag then
insert to
else
update
endif
anexo o arquivo com a funcao
Bom colega lendo parte do seu código entendi o seguinte:
Se o banco estiver vazio[txt-color=#0000f0] (MbAddNewFlag = adoProduto.RecordCount = 0) [/txt-color]você faz um INSERT, porém se não estiver vazio você faz um UPDATE, estou certo? creio que sim, porém após a primeira inclusão no banco de dados ele jamais ficará vazio novamente, a não ser que você exclua os dados, então será feito sempre um UPDATE, o que vai ocasionar o erro.
este é o problema de sua codificação.
o solução seria a ja postada por mim anteriormente, que seria a seguinte:
suponha que vc possua um tabela de nome ORCAMENTO, com os campos IDORC, IDVENDEDOR, NOMECLIENTE, só isso, e esta tabela está vazia.
então o PC1 abre o form para preencher os campos necessários, no load deste form você já irá salvar os dados
porém antes você irá pegar o ultimo id da tabela e criar um novo id veja abaixo:
primeiro você vai pegar o ultimo ID na tabela e somar 1
e guarda este id em um label
se o banco estiver vazio o id será 1
em seguida salva este ID na tabela
pronto você garantiu o seu lugar na tabela que ficará assim
IDORC| IDVENDEDOR| NOMECLIENTE
1 | |
agora suponha que outro usuário (PC2) abra a mesma tela, e o mesmo procedimento ocorra, porém como seu ID está salvo na tabela o ID dele será o 2 ficando assim
IDORC| IDVENDEDOR| NOMECLIENTE
1 | |
2 | |
agora o preenchimento de sua tela pronto, você não irá fazer o INSERT e sim o UPDATE baseado no numero que está no label
ficando assim
IDORC| IDVENDEDOR| NOMECLIENTE
1 | 020202 | joaquim
2 | |
não afetando o registro ja salvo pelo outro PC
não sei se consegui ser claro, mas este é o caminho.
Se o banco estiver vazio[txt-color=#0000f0] (MbAddNewFlag = adoProduto.RecordCount = 0) [/txt-color]você faz um INSERT, porém se não estiver vazio você faz um UPDATE, estou certo? creio que sim, porém após a primeira inclusão no banco de dados ele jamais ficará vazio novamente, a não ser que você exclua os dados, então será feito sempre um UPDATE, o que vai ocasionar o erro.
este é o problema de sua codificação.
o solução seria a ja postada por mim anteriormente, que seria a seguinte:
suponha que vc possua um tabela de nome ORCAMENTO, com os campos IDORC, IDVENDEDOR, NOMECLIENTE, só isso, e esta tabela está vazia.
então o PC1 abre o form para preencher os campos necessários, no load deste form você já irá salvar os dados
porém antes você irá pegar o ultimo id da tabela e criar um novo id veja abaixo:
primeiro você vai pegar o ultimo ID na tabela e somar 1
SELECT MAX(idorc) As ultimoID FROM orcamento
e guarda este id em um label
LblIDorc.Caption = Cint(RS!ultimoid) + 1
se o banco estiver vazio o id será 1
em seguida salva este ID na tabela
sSQL = [Ô]INSERT INTO orcamento(idorc) VALUES ([Ô] & LblIDorc,Caption & [Ô])[Ô]
pronto você garantiu o seu lugar na tabela que ficará assim
IDORC| IDVENDEDOR| NOMECLIENTE
1 | |
agora suponha que outro usuário (PC2) abra a mesma tela, e o mesmo procedimento ocorra, porém como seu ID está salvo na tabela o ID dele será o 2 ficando assim
IDORC| IDVENDEDOR| NOMECLIENTE
1 | |
2 | |
agora o preenchimento de sua tela pronto, você não irá fazer o INSERT e sim o UPDATE baseado no numero que está no label
sSQL = [Ô]UPDATE orcamento SET idvendedor = 020202, nomecliente = [ô]joaquim[ô] WHERE idorc = [Ô] & LblIDorc.Caption
ficando assim
IDORC| IDVENDEDOR| NOMECLIENTE
1 | 020202 | joaquim
2 | |
não afetando o registro ja salvo pelo outro PC
não sei se consegui ser claro, mas este é o caminho.
Ok entendir
só que neste caso aqui
sql = [Ô]Select * from [Produto] Where trim(Orcamento)=[ô][Ô] & trim(txtorcamento) & [Ô][ô] and trim(codproduto)=[ô][Ô] & trim(txtcodproduto) & [Ô][ô][Ô]
adoproduto.open sql, dborcamento, adopenstatic, adlockoptimistic
NewFlag = adoproduto.recordcount=0
o NewFlag tem q ser ZERO porque o SQL nao encontro a pesquisa e sendo assim insert caso contrario update
a nao ser q o resultado do NewFlag esteja errado assim cai na situação q vc descreveu agora
e é ai q nao to conseguindo entender o pq das misturas de informações
só que neste caso aqui
sql = [Ô]Select * from [Produto] Where trim(Orcamento)=[ô][Ô] & trim(txtorcamento) & [Ô][ô] and trim(codproduto)=[ô][Ô] & trim(txtcodproduto) & [Ô][ô][Ô]
adoproduto.open sql, dborcamento, adopenstatic, adlockoptimistic
NewFlag = adoproduto.recordcount=0
o NewFlag tem q ser ZERO porque o SQL nao encontro a pesquisa e sendo assim insert caso contrario update
a nao ser q o resultado do NewFlag esteja errado assim cai na situação q vc descreveu agora
e é ai q nao to conseguindo entender o pq das misturas de informações
RUKERT vamos supor que você iniciou o projeto agora pela primeira vez, então certamente o banco estará vazio NewFlag = 0
quando você incluir o primeiro registro irá funcionar normalmente, pois se NewFlag é 0 então será feito um INSERT.
porém quando outro usuário ou você mesmo for incluir um outro registro, NewFlag não será mais 0 e sim um, a partir dai serão feitos apenas UPDATES entendeu agora
ou coisa você declarou NewFlag como boolean (False or True), porém recordcount não é boolean, e sim integer, pois ele conta a quantidade de registros na tabela.
se você possuir 10.000 registros na tabela, Recordount = 10000, e não True e False.
quando você faz uma consulta via query, para saber se encontrou ou não, terá de fazer assim
o recordcount conta todos os registros da tabela entendeu, e não apenas o da consulta
quando você incluir o primeiro registro irá funcionar normalmente, pois se NewFlag é 0 então será feito um INSERT.
porém quando outro usuário ou você mesmo for incluir um outro registro, NewFlag não será mais 0 e sim um, a partir dai serão feitos apenas UPDATES entendeu agora
ou coisa você declarou NewFlag como boolean (False or True), porém recordcount não é boolean, e sim integer, pois ele conta a quantidade de registros na tabela.
se você possuir 10.000 registros na tabela, Recordount = 10000, e não True e False.
quando você faz uma consulta via query, para saber se encontrou ou não, terá de fazer assim
If (adoproduto.EOF = True And adoproduto.BOF = True) Then
[ô] não existe na tabela
Else
[ô] existe na tabela
End if
o recordcount conta todos os registros da tabela entendeu, e não apenas o da consulta
Tópico encerrado , respostas não são mais permitidas