PEGAR ID DO ÊLTIMO REGISTRO INSERIDO
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?
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?
Bom dia TRSOFTWARES,
Qual banco de dados você está utilizando?
Qual banco de dados você está utilizando?
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
exemplo:
rs.movelast
onde rs é a sua conexao com a base de dados
bom dia, aproveitando o post, e se for em FIREBIRD ?
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
Eu sugiro, e utilizo, o SCOPE_IDENTITY()
https://msdn.microsoft.com/pt-br/library/ms187342.aspx
Isso levando em conta que vc esta em rede, e vários usuários podem inserir ao mesmo tempo ?
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
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
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.
[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