GERAR NUMERO SEQUENCIAL MYSQL
Boa Noite Amigos do VB!
Faz um tempinho que tento encontrar a solução perfeita.
Preciso gerar os códigos do cadastro de clientes por exemplo, de forma sequencial, mas este código deve ser gerado automaticamente ao clicar em novo, antes de gravar no banco de dados, isso impede o uso de Autoincremento no banco, então criei uma tabela (últimos códigos) que armazena o código gerado e na próxima vez que o usuário clicar em novo ele soma +1 ao seu valor. Até aà tudo bem, mas trabalhando em rede, pode acontecer de 2 usuários clicarem exatamente ao mesmo tempo em novo e ele gerar o mesmo código para cadastros diferentes. Já fiz testes clicando em novo cadastro ao mesmo tempo em máquinas diferentes e obviamente em algumas situações ele gera a sequencia correta, mas a cada 5 ou 6 tentativas gera o mesmo código, tentei usar o Doevents para dar um retardo de tempo, dar um refresh no RecordSet, executar 2 vezes a consulta, revirei a internet e até encontrei algumas soluções, mas nenhuma funciona 100%, sempre que faço testes em 2 máquinas em rede uma hora ou outra acaba gerando o mesmo código, segue o que estou usando no momento; se alguém puder me ajudar agradeço muito!
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
rs.Fields(1) = rs.Fields(1) + 1 [ô](1) é o número do campo último código para clientes
DoEvents
rs.Update
DoEvents
Text2.Text = rs.Fields(1)
Faz um tempinho que tento encontrar a solução perfeita.
Preciso gerar os códigos do cadastro de clientes por exemplo, de forma sequencial, mas este código deve ser gerado automaticamente ao clicar em novo, antes de gravar no banco de dados, isso impede o uso de Autoincremento no banco, então criei uma tabela (últimos códigos) que armazena o código gerado e na próxima vez que o usuário clicar em novo ele soma +1 ao seu valor. Até aà tudo bem, mas trabalhando em rede, pode acontecer de 2 usuários clicarem exatamente ao mesmo tempo em novo e ele gerar o mesmo código para cadastros diferentes. Já fiz testes clicando em novo cadastro ao mesmo tempo em máquinas diferentes e obviamente em algumas situações ele gera a sequencia correta, mas a cada 5 ou 6 tentativas gera o mesmo código, tentei usar o Doevents para dar um retardo de tempo, dar um refresh no RecordSet, executar 2 vezes a consulta, revirei a internet e até encontrei algumas soluções, mas nenhuma funciona 100%, sempre que faço testes em 2 máquinas em rede uma hora ou outra acaba gerando o mesmo código, segue o que estou usando no momento; se alguém puder me ajudar agradeço muito!
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
rs.Fields(1) = rs.Fields(1) + 1 [ô](1) é o número do campo último código para clientes
DoEvents
rs.Update
DoEvents
Text2.Text = rs.Fields(1)
Você pode gerar o código quando for gravar. Eu faço assim.
Desta forma, o código só é gerado no momento em que será gravado, eliminando o problema relatado por você. O que garante essa integridade é o AddNew.
Supondo que o campo Código seja exibido em um TextBox, você pode exibir a string [Ô]auto[Ô] enquanto não grava. Após gravar, exiba o numero que foi gerado. Sacou ?
Function GravarDados(Novo As Boolean, Codigo As Long) as Booleam
Dim IDSave As Long
With tblDados
If Novo Then
.Open [Ô]clientes[Ô], Conn, adOpenStatic, adLockOptimistic
If Not .EOF Then
.MoveLast
IDSave = (!Codigo + 1)
Else
IDSave = 1
End If
.AddNew
!Codigo = IDSave
Else
.Open [Ô]SELECT * FROM Clientes WHERE Codigo=[Ô] & Codigo, Conn, adOpenStatic, adLockOptimistic
End If
!Nome = IIf(Trim(Text1.Text) <> [Ô][Ô], Text1.Text), Null)
.Update
End With
End Function
Desta forma, o código só é gerado no momento em que será gravado, eliminando o problema relatado por você. O que garante essa integridade é o AddNew.
Supondo que o campo Código seja exibido em um TextBox, você pode exibir a string [Ô]auto[Ô] enquanto não grava. Após gravar, exiba o numero que foi gerado. Sacou ?
Hidden, obrigado amigo, mas preciso do código antes de gravar, ao clicar em Novo
Então declare sua tabela a nÃvel de formulário (ou global) e relacione o AddNew ao clique do botão novo. Assim, ao clicar em Novo ele criar o recordset.
Outra hipotese serÃa você tratar o erro gerado pela duplicidade.
Outra hipotese serÃa você tratar o erro gerado pela duplicidade.
Resolvi tratando o erro quando gera em duplicidade, não ficou 100% devido acontecer o erro, gostaria de evitá-lo, mas resolveu o problema, muito obrigado Hidden. Abraço!
Colega sei o problema que está passando e a unica solução que encontrei foi essa:
Ao clicar em Novo Já Salvo na Tabela o numero sequencial usando este método
sSQL = [Ô]SELECT MAX(ID) AS Proximo FROM tabela[Ô]
[ô]depois
Numero = RS!Proximo + 1
então voltamos a logica que apliquei, não acredito que dois funcionarios cliquem ao mesmo tempo para salvar, o que acontece é o seguinte, quando um funcionario clica em novo, ele vai digitar os dados complementares, neste meio tempo se outro usuário clicar em novo o mesmo ID será gerado.
a solução é a seguinte, eu quando clico em novo ja salvo na tabela o proximo id, e mantenho este numero em minha tela de cadastro, despois de digitar os dados complementares, eu simplismente dou um update na tabela baseado no numero, assim acabei com o problema.
exemplo
usuário1 clica em novo e é erado o numero 0001
0001 fica na tela de cadastro.
usuario2 clica em novo, e como 0001 esta gravado então será gerado o 0002
usuário1 clica em salvar e é feito um update na tabela com os dados complementares
exemplo da query: [Ô]UPDATE tabela SET campo2=[ô]dados2[ô],campo3=[ô]dados3[ô] WHERE id = 0001
espero ter sido claro.
boa sorte
Ao clicar em Novo Já Salvo na Tabela o numero sequencial usando este método
sSQL = [Ô]SELECT MAX(ID) AS Proximo FROM tabela[Ô]
[ô]depois
Numero = RS!Proximo + 1
então voltamos a logica que apliquei, não acredito que dois funcionarios cliquem ao mesmo tempo para salvar, o que acontece é o seguinte, quando um funcionario clica em novo, ele vai digitar os dados complementares, neste meio tempo se outro usuário clicar em novo o mesmo ID será gerado.
a solução é a seguinte, eu quando clico em novo ja salvo na tabela o proximo id, e mantenho este numero em minha tela de cadastro, despois de digitar os dados complementares, eu simplismente dou um update na tabela baseado no numero, assim acabei com o problema.
exemplo
usuário1 clica em novo e é erado o numero 0001
0001 fica na tela de cadastro.
usuario2 clica em novo, e como 0001 esta gravado então será gerado o 0002
usuário1 clica em salvar e é feito um update na tabela com os dados complementares
exemplo da query: [Ô]UPDATE tabela SET campo2=[ô]dados2[ô],campo3=[ô]dados3[ô] WHERE id = 0001
espero ter sido claro.
boa sorte
Tópico encerrado , respostas não são mais permitidas