Sab el valor de un CAMPO AUTONUM. Luego de INSERT

Hola athrarn : (perdón por lo complicado del titulo, pero 50 caracteres son muy poco)
El tema es simple, necesito saber el valor de un campo autonumérico luego de la ejecución de un comando INSERT.
Pero, debo poder hacerlo usando solo comandos SQL (select, etc, no puedo usar recordsets).
Yo había pensado hacer un "select max(campo autonumérico)..." inmediatamente después del "INSERT", ¿pero qué pasa si otro usuario inserta otro registro en la tabla justo antes de la ejecución del comando select max?...
Espero que se entienda, y muchas gracias

1 Respuesta

Respuesta
1
Uff... Veamos.
Se me ocurren varias posibilidades :
1.- Olvidate del campo autonumérico e inserta tu los campos. Pero, para insertar, añadete un campo que sea el de la máquina que quiere insertar : Mira que el campo está a Nulo. Inserta la petición de inserción. Lee Que la petición es correcta, y si es la suya, entonces inserta.
Esta es la solución más correcta.
2.- Otro método es hacer la consulta del máximo anterior +1. Luego insertas. Y luego buscas todos los campos que has insertado con una select y con el ID mayor que el anterior +1.
Si de algún modo quieres saber cual es la máquina que se conecta, cada máquina tiene un número único. Si después de la inserción, a un campo extra le pones el ID de la máquina puedes preguntar por el máximo valor del autonumérico para el ID de la máquina.
El código de la máquina se calcula así en visual basic :
'Código extraido de la Knowledge Base de Microsoft:
'HOWTO: Use CoCreateGUID API to Generate a GUID with VB
'Article ID: Q176790
'------------------------------------------------------------------
Option Explicit
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type
Private Declare Function CoCreateGuid Lib "OLE32.DLL" _
(pGuid As GUID) As Long
Const S_OK = 0 ' return value from CoCreateGuid
Public Function GetGUID() As String
Dim lResult As Long
Dim lguid As GUID
Dim MyguidString As String
Dim MyGuidString1 As String
Dim MyGuidString2 As String
Dim MyGuidString3 As String
Dim DataLen As Integer
Dim StringLen As Integer
Dim i As Integer
On Error GoTo error_olemsg
lResult = CoCreateGuid(lguid)
If lResult = S_OK Then
MyGuidString1 = Hex$(lguid.Data1)
StringLen = Len(MyGuidString1)
DataLen = Len(lguid.Data1)
MyGuidString1 = LeadingZeros(2 * DataLen, StringLen) _
& MyGuidString1 'First 4 bytes (8 hex digits)
MyGuidString2 = Hex$(lguid.Data2)
StringLen = Len(MyGuidString2)
DataLen = Len(lguid.Data2)
MyGuidString2 = LeadingZeros(2 * DataLen, StringLen) _
& Trim$(MyGuidString2) 'Next 2 bytes (4 hex digits)
MyGuidString3 = Hex$(lguid.Data3)
StringLen = Len(MyGuidString3)
DataLen = Len(lguid.Data3)
MyGuidString3 = LeadingZeros(2 * DataLen, StringLen) _
& Trim$(MyGuidString3) 'Next 2 bytes (4 hex digits)
MyguidString = MyGuidString1 & "-" & MyGuidString2 & "-" & _
MyGuidString3 & "-"
For i = 0 To 7
MyguidString = MyguidString & _
Format$(Hex$(lguid.Data4(i)), "00")
Next
'MyGuidString contains last 8 bytes of Guid (16 hex digits)
GetGUID = MyguidString
Else
GetGUID = "00000000-0000-0000-0000000000000000" ' return zeros if function unsuccessful
End If
Exit Function
error_olemsg:
MsgBox "Error " & Str(Err) & ": " & Error$(Err)
GetGUID = "00000000-0000-0000-0000000000000000"
Exit Function
End Function
Private Function LeadingZeros(ExpectedLen As Integer, ActualLen As Integer) As String
LeadingZeros = String$(ExpectedLen - ActualLen, "0")
End Function
¿Cómo usar esta clase?
Para usar esta clase, hazlo de la siguiente forma:
Private Sub cmdGenGUID_Click()
'Creamos una instancia de la clase
Dim tGuid As New cGUID
'Asignamos el número generado, en este ejemplo lo asignamos a un Label
Label2 = tGuid.GetGUID
'Destruimos la referencia al objeto
Set tGuid = Nothing
End Sub
Pero no se me ocurren más cosas ahora mismo. Si te es insuficiente, comunícamelo y te propongo otras posibilidades.
Muchas gracias por tu tiempo...
Te comento que la solución que me parece más adecuada (dado que necesito usar campos autonuméricos) es usar un campo auxiliar temporario en las tablas, donde guardar un valor por (como el devuelto por la función Timer, etc) por medio del cual recuperar el valor del campo autonumérico...
De nuevo, muchísimas gracias por tu tiempo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas