GERAR CODIGO AUTOMATICAMENTE
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?
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?
Bom supostamente este código está certo tente isto
cod = CLng(DadosClientes([Ô]Codigo[Ô])) + 1
ou
cod = CLng(DadosClientes.Fields([Ô]Codigo[Ô])) + 1
cod = CLng(DadosClientes([Ô]Codigo[Ô])) + 1
ou
cod = CLng(DadosClientes.Fields([Ô]Codigo[Ô])) + 1
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
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...
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...
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.
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.
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
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
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
Ou
Essa Somente captura o ultimo código e incrementa 1
Espero ter ajudado
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
Bem. Segue um função para gerar código disponivel em qualquer tabela.
Para chamar a função
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.
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.
Vlw amigos
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!
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