COMO BLOQUEAR O REGISTRO NO ACCESS USANDO VB6

RUCKERT 11/04/2012 20:15:32
#399648
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
MARCELO.TREZE 11/04/2012 20:54:45
#399650
Explique melhor colega
RUCKERT 12/04/2012 07:46:30
#399660
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 ?
MARCELO.TREZE 12/04/2012 08:13:53
#399662
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.



RUCKERT 12/04/2012 08:54:38
#399667
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
MARCELO.TREZE 12/04/2012 09:38:18
#399670
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?
RUCKERT 12/04/2012 09:54:02
#399671
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
RUCKERT 12/04/2012 10:00:17
#399672
anexo o arquivo com a funcao
MARCELO.TREZE 12/04/2012 12:05:54
#399685
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

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.

RUCKERT 12/04/2012 14:02:56
#399698
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

MARCELO.TREZE 12/04/2012 15:01:58
#399708
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

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





Página 1 de 2 [14 registro(s)]
Tópico encerrado , respostas não são mais permitidas