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 soluo perfeita.

Preciso gerar os cdigos do cadastro de clientes por exemplo, de forma sequencial, mas este cdigo deve ser gerado automaticamente ao clicar em novo, antes de gravar no banco de dados, isso impede o uso de Autoincremento no banco, ento criei uma tabela (ltimos cdigos) que armazena o cdigo gerado e na prxima vez que o usurio clicar em novo ele soma +1 ao seu valor. At a tudo bem, mas trabalhando em rede, pode acontecer de 2 usurios clicarem exatamente ao mesmo tempo em novo e ele gerar o mesmo cdigo para cadastros diferentes. J fiz testes clicando em novo cadastro ao mesmo tempo em mquinas diferentes e obviamente em algumas situaes ele gera a sequencia correta, mas a cada 5 ou 6 tentativas gera o mesmo cdigo, 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 solues, mas nenhuma funciona 100%, sempre que fao testes em 2 mquinas em rede uma hora ou outra acaba gerando o mesmo cdigo, segue o que estou usando no momento; se algum puder me ajudar agradeo 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 cdigo
        rs.Fields(1) = rs.Fields(1) + 1 [](1) o nmero do campo ltimo cdigo 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 cdigo quando for gravar. Eu fao 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 cdigo 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 Cdigo seja exibido em um TextBox, voc pode exibir a string []auto[] enquanto no grava. Aps 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 cdigo antes de gravar, ao clicar em Novo

Jones Paris

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

HIDDEN
GOIANIA
Cadast. em:Julho/2009


Ento declare sua tabela a nvel de formulrio (ou global) e relacione o AddNew ao clique do boto novo. Assim, ao clicar em Novo ele criar o recordset.

Outra hipotese sera 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, no ficou 100% devido acontecer o erro, gostaria de evit-lo, mas resolveu o problema, muito obrigado Hidden. Abrao!

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 soluo que encontrei foi essa:

Ao clicar em Novo J Salvo na Tabela o numero sequencial usando este mtodo

sSQL = []SELECT MAX(ID) AS Proximo FROM tabela[]

[]depois

Numero = RS!Proximo + 1

ento voltamos a logica que apliquei, no 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 usurio clicar em novo o mesmo ID ser gerado.

a soluo 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

usurio1 clica em novo e erado o numero 0001

0001 fica na tela de cadastro.

usuario2 clica em novo, e como 0001 esta gravado ento ser gerado o 0002

usurio1 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 sbios, ao ponto de no percebam que no so to sbios 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