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 de athrarn
1
1
athrarn, - Sistemas Operativos : - MS-DOS, Windows 3
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.