jueves, 14 de julio de 2016

@@IDENTITY con MS Access y SQL Server

Problema

Supongamos un escenario en donde tenemos a SQL Server como base de datos y MS Access como aplicación.

Insertamos un registro en una tabla y queremos ver el ID asignado, para lo cual utilizamos esta línea de código:

Set rs = CurrentDb.OpenRecordset("SELECT @@IDENTITY", dbOpenForwardOnly)

¿Cuál es el problema?

Si existe un trigger detrás de esta tabla que inserta en otra tabla, es posible que el IDENTITY sea el del trigger y no el que estamos buscando

Solución

Una posible solución es usar la función nativa de SQL Server para obtener el último IDENTITY de una tabla:

Function Retornar_Identity_Tabla()
    Dim qdef As DAO.QueryDef
    Dim VarRecords As Variant
    Set qdef = CurrentDb.CreateQueryDef("")
    qdef.ReturnsRecords = True
    qdef.Connect = CurrentDb.TableDefs("dbo_Certificados").Connect
    qdef.sql = "SELECT IDENT_CURRENT('certificados')"
    qdef.OpenRecordset
    VarRecords = qdef.OpenRecordset.GetRows(1)
    Retornar_Scope_Identity = VarRecords(0, 0)
End Function