Solución:
En su ejemplo, debido a que usa CurrentDB para ejecutar su INSERT, lo ha hecho más difícil para usted. En cambio, esto funcionará:
Dim query As String
Dim newRow As Long ' note change of data type
Dim db As DAO.Database
query = "INSERT INTO InvoiceNumbers (date) VALUES (" & NOW() & ");"
Set db = CurrentDB
db.Execute(query)
newRow = db.OpenRecordset("SELECT @@IDENTITY")(0)
Set db = Nothing
Solía hacer INSERTs abriendo un AddOnly
recordset y recogiendo la ID desde allí, pero esto aquí es mucho más eficiente. Y tenga en cuenta que no requiere ADO
.
Si DAO
usar
RS.Move 0, RS.LastModified
lngID = RS!AutoNumberFieldName
Si ADO
usar
cn.Execute "INSERT INTO TheTable.....", , adCmdText + adExecuteNoRecords
Set rs = cn.Execute("SELECT @@Identity", , adCmdText)
Debug.Print rs.Fields(0).Value
cn
siendo una conexión ADO válida, @@Identity
devolverá el último
Identity
(Autonumber) insertado en esta conexión.
Tenga en cuenta que @@Identity
puede ser problemático porque el último valor generado puede no ser el que le interesa. Para el motor de base de datos de Access, considere un VIEW
que une dos tablas, las cuales tienen el IDENTITY
propiedad, y tu INSERT INTO
los VIEW
. Para SQL Server, considere si hay desencadenantes que a su vez inserten registros en otra tabla que también tenga la IDENTITY
propiedad.
por cierto DMax
no funcionaría como si alguien más insertara un registro justo después de haber insertado uno, pero antes de su Dmax
función termina de ejecutarse, entonces obtendría su registro.
Esta es una adaptación de mi código para ti. Me inspiré en Developpez.com (busque en la página: “Pour insérer des données, vaut-il mieux passer par un RecordSet ou par une requête de type INSERT?“). Explican (con un poco de francés). Este camino es mucho más rápido que el superior. En el ejemplo, este camino fue 37 veces más rápido. Pruébelo.
Const tableName As String = "InvoiceNumbers"
Const columnIdName As String = "??"
Const columnDateName As String = "date"
Dim rsTable As DAO.recordSet
Dim recordId as long
Set rsTable = CurrentDb.OpenRecordset(tableName)
Call rsTable .AddNew
recordId = CLng(rsTable (columnIdName)) ' Save your Id in a variable
rsTable (columnDateName) = Now() ' Store your data
rsTable .Update
recordSet.Close
LeCygne