GERAR NUMERO SEQUENCIAL MYSQL

 Tópico anterior Próximo tópico Novo tópico

GERAR NUMERO SEQUENCIAL MYSQL

VB / VBA

 Compartilhe  Compartilhe  Compartilhe
#370523 - 05/04/2011 20:34:37

JONESPARIS
ERECHIM
Cadast. em:Fevereiro/2006


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)
        

Jones Paris

Resposta escolhida #370526 - 05/04/2011 20:43:52

HIDDEN
GOIANIA
Cadast. em:Julho/2009


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 ?



#370529 - 05/04/2011 20:56:41

JONESPARIS
ERECHIM
Cadast. em:Fevereiro/2006


Hidden, obrigado amigo, mas preciso do código antes de gravar, ao clicar em Novo

Jones Paris

#370531 - 05/04/2011 21:12:17

HIDDEN
GOIANIA
Cadast. em:Julho/2009


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.



#370533 - 05/04/2011 21:50:41

JONESPARIS
ERECHIM
Cadast. em:Fevereiro/2006


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!

Jones Paris

#370535 - 05/04/2011 21:58:35

MARCELO-TREZE
SAO VICENTE
Cadast. em:Abril/2009


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







________________________________________________________________________________________
O orgulho cega até os sábios, ao ponto de não percebam que não são tão sábios como pensam.



 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por JONESPARIS em 05/04/2011 21:51:08