CODIGO SEQUENCIAL
Boa Noite amigos!!
Estou gerando automaticamente um código sequencial quando gravo um registro em meu banco Mysql da seguinte maneira:
Dim NovoCódigo As Double
Dim rs As ADODB.Recordset
Dim sql As String
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseServer
rs.Open [Ô]select * from ultimoscodigos[Ô], conn, adOpenStatic, adLockOptimistic, adCmdText [ô] usado para pegar o novo código
NovoCódigo = rs!Colaboradores
NovoCódigo = NovoCódigo + 1
rs.Close
rs.Open [Ô]UPDATE ultimoscodigos SET Colaboradores = [Ô] & NovoCódigo & [Ô] , conn, adOpenStatic, adLockOptimistic, adCmdText [ô] usado para pegar o novo código
Text2.Text = NovoCódigo
Até aà tudo bem, gera o código certinho, porém quando existem dois usuários em máquinas diferentes, que clicam no novo ao mesmo tempo, ele gera o mesmo código nas duas!!!
alguém tem alguma sugestão de como posso gerar um novo código sem usar o Autoincremento do próprio Mysql?
Jones Paris
Estou gerando automaticamente um código sequencial quando gravo um registro em meu banco Mysql da seguinte maneira:
Dim NovoCódigo As Double
Dim rs As ADODB.Recordset
Dim sql As String
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseServer
rs.Open [Ô]select * from ultimoscodigos[Ô], conn, adOpenStatic, adLockOptimistic, adCmdText [ô] usado para pegar o novo código
NovoCódigo = rs!Colaboradores
NovoCódigo = NovoCódigo + 1
rs.Close
rs.Open [Ô]UPDATE ultimoscodigos SET Colaboradores = [Ô] & NovoCódigo & [Ô] , conn, adOpenStatic, adLockOptimistic, adCmdText [ô] usado para pegar o novo código
Text2.Text = NovoCódigo
Até aà tudo bem, gera o código certinho, porém quando existem dois usuários em máquinas diferentes, que clicam no novo ao mesmo tempo, ele gera o mesmo código nas duas!!!
alguém tem alguma sugestão de como posso gerar um novo código sem usar o Autoincremento do próprio Mysql?
Jones Paris
eu sugiro a voce que GERE o código quando voce SALVAR os Dados e nao quando voce Clicar no Botão novo....mesmo voce colocando isso no botão SALVAR e se dois usuarios clicar ao mesmo tempo...os Códigos não vão se Repetir..sempre vai pegar o Ultimo + 1...faça o teste...coloque esse código do Botão SAlvar...
sabe como reduzi este problema, fiz assim:
assim que acesso o formulário de inclusão já salvo no banco o novo código com o identificador do usuário, depois quando salvar os dados dou apenas o update.
exemplo:
abro o form--->já salva no banco (003,id dousuario)
enquanto digito os dados que serão salvos se outro usuário acessar o mesmo form será salvo (004,id dousuário), então isto evita o problema, depois basta eu fazer apenas um update destes dados.
ps: claro se os dois usuário abrirem o form exatamente no mesmo segundo poderá surgir um erro, mas isso é muito mais dificil de acontecer.
assim que acesso o formulário de inclusão já salvo no banco o novo código com o identificador do usuário, depois quando salvar os dados dou apenas o update.
exemplo:
abro o form--->já salva no banco (003,id dousuario)
enquanto digito os dados que serão salvos se outro usuário acessar o mesmo form será salvo (004,id dousuário), então isto evita o problema, depois basta eu fazer apenas um update destes dados.
ps: claro se os dois usuário abrirem o form exatamente no mesmo segundo poderá surgir um erro, mas isso é muito mais dificil de acontecer.
pode se contornar facil isso ai, veja bem.. quando vai gravar o codigo, verifique se o codigo ja esta cadastrado no banco.. se tiver, de um +1 no ultimo registro.. ou seja, vc exibiu la quando clicou no botao incluir o codigo 00020 .. mas outro usuario da rede foi la e conseguiu gravar primeiro o cadastro que corresponde ao 20, antes de dar o insert por exemplo.. faça um select no ultimo registro, se ja tiver o codigo 00020 voce pode ou dar uma mensagem para o usuario, ou senao refazer sua funçao acima.. para ele pegar o codigo 00021.. sacou?
Eu criei uma função para isso:
Public Function ProximoCodigo(vTabela As String, vCampo As String, vCondicao As String)
Dim RsProximo As New ADODB.Recordset
Sql = [Ô]SELECT MAX([Ô] & Trim(vCampo) & [Ô]) AS CODIGO FROM [Ô] & Trim(vTabela) & [Ô][Ô] & vCondicao & [Ô][Ô]
RsProximo.Open Sql, Conexao, adOpenKeyset, adLockReadOnly
If IsNull(RsProximo([Ô]CODIGO[Ô])) = True Then
ProximoCodigo = 1
Else
ProximoCodigo = RsProximo([Ô]CODIGO[Ô]) + 1
End If
RsProximo.Close: Set RsProximo = Nothing
End Function
Chamando:
Rs([Ô]ID_TABELA[Ô]) = ProximoCodigo([Ô]TABELA[Ô], [Ô]ID_TABELA[Ô], [Ô][Ô])
Sempre coloco na hora de gravar e não na hora de abrir o form ou ao clicar no botão [Ô]novo[Ô]
Public Function ProximoCodigo(vTabela As String, vCampo As String, vCondicao As String)
Dim RsProximo As New ADODB.Recordset
Sql = [Ô]SELECT MAX([Ô] & Trim(vCampo) & [Ô]) AS CODIGO FROM [Ô] & Trim(vTabela) & [Ô][Ô] & vCondicao & [Ô][Ô]
RsProximo.Open Sql, Conexao, adOpenKeyset, adLockReadOnly
If IsNull(RsProximo([Ô]CODIGO[Ô])) = True Then
ProximoCodigo = 1
Else
ProximoCodigo = RsProximo([Ô]CODIGO[Ô]) + 1
End If
RsProximo.Close: Set RsProximo = Nothing
End Function
Chamando:
Rs([Ô]ID_TABELA[Ô]) = ProximoCodigo([Ô]TABELA[Ô], [Ô]ID_TABELA[Ô], [Ô][Ô])
Sempre coloco na hora de gravar e não na hora de abrir o form ou ao clicar no botão [Ô]novo[Ô]
Tópico encerrado , respostas não são mais permitidas