OBTER CAMPO AUTONUMERACAO NO FORMULARIO

YHIZSRHAELL 26/05/2012 10:46:22
#402860
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
OMAR2011 26/05/2012 12:24:29
#402868
Resposta escolhida
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.
OMAR2011 26/05/2012 12:34:43
#402870
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.
RICART 26/05/2012 21:53:10
#402901
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.
XAVIER 26/05/2012 22:25:12
#402902
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

RICART 27/05/2012 09:24:11
#402908
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.
MARCELO.TREZE 27/05/2012 12:51:40
#402914
tenta assim


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
YHIZSRHAELL 27/05/2012 17:40:57
#402926
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 27/05/2012 18:47:29
#402931
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.

MARCELO.TREZE 28/05/2012 10:47:32
#402949
Assim funcionou aqui


Set Ultos = Cnn.Execute([Ô]SELECT max(Id) AS Ultimo FROM Os[Ô])
If Not Ultos.EOF Then
varRetorno = Ultos!Ultimo & [Ô][Ô]
End If

RICART 29/05/2012 08:05:00
#403050
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.
Página 1 de 2 [11 registro(s)]
Tópico encerrado , respostas não são mais permitidas