GERAR CODIGO AUTOMATICAMENTE

FABIANOWALLAXX 12/07/2012 20:49:07
#405970
Olá pessoal é o seguinte. Eu estou com um formulário de cadastro e um database access aqui com campos NOME,CÓDIGO e etc...
Minha intenção é gerar um novo código automaticamente.Toda vez que se presiona o botão INSERIR a textbox de nome txtCodigo gere um número sequente ao banco de dados . Eis meu código que coloquei no Botão

Private Sub cmdIncluir_Click()
Call trava(True)
cmdIncluir.Enabled = False
cmdApagar.Enabled = False
cmdAlterar.Enabled = False
cmdConsultar.Enabled = False

txtNome.SetFocus

Dim cod As Long

If DadosClientes.Recordset.RecordCount = 0 Then

cod = [Ô]00001[Ô]
Else
DadosClientes.Recordset.MoveLast
cod = DadosClientes([Ô]Codigo[Ô]) + 1

End If

txtCodigo.Text = cod

DadosClientes.Recordset.AddNew
End Sub


Só que é o seguinte: Está dando erro na linha [Ô]cod = DadosClientes([Ô]Codigo[Ô]) + 1[Ô] onde eu associo a variavel cod ao camo do banco de dados [Ô]Codigo[Ô]

O que eu estou fazendo de errado.Alguém pode me dar uma dica?
MARCELO.TREZE 12/07/2012 20:58:32
#405971
Bom supostamente este código está certo tente isto

cod = CLng(DadosClientes([Ô]Codigo[Ô])) + 1

ou

cod = CLng(DadosClientes.Fields([Ô]Codigo[Ô])) + 1
FABIANOWALLAXX 12/07/2012 21:43:59
#405977
Vish.Não rolou nenhum desses métodos aí. Dá [Ô]Data field or method not found[Ô] Mas Data field ta certo.Existe o campo Codigo
KERPLUNK 13/07/2012 00:24:43
#405982
cod = DadosClientes.Recordset.RecordCount + 1
Isso já quebra seu galho
MAS

1 - Comece a aprender OOP
2 - Aprenda a usar a Watch Window, coloque elementos nela e veja quanta coisa vai magicamente clarear...
FEDERHEN 13/07/2012 08:11:05
#405986
Desculpe KERPLUNK, mas a tua lógica vai dar erro.

Se o usuário incluir 3 registros, o campo CODIGO vai ficar com os valores 1, 2 e 3
Enão haverá a exclusão do CODIGO=1
Após nova insersão, o cod = DadosClientes.Recordset.RecordCount + 1 retorna (2+1), ou seja 3, mas já existe um CODIGO=3

Logo, dará erro de chave dupla.
ADILSOO 13/07/2012 08:32:31
#405990
Bom, se voce quer pegar o código que será gravado, primeiro voce deve gravar um registro somente com o código no banco fazendo um

SELECT MAX + 1 no botao novo

se voce fechar o form ou cancelar a inclusão voce exclui o registro adicionado, lembrando que esse método é o que eu uso e não da problemas nenhum, pode trabalhar em rede tranquilo, agora se quer trabalhar local, pode ser somente um

SELECT MAX + 1 no botao novo e não incluir nenhum, porque se somente voce estará usando o sistema não tem como um usuáriod a rede entrar e incluir um novo igual..

OBS: aconselho usar o método de inclusão, pois se um dia voce precisar trabalhar em rede já estará pronto
FILMAN 13/07/2012 09:47:04
#405995
Bom eu Faria Assim

Coloque em um modulo a seguinte função

Essa Função Vai incrementando de um a um o código na tabela só que se encontrar algum valor faltando no meio ela trava e te da aquele valor
Public Function NovoCodigo() As Long
Dim rstN As New ADODB.Recordset
Dim c As Integer
Dim Codigo As Long

IF rstN.State <> 0 Then rstN.Close: Set rstN = Nothing

rstN.Open [Ô]SELECT Codigo FROM SuaTabela ORDER BY Codigo[Ô], Seu_Objeto_de_Conexao, adOpenStatic, adLockReadOnly

If rstN.RecordCount = 0 Then
Codigo = 1
Else
rstN.MoveFirst
Codigo = rstN.RecordCount
For c = 1 To Codigo
If rstN!Codigo <> c Then
Exit For
End If
rstN.MoveNext
Next c
Codigo = c
End If

rstN.Close
Set rstN = Nothing

NovoCodigo = Codigo
End Function



Ou


Essa Somente captura o ultimo código e incrementa 1
Public Function NovoCodigo() As Long
Dim rstN As New ADODB.Recordset
Dim Codigo As Long

IF rstN.State <> 0 Then rstN.Close: Set rstN = Nothing

rstN.Open [Ô]SELECT MAX(Codigo) AS Codigo FROM SuaTabela[Ô], Seu_Objeto_de_Conexao, adOpenStatic, adLockReadOnly

If rstN!Codigo = 0 Then
Codigo = 1
Else
Codigo = CLng(rstN!Codigo) + 1
End If

rstN.Close
Set rstN = Nothing

NovoCodigo = Codigo
End Function



Espero ter ajudado
FFCOUTO 13/07/2012 10:05:10
#405997
Resposta escolhida
Bem. Segue um função para gerar código disponivel em qualquer tabela.


Public Function GerarCodigoDisponivel(ByVal Tabela As String, ByVal CampoPesquisa As String, Optional ByVal CodigoIni As Long = 0) As Long
Dim sSQL As String
Dim r As ADODB.Recordset
Dim bRet As Boolean
Dim codLivre As Long

[ô]Atribui o código inicial
codLivre = CodigoIni

Do
codLivre = codLivre + 1
sSQL = [Ô]SELECT [Ô] & CampoPesquisa & [Ô] FROM [Ô] & Tabela & [Ô] WHERE ([Ô] & CampoPesquisa & [Ô] = [Ô] & codLivre & [Ô]);[Ô]
r.Open sSQL, Conexao
bRet = Not r.BOF
If r.State <> 0 Then r.Close
Set r = Nothing
Loop While bRet

[ô]Retorna o código disponível
GerarCodigoDisponivel = codLivre
End Function


Para chamar a função


Dim NovoCodigo As Long
NovoCodigo = GerarCodigoDisponivel([Ô]Clientes[Ô], [Ô]Codigo[Ô])
txtCodigo.Text = NovoCodigo


Agora, se você usar o teu sistema em rede com muitos usuários ao mesmo tempo. Você deve recuperar o código somente no momento da gravação, para evitar duplicidade.
FABIANOWALLAXX 13/07/2012 11:44:12
#406012
Vlw amigos
LLAIA 13/07/2012 11:45:44
#406013
Por que muitos insistem em querer ficar criando os códigos identificadores se o próprio banco de dados faz isso e muito bem?
Em um sistema em rede isso é uma furada imensa. Depois vai ser necessário gambiarras pra lidar com isso. Falo por experiência!
Tópico encerrado , respostas não são mais permitidas