OBTER CAMPO AUTONUMERACAO NO FORMULARIO
Olá!
Estou com um pequeno probleminha...
Estou fazendo um simples programa de OS. Preciso que quando o usuário salvar os registros automáticamente abra o relatório para que possa imprimir a os.
Passo o parametro para selecionar a id e imprimir todos os dados, claro.
O problema é que quando clico em novo, nao aparece o codigo. ja tentei usar SELECT @@Identity FROM OS mas não estou conseguindo
ai escrevi assim
Sub lastid()
Dim varRetorno As Long
Dim Ultos As ADODB.Recordset
[ô] Set Ultos = Cnn.Execute([Ô]SELECT @@Identity FROM OS[Ô])
Set Ultos = Cnn.Execute([Ô]SELECT max(Id) AS Ultimo FROM Os[Ô])
If Not Ultos.EOF Then
If Not IsNull(Ultos(0)) Then
varRetorno = Ultos(0)
End If
End If
idlast = varRetorno
[ô] MsgBox [Ô]O último código inserido foi [Ô] & idlast
LblCodigo.Caption = varRetorno +1
rst.Update
Ultos.Close
Set Ultos = Nothing
ai mostra o código, mas está pulando um (nem adinta remover varretorno +1)
se alguém puder me ajudar agradeço
Estou com um pequeno probleminha...
Estou fazendo um simples programa de OS. Preciso que quando o usuário salvar os registros automáticamente abra o relatório para que possa imprimir a os.
Passo o parametro para selecionar a id e imprimir todos os dados, claro.
O problema é que quando clico em novo, nao aparece o codigo. ja tentei usar SELECT @@Identity FROM OS mas não estou conseguindo
ai escrevi assim
Sub lastid()
Dim varRetorno As Long
Dim Ultos As ADODB.Recordset
[ô] Set Ultos = Cnn.Execute([Ô]SELECT @@Identity FROM OS[Ô])
Set Ultos = Cnn.Execute([Ô]SELECT max(Id) AS Ultimo FROM Os[Ô])
If Not Ultos.EOF Then
If Not IsNull(Ultos(0)) Then
varRetorno = Ultos(0)
End If
End If
idlast = varRetorno
[ô] MsgBox [Ô]O último código inserido foi [Ô] & idlast
LblCodigo.Caption = varRetorno +1
rst.Update
Ultos.Close
Set Ultos = Nothing
ai mostra o código, mas está pulando um (nem adinta remover varretorno +1)
se alguém puder me ajudar agradeço
ai mostra o código, mas está pulando um (nem adinta remover varretorno +1)
YHIZSRHAELL fiz um teste aqui com Acess 2003 com seu código e funcionou normal.Peguei uma tabela
com[txt-color=#e80000] quatro [/txt-color]registros onde faço teste e apresentou este resultado.
Text1.Text = varRetorno = 4
LblCodigo.Caption = varRetorno + 1 = 5
Como é isso pula um.
YHIZSRHAELL fiz um teste aqui com Acess 2003 com seu código e funcionou normal.Peguei uma tabela
com[txt-color=#e80000] quatro [/txt-color]registros onde faço teste e apresentou este resultado.
Text1.Text = varRetorno = 4
LblCodigo.Caption = varRetorno + 1 = 5
Como é isso pula um.
Vale ressaltar,quando se usa numeração automática e excluir um registro ou mais vai dar diferença no resultado.
Faça um teste e verifique.Você pode ter excluido um registro.
Faça um teste e verifique.Você pode ter excluido um registro.
O ideal é vc utilizar um banco de dados que trabalhe com sequence. Então vc vai sempre incrementar 1 nesse sequencial. Se vc estiver utilizando access, sugiro que vc crie uma tabela com um campo numerico duplo. Sempre que vc precisar gerar o nr da os, vc faz um update na tabela, aumentando 1 no sequencial do campo que vc criou. O resultado vc passa para o nr da os a ser gravada na tabela de os. E esse mesmo nr vc utilizará para recuperar a OS para impressao Ou seja, o seu campo de os deixa de ser autonumeracao e passa a receber um nr que será gerado pela outra tabela. Assim vc evitará que mais de 1 usuario possua o mesmo nr de os. Ressalto que essa é uma prática menos ruim, em se tratando de Access.
Você capturou o Ãndice numa label: ok
Ao gerar a nova OS, incremente + 1
Exemplo:
lblUR.caption= rs.field([Ô]INDICE[Ô]) + 1
ou ainda
lblUR.caption= rs.field([Ô]INDICE[Ô])
lblNR.caption= lblUR.caption + 1
O número da OS sequencial será lblNR.caption
Ao gerar a nova OS, incremente + 1
Exemplo:
lblUR.caption= rs.field([Ô]INDICE[Ô]) + 1
ou ainda
lblUR.caption= rs.field([Ô]INDICE[Ô])
lblNR.caption= lblUR.caption + 1
O número da OS sequencial será lblNR.caption
Xavier, dessa forma, em um ambiente multi-usuario, não há garantia de que o mesmo NR não será repassado para mais de um usuário.
tenta assim
veja se funciona
Dim varRetorno As Long
Dim Ultos As ADODB.Recordset
Set Ultos = Cnn.Execute([Ô]SELECT max(Id) AS Ultimo FROM Os[Ô])
If Not (Ultos.EOF And Ultos.BOF) Then
If Not IsNull(Ultos!Ultimo) Then
varRetorno = Ultos!Ultimo
End If
End If
idlast = varRetorno
LblCodigo.Caption = varRetorno +1
rst.Update
Ultos.Close
Set Ultos = Nothing
veja se funciona
Marcelo-treze, obg, já tinha tentando assim não funcionou.
Omar2011, estou usando acess 2010, vou testar no 2003, bom também tenho excluido algum registro, mas mesmo assim qdo não excluo salta 1.
Ricart, estou mesmo pensando em usar o campo id numero nao automatico e fazer uma rotina pra add + 1.
Vou experimentar a ideia do xavier, não sei se ja fiz isso, fiz tantos testes e gambiarras.
Ricart o ambiente não é multiusuario, nem requer login, é coisa bem simples msm.
Não sei se ficou claro para todos. Eu preciso que qdo clicar em novo ja mostre no lblcodigo.caption o codigo do registro que será gravado no momento.
Quando o usuário cadastrar nova OS, ja tem que aparecer o código, pq ele clicar em salvar, ja salva e o foco vai pro cmdprintos, abrindo o relatorio pronto para imprimir, acontece q se não aparece o código, vai dar erro, claro, pq não obteve o parametro. O usuário não quer (e com razão) salvar os dados, localizar a os e imprimir (ai sim ja tem o codigo no label), tentei ao salvar, limpar a tela e ir ao ultimo registro mas não obtive exito.
Ja devem ter percebido não tenho muita experiência com vb, tive contato ha alguns anos e agora que estou tentando aprender.
Obg a todos.
Segue anexo para quem quiser dar uma olhada.
para abrir o relatorio precisa de fastreport3.dll pode baixar o fastreports 4
Omar2011, estou usando acess 2010, vou testar no 2003, bom também tenho excluido algum registro, mas mesmo assim qdo não excluo salta 1.
Ricart, estou mesmo pensando em usar o campo id numero nao automatico e fazer uma rotina pra add + 1.
Vou experimentar a ideia do xavier, não sei se ja fiz isso, fiz tantos testes e gambiarras.
Ricart o ambiente não é multiusuario, nem requer login, é coisa bem simples msm.
Não sei se ficou claro para todos. Eu preciso que qdo clicar em novo ja mostre no lblcodigo.caption o codigo do registro que será gravado no momento.
Quando o usuário cadastrar nova OS, ja tem que aparecer o código, pq ele clicar em salvar, ja salva e o foco vai pro cmdprintos, abrindo o relatorio pronto para imprimir, acontece q se não aparece o código, vai dar erro, claro, pq não obteve o parametro. O usuário não quer (e com razão) salvar os dados, localizar a os e imprimir (ai sim ja tem o codigo no label), tentei ao salvar, limpar a tela e ir ao ultimo registro mas não obtive exito.
Ja devem ter percebido não tenho muita experiência com vb, tive contato ha alguns anos e agora que estou tentando aprender.
Obg a todos.
Segue anexo para quem quiser dar uma olhada.
para abrir o relatorio precisa de fastreport3.dll pode baixar o fastreports 4
Coloque o Banco para podermos fazer o teste.
Como o meu teste com Acess 2003 ficou normal como postei.
Adiciona o Banco ai testaremos.
O que acho estranho é SALTAR UM.
Valeu.
Como o meu teste com Acess 2003 ficou normal como postei.
Adiciona o Banco ai testaremos.
O que acho estranho é SALTAR UM.
Valeu.
Assim funcionou aqui
Set Ultos = Cnn.Execute([Ô]SELECT max(Id) AS Ultimo FROM Os[Ô])
If Not Ultos.EOF Then
varRetorno = Ultos!Ultimo & [Ô][Ô]
End If
Bom, mesmo que o sistema não seja multiusuário, é uma boa prática vc tratar considerando que um dia poderá vir a ser.
Quando vc faz a pesquisa na própria tabela onde vc grava os registros, selecionando o maior valor do campo ID, vc está fazendo uma consulta em uma tabela que estará crescendo a cada dia. Claro que isso pode não fazer muita diferença para esse sistema que vc está fazendo, mas, em regra, começará a ficar um pouco mais lento a cada dia. Por isso a sugestão de criar uma tabela para que armazene o nr que vc utilizará como id. Então, vc estará sempre pesquisando apenas 1 linha de registro.
Quando vc faz a pesquisa na própria tabela onde vc grava os registros, selecionando o maior valor do campo ID, vc está fazendo uma consulta em uma tabela que estará crescendo a cada dia. Claro que isso pode não fazer muita diferença para esse sistema que vc está fazendo, mas, em regra, começará a ficar um pouco mais lento a cada dia. Por isso a sugestão de criar uma tabela para que armazene o nr que vc utilizará como id. Então, vc estará sempre pesquisando apenas 1 linha de registro.
Tópico encerrado , respostas não são mais permitidas