CADASTRO NOVO PUXAR O ID DO BANCO DE DADOS

FEEHPEREZ 06/02/2014 09:07:20
#434338
Bom Dia Pessoal, Olha eu de volta.

Bom meu problema é o seguinte tenho um sistema que estou terminando com banco de dados em access e conexão ADO.

eu queria saber como faço para quando abro o meu form de cadastro como novo usuário ele apareça na minha textbox ID o id do banco de dados automático.

Pois só funciona quando vou alterar alguém ai sim quando pesquiso e puxo o cadastro de volta para o form ai vem o numero do ID.

Muito obrigado pela ajuda pessoal
OMAR2011 06/02/2014 09:23:30
#434339
O problema está na consulta que tu faz.
Ai é onde vai retornar todos os dados
da consulta.
Pode olhar está na sua pesquisa sql.
é bem simples.
[txt-color=#e80000]Max(Id)[/txt-color] traz o último registro.
TUNUSAT 06/02/2014 09:53:55
#434342
FEEHPEREZ,

Quando o usuário abre um novo registro, mas NÃO gravou ainda, e já tem o novo ID lá no form ...
... okay ...
... mas o que acontece se o usuário desistir de gerar um novo cadastro? O [Ô]ID[Ô] é perdido ou reaproveitado?

Tipo ... você pode fazer de duas (ou mais) formas:

1 - Colocar o campo com [Ô]autonumber[Ô] e salvar o registro [Ô]em branco[Ô], daí você coloca uma flag tipo caractere de 1 com os valores discretos. Exemplo:
[Ô]C[Ô] - Confirmar que o ID foi realmente utilizado e está em uso.
[Ô]B[Ô] - Está em branco e pode ser usado por qualquer pessoa.
[Ô]R[Ô] - Acabou de ser reservado e não pode ser utilizado (porém ainda está em branco) ... caso o usuário desista de usar, precisa voltar para o estado [Ô]B[Ô];
[Ô]D[Ô] - Registro DELETADO, só é mantido no banco para preservar a compatibilidade, mas não deve aparecer na tela e nem nos relatórios. Somente aparece em relatórios específicos.

2 - Gerenciar o número do ID, mostrando ao usuário os números disponíveis. Caso dois usuários peguem o mesmo número ao mesmo tempo é preciso ver quem reservou primeiro e pedir ao segundo uma nova escolha.

Mas para facilitar:
- Você não pode mostrar para o usuário o ID somente depois dele ter confirmado a gravação no banco de dados?


[][ô]s,
Tunusat.
FEEHPEREZ 06/02/2014 10:13:08
#434346
TUNUSAT.

Sim seria muito melhor se o ID aparecesse apenas depois de clicar no cmdgravar, pois ai viria a impressão onde preciso desse numero na folha.

como posso fazer isso?
MARCELO.TREZE 06/02/2014 10:42:22
#434349
Eu vou tentar explicar de forma mais simples, quando o campo é autonumeração ele não gera o ID ao se abrir a planilha, e somente quando esta é salva, como dito pelo colega tunusat, isso é para evitar que dois usuários usem o mesmo ID.

Bom uma vez quando precisei disto e para evitar erros procedi da seguinte forma:

* O campo ID criei como numero, e não autonumeração;
* ao abrir o formulario, eu pegava o ultimo ID + 1 para gerar o proximo ID (ex: select max(ID) + 1 As proxnum from tabela)
* de imediato salvava na tabela somente este ID, os demais campos ficavam em branco;
* o numero do ID gerado e ja salvo na tela era usado para atualizar aquele id, então o botão salvar era um update.

da maneria descrita acima o codigo funcionava bem ou seja se você abrir o formulário por exemplo aparecerá no campo ID o numero do seu ID ex: (03) e se outro funcionario abrir este formulario em outro computador pra ele vai aparecer 04, pois o 03 ja ficou para seu uso.

veja só isso não é regra foi apenas uma maneira de acertar a programação, na época eu achava que precisava saber o id, hoje não uso mais isso todos meus códigos possuem um campo autonumeração, que não é exibido.


TUNUSAT 06/02/2014 16:49:41
#434382
FEEHPEREZ,

Se você quiser usar o [Ô]autonumber[Ô], você grava o registro e depois precisa lê-lo novamente em seguida. Então de qualquer maneira você precisa de uma chave primária, pois precisa recuperar EXATAMENTE o registro que acabou de salvar. Isto é complicado, pois se dois usuários em máquinas diferentes clicarem no botão [Ô]salvar[Ô] ao mesmo tempo, o [Ô]autonumber[Ô] fará o trabalho dele NÃO deixando de forma alguma que o número de ID seja igual, mas como recuperar a informação? Daí você precisa de algo como um [Ô]RG[Ô], um [Ô]CPF[Ô] ou uma data+hora+minuto+ segundo da gravação gravado em algum registro da tabela do banco de dados. Se você conseguir ter uma chave primária para sua tabela nem precisa de um [Ô]autonumber[Ô].

Detalhe: Não dá para reaproveitar numeração no [Ô]autonumber[Ô].

http://info.abril.com.br/forum/viewtopic.php?p=22234

O tipo Autonumeração é consecutivo, embora, quando for excluído um registro o mesmo não será reutilizado.

Os campos AutoNumeração não podem ser atualizados. O que é possível é reiniciar o valor de um campo autonumeração após inserir e excluir todos os registros de uma tabela.

Se não havia registros na tabela quando compactar o banco de dados, o valor de AutoNumeração do próximo registro adicionado será redefinido como 1.


[][ô]s,
Tunusat.
ADRIANOM 06/02/2014 18:46:58
#434396
Particulamente gosto muito da forma que é feita nesse código fonte... dê uma olhadinha...

http://www.vbmania.com.br/pages/index.php?varModulo=Detalhe&varID=2183
FEEHPEREZ 13/02/2014 17:13:32
#434739
gostaria de saber como posso fazer o código para a cada clique no botão ele me mostrar na textbox o numero somado com mais um.
não estou conseguindo essa formula
MARCELO.TREZE 13/02/2014 17:21:15
#434740
assim

sql = [Ô]select max(ID) + 1 As proxnum from tabela[Ô]
Set rs = cnn.Execute(sql)

txtId.Text = rs!proxnum
FILMAN 13/02/2014 18:38:31
#434747
Bom já precisei usar a rotina abaixo porque um cliente precisou e funcionou legal, mas se te ajudar segue a mesma. Porem não aconselho muito dependendo da massa de dados pode causar um pouco de lentidão.

[ô]Essa funcção serve para capturar o próximo número disponível. Exemplo:
[ô]----------------------------------------------------------------------------------
[ô]Tenho 0 registro na tabela a funcção retorna 1
[ô]----------------------------------------------------------------------------------
[ô]Tenho 3 registro na tabela na seguinte sequencia
[ô]1
[ô]2
[ô]4
[ô]A função retorna o 3
[ô]----------------------------------------------------------------------------------
[ô]Tenho 3 registro na tabela na seguinte sequencia
[ô]1
[ô]2
[ô]3
[ô]A função retorna o 4
[ô]Não aconselho muito a utilizar essa, mas caso queira!

Public Function NovoID() As Long
Dim vTamTab As Long, X As Long
Dim rst As New ADODB.RecordSet

rst.Open [Ô]SELECT ID FROM SuaTabela ORDER BY ID[Ô], SeuObjetoConnection

If rst.RecordCount = 0 Then
NovoID = 1
rst.Close: Set rst = Nothing
Exit Function
Else
rst.MoveFirst
vTamTab = rst.RecordCount
For X = 1 To vTamTab
If CLng(rst([Ô]ID[Ô]).Value) <> X Then
Exit For
End If
rst.MoveNext
DoEvents
Next X

NovoID = X
rst.Close: Set rst = Nothing
End If

End Function



[ô]Esse aqui independente de das sequencias vai sempre ser o maior
[ô]Mas esse processo deve ser utilizado na hora de gravar ou da maneira que o MARCELO mencionou!

Public Function NovoID() As Long
Dim rst As New ADODB.RecordSet

rst.Open [Ô]SELECT (Max(ID) + 1) As ID FROM SuaTabela[Ô], SeuObjetoConnection

If rst.RecordCount = 0 Or CLng(rst([Ô]ID[Ô])) = 0 Then
NovoID = 1
rst.Close: Set rst = Nothing
Exit Function

Else
NovoID = CLng(rst([Ô]ID[Ô]))
rst.Close: Set rst = Nothing

End If

End Function



Para chamar o processo é só fazer assim

Variável = NovoID
Tópico encerrado , respostas não são mais permitidas