GERAR NUMERO SEQUENCIAL MYSQL

JONESPARIS 05/04/2011 20:34:37
#370523
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)
HIDDEN 05/04/2011 20:43:52
#370526
Resposta escolhida
Você pode gerar o código quando for gravar. Eu faço assim.

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 ?
JONESPARIS 05/04/2011 20:56:41
#370529
Hidden, obrigado amigo, mas preciso do código antes de gravar, ao clicar em Novo
HIDDEN 05/04/2011 21:12:17
#370531
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.
JONESPARIS 05/04/2011 21:50:41
#370533
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!
MARCELO.TREZE 05/04/2011 21:58:35
#370535
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





Tópico encerrado , respostas não são mais permitidas