PEGAR ID DO ÊLTIMO REGISTRO INSERIDO

TRTNCG 15/11/2016 03:38:51
#468925
Olá pessoal, Bom dia! Bom, estou com um probleminha será que poderiam me dá uma dica ou auxílio?

Tenho uma tabela onde preciso pegar o ID da última inserção e salvar em outra tabela. Mas, pode ser que eu esteja errado, se por ventura der um [txt-color=#0000f0]MAX(id)[/txt-color] teoricamente eu teria esse número id do registro, mas, poderá ocorrer que outro usuário tivesse feito um update ao mesmo tempo, o meu foi inserido e o dele pouco milésimos depois, neste caso já daria erro, pois, o último id seria o dele e não o meu, concordam? Alguém tem alguma ideia de como resolver este impasse?
JONATHANSTECKER 15/11/2016 09:08:41
#468932
Bom dia TRSOFTWARES,

Qual banco de dados você está utilizando?
RICARDOCGD 15/11/2016 09:58:16
#468933
em SQL basta colocar no final da abertura do base de dados o seguinte

exemplo:

rs.movelast

onde rs é a sua conexao com a base de dados
MOREIRA 15/11/2016 11:46:06
#468935
bom dia, aproveitando o post, e se for em FIREBIRD ?
LVFIOROT 16/11/2016 10:27:32
#468953
no mssql você pode usar o: @@IDENTITY, SCOPE_IDENTITY e IDENT_CURRENT

Eu sugiro, e utilizo, o SCOPE_IDENTITY()

https://msdn.microsoft.com/pt-br/library/ms187342.aspx
FUTURA 16/11/2016 11:23:42
#468954
Isso levando em conta que vc esta em rede, e vários usuários podem inserir ao mesmo tempo ?
MA.BREGUEIRO 16/11/2016 16:08:34
#468965
Resposta escolhida
FUNÇÃO PEGA SEQUENCIA (QUALQUER BANCO DE DADOS)

If vgSituacao = ACAO_INCLUINDO Then
txtCampo(0).Value = PegaSequencia(vgIdentTab, [Ô]CD_CLIENTE[Ô], [Ô][Ô], 1)

VoltaSequencia vgIdentTab, [Ô]CD_CLIENTE[Ô]

[ô]pega o valor do campo sequencial
Public Function PegaSequencia(vgT As String, vgCp As String, vgDefa As Variant, vgSeq As Long) As Variant
Dim vgValor As Variant, vgOk As Boolean, vgTp As GCOLUMN_TYPE, vgCur As Integer, vgMsk As String
vgCur = Screen.MousePointer [ô]salva cursor atual
Screen.MousePointer = vbHourglass [ô]coloca ampulheta
vgOk = False
If Len(vgDefa) = 0 Then
vgDefa = [Ô] [Ô]
End If
vgTp = vgDb.Tables(vgT).Columns(vgCp).ColumnType
With vgRsSequencia [ô]vamos trabalhar com a tab de sequenciais
.OpenRecordSet [Ô]SELECT TOP 1 * FROM [SYS~Sequencial] WHERE [SYS~Tabela] = [ô][Ô] & vgT$ & [Ô][ô] AND [SYS~Campo] = [ô][Ô] & vgCp$ & [Ô][ô][Ô], , , , True
vgOk = (.NoMatch = False) [ô]se achou
If Not vgOk Then [ô]se for a primeira vez
.AddNew [ô]inclui o registro
![SYS~Tabela] = vgT$ [ô]coloca a tabela
![SYS~Campo] = vgCp$ [ô]nome do campo
![SYS~Valor] = CStr(vgDefa) [ô]e o valor default
vgValor = vgDefa [ô]a primeira vez pega o default
.Update [ô]grava na tabela
If Vazio(vgDefa) Then GoTo Incrementa [ô]se não tem default vlr inicial e o incremento
Else [ô]registro já existe

Incrementa:
.Edit [ô]vamos editá-lo
If IsNull(![SYS~Valor]) Then [ô]se for a 1a. vez
vgValor = vgSeq [ô]pega o default
Else
If vgTp = TP_CARACTER Then [ô]vamos somar o sequencial
vgValor = LTrim$(Str$(Val(![SYS~Valor]) + vgSeq)) [ô]string
ElseIf vgTp = TP_DATA_HORA Then
If InStr(![SYS~Valor], [Ô].[Ô]) > 0 Then [ô]se valor veio de reparação de bd, trata o formato yyyy-mm-dd hh:mm:ss.0000
vgValor = CDate(Mid(![SYS~Valor], 1, InStr(![SYS~Valor], [Ô].[Ô]) - 1)) + vgSeq [ô]data
Else
vgValor = CDate(![SYS~Valor]) + vgSeq [ô]data
End If
Else
vgValor = Val(![SYS~Valor]) + vgSeq [ô]número
End If
End If
![SYS~ValorAnterior] = ![SYS~Valor] [ô]grava valor anterior
![SYS~Valor] = CStr(vgValor) [ô]grava o novo valor
.Update [ô]grava na tabela
End If
If vgTp = TP_CARACTER Then [ô]se o campo é string
vgMsk$ = vgDb.Tables(vgT).Columns(vgCp).Mask
If Len(vgMsk$) > 0 Then [ô]se o campo tem máscara
If String$(Len(vgMsk$), [Ô]9[Ô]) = vgMsk$ Then [ô]se a máscara é tudo [Ô]9[Ô]
vgValor = LPad$(vgValor, Len(vgMsk$), [Ô]0[Ô]) [ô]coloca zeros a esquerda
End If
If String$(Len(vgMsk$), [Ô]#[Ô]) = vgMsk$ Then [ô]se a máscara é tudo [Ô]#[Ô]
vgValor = LPad$(vgValor, Len(vgMsk$), [Ô] [Ô]) [ô]coloca brancos a esquerda
End If
End If
End If
If .RecordCount > 0 Then .MoveFirst [ô]evita pau do DAO!!!
End With
PegaSequencia = vgValor [ô]novo valor default
Screen.MousePointer = vgCur [ô]retorna o cursor
End Function

[ô]volta o valor do campo sequencial
Public Sub VoltaSequencia(vgT As String, vgCp As String)
Dim vgOk As Boolean, vgCur As Integer
vgCur = Screen.MousePointer [ô]salva cursor atual
Screen.MousePointer = vbHourglass [ô]coloca ampulheta
With vgRsSequencia [ô]vamos trabalhar com a tab de sequenciais
.OpenRecordSet [Ô]SELECT TOP 1 * FROM [SYS~Sequencial] WHERE [SYS~Tabela] = [ô][Ô] & vgT$ & [Ô][ô] AND [SYS~Campo] = [ô][Ô] & vgCp$ & [Ô][ô][Ô], , , , True
vgOk = (.NoMatch = False) [ô]se achou
If vgOk Then
.Edit [ô]vamos editá-lo
![SYS~Valor] = ![SYS~ValorAnterior] [ô]volta o valor
.Update [ô]grava na tabela
End If
End With
Screen.MousePointer = vgCur [ô]retorna o cursor
End Sub

OMAR2011 16/11/2016 17:37:38
#468971
With vgRsSequencia
[txt-color=#e80000].OpenRecordSet [/txt-color][Ô]SELECT TOP 1 * FROM [SYS~Sequencial] WHERE [SYS~Tabela] = [ô][Ô] & vgT$ & [Ô][ô] AND [SYS~Campo] = [ô][Ô] & vgCp$ & [Ô][ô][Ô], , , ,
True
Vb6.
é net.














Tópico encerrado , respostas não são mais permitidas