Saltar al contenido

Valor de numeración automática de la última fila insertada – MS Access / VBA

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

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *